From 95da01c190354c0d9955736d058e4f5fb9811a06 Mon Sep 17 00:00:00 2001 From: Andrew Starr-Bochicchio Date: Tue, 7 Feb 2023 14:37:14 -0500 Subject: [PATCH] Package reorganization (#927) * Initial reorganization. * Update Makefile for running accepance tests under new organization. * Update sweepers for new organization. * Remove unused functions from util package. * godo.PtrTo replaces the boolPtr and intPtr helpers. * Clean up util package. * Reorg helpers in acceptance package. --- GNUmakefile | 16 +- README.md | 8 +- digitalocean/acceptance/acceptance.go | 58 +++ digitalocean/acceptance/certs.go | 89 +++++ digitalocean/acceptance/droplets.go | 135 +++++++ .../{testing.go => acceptance/test_utils.go} | 6 +- .../datasource_account.go} | 8 +- .../datasource_account_test.go} | 8 +- digitalocean/{ => app}/app_spec.go | 2 +- .../datasource_app.go} | 4 +- .../datasource_app_test.go} | 9 +- .../import_app_test.go} | 11 +- .../resource_app.go} | 13 +- .../resource_app_test.go} | 117 ++---- digitalocean/app/sweep.go | 47 +++ .../resource_cdn.go} | 22 +- .../resource_cdn_test.go} | 28 +- .../datasource_certificate.go} | 11 +- .../datasource_certificate_test.go} | 19 +- .../import_certificate_test.go} | 9 +- .../resource_certificate.go} | 28 +- .../resource_certificate_test.go} | 149 +------ digitalocean/certificate/sweep.go | 47 +++ digitalocean/{ => config}/config.go | 55 +-- .../datasource_database_ca.go} | 7 +- .../datasource_database_ca_test.go} | 9 +- .../datasource_database_cluster.go} | 12 +- .../datasource_database_cluster_test.go} | 10 +- .../datasource_database_replica.go} | 10 +- .../datasource_database_replica_test.go} | 11 +- .../import_database_connection_pool_test.go} | 11 +- .../import_database_db_test.go} | 7 +- .../import_database_firewall_test.go} | 9 +- .../import_database_replica_test.go} | 11 +- .../import_database_user_test.go} | 11 +- .../resource_database_cluster.go} | 22 +- .../resource_database_cluster_test.go} | 133 +++---- .../resource_database_connection_pool.go} | 11 +- ...resource_database_connection_pool_test.go} | 32 +- .../resource_database_db.go} | 11 +- .../resource_database_db_test.go} | 14 +- .../resource_database_firewall.go} | 13 +- .../resource_database_firewall_test.go} | 24 +- .../resource_database_replica.go} | 21 +- .../resource_database_replica_test.go} | 26 +- .../resource_database_user.go} | 13 +- .../resource_database_user_test.go} | 34 +- digitalocean/database/sweep.go | 47 +++ .../datasource_domain.go} | 7 +- .../datasource_domain_test.go} | 12 +- .../datasource_domains.go} | 4 +- .../datasource_domains_test.go} | 11 +- .../datasource_record.go} | 7 +- .../datasource_record_test.go} | 14 +- .../datasource_records.go} | 4 +- .../datasource_records_test.go} | 9 +- digitalocean/{ => domain}/domains.go | 5 +- .../import_domain_test.go} | 9 +- .../import_record_test.go} | 9 +- digitalocean/{ => domain}/records.go | 5 +- .../resource_domain.go} | 11 +- .../resource_domain_test.go} | 57 +-- .../resource_record.go} | 17 +- .../resource_record_test.go} | 109 ++--- digitalocean/domain/sweep.go | 47 +++ .../datasource_droplet.go} | 10 +- .../datasource_droplet_test.go} | 24 +- .../datasource_droplets.go} | 4 +- .../datasource_droplets_test.go} | 7 +- digitalocean/{ => droplet}/droplets.go | 18 +- .../import_droplet_test.go} | 29 +- .../resource_droplet.go} | 59 +-- .../resource_droplet_migrate.go} | 4 +- .../resource_droplet_migrate_test.go} | 5 +- .../resource_droplet_test.go} | 376 +++++++----------- digitalocean/droplet/sweep.go | 47 +++ digitalocean/filter.go | 57 --- digitalocean/filter_test.go | 34 -- .../datasource_firewall.go} | 4 +- .../datasource_firewall_test.go} | 9 +- digitalocean/{ => firewall}/firewalls.go | 15 +- .../resource_firewall.go} | 18 +- .../resource_firewall_test.go} | 77 +--- digitalocean/firewall/sweep.go | 47 +++ digitalocean/hash.go | 40 -- .../datasource_image.go} | 10 +- .../datasource_image_test.go} | 72 +--- .../datasource_images.go} | 4 +- .../datasource_images_test.go} | 12 +- digitalocean/{ => image}/images.go | 8 +- .../resource_custom_image.go} | 39 +- .../resource_custom_image_test.go} | 23 +- .../datasource_kubernetes_cluster.go} | 10 +- .../datasource_kubernetes_cluster_test.go} | 12 +- .../datasource_kubernetes_versions.go} | 7 +- .../datasource_kubernetes_versions_test.go} | 17 +- .../import_kubernetes_cluster_test.go} | 23 +- .../import_kubernetes_node_pool_test.go} | 11 +- digitalocean/{ => kubernetes}/kubernetes.go | 24 +- .../resource_kubernetes_cluster.go} | 67 ++-- .../resource_kubernetes_cluster_test.go} | 110 ++--- .../resource_kubernetes_node_pool.go} | 34 +- .../resource_kubernetes_node_pool_test.go} | 30 +- digitalocean/kubernetes/sweep.go | 47 +++ .../datasource_loadbalancer.go} | 7 +- .../datasource_loadbalancer_test.go} | 70 ++-- .../import_loadbalancer_test.go} | 7 +- .../{ => loadbalancer}/loadbalancer.go | 10 +- .../resource_loadbalancer.go} | 21 +- .../resource_loadbalancer_test.go} | 118 ++---- digitalocean/loadbalancer/sweep.go | 47 +++ .../import_monitor_alert_test.go} | 9 +- .../resource_monitor_alert.go} | 43 +- .../resource_monitor_alert_test.go} | 32 +- .../datasource_project.go} | 10 +- .../datasource_project_test.go} | 13 +- .../datasource_projects.go} | 4 +- .../datasource_projects_test.go} | 11 +- .../import_project_test.go} | 7 +- digitalocean/{ => project}/projects.go | 44 +- .../resource_project.go} | 53 +-- .../resource_project_resources.go} | 16 +- .../resource_project_resources_test.go} | 17 +- .../resource_project_test.go} | 46 ++- digitalocean/provider.go | 188 +++++---- digitalocean/provider_test.go | 54 +-- .../datasource_region.go} | 7 +- .../datasource_region_test.go} | 11 +- .../datasource_regions.go} | 4 +- .../datasource_regions_test.go} | 9 +- digitalocean/{ => region}/regions.go | 5 +- .../datasource_container_registry.go} | 4 +- .../datasource_container_registry_test.go} | 12 +- .../import_container_registry_test.go} | 9 +- .../resource_container_registry.go} | 13 +- ..._container_registry_docker_credentials.go} | 15 +- ...ainer_registry_docker_credentials_test.go} | 20 +- .../resource_container_registry_test.go} | 23 +- .../datasource_floating_ip.go} | 4 +- .../datasource_floating_ip_test.go} | 10 +- .../datasource_reserved_ip.go} | 4 +- .../datasource_reserved_ip_test.go} | 14 +- .../import_floating_ip_assignment_test.go} | 12 +- .../import_floating_ip_test.go} | 11 +- .../import_reserved_ip_test.go} | 11 +- .../resource_floating_ip.go} | 4 +- .../resource_floating_ip_assignment.go} | 4 +- .../resource_floating_ip_assignment_test.go} | 14 +- .../resource_floating_ip_test.go} | 46 +-- .../resource_reserved_ip.go} | 17 +- .../resource_reserved_ip_assignment.go} | 13 +- .../resource_reserved_ip_assignment_test.go} | 14 +- .../resource_reserved_ip_test.go} | 46 +-- digitalocean/reservedip/sweep.go | 65 +++ .../datasource_sizes.go} | 7 +- .../datasource_sizes_test.go} | 11 +- .../datasource_droplet_snapshot.go} | 7 +- .../datasource_droplet_snapshot_test.go} | 24 +- .../datasource_volume_snapshot.go} | 12 +- .../datasource_volume_snapshot_test.go} | 24 +- .../import_droplet_snapshot_test.go} | 7 +- .../import_volume_snapshot_test.go} | 7 +- .../resource_droplet_snapshot.go} | 14 +- .../resource_droplet_snapshot_test.go} | 49 +-- .../resource_volume_snapshot.go} | 22 +- .../resource_volume_snapshot_test.go} | 53 +-- digitalocean/snapshot/sweep.go | 80 ++++ digitalocean/sort.go | 52 --- digitalocean/sort_test.go | 30 -- .../datasource_spaces_bucket.go} | 10 +- .../datasource_spaces_bucket_object.go} | 7 +- .../datasource_spaces_bucket_object_test.go} | 27 +- .../datasource_spaces_bucket_objects.go} | 7 +- .../datasource_spaces_bucket_objects_test.go} | 23 +- .../datasource_spaces_bucket_test.go} | 20 +- .../datasource_spaces_buckets.go} | 4 +- .../datasource_spaces_buckets_test.go} | 12 +- .../import_spaces_bucket_policy_test.go} | 7 +- .../import_spaces_bucket_test.go} | 7 +- .../resource_spaces_bucket.go} | 32 +- .../resource_spaces_bucket_object.go} | 15 +- .../resource_spaces_bucket_object_test.go} | 58 +-- .../resource_spaces_bucket_policy.go} | 9 +- .../resource_spaces_bucket_policy_test.go} | 29 +- .../resource_spaces_bucket_test.go} | 58 +-- digitalocean/{ => spaces}/spaces_buckets.go | 11 +- .../datasource_ssh_key.go} | 7 +- .../datasource_ssh_key_test.go} | 12 +- .../datasource_ssh_keys.go} | 4 +- .../datasource_ssh_keys_test.go} | 7 +- .../import_ssh_key_test.go} | 7 +- .../resource_ssh_key.go} | 13 +- .../resource_ssh_key_test.go} | 12 +- digitalocean/{ => sshkey}/ssh_keys.go | 5 +- .../{sweeper_test.go => sweep/sweep.go} | 15 +- digitalocean/sweep/sweep_test.go | 23 ++ .../datasource_tag.go} | 9 +- .../datasource_tag_test.go} | 12 +- .../datasource_tags.go} | 7 +- .../datasource_tags_test.go} | 9 +- .../import_tag_test.go} | 7 +- .../resource_tag.go} | 13 +- .../resource_tag_test.go} | 12 +- digitalocean/{ => tag}/tags.go | 33 +- digitalocean/{ => tag}/tags_test.go | 20 +- .../resource_uptime_alert.go} | 27 +- .../resource_uptime_alert_test.go} | 16 +- .../resource_uptime_check.go} | 13 +- .../resource_uptime_check_test.go} | 16 +- digitalocean/util.go | 9 - digitalocean/util/errors.go | 17 + digitalocean/util/hash.go | 49 +++ digitalocean/{ => util}/schema.go | 5 +- digitalocean/{ => util}/set.go | 13 +- digitalocean/{ => util}/set_test.go | 4 +- digitalocean/{ => util}/suppress.go | 3 +- digitalocean/{ => util}/suppress_test.go | 2 +- digitalocean/util/wait.go | 45 +++ .../datasource_volume.go} | 12 +- .../datasource_volume_test.go} | 18 +- .../import_volume_test.go} | 7 +- .../resource_volume.go} | 25 +- .../resource_volume_attachment.go} | 20 +- .../resource_volume_attachment_test.go} | 34 +- .../resource_volume_test.go} | 96 +---- digitalocean/volume/sweep.go | 66 +++ .../datasource_vpc.go} | 7 +- .../datasource_vpc_test.go} | 21 +- .../import_vpc_test.go} | 9 +- .../resource_vpc.go} | 16 +- .../resource_vpc_test.go} | 30 +- 231 files changed, 3147 insertions(+), 2832 deletions(-) create mode 100644 digitalocean/acceptance/acceptance.go create mode 100644 digitalocean/acceptance/certs.go create mode 100644 digitalocean/acceptance/droplets.go rename digitalocean/{testing.go => acceptance/test_utils.go} (70%) rename digitalocean/{datasource_digitalocean_account.go => account/datasource_account.go} (90%) rename digitalocean/{datasource_digitalocean_account_test.go => account/datasource_account_test.go} (72%) rename digitalocean/{ => app}/app_spec.go (99%) rename digitalocean/{datasource_digitalocean_app.go => app/datasource_app.go} (95%) rename digitalocean/{datasource_digitalocean_app_test.go => app/datasource_app_test.go} (94%) rename digitalocean/{import_digitalocean_app_test.go => app/import_app_test.go} (61%) rename digitalocean/{resource_digitalocean_app.go => app/resource_app.go} (95%) rename digitalocean/{resource_digitalocean_app_test.go => app/resource_app_test.go} (94%) create mode 100644 digitalocean/app/sweep.go rename digitalocean/{resource_digitalocean_cdn.go => cdn/resource_cdn.go} (91%) rename digitalocean/{resource_digitalocean_cdn_test.go => cdn/resource_cdn_test.go} (89%) rename digitalocean/{datasource_digitalocean_certificate.go => certificate/datasource_certificate.go} (90%) rename digitalocean/{datasource_digitalocean_certificate_test.go => certificate/datasource_certificate_test.go} (74%) rename digitalocean/{import_digitalocean_certificate_test.go => certificate/import_certificate_test.go} (72%) rename digitalocean/{resource_digitalocean_certificate.go => certificate/resource_certificate.go} (91%) rename digitalocean/{resource_digitalocean_certificate_test.go => certificate/resource_certificate_test.go} (53%) create mode 100644 digitalocean/certificate/sweep.go rename digitalocean/{ => config}/config.go (62%) rename digitalocean/{datasource_digitalocean_database_ca.go => database/datasource_database_ca.go} (82%) rename digitalocean/{datasource_digitalocean_database_ca_test.go => database/datasource_database_ca_test.go} (87%) rename digitalocean/{datasource_digitalocean_database_cluster.go => database/datasource_database_cluster.go} (90%) rename digitalocean/{datasource_digitalocean_database_cluster_test.go => database/datasource_database_cluster_test.go} (89%) rename digitalocean/{datasource_digitalocean_database_replica.go => database/datasource_database_replica.go} (85%) rename digitalocean/{datasource_digitalocean_database_replica_test.go => database/datasource_database_replica_test.go} (91%) rename digitalocean/{import_digitalocean_database_connection_pool_test.go => database/import_database_connection_pool_test.go} (84%) rename digitalocean/{import_digitalocean_database_db_test.go => database/import_database_db_test.go} (89%) rename digitalocean/{import_digitalocean_database_firewall_test.go => database/import_database_firewall_test.go} (86%) rename digitalocean/{import_digitalocean_database_replica_test.go => database/import_database_replica_test.go} (87%) rename digitalocean/{import_digitalocean_database_user_test.go => database/import_database_user_test.go} (84%) rename digitalocean/{resource_digitalocean_database_cluster.go => database/resource_database_cluster.go} (96%) rename digitalocean/{resource_digitalocean_database_cluster_test.go => database/resource_database_cluster_test.go} (88%) rename digitalocean/{resource_digitalocean_database_connection_pool.go => database/resource_database_connection_pool.go} (94%) rename digitalocean/{resource_digitalocean_database_connection_pool_test.go => database/resource_database_connection_pool_test.go} (89%) rename digitalocean/{resource_digitalocean_database_db.go => database/resource_database_db.go} (90%) rename digitalocean/{resource_digitalocean_database_db_test.go => database/resource_database_db_test.go} (88%) rename digitalocean/{resource_digitalocean_database_firewall.go => database/resource_database_firewall.go} (92%) rename digitalocean/{resource_digitalocean_database_firewall_test.go => database/resource_database_firewall_test.go} (85%) rename digitalocean/{resource_digitalocean_database_replica.go => database/resource_database_replica.go} (91%) rename digitalocean/{resource_digitalocean_database_replica_test.go => database/resource_database_replica_test.go} (87%) rename digitalocean/{resource_digitalocean_database_user.go => database/resource_database_user.go} (93%) rename digitalocean/{resource_digitalocean_database_user_test.go => database/resource_database_user_test.go} (89%) create mode 100644 digitalocean/database/sweep.go rename digitalocean/{datasource_digitalocean_domain.go => domain/datasource_domain.go} (87%) rename digitalocean/{datasource_digitalocean_domain_test.go => domain/datasource_domain_test.go} (82%) rename digitalocean/{datasource_digitalocean_domains.go => domain/datasource_domains.go} (84%) rename digitalocean/{datasource_digitalocean_domains_test.go => domain/datasource_domains_test.go} (79%) rename digitalocean/{datasource_digitalocean_record.go => domain/datasource_record.go} (93%) rename digitalocean/{datasource_digitalocean_record_test.go => domain/datasource_record_test.go} (82%) rename digitalocean/{datasource_digitalocean_records.go => domain/datasource_records.go} (87%) rename digitalocean/{datasource_digitalocean_records_test.go => domain/datasource_records_test.go} (89%) rename digitalocean/{ => domain}/domains.go (91%) rename digitalocean/{import_digitalocean_domain_test.go => domain/import_domain_test.go} (70%) rename digitalocean/{import_digitalocean_record_test.go => domain/import_record_test.go} (78%) rename digitalocean/{ => domain}/records.go (95%) rename digitalocean/{resource_digitalocean_domain.go => domain/resource_domain.go} (89%) rename digitalocean/{resource_digitalocean_domain_test.go => domain/resource_domain_test.go} (73%) rename digitalocean/{resource_digitalocean_record.go => domain/resource_record.go} (94%) rename digitalocean/{resource_digitalocean_record_test.go => domain/resource_record_test.go} (90%) create mode 100644 digitalocean/domain/sweep.go rename digitalocean/{datasource_digitalocean_droplet.go => droplet/datasource_droplet.go} (89%) rename digitalocean/{datasource_digitalocean_droplet_test.go => droplet/datasource_droplet_test.go} (89%) rename digitalocean/{datasource_digitalocean_droplets.go => droplet/datasource_droplets.go} (84%) rename digitalocean/{datasource_digitalocean_droplets_test.go => droplet/datasource_droplets_test.go} (86%) rename digitalocean/{ => droplet}/droplets.go (90%) rename digitalocean/{import_digitalocean_droplet_test.go => droplet/import_droplet_test.go} (72%) rename digitalocean/{resource_digitalocean_droplet.go => droplet/resource_droplet.go} (92%) rename digitalocean/{resource_digitalocean_droplet_migrate.go => droplet/resource_droplet_migrate.go} (92%) rename digitalocean/{resource_digitalocean_droplet_migrate_test.go => droplet/resource_droplet_migrate_test.go} (85%) rename digitalocean/{resource_digitalocean_droplet_test.go => droplet/resource_droplet_test.go} (72%) create mode 100644 digitalocean/droplet/sweep.go delete mode 100644 digitalocean/filter.go delete mode 100644 digitalocean/filter_test.go rename digitalocean/{datasource_digitalocean_firewall.go => firewall/datasource_firewall.go} (90%) rename digitalocean/{datasource_digitalocean_firewall_test.go => firewall/datasource_firewall_test.go} (93%) rename digitalocean/{ => firewall}/firewalls.go (94%) rename digitalocean/{resource_digitalocean_firewall.go => firewall/resource_firewall.go} (89%) rename digitalocean/{resource_digitalocean_firewall_test.go => firewall/resource_firewall_test.go} (85%) create mode 100644 digitalocean/firewall/sweep.go delete mode 100644 digitalocean/hash.go rename digitalocean/{datasource_digitalocean_image.go => image/datasource_image.go} (90%) rename digitalocean/{datasource_digitalocean_image_test.go => image/datasource_image_test.go} (58%) rename digitalocean/{datasource_digitalocean_images.go => image/datasource_images.go} (84%) rename digitalocean/{datasource_digitalocean_images_test.go => image/datasource_images_test.go} (78%) rename digitalocean/{ => image}/images.go (93%) rename digitalocean/{resource_digitalocean_custom_image.go => image/resource_custom_image.go} (88%) rename digitalocean/{resource_digitalocean_custom_image_test.go => image/resource_custom_image_test.go} (85%) rename digitalocean/{datasource_digitalocean_kubernetes_cluster.go => kubernetes/datasource_kubernetes_cluster.go} (90%) rename digitalocean/{datasource_digitalocean_kubernetes_cluster_test.go => kubernetes/datasource_kubernetes_cluster_test.go} (89%) rename digitalocean/{datasource_digitalocean_kubernetes_versions.go => kubernetes/datasource_kubernetes_versions.go} (85%) rename digitalocean/{datasource_digitalocean_kubernetes_versions_test.go => kubernetes/datasource_kubernetes_versions_test.go} (82%) rename digitalocean/{import_digitalocean_kubernetes_cluster_test.go => kubernetes/import_kubernetes_cluster_test.go} (82%) rename digitalocean/{import_digitalocean_kubernetes_node_pool_test.go => kubernetes/import_kubernetes_node_pool_test.go} (80%) rename digitalocean/{ => kubernetes}/kubernetes.go (92%) rename digitalocean/{resource_digitalocean_kubernetes_cluster.go => kubernetes/resource_kubernetes_cluster.go} (91%) rename digitalocean/{resource_digitalocean_kubernetes_cluster_test.go => kubernetes/resource_kubernetes_cluster_test.go} (93%) rename digitalocean/{resource_digitalocean_kubernetes_node_pool.go => kubernetes/resource_kubernetes_node_pool.go} (90%) rename digitalocean/{resource_digitalocean_kubernetes_node_pool_test.go => kubernetes/resource_kubernetes_node_pool_test.go} (96%) create mode 100644 digitalocean/kubernetes/sweep.go rename digitalocean/{datasource_digitalocean_loadbalancer.go => loadbalancer/datasource_loadbalancer.go} (98%) rename digitalocean/{datasource_digitalocean_loadbalancer_test.go => loadbalancer/datasource_loadbalancer_test.go} (92%) rename digitalocean/{import_digitalocean_loadbalancer_test.go => loadbalancer/import_loadbalancer_test.go} (73%) rename digitalocean/{ => loadbalancer}/loadbalancer.go (95%) rename digitalocean/{resource_digitalocean_loadbalancer.go => loadbalancer/resource_loadbalancer.go} (96%) rename digitalocean/{resource_digitalocean_loadbalancer_test.go => loadbalancer/resource_loadbalancer_test.go} (93%) create mode 100644 digitalocean/loadbalancer/sweep.go rename digitalocean/{import_digitalocean_monitor_alert_test.go => monitoring/import_monitor_alert_test.go} (79%) rename digitalocean/{resource_digitalocean_monitor_alert.go => monitoring/resource_monitor_alert.go} (87%) rename digitalocean/{resource_digitalocean_monitor_alert_test.go => monitoring/resource_monitor_alert_test.go} (89%) rename digitalocean/{datasource_digitalocean_project.go => project/datasource_project.go} (86%) rename digitalocean/{datasource_digitalocean_project_test.go => project/datasource_project_test.go} (81%) rename digitalocean/{datasource_digitalocean_projects.go => project/datasource_projects.go} (84%) rename digitalocean/{datasource_digitalocean_projects_test.go => project/datasource_projects_test.go} (85%) rename digitalocean/{import_digitalocean_project_test.go => project/import_project_test.go} (71%) rename digitalocean/{ => project}/projects.go (73%) rename digitalocean/{resource_digitalocean_project.go => project/resource_project.go} (87%) rename digitalocean/{resource_digitalocean_project_resources.go => project/resource_project_resources.go} (87%) rename digitalocean/{resource_digitalocean_project_resources_test.go => project/resource_project_resources_test.go} (82%) rename digitalocean/{resource_digitalocean_project_test.go => project/resource_project_test.go} (91%) rename digitalocean/{datasource_digitalocean_region.go => region/datasource_region.go} (88%) rename digitalocean/{datasource_digitalocean_region_test.go => region/datasource_region_test.go} (76%) rename digitalocean/{datasource_digitalocean_regions.go => region/datasource_regions.go} (90%) rename digitalocean/{datasource_digitalocean_regions_test.go => region/datasource_regions_test.go} (86%) rename digitalocean/{ => region}/regions.go (91%) rename digitalocean/{datasource_digitalocean_container_registry.go => registry/datasource_container_registry.go} (93%) rename digitalocean/{datasource_digitalocean_container_registry_test.go => registry/datasource_container_registry_test.go} (82%) rename digitalocean/{import_digitalocean_container_registry_test.go => registry/import_container_registry_test.go} (69%) rename digitalocean/{resource_digitalocean_container_registry.go => registry/resource_container_registry.go} (91%) rename digitalocean/{resource_digitalocean_container_registry_docker_credentials.go => registry/resource_container_registry_docker_credentials.go} (93%) rename digitalocean/{resource_digitalocean_container_registry_docker_credentials_test.go => registry/resource_container_registry_docker_credentials_test.go} (87%) rename digitalocean/{resource_digitalocean_container_registry_test.go => registry/resource_container_registry_test.go} (88%) rename digitalocean/{datasource_digitalocean_floating_ip.go => reservedip/datasource_floating_ip.go} (94%) rename digitalocean/{datasource_digitalocean_floating_ip_test.go => reservedip/datasource_floating_ip_test.go} (83%) rename digitalocean/{datasource_digitalocean_reserved_ip.go => reservedip/datasource_reserved_ip.go} (93%) rename digitalocean/{datasource_digitalocean_reserved_ip_test.go => reservedip/datasource_reserved_ip_test.go} (85%) rename digitalocean/{import_digitalocean_floating_ip_assignment_test.go => reservedip/import_floating_ip_assignment_test.go} (83%) rename digitalocean/{import_digitalocean_floating_ip_test.go => reservedip/import_floating_ip_test.go} (75%) rename digitalocean/{import_digitalocean_reserved_ip_test.go => reservedip/import_reserved_ip_test.go} (75%) rename digitalocean/{resource_digitalocean_floating_ip.go => reservedip/resource_floating_ip.go} (97%) rename digitalocean/{resource_digitalocean_floating_ip_assignment.go => reservedip/resource_floating_ip_assignment.go} (92%) rename digitalocean/{resource_digitalocean_floating_ip_assignment_test.go => reservedip/resource_floating_ip_assignment_test.go} (92%) rename digitalocean/{resource_digitalocean_floating_ip_test.go => reservedip/resource_floating_ip_test.go} (83%) rename digitalocean/{resource_digitalocean_reserved_ip.go => reservedip/resource_reserved_ip.go} (94%) rename digitalocean/{resource_digitalocean_reserved_ip_assignment.go => reservedip/resource_reserved_ip_assignment.go} (93%) rename digitalocean/{resource_digitalocean_reserved_ip_assignment_test.go => reservedip/resource_reserved_ip_assignment_test.go} (92%) rename digitalocean/{resource_digitalocean_reserved_ip_test.go => reservedip/resource_reserved_ip_test.go} (83%) create mode 100644 digitalocean/reservedip/sweep.go rename digitalocean/{datasource_digitalocean_sizes.go => size/datasource_sizes.go} (94%) rename digitalocean/{datasource_digitalocean_sizes_test.go => size/datasource_sizes_test.go} (91%) rename digitalocean/{datasource_digitalocean_droplet_snapshot.go => snapshot/datasource_droplet_snapshot.go} (94%) rename digitalocean/{datasource_digitalocean_droplet_snapshot_test.go => snapshot/datasource_droplet_snapshot_test.go} (86%) rename digitalocean/{datasource_digitalocean_volume_snapshot.go => snapshot/datasource_volume_snapshot.go} (92%) rename digitalocean/{datasource_digitalocean_volume_snapshot_test.go => snapshot/datasource_volume_snapshot_test.go} (87%) rename digitalocean/{import_digitalocean_droplet_snapshot_test.go => snapshot/import_droplet_snapshot_test.go} (75%) rename digitalocean/{import_digitalocean_volume_snapshot_test.go => snapshot/import_volume_snapshot_test.go} (74%) rename digitalocean/{resource_digitalocean_droplet_snapshot.go => snapshot/resource_droplet_snapshot.go} (90%) rename digitalocean/{resource_digitalocean_droplet_snapshot_test.go => snapshot/resource_droplet_snapshot_test.go} (66%) rename digitalocean/{resource_digitalocean_volume_snapshot.go => snapshot/resource_volume_snapshot.go} (83%) rename digitalocean/{resource_digitalocean_volume_snapshot_test.go => snapshot/resource_volume_snapshot_test.go} (77%) create mode 100644 digitalocean/snapshot/sweep.go delete mode 100644 digitalocean/sort.go delete mode 100644 digitalocean/sort_test.go rename digitalocean/{datasource_digitalocean_spaces_bucket.go => spaces/datasource_spaces_bucket.go} (83%) rename digitalocean/{datasource_digitalocean_spaces_bucket_object.go => spaces/datasource_spaces_bucket_object.go} (95%) rename digitalocean/{datasource_digitalocean_spaces_bucket_object_test.go => spaces/datasource_spaces_bucket_object_test.go} (94%) rename digitalocean/{datasource_digitalocean_spaces_bucket_objects.go => spaces/datasource_spaces_bucket_objects.go} (94%) rename digitalocean/{datasource_digitalocean_spaces_bucket_objects_test.go => spaces/datasource_spaces_bucket_objects_test.go} (93%) rename digitalocean/{datasource_digitalocean_spaces_bucket_test.go => spaces/datasource_spaces_bucket_test.go} (79%) rename digitalocean/{datasource_digitalocean_spaces_buckets.go => spaces/datasource_spaces_buckets.go} (83%) rename digitalocean/{datasource_digitalocean_spaces_buckets_test.go => spaces/datasource_spaces_buckets_test.go} (80%) rename digitalocean/{import_digitalocean_spaces_bucket_policy_test.go => spaces/import_spaces_bucket_policy_test.go} (88%) rename digitalocean/{import_digitalocean_spaces_bucket_test.go => spaces/import_spaces_bucket_test.go} (89%) rename digitalocean/{resource_digitalocean_spaces_bucket.go => spaces/resource_spaces_bucket.go} (96%) rename digitalocean/{resource_digitalocean_spaces_bucket_object.go => spaces/resource_spaces_bucket_object.go} (97%) rename digitalocean/{resource_digitalocean_spaces_bucket_object_test.go => spaces/resource_spaces_bucket_object_test.go} (92%) rename digitalocean/{resource_digitalocean_spaces_bucket_policy.go => spaces/resource_spaces_bucket_policy.go} (94%) rename digitalocean/{resource_digitalocean_spaces_bucket_policy_test.go => spaces/resource_spaces_bucket_policy_test.go} (86%) rename digitalocean/{resource_digitalocean_spaces_bucket_test.go => spaces/resource_spaces_bucket_test.go} (92%) rename digitalocean/{ => spaces}/spaces_buckets.go (88%) rename digitalocean/{datasource_digitalocean_ssh_key.go => sshkey/datasource_ssh_key.go} (87%) rename digitalocean/{datasource_digitalocean_ssh_key_test.go => sshkey/datasource_ssh_key_test.go} (84%) rename digitalocean/{datasource_digitalocean_ssh_keys.go => sshkey/datasource_ssh_keys.go} (84%) rename digitalocean/{datasource_digitalocean_ssh_keys_test.go => sshkey/datasource_ssh_keys_test.go} (87%) rename digitalocean/{import_digitalocean_ssh_key_test.go => sshkey/import_ssh_key_test.go} (78%) rename digitalocean/{resource_digitalocean_ssh_key.go => sshkey/resource_ssh_key.go} (90%) rename digitalocean/{resource_digitalocean_ssh_key_test.go => sshkey/resource_ssh_key_test.go} (83%) rename digitalocean/{ => sshkey}/ssh_keys.go (91%) rename digitalocean/{sweeper_test.go => sweep/sweep.go} (72%) create mode 100644 digitalocean/sweep/sweep_test.go rename digitalocean/{datasource_digitalocean_tag.go => tag/datasource_tag.go} (87%) rename digitalocean/{datasource_digitalocean_tag_test.go => tag/datasource_tag_test.go} (82%) rename digitalocean/{datasource_digitalocean_tags.go => tag/datasource_tags.go} (91%) rename digitalocean/{datasource_digitalocean_tags_test.go => tag/datasource_tags_test.go} (85%) rename digitalocean/{import_digitalocean_tag_test.go => tag/import_tag_test.go} (69%) rename digitalocean/{resource_digitalocean_tag.go => tag/resource_tag.go} (89%) rename digitalocean/{resource_digitalocean_tag_test.go => tag/resource_tag_test.go} (84%) rename digitalocean/{ => tag}/tags.go (72%) rename digitalocean/{ => tag}/tags_test.go (78%) rename digitalocean/{resource_digitalocean_uptime_alert.go => uptime/resource_uptime_alert.go} (88%) rename digitalocean/{resource_digitalocean_uptime_alert_test.go => uptime/resource_uptime_alert_test.go} (88%) rename digitalocean/{resource_digitalocean_uptime_check.go => uptime/resource_uptime_check.go} (92%) rename digitalocean/{resource_digitalocean_uptime_check_test.go => uptime/resource_uptime_check_test.go} (84%) delete mode 100644 digitalocean/util.go create mode 100644 digitalocean/util/errors.go create mode 100644 digitalocean/util/hash.go rename digitalocean/{ => util}/schema.go (65%) rename digitalocean/{ => util}/set.go (63%) rename digitalocean/{ => util}/set_test.go (97%) rename digitalocean/{ => util}/suppress.go (69%) rename digitalocean/{ => util}/suppress_test.go (97%) create mode 100644 digitalocean/util/wait.go rename digitalocean/{datasource_digitalocean_volume.go => volume/datasource_volume.go} (91%) rename digitalocean/{datasource_digitalocean_volume_test.go => volume/datasource_volume_test.go} (86%) rename digitalocean/{import_digitalocean_volume_test.go => volume/import_volume_test.go} (81%) rename digitalocean/{resource_digitalocean_volume.go => volume/resource_volume.go} (89%) rename digitalocean/{resource_digitalocean_volume_attachment.go => volume/resource_volume_attachment.go} (86%) rename digitalocean/{resource_digitalocean_volume_attachment_test.go => volume/resource_volume_attachment_test.go} (88%) rename digitalocean/{resource_digitalocean_volume_test.go => volume/resource_volume_test.go} (82%) create mode 100644 digitalocean/volume/sweep.go rename digitalocean/{datasource_digitalocean_vpc.go => vpc/datasource_vpc.go} (95%) rename digitalocean/{datasource_digitalocean_vpc_test.go => vpc/datasource_vpc_test.go} (84%) rename digitalocean/{import_digitalocean_vpc_test.go => vpc/import_vpc_test.go} (78%) rename digitalocean/{resource_digitalocean_vpc.go => vpc/resource_vpc.go} (91%) rename digitalocean/{resource_digitalocean_vpc_test.go => vpc/resource_vpc_test.go} (84%) diff --git a/GNUmakefile b/GNUmakefile index e2ad1a054..8b045799d 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,6 +1,8 @@ TEST?=$$(go list ./... |grep -v 'vendor') GOFMT_FILES?=$$(find . -name '*.go' |grep -v vendor) -PKG_NAME=digitalocean +PKG_NAME:=digitalocean +ACCTEST_TIMEOUT:=120m +ACCTEST_PARALLELISM:=2 default: build @@ -13,7 +15,7 @@ test: fmtcheck xargs -t -n4 go test $(TESTARGS) -timeout=30s -parallel=4 testacc: fmtcheck - TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout 120m + TF_ACC=1 go test -v ./$(PKG_NAME)/... $(TESTARGS) -timeout $(ACCTEST_TIMEOUT) -parallel=$(ACCTEST_PARALLELISM) vet: @echo "go vet ." @@ -26,7 +28,7 @@ vet: sweep: @echo "WARNING: This will destroy infrastructure. Use only in development accounts." - go test ./digitalocean -v -sweep=1 + go test ./digitalocean/sweep/... -v -sweep=1 goimports: @echo "==> Fixing imports code with goimports..." @@ -47,14 +49,6 @@ fmtcheck: errcheck: @sh -c "'$(CURDIR)/scripts/errcheck.sh'" -test-compile: - @if [ "$(TEST)" = "./..." ]; then \ - echo "ERROR: Set TEST to a specific package. For example,"; \ - echo " make test-compile TEST=./$(PKG_NAME)"; \ - exit 1; \ - fi - go test -c $(TEST) $(TESTARGS) - website: @echo "Use this site to preview markdown rendering: https://registry.terraform.io/tools/doc-preview" diff --git a/README.md b/README.md index 60d5effd5..38de0564b 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,12 @@ In order to run a specific acceptance test, use the `TESTARGS` environment varia $ make testacc TESTARGS='-run=TestAccDigitalOceanDomain_Basic' ``` +All acceptance tests for a specific package can be run by setting the `PKG_NAME` environment variable. For example: + +```sh +$ make testacc PKG_NAME=digitalocean/account +``` + In order to check changes you made locally to the provider, you can use the binary you just compiled by adding the following to your `~/.terraformrc` file. This is valid for Terraform 0.14+. Please see [Terraform's documentation](https://www.terraform.io/docs/cli/config/config-file.html#development-overrides-for-provider-developers) @@ -111,7 +117,7 @@ To release the provider: git tag -m "release $new_version" -a "$new_version" ``` -1. Push the tag: +1. Push the tag: ```bash git push "$origin" tag "$new_version" diff --git a/digitalocean/acceptance/acceptance.go b/digitalocean/acceptance/acceptance.go new file mode 100644 index 000000000..fd733fb06 --- /dev/null +++ b/digitalocean/acceptance/acceptance.go @@ -0,0 +1,58 @@ +package acceptance + +import ( + "context" + "fmt" + "os" + "strings" + "testing" + + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" +) + +const TestNamePrefix = "tf-acc-test-" + +var ( + TestAccProvider *schema.Provider + TestAccProviders map[string]*schema.Provider + TestAccProviderFactories map[string]func() (*schema.Provider, error) +) + +func init() { + TestAccProvider = digitalocean.Provider() + TestAccProviders = map[string]*schema.Provider{ + "digitalocean": TestAccProvider, + } + TestAccProviderFactories = map[string]func() (*schema.Provider, error){ + "digitalocean": func() (*schema.Provider, error) { + return TestAccProvider, nil + }, + } +} + +func TestAccPreCheck(t *testing.T) { + if v := os.Getenv("DIGITALOCEAN_TOKEN"); v == "" { + t.Fatal("DIGITALOCEAN_TOKEN must be set for acceptance tests") + } + + err := TestAccProvider.Configure(context.Background(), terraform.NewResourceConfigRaw(nil)) + if err != nil { + t.Fatal(err) + } +} + +func RandomTestName(additionalNames ...string) string { + prefix := TestNamePrefix + for _, n := range additionalNames { + prefix += "-" + strings.Replace(n, " ", "_", -1) + } + return randomName(prefix, 10) +} + +func randomName(prefix string, length int) string { + return fmt.Sprintf("%s%s", prefix, acctest.RandString(length)) +} diff --git a/digitalocean/acceptance/certs.go b/digitalocean/acceptance/certs.go new file mode 100644 index 000000000..23d942cd9 --- /dev/null +++ b/digitalocean/acceptance/certs.go @@ -0,0 +1,89 @@ +package acceptance + +import ( + "bytes" + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "fmt" + "math/big" + "strings" + "testing" + "time" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" +) + +// GenerateTestCertMaterial generates a TLS certificate for use in acceptance test fixtures. +func GenerateTestCertMaterial(t *testing.T) (string, string, string) { + leafCertMaterial, privateKeyMaterial, err := randTLSCert("Acme Co", "example.com") + if err != nil { + t.Fatalf("Cannot generate test TLS certificate: %s", err) + } + rootCertMaterial, _, err := randTLSCert("Acme Go", "example.com") + if err != nil { + t.Fatalf("Cannot generate test TLS certificate: %s", err) + } + certChainMaterial := fmt.Sprintf("%s\n%s", strings.TrimSpace(rootCertMaterial), leafCertMaterial) + + return privateKeyMaterial, leafCertMaterial, certChainMaterial +} + +// Based on Terraform's acctest.RandTLSCert, but allows for passing DNS name. +func randTLSCert(orgName string, dnsName string) (string, string, error) { + template := &x509.Certificate{ + SerialNumber: big.NewInt(int64(acctest.RandInt())), + Subject: pkix.Name{ + Organization: []string{orgName}, + }, + NotBefore: time.Now(), + NotAfter: time.Now().Add(24 * time.Hour), + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + BasicConstraintsValid: true, + DNSNames: []string{dnsName}, + } + + privateKey, privateKeyPEM, err := genPrivateKey() + if err != nil { + return "", "", err + } + + cert, err := x509.CreateCertificate(rand.Reader, template, template, &privateKey.PublicKey, privateKey) + if err != nil { + return "", "", err + } + + certPEM, err := pemEncode(cert, "CERTIFICATE") + if err != nil { + return "", "", err + } + + return certPEM, privateKeyPEM, nil +} + +func genPrivateKey() (*rsa.PrivateKey, string, error) { + privateKey, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + return nil, "", err + } + + privateKeyPEM, err := pemEncode(x509.MarshalPKCS1PrivateKey(privateKey), "RSA PRIVATE KEY") + if err != nil { + return nil, "", err + } + + return privateKey, privateKeyPEM, nil +} + +func pemEncode(b []byte, block string) (string, error) { + var buf bytes.Buffer + pb := &pem.Block{Type: block, Bytes: b} + if err := pem.Encode(&buf, pb); err != nil { + return "", err + } + + return buf.String(), nil +} diff --git a/digitalocean/acceptance/droplets.go b/digitalocean/acceptance/droplets.go new file mode 100644 index 000000000..d00324fec --- /dev/null +++ b/digitalocean/acceptance/droplets.go @@ -0,0 +1,135 @@ +package acceptance + +import ( + "context" + "fmt" + "log" + "strconv" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" +) + +func TestAccCheckDigitalOceanDropletDestroy(s *terraform.State) error { + client := TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() + + for _, rs := range s.RootModule().Resources { + if rs.Type != "digitalocean_droplet" { + continue + } + + id, err := strconv.Atoi(rs.Primary.ID) + if err != nil { + return err + } + + // Try to find the Droplet + _, _, err = client.Droplets.Get(context.Background(), id) + + // Wait + + if err != nil && !strings.Contains(err.Error(), "404") { + return fmt.Errorf( + "Error waiting for droplet (%s) to be destroyed: %s", + rs.Primary.ID, err) + } + } + + return nil +} + +func TestAccCheckDigitalOceanDropletExists(n string, droplet *godo.Droplet) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + if rs.Primary.ID == "" { + return fmt.Errorf("No Droplet ID is set") + } + + client := TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() + + id, err := strconv.Atoi(rs.Primary.ID) + if err != nil { + return err + } + + // Try to find the Droplet + retrieveDroplet, _, err := client.Droplets.Get(context.Background(), id) + + if err != nil { + return err + } + + if strconv.Itoa(retrieveDroplet.ID) != rs.Primary.ID { + return fmt.Errorf("Droplet not found") + } + + *droplet = *retrieveDroplet + + return nil + } +} + +func TestAccCheckDigitalOceanDropletConfig_basic(rInt int) string { + return fmt.Sprintf(` +resource "digitalocean_droplet" "foobar" { + name = "foo-%d" + size = "s-1vcpu-1gb" + image = "ubuntu-22-04-x64" + region = "nyc3" + user_data = "foobar" +}`, rInt) +} + +func TakeSnapshotsOfDroplet(rInt int, droplet *godo.Droplet, snapshotsId *[]int) resource.TestCheckFunc { + return func(s *terraform.State) error { + client := TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() + for i := 0; i < 3; i++ { + err := takeSnapshotOfDroplet(rInt, i%2, droplet) + if err != nil { + return err + } + } + retrieveDroplet, _, err := client.Droplets.Get(context.Background(), (*droplet).ID) + if err != nil { + return err + } + *snapshotsId = retrieveDroplet.SnapshotIDs + return nil + } +} + +func takeSnapshotOfDroplet(rInt, sInt int, droplet *godo.Droplet) error { + client := TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() + action, _, err := client.DropletActions.Snapshot(context.Background(), (*droplet).ID, fmt.Sprintf("snap-%d-%d", rInt, sInt)) + if err != nil { + return err + } + util.WaitForAction(client, action) + return nil +} + +func DeleteDropletSnapshots(snapshotsId *[]int) resource.TestCheckFunc { + return func(s *terraform.State) error { + log.Printf("Deleting Droplet snapshots") + + client := TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() + + snapshots := *snapshotsId + for _, value := range snapshots { + log.Printf("Deleting %d", value) + _, err := client.Images.Delete(context.Background(), value) + if err != nil { + return err + } + } + return nil + } +} diff --git a/digitalocean/testing.go b/digitalocean/acceptance/test_utils.go similarity index 70% rename from digitalocean/testing.go rename to digitalocean/acceptance/test_utils.go index 90e9559bc..0620ccd59 100644 --- a/digitalocean/testing.go +++ b/digitalocean/acceptance/test_utils.go @@ -1,4 +1,4 @@ -package digitalocean +package acceptance import ( "fmt" @@ -7,7 +7,9 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func testResourceInstanceState(name string, check func(*terraform.InstanceState) error) resource.TestCheckFunc { +// TestResourceInstanceState is a resource.TestCheckFunc to test if a resource is +// present in the instance state. +func TestResourceInstanceState(name string, check func(*terraform.InstanceState) error) resource.TestCheckFunc { return func(s *terraform.State) error { m := s.RootModule() if rs, ok := m.Resources[name]; ok { diff --git a/digitalocean/datasource_digitalocean_account.go b/digitalocean/account/datasource_account.go similarity index 90% rename from digitalocean/datasource_digitalocean_account.go rename to digitalocean/account/datasource_account.go index 699822211..59d0b7045 100644 --- a/digitalocean/datasource_digitalocean_account.go +++ b/digitalocean/account/datasource_account.go @@ -1,13 +1,15 @@ -package digitalocean +package account import ( "context" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanAccount() *schema.Resource { +func DataSourceDigitalOceanAccount() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanAccountRead, Schema: map[string]*schema.Schema{ @@ -51,7 +53,7 @@ func dataSourceDigitalOceanAccount() *schema.Resource { } func dataSourceDigitalOceanAccountRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() account, _, err := client.Account.Get(context.Background()) if err != nil { diff --git a/digitalocean/datasource_digitalocean_account_test.go b/digitalocean/account/datasource_account_test.go similarity index 72% rename from digitalocean/datasource_digitalocean_account_test.go rename to digitalocean/account/datasource_account_test.go index b9dc58fbd..03e8b9e7d 100644 --- a/digitalocean/datasource_digitalocean_account_test.go +++ b/digitalocean/account/datasource_account_test.go @@ -1,16 +1,18 @@ -package digitalocean +package account_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDataSourceDigitalOceanAccount_Basic(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: fmt.Sprintf(testAccCheckDataSourceDigitalOceanAccountConfig_basic), diff --git a/digitalocean/app_spec.go b/digitalocean/app/app_spec.go similarity index 99% rename from digitalocean/app_spec.go rename to digitalocean/app/app_spec.go index c1e962d9f..f98a56f54 100644 --- a/digitalocean/app_spec.go +++ b/digitalocean/app/app_spec.go @@ -1,4 +1,4 @@ -package digitalocean +package app import ( "log" diff --git a/digitalocean/datasource_digitalocean_app.go b/digitalocean/app/datasource_app.go similarity index 95% rename from digitalocean/datasource_digitalocean_app.go rename to digitalocean/app/datasource_app.go index f9b7060e9..5cb5ef5e8 100644 --- a/digitalocean/datasource_digitalocean_app.go +++ b/digitalocean/app/datasource_app.go @@ -1,4 +1,4 @@ -package digitalocean +package app import ( "context" @@ -7,7 +7,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanApp() *schema.Resource { +func DataSourceDigitalOceanApp() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanAppRead, Schema: map[string]*schema.Schema{ diff --git a/digitalocean/datasource_digitalocean_app_test.go b/digitalocean/app/datasource_app_test.go similarity index 94% rename from digitalocean/datasource_digitalocean_app_test.go rename to digitalocean/app/datasource_app_test.go index 66a4129b5..297ac0013 100644 --- a/digitalocean/datasource_digitalocean_app_test.go +++ b/digitalocean/app/datasource_app_test.go @@ -1,16 +1,17 @@ -package digitalocean +package app_test import ( "fmt" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDataSourceDigitalOceanApp_Basic(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() appCreateConfig := fmt.Sprintf(testAccCheckDigitalOceanAppConfig_basic, appName) appDataConfig := fmt.Sprintf(testAccCheckDataSourceDigitalOceanAppConfig, appCreateConfig) @@ -18,8 +19,8 @@ func TestAccDataSourceDigitalOceanApp_Basic(t *testing.T) { updatedAppDataConfig := fmt.Sprintf(testAccCheckDataSourceDigitalOceanAppConfig, updatedAppCreateConfig) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, Steps: []resource.TestStep{ { Config: appCreateConfig, diff --git a/digitalocean/import_digitalocean_app_test.go b/digitalocean/app/import_app_test.go similarity index 61% rename from digitalocean/import_digitalocean_app_test.go rename to digitalocean/app/import_app_test.go index 4318119e1..c69c4d208 100644 --- a/digitalocean/import_digitalocean_app_test.go +++ b/digitalocean/app/import_app_test.go @@ -1,9 +1,10 @@ -package digitalocean +package app_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -11,12 +12,12 @@ func TestAccDigitalOceanApp_importBasic(t *testing.T) { resourceName := "digitalocean_app.foobar" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testAccCheckDigitalOceanCertificateDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, + CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { - Config: fmt.Sprintf(testAccCheckDigitalOceanAppConfig_basic, randomTestName()), + Config: fmt.Sprintf(testAccCheckDigitalOceanAppConfig_basic, acceptance.RandomTestName()), }, { diff --git a/digitalocean/resource_digitalocean_app.go b/digitalocean/app/resource_app.go similarity index 95% rename from digitalocean/resource_digitalocean_app.go rename to digitalocean/app/resource_app.go index 063790545..09e6decbb 100644 --- a/digitalocean/resource_digitalocean_app.go +++ b/digitalocean/app/resource_app.go @@ -1,4 +1,4 @@ -package digitalocean +package app import ( "context" @@ -7,11 +7,12 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func resourceDigitalOceanApp() *schema.Resource { +func ResourceDigitalOceanApp() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanAppCreate, ReadContext: resourceDigitalOceanAppRead, @@ -79,7 +80,7 @@ func resourceDigitalOceanApp() *schema.Resource { } func resourceDigitalOceanAppCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() appCreateRequest := &godo.AppCreateRequest{} appCreateRequest.Spec = expandAppSpec(d.Get("spec").([]interface{})) @@ -103,7 +104,7 @@ func resourceDigitalOceanAppCreate(ctx context.Context, d *schema.ResourceData, } func resourceDigitalOceanAppRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() app, resp, err := client.Apps.Get(context.Background(), d.Id()) if err != nil { @@ -141,7 +142,7 @@ func resourceDigitalOceanAppRead(ctx context.Context, d *schema.ResourceData, me } func resourceDigitalOceanAppUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() if d.HasChange("spec") { appUpdateRequest := &godo.AppUpdateRequest{} @@ -166,7 +167,7 @@ func resourceDigitalOceanAppUpdate(ctx context.Context, d *schema.ResourceData, } func resourceDigitalOceanAppDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting App: %s", d.Id()) _, err := client.Apps.Delete(context.Background(), d.Id()) diff --git a/digitalocean/resource_digitalocean_app_test.go b/digitalocean/app/resource_app_test.go similarity index 94% rename from digitalocean/resource_digitalocean_app_test.go rename to digitalocean/app/resource_app_test.go index 675e4604e..47821af49 100644 --- a/digitalocean/resource_digitalocean_app_test.go +++ b/digitalocean/app/resource_app_test.go @@ -1,60 +1,25 @@ -package digitalocean +package app_test import ( "context" "fmt" - "log" "regexp" - "strings" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_app", &resource.Sweeper{ - Name: "digitalocean_app", - F: testSweepApp, - }) - -} - -func testSweepApp(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListOptions{PerPage: 200} - apps, _, err := client.Apps.List(context.Background(), opt) - if err != nil { - return err - } - - for _, app := range apps { - if strings.HasPrefix(app.Spec.Name, testNamePrefix) { - log.Printf("Destroying app %s", app.Spec.Name) - - if _, err := client.Apps.Delete(context.Background(), app.ID); err != nil { - return err - } - } - } - - return nil -} - func TestAccDigitalOceanApp_Image(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -81,11 +46,11 @@ func TestAccDigitalOceanApp_Image(t *testing.T) { func TestAccDigitalOceanApp_Basic(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -187,11 +152,11 @@ func TestAccDigitalOceanApp_Basic(t *testing.T) { func TestAccDigitalOceanApp_Job(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -224,11 +189,11 @@ func TestAccDigitalOceanApp_Job(t *testing.T) { func TestAccDigitalOceanApp_StaticSite(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -265,11 +230,11 @@ func TestAccDigitalOceanApp_StaticSite(t *testing.T) { func TestAccDigitalOceanApp_InternalPort(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -302,7 +267,7 @@ func TestAccDigitalOceanApp_InternalPort(t *testing.T) { func TestAccDigitalOceanApp_Envs(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() oneEnv := ` env { @@ -363,8 +328,8 @@ func TestAccDigitalOceanApp_Envs(t *testing.T) { ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -481,13 +446,13 @@ func TestAccDigitalOceanApp_Envs(t *testing.T) { func TestAccDigitalOceanApp_Worker(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() workerConfig := fmt.Sprintf(testAccCheckDigitalOceanAppConfig_worker, appName, "basic-xxs") upgradedWorkerConfig := fmt.Sprintf(testAccCheckDigitalOceanAppConfig_worker, appName, "professional-xs") resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -527,7 +492,7 @@ func TestAccDigitalOceanApp_Worker(t *testing.T) { func TestAccDigitalOceanApp_Function(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() fnConfig := fmt.Sprintf(testAccCheckDigitalOceanAppConfig_function, appName, "") corsConfig := ` @@ -544,8 +509,8 @@ func TestAccDigitalOceanApp_Function(t *testing.T) { updatedFnConfig := fmt.Sprintf(testAccCheckDigitalOceanAppConfig_function, appName, corsConfig) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -591,7 +556,7 @@ func TestAccDigitalOceanApp_Function(t *testing.T) { func TestAccDigitalOceanApp_Domain(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() domain := fmt.Sprintf(` domain { @@ -611,8 +576,8 @@ func TestAccDigitalOceanApp_Domain(t *testing.T) { updatedDomainConfig := fmt.Sprintf(testAccCheckDigitalOceanAppConfig_Domains, appName, updatedDomain) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -645,7 +610,7 @@ func TestAccDigitalOceanApp_Domain(t *testing.T) { func TestAccDigitalOceanApp_DomainsDeprecation(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() deprecatedStyleDomain := fmt.Sprintf(` domains = ["%s.com"] @@ -667,8 +632,8 @@ func TestAccDigitalOceanApp_DomainsDeprecation(t *testing.T) { replaceDomainsConfig := fmt.Sprintf(testAccCheckDigitalOceanAppConfig_Domains, appName, newStyleDomain) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -706,7 +671,7 @@ func TestAccDigitalOceanApp_DomainsDeprecation(t *testing.T) { func TestAccDigitalOceanApp_CORS(t *testing.T) { var app godo.App - appName := randomTestName() + appName := acceptance.RandomTestName() allowedOrginExact := ` cors { @@ -759,8 +724,8 @@ func TestAccDigitalOceanApp_CORS(t *testing.T) { ) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -816,11 +781,11 @@ func TestAccDigitalOceanApp_CORS(t *testing.T) { } func TestAccDigitalOceanApp_TimeoutConfig(t *testing.T) { - appName := randomTestName() + appName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanAppDestroy, Steps: []resource.TestStep{ { @@ -832,7 +797,7 @@ func TestAccDigitalOceanApp_TimeoutConfig(t *testing.T) { } func testAccCheckDigitalOceanAppDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_app" { @@ -860,7 +825,7 @@ func testAccCheckDigitalOceanAppExists(n string, app *godo.App) resource.TestChe return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundApp, _, err := client.Apps.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/app/sweep.go b/digitalocean/app/sweep.go new file mode 100644 index 000000000..b9fbb4f00 --- /dev/null +++ b/digitalocean/app/sweep.go @@ -0,0 +1,47 @@ +package app + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_app", &resource.Sweeper{ + Name: "digitalocean_app", + F: sweepApp, + }) + +} + +func sweepApp(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + apps, _, err := client.Apps.List(context.Background(), opt) + if err != nil { + return err + } + + for _, app := range apps { + if strings.HasPrefix(app.Spec.Name, sweep.TestNamePrefix) { + log.Printf("Destroying app %s", app.Spec.Name) + + if _, err := client.Apps.Delete(context.Background(), app.ID); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/resource_digitalocean_cdn.go b/digitalocean/cdn/resource_cdn.go similarity index 91% rename from digitalocean/resource_digitalocean_cdn.go rename to digitalocean/cdn/resource_cdn.go index 64f31f121..bc2bb860d 100644 --- a/digitalocean/resource_digitalocean_cdn.go +++ b/digitalocean/cdn/resource_cdn.go @@ -1,4 +1,4 @@ -package digitalocean +package cdn import ( "context" @@ -6,12 +6,14 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/certificate" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanCDN() *schema.Resource { +func ResourceDigitalOceanCDN() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanCDNCreate, ReadContext: resourceDigitalOceanCDNRead, @@ -105,7 +107,7 @@ func migrateCDNStateV0toV1(ctx context.Context, rawState map[string]interface{}, certID := rawState["certificate_id"].(string) if certID != "" { log.Println("[DEBUG] Migrating CDN schema from v0 to v1.") - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() cert, _, err := client.Certificates.Get(context.Background(), certID) if err != nil { return rawState, err @@ -119,7 +121,7 @@ func migrateCDNStateV0toV1(ctx context.Context, rawState map[string]interface{}, } func resourceDigitalOceanCDNCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() cdnRequest := &godo.CDNCreateRequest{ Origin: d.Get("origin").(string), @@ -136,7 +138,7 @@ func resourceDigitalOceanCDNCreate(ctx context.Context, d *schema.ResourceData, if name, nameOk := d.GetOk("certificate_name"); nameOk { certName := name.(string) if certName != "" { - cert, err := findCertificateByName(client, certName) + cert, err := certificate.FindCertificateByName(client, certName) if err != nil { return diag.FromErr(err) } @@ -151,7 +153,7 @@ func resourceDigitalOceanCDNCreate(ctx context.Context, d *schema.ResourceData, // certificate name as the primary identifier instead. certName := id.(string) if certName != "" { - cert, err := findCertificateByName(client, certName) + cert, err := certificate.FindCertificateByName(client, certName) if err != nil { if strings.Contains(err.Error(), "not found") { log.Println("[DEBUG] Certificate not found looking up by name. Falling back to lookup by ID.") @@ -181,7 +183,7 @@ func resourceDigitalOceanCDNCreate(ctx context.Context, d *schema.ResourceData, } func resourceDigitalOceanCDNRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() cdn, resp, err := client.CDNs.Get(context.Background(), d.Id()) @@ -216,7 +218,7 @@ func resourceDigitalOceanCDNRead(ctx context.Context, d *schema.ResourceData, me } func resourceDigitalOceanCDNUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() d.Partial(true) @@ -239,7 +241,7 @@ func resourceDigitalOceanCDNUpdate(ctx context.Context, d *schema.ResourceData, certName := d.Get("certificate_name").(string) if certName != "" { - cert, err := findCertificateByName(client, certName) + cert, err := certificate.FindCertificateByName(client, certName) if err != nil { return diag.FromErr(err) } @@ -260,7 +262,7 @@ func resourceDigitalOceanCDNUpdate(ctx context.Context, d *schema.ResourceData, } func resourceDigitalOceanCDNDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() resourceId := d.Id() _, err := client.CDNs.Delete(context.Background(), resourceId) diff --git a/digitalocean/resource_digitalocean_cdn_test.go b/digitalocean/cdn/resource_cdn_test.go similarity index 89% rename from digitalocean/resource_digitalocean_cdn_test.go rename to digitalocean/cdn/resource_cdn_test.go index 292d77f3c..d7fd27cc5 100644 --- a/digitalocean/resource_digitalocean_cdn_test.go +++ b/digitalocean/cdn/resource_cdn_test.go @@ -1,10 +1,12 @@ -package digitalocean +package cdn_test import ( "context" "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -21,8 +23,8 @@ func TestAccDigitalOceanCDN_Create(t *testing.T) { expectedTTL := "3600" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanCDNDestroy, Steps: []resource.TestStep{ { @@ -48,8 +50,8 @@ func TestAccDigitalOceanCDN_Create_with_TTL(t *testing.T) { expectedTTL := "600" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanCDNDestroy, Steps: []resource.TestStep{ { @@ -77,8 +79,8 @@ func TestAccDigitalOceanCDN_Create_and_Update(t *testing.T) { expectedTTL := "600" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanCDNDestroy, Steps: []resource.TestStep{ { @@ -105,15 +107,15 @@ func TestAccDigitalOceanCDN_Create_and_Update(t *testing.T) { func TestAccDigitalOceanCDN_CustomDomain(t *testing.T) { spaceName := generateBucketName() - certName := randomTestName() + certName := acceptance.RandomTestName() updatedCertName := generateBucketName() - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" config := testAccCheckDigitalOceanCDNConfig_CustomDomain(domain, spaceName, certName) updatedConfig := testAccCheckDigitalOceanCDNConfig_CustomDomain(domain, spaceName, updatedCertName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanCDNDestroy, ExternalProviders: map[string]resource.ExternalProvider{ "tls": { @@ -147,7 +149,7 @@ func TestAccDigitalOceanCDN_CustomDomain(t *testing.T) { } func testAccCheckDigitalOceanCDNDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { @@ -166,7 +168,7 @@ func testAccCheckDigitalOceanCDNDestroy(s *terraform.State) error { func testAccCheckDigitalOceanCDNExists(resource string) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[resource] diff --git a/digitalocean/datasource_digitalocean_certificate.go b/digitalocean/certificate/datasource_certificate.go similarity index 90% rename from digitalocean/datasource_digitalocean_certificate.go rename to digitalocean/certificate/datasource_certificate.go index 55a60246d..064989b12 100644 --- a/digitalocean/datasource_digitalocean_certificate.go +++ b/digitalocean/certificate/datasource_certificate.go @@ -1,4 +1,4 @@ -package digitalocean +package certificate import ( "context" @@ -6,12 +6,13 @@ import ( "net/http" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanCertificate() *schema.Resource { +func DataSourceDigitalOceanCertificate() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanCertificateRead, Schema: map[string]*schema.Schema{ @@ -65,13 +66,13 @@ func dataSourceDigitalOceanCertificate() *schema.Resource { } func dataSourceDigitalOceanCertificateRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // When the certificate type is lets_encrypt, the certificate // ID will change when it's renewed, so we have to rely on the // certificate name as the primary identifier instead. name := d.Get("name").(string) - cert, err := findCertificateByName(client, name) + cert, err := FindCertificateByName(client, name) if err != nil { return diag.FromErr(err) } @@ -91,7 +92,7 @@ func dataSourceDigitalOceanCertificateRead(ctx context.Context, d *schema.Resour return nil } -func findCertificateByName(client *godo.Client, name string) (*godo.Certificate, error) { +func FindCertificateByName(client *godo.Client, name string) (*godo.Certificate, error) { opts := &godo.ListOptions{ Page: 1, PerPage: 200, diff --git a/digitalocean/datasource_digitalocean_certificate_test.go b/digitalocean/certificate/datasource_certificate_test.go similarity index 74% rename from digitalocean/datasource_digitalocean_certificate_test.go rename to digitalocean/certificate/datasource_certificate_test.go index b5ef42f41..2b274f143 100644 --- a/digitalocean/datasource_digitalocean_certificate_test.go +++ b/digitalocean/certificate/datasource_certificate_test.go @@ -1,10 +1,13 @@ -package digitalocean +package certificate_test import ( "fmt" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/certificate" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -14,11 +17,11 @@ func TestAccDataSourceDigitalOceanCertificate_Basic(t *testing.T) { var certificate godo.Certificate name := fmt.Sprintf("certificate-%s", acctest.RandString(10)) - privateKeyMaterial, leafCertMaterial, certChainMaterial := generateTestCertMaterial(t) + privateKeyMaterial, leafCertMaterial, certChainMaterial := acceptance.GenerateTestCertMaterial(t) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccCheckDataSourceDigitalOceanCertificateConfig_basic(name, privateKeyMaterial, leafCertMaterial, certChainMaterial, false), @@ -39,7 +42,7 @@ func TestAccDataSourceDigitalOceanCertificate_Basic(t *testing.T) { }) } -func testAccCheckDataSourceDigitalOceanCertificateExists(n string, certificate *godo.Certificate) resource.TestCheckFunc { +func testAccCheckDataSourceDigitalOceanCertificateExists(n string, cert *godo.Certificate) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] @@ -51,14 +54,14 @@ func testAccCheckDataSourceDigitalOceanCertificateExists(n string, certificate * return fmt.Errorf("No certificate ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() - foundCertificate, err := findCertificateByName(client, rs.Primary.ID) + foundCertificate, err := certificate.FindCertificateByName(client, rs.Primary.ID) if err != nil { return err } - *certificate = *foundCertificate + *cert = *foundCertificate return nil } diff --git a/digitalocean/import_digitalocean_certificate_test.go b/digitalocean/certificate/import_certificate_test.go similarity index 72% rename from digitalocean/import_digitalocean_certificate_test.go rename to digitalocean/certificate/import_certificate_test.go index 80601e683..88351ce00 100644 --- a/digitalocean/import_digitalocean_certificate_test.go +++ b/digitalocean/certificate/import_certificate_test.go @@ -1,8 +1,9 @@ -package digitalocean +package certificate_test import ( "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -11,11 +12,11 @@ func TestAccDigitalOceanCertificate_importBasic(t *testing.T) { resourceName := "digitalocean_certificate.foobar" rInt := acctest.RandInt() - privateKeyMaterial, leafCertMaterial, certChainMaterial := generateTestCertMaterial(t) + privateKeyMaterial, leafCertMaterial, certChainMaterial := acceptance.GenerateTestCertMaterial(t) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanCertificateDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_certificate.go b/digitalocean/certificate/resource_certificate.go similarity index 91% rename from digitalocean/resource_digitalocean_certificate.go rename to digitalocean/certificate/resource_certificate.go index 5fd068d1e..4a0d90e12 100644 --- a/digitalocean/resource_digitalocean_certificate.go +++ b/digitalocean/certificate/resource_certificate.go @@ -1,4 +1,4 @@ -package digitalocean +package certificate import ( "context" @@ -7,13 +7,15 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanCertificate() *schema.Resource { +func ResourceDigitalOceanCertificate() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanCertificateCreate, ReadContext: resourceDigitalOceanCertificateRead, @@ -28,7 +30,7 @@ func resourceDigitalOceanCertificate() *schema.Resource { StateUpgraders: []schema.StateUpgrader{ { Type: resourceDigitalOceanCertificateV0().CoreConfigSchema().ImpliedType(), - Upgrade: migrateCertificateStateV0toV1, + Upgrade: MigrateCertificateStateV0toV1, Version: 0, }, }, @@ -68,7 +70,7 @@ func resourceDigitalOceanCertificateV0() *schema.Resource { Sensitive: true, ForceNew: true, ValidateFunc: validation.NoZeroValues, - StateFunc: HashStringStateFunc(), + StateFunc: util.HashStringStateFunc(), // In order to support older statefiles with fully saved private_key DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return new != "" && old == d.Get("private_key") @@ -80,7 +82,7 @@ func resourceDigitalOceanCertificateV0() *schema.Resource { Optional: true, ForceNew: true, ValidateFunc: validation.NoZeroValues, - StateFunc: HashStringStateFunc(), + StateFunc: util.HashStringStateFunc(), // In order to support older statefiles with fully saved leaf_certificate DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return new != "" && old == d.Get("leaf_certificate") @@ -92,7 +94,7 @@ func resourceDigitalOceanCertificateV0() *schema.Resource { Optional: true, ForceNew: true, ValidateFunc: validation.NoZeroValues, - StateFunc: HashStringStateFunc(), + StateFunc: util.HashStringStateFunc(), // In order to support older statefiles with fully saved certificate_chain DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return new != "" && old == d.Get("certificate_chain") @@ -143,7 +145,7 @@ func resourceDigitalOceanCertificateV0() *schema.Resource { } } -func migrateCertificateStateV0toV1(ctx context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) { +func MigrateCertificateStateV0toV1(ctx context.Context, rawState map[string]interface{}, meta interface{}) (map[string]interface{}, error) { if len(rawState) == 0 { log.Println("[DEBUG] Empty state; nothing to migrate.") return rawState, nil @@ -183,7 +185,7 @@ func buildCertificateRequest(d *schema.ResourceData) (*godo.CertificateRequest, } func resourceDigitalOceanCertificateCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() certificateType := d.Get("type").(string) if certificateType == "custom" { @@ -241,13 +243,13 @@ func resourceDigitalOceanCertificateCreate(ctx context.Context, d *schema.Resour } func resourceDigitalOceanCertificateRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // When the certificate type is lets_encrypt, the certificate // ID will change when it's renewed, so we have to rely on the // certificate name as the primary identifier instead. log.Printf("[INFO] Reading the details of the Certificate %s", d.Id()) - cert, err := findCertificateByName(client, d.Id()) + cert, err := FindCertificateByName(client, d.Id()) if err != nil { return diag.Errorf("Error retrieving Certificate: %s", err) } @@ -275,10 +277,10 @@ func resourceDigitalOceanCertificateRead(ctx context.Context, d *schema.Resource } func resourceDigitalOceanCertificateDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting Certificate: %s", d.Id()) - cert, err := findCertificateByName(client, d.Id()) + cert, err := FindCertificateByName(client, d.Id()) if err != nil { return diag.Errorf("Error retrieving Certificate: %s", err) } @@ -320,7 +322,7 @@ func flattenDigitalOceanCertificateDomains(domains []string) *schema.Set { } func newCertificateStateRefreshFunc(d *schema.ResourceData, meta interface{}) resource.StateRefreshFunc { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() return func() (interface{}, string, error) { // Retrieve the certificate properties diff --git a/digitalocean/resource_digitalocean_certificate_test.go b/digitalocean/certificate/resource_certificate_test.go similarity index 53% rename from digitalocean/resource_digitalocean_certificate_test.go rename to digitalocean/certificate/resource_certificate_test.go index d83cdbde7..3b900e1b5 100644 --- a/digitalocean/resource_digitalocean_certificate_test.go +++ b/digitalocean/certificate/resource_certificate_test.go @@ -1,63 +1,23 @@ -package digitalocean +package certificate_test import ( - "bytes" "context" - crand "crypto/rand" - "crypto/rsa" - "crypto/x509" - "crypto/x509/pkix" - "encoding/pem" "fmt" - "log" - "math/big" "reflect" "regexp" "strings" "testing" - "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/certificate" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_certificate", &resource.Sweeper{ - Name: "digitalocean_certificate", - F: testSweepCertificate, - }) - -} - -func testSweepCertificate(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListOptions{PerPage: 200} - certs, _, err := client.Certificates.List(context.Background(), opt) - if err != nil { - return err - } - - for _, c := range certs { - if strings.HasPrefix(c.Name, "certificate-") { - log.Printf("Destroying certificate %s", c.Name) - - if _, err := client.Certificates.Delete(context.Background(), c.ID); err != nil { - return err - } - } - } - - return nil -} - func testCertificateStateDataV0() map[string]interface{} { return map[string]interface{}{ "name": "test", @@ -76,7 +36,7 @@ func testCertificateStateDataV1() map[string]interface{} { func TestResourceExampleInstanceStateUpgradeV0(t *testing.T) { expected := testCertificateStateDataV1() - actual, err := migrateCertificateStateV0toV1(context.Background(), testCertificateStateDataV0(), nil) + actual, err := certificate.MigrateCertificateStateV0toV1(context.Background(), testCertificateStateDataV0(), nil) if err != nil { t.Fatalf("error migrating state: %s", err) } @@ -90,11 +50,11 @@ func TestAccDigitalOceanCertificate_Basic(t *testing.T) { var cert godo.Certificate rInt := acctest.RandInt() name := fmt.Sprintf("certificate-%d", rInt) - privateKeyMaterial, leafCertMaterial, certChainMaterial := generateTestCertMaterial(t) + privateKeyMaterial, leafCertMaterial, certChainMaterial := acceptance.GenerateTestCertMaterial(t) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanCertificateDestroy, Steps: []resource.TestStep{ { @@ -106,11 +66,11 @@ func TestAccDigitalOceanCertificate_Basic(t *testing.T) { resource.TestCheckResourceAttr( "digitalocean_certificate.foobar", "name", name), resource.TestCheckResourceAttr( - "digitalocean_certificate.foobar", "private_key", HashString(fmt.Sprintf("%s\n", privateKeyMaterial))), + "digitalocean_certificate.foobar", "private_key", util.HashString(fmt.Sprintf("%s\n", privateKeyMaterial))), resource.TestCheckResourceAttr( - "digitalocean_certificate.foobar", "leaf_certificate", HashString(fmt.Sprintf("%s\n", leafCertMaterial))), + "digitalocean_certificate.foobar", "leaf_certificate", util.HashString(fmt.Sprintf("%s\n", leafCertMaterial))), resource.TestCheckResourceAttr( - "digitalocean_certificate.foobar", "certificate_chain", HashString(fmt.Sprintf("%s\n", certChainMaterial))), + "digitalocean_certificate.foobar", "certificate_chain", util.HashString(fmt.Sprintf("%s\n", certChainMaterial))), ), }, }, @@ -119,11 +79,11 @@ func TestAccDigitalOceanCertificate_Basic(t *testing.T) { func TestAccDigitalOceanCertificate_ExpectedErrors(t *testing.T) { rInt := acctest.RandInt() - privateKeyMaterial, leafCertMaterial, certChainMaterial := generateTestCertMaterial(t) + privateKeyMaterial, leafCertMaterial, certChainMaterial := acceptance.GenerateTestCertMaterial(t) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanCertificateDestroy, Steps: []resource.TestStep{ { @@ -143,14 +103,14 @@ func TestAccDigitalOceanCertificate_ExpectedErrors(t *testing.T) { } func testAccCheckDigitalOceanCertificateDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_certificate" { continue } - _, err := findCertificateByName(client, rs.Primary.ID) + _, err := certificate.FindCertificateByName(client, rs.Primary.ID) if err != nil && !strings.Contains(err.Error(), "not found") { return fmt.Errorf( @@ -173,9 +133,9 @@ func testAccCheckDigitalOceanCertificateExists(n string, cert *godo.Certificate) return fmt.Errorf("No Certificate ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() - c, err := findCertificateByName(client, rs.Primary.ID) + c, err := certificate.FindCertificateByName(client, rs.Primary.ID) if err != nil { return err } @@ -186,77 +146,6 @@ func testAccCheckDigitalOceanCertificateExists(n string, cert *godo.Certificate) } } -func generateTestCertMaterial(t *testing.T) (string, string, string) { - leafCertMaterial, privateKeyMaterial, err := randTLSCert("Acme Co", "example.com") - if err != nil { - t.Fatalf("Cannot generate test TLS certificate: %s", err) - } - rootCertMaterial, _, err := randTLSCert("Acme Go", "example.com") - if err != nil { - t.Fatalf("Cannot generate test TLS certificate: %s", err) - } - certChainMaterial := fmt.Sprintf("%s\n%s", strings.TrimSpace(rootCertMaterial), leafCertMaterial) - - return privateKeyMaterial, leafCertMaterial, certChainMaterial -} - -// Based on Terraform's acctest.RandTLSCert, but allows for passing DNS name. -func randTLSCert(orgName string, dnsName string) (string, string, error) { - template := &x509.Certificate{ - SerialNumber: big.NewInt(int64(acctest.RandInt())), - Subject: pkix.Name{ - Organization: []string{orgName}, - }, - NotBefore: time.Now(), - NotAfter: time.Now().Add(24 * time.Hour), - KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, - ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, - BasicConstraintsValid: true, - DNSNames: []string{dnsName}, - } - - privateKey, privateKeyPEM, err := genPrivateKey() - if err != nil { - return "", "", err - } - - cert, err := x509.CreateCertificate(crand.Reader, template, template, &privateKey.PublicKey, privateKey) - if err != nil { - return "", "", err - } - - certPEM, err := pemEncode(cert, "CERTIFICATE") - if err != nil { - return "", "", err - } - - return certPEM, privateKeyPEM, nil -} - -func genPrivateKey() (*rsa.PrivateKey, string, error) { - privateKey, err := rsa.GenerateKey(crand.Reader, 2048) - if err != nil { - return nil, "", err - } - - privateKeyPEM, err := pemEncode(x509.MarshalPKCS1PrivateKey(privateKey), "RSA PRIVATE KEY") - if err != nil { - return nil, "", err - } - - return privateKey, privateKeyPEM, nil -} - -func pemEncode(b []byte, block string) (string, error) { - var buf bytes.Buffer - pb := &pem.Block{Type: block, Bytes: b} - if err := pem.Encode(&buf, pb); err != nil { - return "", err - } - - return buf.String(), nil -} - func testAccCheckDigitalOceanCertificateConfig_basic(rInt int, privateKeyMaterial, leafCert, certChain string) string { return fmt.Sprintf(` resource "digitalocean_certificate" "foobar" { diff --git a/digitalocean/certificate/sweep.go b/digitalocean/certificate/sweep.go new file mode 100644 index 000000000..b73da5c85 --- /dev/null +++ b/digitalocean/certificate/sweep.go @@ -0,0 +1,47 @@ +package certificate + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_certificate", &resource.Sweeper{ + Name: "digitalocean_certificate", + F: sweepCertificate, + }) + +} + +func sweepCertificate(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + certs, _, err := client.Certificates.List(context.Background(), opt) + if err != nil { + return err + } + + for _, c := range certs { + if strings.HasPrefix(c.Name, "certificate-") { + log.Printf("Destroying certificate %s", c.Name) + + if _, err := client.Certificates.Delete(context.Background(), c.ID); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/config.go b/digitalocean/config/config.go similarity index 62% rename from digitalocean/config.go rename to digitalocean/config/config.go index 12735ae3f..87aa994ae 100644 --- a/digitalocean/config.go +++ b/digitalocean/config/config.go @@ -1,20 +1,17 @@ -package digitalocean +package config import ( - "context" "fmt" + "html/template" "log" "net/url" "strings" - "text/template" - "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/digitalocean/godo" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/logging" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "golang.org/x/oauth2" ) @@ -34,9 +31,9 @@ type CombinedConfig struct { secretKey string } -func (c *CombinedConfig) godoClient() *godo.Client { return c.client } +func (c *CombinedConfig) GodoClient() *godo.Client { return c.client } -func (c *CombinedConfig) spacesClient(region string) (*session.Session, error) { +func (c *CombinedConfig) SpacesClient(region string) (*session.Session, error) { if c.accessID == "" || c.secretKey == "" { err := fmt.Errorf("Spaces credentials not configured") return &session.Session{}, err @@ -99,47 +96,3 @@ func (c *Config) Client() (*CombinedConfig, error) { secretKey: c.SecretKey, }, nil } - -// waitForAction waits for the action to finish using the resource.StateChangeConf. -func waitForAction(client *godo.Client, action *godo.Action) error { - var ( - pending = "in-progress" - target = "completed" - refreshfn = func() (result interface{}, state string, err error) { - a, _, err := client.Actions.Get(context.Background(), action.ID) - if err != nil { - return nil, "", err - } - if a.Status == "errored" { - return a, "errored", nil - } - if a.CompletedAt != nil { - return a, target, nil - } - return a, pending, nil - } - ) - _, err := (&resource.StateChangeConf{ - Pending: []string{pending}, - Refresh: refreshfn, - Target: []string{target}, - - Delay: 10 * time.Second, - Timeout: 60 * time.Minute, - MinTimeout: 3 * time.Second, - - // This is a hack around DO API strangeness. - // https://github.com/hashicorp/terraform/issues/481 - // - NotFoundChecks: 60, - }).WaitForState() - return err -} - -func isDigitalOceanError(err error, code int, message string) bool { - if err, ok := err.(*godo.ErrorResponse); ok { - return err.Response.StatusCode == code && - strings.Contains(strings.ToLower(err.Message), strings.ToLower(message)) - } - return false -} diff --git a/digitalocean/datasource_digitalocean_database_ca.go b/digitalocean/database/datasource_database_ca.go similarity index 82% rename from digitalocean/datasource_digitalocean_database_ca.go rename to digitalocean/database/datasource_database_ca.go index c90cdf6b6..5aca8f1b0 100644 --- a/digitalocean/datasource_digitalocean_database_ca.go +++ b/digitalocean/database/datasource_database_ca.go @@ -1,14 +1,15 @@ -package digitalocean +package database import ( "context" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanDatabaseCA() *schema.Resource { +func DataSourceDigitalOceanDatabaseCA() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanDatabaseCARead, Schema: map[string]*schema.Schema{ @@ -27,7 +28,7 @@ func dataSourceDigitalOceanDatabaseCA() *schema.Resource { } func dataSourceDigitalOceanDatabaseCARead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) d.SetId(clusterID) diff --git a/digitalocean/datasource_digitalocean_database_ca_test.go b/digitalocean/database/datasource_database_ca_test.go similarity index 87% rename from digitalocean/datasource_digitalocean_database_ca_test.go rename to digitalocean/database/datasource_database_ca_test.go index 614515fa4..d72e854f2 100644 --- a/digitalocean/datasource_digitalocean_database_ca_test.go +++ b/digitalocean/database/datasource_database_ca_test.go @@ -1,4 +1,4 @@ -package digitalocean +package database_test import ( "crypto/x509" @@ -7,18 +7,19 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceDigitalOceanDatabaseCA(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() databaseConfig := fmt.Sprintf(testAccCheckDigitalOceanDatabaseClusterConfigMongoDB, databaseName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseReplicaDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/datasource_digitalocean_database_cluster.go b/digitalocean/database/datasource_database_cluster.go similarity index 90% rename from digitalocean/datasource_digitalocean_database_cluster.go rename to digitalocean/database/datasource_database_cluster.go index e4d4a9f92..a920159c5 100644 --- a/digitalocean/datasource_digitalocean_database_cluster.go +++ b/digitalocean/database/datasource_database_cluster.go @@ -1,15 +1,17 @@ -package digitalocean +package database import ( "context" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanDatabaseCluster() *schema.Resource { +func DataSourceDigitalOceanDatabaseCluster() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanDatabaseClusterRead, Schema: map[string]*schema.Schema{ @@ -115,13 +117,13 @@ func dataSourceDigitalOceanDatabaseCluster() *schema.Resource { Computed: true, }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), }, } } func dataSourceDigitalOceanDatabaseClusterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() name := d.Get("name").(string) @@ -166,7 +168,7 @@ func dataSourceDigitalOceanDatabaseClusterRead(ctx context.Context, d *schema.Re d.Set("size", db.SizeSlug) d.Set("region", db.RegionSlug) d.Set("node_count", db.NumNodes) - d.Set("tags", flattenTags(db.Tags)) + d.Set("tags", tag.FlattenTags(db.Tags)) if _, ok := d.GetOk("maintenance_window"); ok { if err := d.Set("maintenance_window", flattenMaintWindowOpts(*db.MaintenanceWindow)); err != nil { diff --git a/digitalocean/datasource_digitalocean_database_cluster_test.go b/digitalocean/database/datasource_database_cluster_test.go similarity index 89% rename from digitalocean/datasource_digitalocean_database_cluster_test.go rename to digitalocean/database/datasource_database_cluster_test.go index dfc4720da..a65a610ae 100644 --- a/digitalocean/datasource_digitalocean_database_cluster_test.go +++ b/digitalocean/database/datasource_database_cluster_test.go @@ -1,4 +1,4 @@ -package digitalocean +package database_test import ( "context" @@ -6,6 +6,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -16,8 +18,8 @@ func TestAccDataSourceDigitalOceanDatabaseCluster_Basic(t *testing.T) { databaseName := fmt.Sprintf("foobar-test-terraform-%s", acctest.RandString(10)) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: fmt.Sprintf(testAccCheckDataSourceDigitalOceanDatabaseClusterConfigBasic, databaseName), @@ -64,7 +66,7 @@ func testAccCheckDataSourceDigitalOceanDatabaseClusterExists(n string, databaseC return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundCluster, _, err := client.Databases.Get(context.Background(), rs.Primary.ID) if err != nil { diff --git a/digitalocean/datasource_digitalocean_database_replica.go b/digitalocean/database/datasource_database_replica.go similarity index 85% rename from digitalocean/datasource_digitalocean_database_replica.go rename to digitalocean/database/datasource_database_replica.go index 515a18d13..3cfdbf152 100644 --- a/digitalocean/datasource_digitalocean_database_replica.go +++ b/digitalocean/database/datasource_database_replica.go @@ -1,14 +1,16 @@ -package digitalocean +package database import ( "context" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanDatabaseReplica() *schema.Resource { +func DataSourceDigitalOceanDatabaseReplica() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanDatabaseReplicaRead, Schema: map[string]*schema.Schema{ @@ -82,9 +84,9 @@ func dataSourceDigitalOceanDatabaseReplica() *schema.Resource { Optional: true, Elem: &schema.Schema{ Type: schema.TypeString, - ValidateFunc: validateTag, + ValidateFunc: tag.ValidateTag, }, - Set: HashStringIgnoreCase, + Set: util.HashStringIgnoreCase, }, }, } diff --git a/digitalocean/datasource_digitalocean_database_replica_test.go b/digitalocean/database/datasource_database_replica_test.go similarity index 91% rename from digitalocean/datasource_digitalocean_database_replica_test.go rename to digitalocean/database/datasource_database_replica_test.go index 236203209..4526fd176 100644 --- a/digitalocean/datasource_digitalocean_database_replica_test.go +++ b/digitalocean/database/datasource_database_replica_test.go @@ -1,4 +1,4 @@ -package digitalocean +package database_test import ( "fmt" @@ -6,6 +6,7 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -14,16 +15,16 @@ func TestAccDataSourceDigitalOceanDatabaseReplica_Basic(t *testing.T) { var databaseReplica godo.DatabaseReplica var database godo.Database - databaseName := randomTestName() - databaseReplicaName := randomTestName() + databaseName := acceptance.RandomTestName() + databaseReplicaName := acceptance.RandomTestName() databaseConfig := fmt.Sprintf(testAccCheckDigitalOceanDatabaseClusterConfigBasic, databaseName) replicaConfig := fmt.Sprintf(testAccCheckDigitalOceanDatabaseReplicaConfigBasic, databaseReplicaName) datasourceReplicaConfig := fmt.Sprintf(testAccCheckDigitalOceanDatasourceDatabaseReplicaConfigBasic, databaseReplicaName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseReplicaDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_database_connection_pool_test.go b/digitalocean/database/import_database_connection_pool_test.go similarity index 84% rename from digitalocean/import_digitalocean_database_connection_pool_test.go rename to digitalocean/database/import_database_connection_pool_test.go index a982cdd0b..f630747e0 100644 --- a/digitalocean/import_digitalocean_database_connection_pool_test.go +++ b/digitalocean/database/import_database_connection_pool_test.go @@ -1,22 +1,23 @@ -package digitalocean +package database_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanDatabaseConnectionPool_importBasic(t *testing.T) { resourceName := "digitalocean_database_connection_pool.pool-01" - databaseName := randomTestName() - databaseConnectionPoolName := randomTestName() + databaseName := acceptance.RandomTestName() + databaseConnectionPoolName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseConnectionPoolDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_database_db_test.go b/digitalocean/database/import_database_db_test.go similarity index 89% rename from digitalocean/import_digitalocean_database_db_test.go rename to digitalocean/database/import_database_db_test.go index d6c62a572..f61a9a3cd 100644 --- a/digitalocean/import_digitalocean_database_db_test.go +++ b/digitalocean/database/import_database_db_test.go @@ -1,10 +1,11 @@ -package digitalocean +package database_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -16,8 +17,8 @@ func TestAccDigitalOceanDatabaseDB_importBasic(t *testing.T) { databaseDBName := fmt.Sprintf("foobar-test-db-terraform-%s", acctest.RandString(10)) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseDBDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_database_firewall_test.go b/digitalocean/database/import_database_firewall_test.go similarity index 86% rename from digitalocean/import_digitalocean_database_firewall_test.go rename to digitalocean/database/import_database_firewall_test.go index 3b2bce08d..4d5addde9 100644 --- a/digitalocean/import_digitalocean_database_firewall_test.go +++ b/digitalocean/database/import_database_firewall_test.go @@ -1,21 +1,22 @@ -package digitalocean +package database_test import ( "fmt" "strings" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanDatabaseFirewall_importBasic(t *testing.T) { resourceName := "digitalocean_database_firewall.example" - databaseClusterName := randomTestName() + databaseClusterName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseFirewallDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_database_replica_test.go b/digitalocean/database/import_database_replica_test.go similarity index 87% rename from digitalocean/import_digitalocean_database_replica_test.go rename to digitalocean/database/import_database_replica_test.go index 59b0998d4..82779ea61 100644 --- a/digitalocean/import_digitalocean_database_replica_test.go +++ b/digitalocean/database/import_database_replica_test.go @@ -1,4 +1,4 @@ -package digitalocean +package database_test import ( "fmt" @@ -6,6 +6,7 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -13,15 +14,15 @@ import ( func TestAccDigitalOceanDatabaseReplica_importBasic(t *testing.T) { var database godo.Database resourceName := "digitalocean_database_replica.read-01" - databaseName := randomTestName() - databaseReplicaName := randomTestName() + databaseName := acceptance.RandomTestName() + databaseReplicaName := acceptance.RandomTestName() databaseConfig := fmt.Sprintf(testAccCheckDigitalOceanDatabaseClusterConfigBasic, databaseName) replicaConfig := fmt.Sprintf(testAccCheckDigitalOceanDatabaseReplicaConfigBasic, databaseReplicaName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseReplicaDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_database_user_test.go b/digitalocean/database/import_database_user_test.go similarity index 84% rename from digitalocean/import_digitalocean_database_user_test.go rename to digitalocean/database/import_database_user_test.go index f5ba0ad00..f42aa7e3f 100644 --- a/digitalocean/import_digitalocean_database_user_test.go +++ b/digitalocean/database/import_database_user_test.go @@ -1,22 +1,23 @@ -package digitalocean +package database_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanDatabaseUser_importBasic(t *testing.T) { resourceName := "digitalocean_database_user.foobar_user" - databaseClusterName := randomTestName() - databaseUserName := randomTestName() + databaseClusterName := acceptance.RandomTestName() + databaseUserName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseUserDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_database_cluster.go b/digitalocean/database/resource_database_cluster.go similarity index 96% rename from digitalocean/resource_digitalocean_database_cluster.go rename to digitalocean/database/resource_database_cluster.go index ab1f02c1b..95eabad61 100644 --- a/digitalocean/resource_digitalocean_database_cluster.go +++ b/digitalocean/database/resource_database_cluster.go @@ -1,4 +1,4 @@ -package digitalocean +package database import ( "context" @@ -10,6 +10,8 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -22,7 +24,7 @@ const ( redisDBEngineSlug = "redis" ) -func resourceDigitalOceanDatabaseCluster() *schema.Resource { +func ResourceDigitalOceanDatabaseCluster() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanDatabaseClusterCreate, ReadContext: resourceDigitalOceanDatabaseClusterRead, @@ -180,7 +182,7 @@ func resourceDigitalOceanDatabaseCluster() *schema.Resource { Computed: true, }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), }, Timeouts: &schema.ResourceTimeout{ @@ -231,7 +233,7 @@ func validateExclusiveAttributes() schema.CustomizeDiffFunc { } func resourceDigitalOceanDatabaseClusterCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() opts := &godo.DatabaseCreateRequest{ Name: d.Get("name").(string), @@ -240,7 +242,7 @@ func resourceDigitalOceanDatabaseClusterCreate(ctx context.Context, d *schema.Re SizeSlug: d.Get("size").(string), Region: d.Get("region").(string), NumNodes: d.Get("node_count").(int), - Tags: expandTags(d.Get("tags").(*schema.Set).List()), + Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()), } if v, ok := d.GetOk("private_network_uuid"); ok { @@ -305,7 +307,7 @@ func resourceDigitalOceanDatabaseClusterCreate(ctx context.Context, d *schema.Re } func resourceDigitalOceanDatabaseClusterUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() if d.HasChanges("size", "node_count") { opts := &godo.DatabaseResizeRequest{ @@ -401,7 +403,7 @@ func resourceDigitalOceanDatabaseClusterUpdate(ctx context.Context, d *schema.Re } if d.HasChange("tags") { - err := setTags(client, d, godo.DatabaseResourceType) + err := tag.SetTags(client, d, godo.DatabaseResourceType) if err != nil { return diag.Errorf("Error updating tags: %s", err) } @@ -411,7 +413,7 @@ func resourceDigitalOceanDatabaseClusterUpdate(ctx context.Context, d *schema.Re } func resourceDigitalOceanDatabaseClusterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() database, resp, err := client.Databases.Get(context.Background(), d.Id()) if err != nil { @@ -431,7 +433,7 @@ func resourceDigitalOceanDatabaseClusterRead(ctx context.Context, d *schema.Reso d.Set("size", database.SizeSlug) d.Set("region", database.RegionSlug) d.Set("node_count", database.NumNodes) - d.Set("tags", flattenTags(database.Tags)) + d.Set("tags", tag.FlattenTags(database.Tags)) if _, ok := d.GetOk("maintenance_window"); ok { if err := d.Set("maintenance_window", flattenMaintWindowOpts(*database.MaintenanceWindow)); err != nil { @@ -469,7 +471,7 @@ func resourceDigitalOceanDatabaseClusterRead(ctx context.Context, d *schema.Reso } func resourceDigitalOceanDatabaseClusterDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting database cluster: %s", d.Id()) _, err := client.Databases.Delete(context.Background(), d.Id()) diff --git a/digitalocean/resource_digitalocean_database_cluster_test.go b/digitalocean/database/resource_database_cluster_test.go similarity index 88% rename from digitalocean/resource_digitalocean_database_cluster_test.go rename to digitalocean/database/resource_database_cluster_test.go index 6b60f3fa7..3ac436767 100644 --- a/digitalocean/resource_digitalocean_database_cluster_test.go +++ b/digitalocean/database/resource_database_cluster_test.go @@ -1,61 +1,26 @@ -package digitalocean +package database_test import ( "context" "fmt" - "log" "net/url" "regexp" - "strings" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_database_cluster", &resource.Sweeper{ - Name: "digitalocean_database_cluster", - F: testSweepDatabaseCluster, - }) - -} - -func testSweepDatabaseCluster(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListOptions{PerPage: 200} - databases, _, err := client.Databases.List(context.Background(), opt) - if err != nil { - return err - } - - for _, db := range databases { - if strings.HasPrefix(db.Name, testNamePrefix) { - log.Printf("Destroying database cluster %s", db.Name) - - if _, err := client.Databases.Delete(context.Background(), db.ID); err != nil { - return err - } - } - } - - return nil -} - func TestAccDigitalOceanDatabaseCluster_Basic(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -99,11 +64,11 @@ func TestAccDigitalOceanDatabaseCluster_Basic(t *testing.T) { func TestAccDigitalOceanDatabaseCluster_WithUpdate(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -130,11 +95,11 @@ func TestAccDigitalOceanDatabaseCluster_WithUpdate(t *testing.T) { func TestAccDigitalOceanDatabaseCluster_WithMigration(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -161,11 +126,11 @@ func TestAccDigitalOceanDatabaseCluster_WithMigration(t *testing.T) { func TestAccDigitalOceanDatabaseCluster_WithMaintWindow(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -185,11 +150,11 @@ func TestAccDigitalOceanDatabaseCluster_WithMaintWindow(t *testing.T) { func TestAccDigitalOceanDatabaseCluster_WithSQLMode(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -217,11 +182,11 @@ func TestAccDigitalOceanDatabaseCluster_WithSQLMode(t *testing.T) { } func TestAccDigitalOceanDatabaseCluster_CheckSQLModeSupport(t *testing.T) { - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -234,11 +199,11 @@ func TestAccDigitalOceanDatabaseCluster_CheckSQLModeSupport(t *testing.T) { func TestAccDigitalOceanDatabaseCluster_RedisNoVersion(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -274,11 +239,11 @@ func TestAccDigitalOceanDatabaseCluster_oldRedisVersion(t *testing.T) { redisVersion string ) - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -287,7 +252,7 @@ func TestAccDigitalOceanDatabaseCluster_oldRedisVersion(t *testing.T) { // Fetch the Databases Options and get the current supported version of // Redis from the response. func(*terraform.State) error { - client = testAccProvider.Meta().(*CombinedConfig).godoClient() + client = acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() options, _, err := client.Databases.ListOptions(context.Background()) if err != nil { t.Error("Error fetching database options") @@ -311,11 +276,11 @@ func TestAccDigitalOceanDatabaseCluster_oldRedisVersion(t *testing.T) { func TestAccDigitalOceanDatabaseCluster_RedisWithEvictionPolicy(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ // Create with an eviction policy @@ -351,11 +316,11 @@ func TestAccDigitalOceanDatabaseCluster_RedisWithEvictionPolicy(t *testing.T) { } func TestAccDigitalOceanDatabaseCluster_CheckEvictionPolicySupport(t *testing.T) { - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -368,11 +333,11 @@ func TestAccDigitalOceanDatabaseCluster_CheckEvictionPolicySupport(t *testing.T) func TestAccDigitalOceanDatabaseCluster_TagUpdate(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -399,12 +364,12 @@ func TestAccDigitalOceanDatabaseCluster_TagUpdate(t *testing.T) { func TestAccDigitalOceanDatabaseCluster_WithVPC(t *testing.T) { var database godo.Database - vpcName := randomTestName() - databaseName := randomTestName() + vpcName := acceptance.RandomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -422,11 +387,11 @@ func TestAccDigitalOceanDatabaseCluster_WithVPC(t *testing.T) { func TestAccDigitalOceanDatabaseCluster_MongoDBPassword(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -448,13 +413,13 @@ func TestAccDigitalOceanDatabaseCluster_MongoDBPassword(t *testing.T) { func TestAccDigitalOceanDatabaseCluster_Upgrade(t *testing.T) { var database godo.Database - databaseName := randomTestName() + databaseName := acceptance.RandomTestName() previousPGVersion := "13" latestPGVersion := "14" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -484,7 +449,7 @@ func TestAccDigitalOceanDatabaseCluster_Upgrade(t *testing.T) { } func testAccCheckDigitalOceanDatabaseClusterDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_database_cluster" { @@ -525,7 +490,7 @@ func testAccCheckDigitalOceanDatabaseClusterExists(n string, database *godo.Data return fmt.Errorf("No DatabaseCluster ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundDatabaseCluster, _, err := client.Databases.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/resource_digitalocean_database_connection_pool.go b/digitalocean/database/resource_database_connection_pool.go similarity index 94% rename from digitalocean/resource_digitalocean_database_connection_pool.go rename to digitalocean/database/resource_database_connection_pool.go index c39e4e702..cf31475a4 100644 --- a/digitalocean/resource_digitalocean_database_connection_pool.go +++ b/digitalocean/database/resource_database_connection_pool.go @@ -1,4 +1,4 @@ -package digitalocean +package database import ( "context" @@ -8,12 +8,13 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanDatabaseConnectionPool() *schema.Resource { +func ResourceDigitalOceanDatabaseConnectionPool() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanDatabaseConnectionPoolCreate, ReadContext: resourceDigitalOceanDatabaseConnectionPoolRead, @@ -105,7 +106,7 @@ func resourceDigitalOceanDatabaseConnectionPool() *schema.Resource { } func resourceDigitalOceanDatabaseConnectionPoolCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) opts := &godo.DatabaseCreatePoolRequest{ @@ -129,7 +130,7 @@ func resourceDigitalOceanDatabaseConnectionPoolCreate(ctx context.Context, d *sc } func resourceDigitalOceanDatabaseConnectionPoolRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID, poolName := splitConnectionPoolID(d.Id()) pool, resp, err := client.Databases.GetPool(context.Background(), clusterID, poolName) @@ -177,7 +178,7 @@ func resourceDigitalOceanDatabaseConnectionPoolImport(d *schema.ResourceData, me } func resourceDigitalOceanDatabaseConnectionPoolDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID, poolName := splitConnectionPoolID(d.Id()) log.Printf("[INFO] Deleting DatabaseConnectionPool: %s", poolName) diff --git a/digitalocean/resource_digitalocean_database_connection_pool_test.go b/digitalocean/database/resource_database_connection_pool_test.go similarity index 89% rename from digitalocean/resource_digitalocean_database_connection_pool_test.go rename to digitalocean/database/resource_database_connection_pool_test.go index 73b076e0d..ede7c4fd1 100644 --- a/digitalocean/resource_digitalocean_database_connection_pool_test.go +++ b/digitalocean/database/resource_database_connection_pool_test.go @@ -1,4 +1,4 @@ -package digitalocean +package database_test import ( "context" @@ -7,18 +7,20 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanDatabaseConnectionPool_Basic(t *testing.T) { var databaseConnectionPool godo.DatabasePool - databaseName := randomTestName() - databaseConnectionPoolName := randomTestName() + databaseName := acceptance.RandomTestName() + databaseConnectionPoolName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseConnectionPoolDestroy, Steps: []resource.TestStep{ { @@ -72,12 +74,12 @@ func TestAccDigitalOceanDatabaseConnectionPool_Basic(t *testing.T) { func TestAccDigitalOceanDatabaseConnectionPool_InboundUser(t *testing.T) { var databaseConnectionPool godo.DatabasePool - databaseName := randomTestName() - databaseConnectionPoolName := randomTestName() + databaseName := acceptance.RandomTestName() + databaseConnectionPoolName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseConnectionPoolDestroy, Steps: []resource.TestStep{ { @@ -112,12 +114,12 @@ func TestAccDigitalOceanDatabaseConnectionPool_InboundUser(t *testing.T) { } func TestAccDigitalOceanDatabaseConnectionPool_BadModeName(t *testing.T) { - databaseName := randomTestName() - databaseConnectionPoolName := randomTestName() + databaseName := acceptance.RandomTestName() + databaseConnectionPoolName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseConnectionPoolDestroy, Steps: []resource.TestStep{ { @@ -129,7 +131,7 @@ func TestAccDigitalOceanDatabaseConnectionPool_BadModeName(t *testing.T) { } func testAccCheckDigitalOceanDatabaseConnectionPoolDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_database_connection_pool" { @@ -160,7 +162,7 @@ func testAccCheckDigitalOceanDatabaseConnectionPoolExists(n string, database *go return fmt.Errorf("No DatabaseConnectionPool ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() clusterId := rs.Primary.Attributes["cluster_id"] name := rs.Primary.Attributes["name"] diff --git a/digitalocean/resource_digitalocean_database_db.go b/digitalocean/database/resource_database_db.go similarity index 90% rename from digitalocean/resource_digitalocean_database_db.go rename to digitalocean/database/resource_database_db.go index 9c44eee9d..1f2797d96 100644 --- a/digitalocean/resource_digitalocean_database_db.go +++ b/digitalocean/database/resource_database_db.go @@ -1,4 +1,4 @@ -package digitalocean +package database import ( "context" @@ -8,12 +8,13 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanDatabaseDB() *schema.Resource { +func ResourceDigitalOceanDatabaseDB() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanDatabaseDBCreate, ReadContext: resourceDigitalOceanDatabaseDBRead, @@ -40,7 +41,7 @@ func resourceDigitalOceanDatabaseDB() *schema.Resource { } func resourceDigitalOceanDatabaseDBCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) opts := &godo.DatabaseCreateDBRequest{ @@ -60,7 +61,7 @@ func resourceDigitalOceanDatabaseDBCreate(ctx context.Context, d *schema.Resourc } func resourceDigitalOceanDatabaseDBRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) name := d.Get("name").(string) @@ -81,7 +82,7 @@ func resourceDigitalOceanDatabaseDBRead(ctx context.Context, d *schema.ResourceD } func resourceDigitalOceanDatabaseDBDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) name := d.Get("name").(string) diff --git a/digitalocean/resource_digitalocean_database_db_test.go b/digitalocean/database/resource_database_db_test.go similarity index 88% rename from digitalocean/resource_digitalocean_database_db_test.go rename to digitalocean/database/resource_database_db_test.go index d970101aa..717251c05 100644 --- a/digitalocean/resource_digitalocean_database_db_test.go +++ b/digitalocean/database/resource_database_db_test.go @@ -1,4 +1,4 @@ -package digitalocean +package database_test import ( "context" @@ -7,6 +7,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -19,8 +21,8 @@ func TestAccDigitalOceanDatabaseDB_Basic(t *testing.T) { databaseDBNameUpdated := databaseDBName + "-up" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseDBDestroy, Steps: []resource.TestStep{ { @@ -47,7 +49,7 @@ func TestAccDigitalOceanDatabaseDB_Basic(t *testing.T) { } func testAccCheckDigitalOceanDatabaseDBDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_database_db" { @@ -79,7 +81,7 @@ func testAccCheckDigitalOceanDatabaseDBExists(n string, databaseDB *godo.Databas return fmt.Errorf("No Database DB ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() clusterID := rs.Primary.Attributes["cluster_id"] name := rs.Primary.Attributes["name"] @@ -111,7 +113,7 @@ func testAccCheckDigitalOceanDatabaseDBNotExists(n string, databaseDBName string return fmt.Errorf("No Database DB ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() clusterID := rs.Primary.Attributes["cluster_id"] _, resp, err := client.Databases.GetDB(context.Background(), clusterID, databaseDBName) diff --git a/digitalocean/resource_digitalocean_database_firewall.go b/digitalocean/database/resource_database_firewall.go similarity index 92% rename from digitalocean/resource_digitalocean_database_firewall.go rename to digitalocean/database/resource_database_firewall.go index 9870d2a37..7b3a4ced6 100644 --- a/digitalocean/resource_digitalocean_database_firewall.go +++ b/digitalocean/database/resource_database_firewall.go @@ -1,4 +1,4 @@ -package digitalocean +package database import ( "context" @@ -6,13 +6,14 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanDatabaseFirewall() *schema.Resource { +func ResourceDigitalOceanDatabaseFirewall() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanDatabaseFirewallCreate, ReadContext: resourceDigitalOceanDatabaseFirewallRead, @@ -70,7 +71,7 @@ func resourceDigitalOceanDatabaseFirewall() *schema.Resource { } func resourceDigitalOceanDatabaseFirewallCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) rules := buildDatabaseFirewallRequest(d.Get("rule").(*schema.Set).List()) @@ -86,7 +87,7 @@ func resourceDigitalOceanDatabaseFirewallCreate(ctx context.Context, d *schema.R } func resourceDigitalOceanDatabaseFirewallRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) rules, resp, err := client.Databases.GetFirewallRules(context.TODO(), clusterID) @@ -107,7 +108,7 @@ func resourceDigitalOceanDatabaseFirewallRead(ctx context.Context, d *schema.Res } func resourceDigitalOceanDatabaseFirewallUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) rules := buildDatabaseFirewallRequest(d.Get("rule").(*schema.Set).List()) @@ -121,7 +122,7 @@ func resourceDigitalOceanDatabaseFirewallUpdate(ctx context.Context, d *schema.R } func resourceDigitalOceanDatabaseFirewallDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) log.Printf("[INFO] Deleting DatabaseFirewall: %s", d.Id()) diff --git a/digitalocean/resource_digitalocean_database_firewall_test.go b/digitalocean/database/resource_database_firewall_test.go similarity index 85% rename from digitalocean/resource_digitalocean_database_firewall_test.go rename to digitalocean/database/resource_database_firewall_test.go index 8db18ade1..fbb3d0679 100644 --- a/digitalocean/resource_digitalocean_database_firewall_test.go +++ b/digitalocean/database/resource_database_firewall_test.go @@ -1,20 +1,22 @@ -package digitalocean +package database_test import ( "context" "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanDatabaseFirewall_Basic(t *testing.T) { - databaseClusterName := randomTestName() + databaseClusterName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseFirewallDestroy, Steps: []resource.TestStep{ { @@ -45,14 +47,14 @@ func TestAccDigitalOceanDatabaseFirewall_Basic(t *testing.T) { } func TestAccDigitalOceanDatabaseFirewall_MultipleResourceTypes(t *testing.T) { - dbName := randomTestName() - dropletName := randomTestName() - tagName := randomTestName() - appName := randomTestName() + dbName := acceptance.RandomTestName() + dropletName := acceptance.RandomTestName() + tagName := acceptance.RandomTestName() + appName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseFirewallDestroy, Steps: []resource.TestStep{ { @@ -68,7 +70,7 @@ func TestAccDigitalOceanDatabaseFirewall_MultipleResourceTypes(t *testing.T) { } func testAccCheckDigitalOceanDatabaseFirewallDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_database_firewall" { diff --git a/digitalocean/resource_digitalocean_database_replica.go b/digitalocean/database/resource_database_replica.go similarity index 91% rename from digitalocean/resource_digitalocean_database_replica.go rename to digitalocean/database/resource_database_replica.go index d5d6e5353..346f10a83 100644 --- a/digitalocean/resource_digitalocean_database_replica.go +++ b/digitalocean/database/resource_database_replica.go @@ -1,4 +1,4 @@ -package digitalocean +package database import ( "context" @@ -9,13 +9,16 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanDatabaseReplica() *schema.Resource { +func ResourceDigitalOceanDatabaseReplica() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanDatabaseReplicaCreate, ReadContext: resourceDigitalOceanDatabaseReplicaRead, @@ -115,23 +118,23 @@ func resourceDigitalOceanDatabaseReplica() *schema.Resource { ForceNew: true, Elem: &schema.Schema{ Type: schema.TypeString, - ValidateFunc: validateTag, + ValidateFunc: tag.ValidateTag, }, - Set: HashStringIgnoreCase, + Set: util.HashStringIgnoreCase, }, }, } } func resourceDigitalOceanDatabaseReplicaCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterId := d.Get("cluster_id").(string) opts := &godo.DatabaseCreateReplicaRequest{ Name: d.Get("name").(string), Region: d.Get("region").(string), Size: d.Get("size").(string), - Tags: expandTags(d.Get("tags").(*schema.Set).List()), + Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()), } if v, ok := d.GetOk("private_network_uuid"); ok { @@ -181,7 +184,7 @@ func resourceDigitalOceanDatabaseReplicaCreate(ctx context.Context, d *schema.Re } func resourceDigitalOceanDatabaseReplicaRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterId := d.Get("cluster_id").(string) name := d.Get("name").(string) replica, resp, err := client.Databases.GetReplica(context.Background(), clusterId, name) @@ -197,7 +200,7 @@ func resourceDigitalOceanDatabaseReplicaRead(ctx context.Context, d *schema.Reso } d.Set("region", replica.Region) - d.Set("tags", flattenTags(replica.Tags)) + d.Set("tags", tag.FlattenTags(replica.Tags)) // Computed values d.Set("host", replica.Connection.Host) @@ -227,7 +230,7 @@ func resourceDigitalOceanDatabaseReplicaImport(d *schema.ResourceData, meta inte } func resourceDigitalOceanDatabaseReplicaDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterId := d.Get("cluster_id").(string) name := d.Get("name").(string) diff --git a/digitalocean/resource_digitalocean_database_replica_test.go b/digitalocean/database/resource_database_replica_test.go similarity index 87% rename from digitalocean/resource_digitalocean_database_replica_test.go rename to digitalocean/database/resource_database_replica_test.go index 1a73a20dd..1071d2032 100644 --- a/digitalocean/resource_digitalocean_database_replica_test.go +++ b/digitalocean/database/resource_database_replica_test.go @@ -1,4 +1,4 @@ -package digitalocean +package database_test import ( "context" @@ -6,6 +6,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -14,15 +16,15 @@ func TestAccDigitalOceanDatabaseReplica_Basic(t *testing.T) { var databaseReplica godo.DatabaseReplica var database godo.Database - databaseName := randomTestName() - databaseReplicaName := randomTestName() + databaseName := acceptance.RandomTestName() + databaseReplicaName := acceptance.RandomTestName() databaseConfig := fmt.Sprintf(testAccCheckDigitalOceanDatabaseClusterConfigBasic, databaseName) replicaConfig := fmt.Sprintf(testAccCheckDigitalOceanDatabaseReplicaConfigBasic, databaseReplicaName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseReplicaDestroy, Steps: []resource.TestStep{ { @@ -72,16 +74,16 @@ func TestAccDigitalOceanDatabaseReplica_WithVPC(t *testing.T) { var database godo.Database var databaseReplica godo.DatabaseReplica - vpcName := randomTestName() - databaseName := randomTestName() - databaseReplicaName := randomTestName() + vpcName := acceptance.RandomTestName() + databaseName := acceptance.RandomTestName() + databaseReplicaName := acceptance.RandomTestName() databaseConfig := fmt.Sprintf(testAccCheckDigitalOceanDatabaseClusterConfigWithVPC, vpcName, databaseName) replicaConfig := fmt.Sprintf(testAccCheckDigitalOceanDatabaseReplicaConfigWithVPC, databaseReplicaName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseClusterDestroy, Steps: []resource.TestStep{ { @@ -104,7 +106,7 @@ func TestAccDigitalOceanDatabaseReplica_WithVPC(t *testing.T) { } func testAccCheckDigitalOceanDatabaseReplicaDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_database_replica" { @@ -135,7 +137,7 @@ func testAccCheckDigitalOceanDatabaseReplicaExists(n string, database *godo.Data return fmt.Errorf("No DatabaseReplica cluster ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() clusterId := rs.Primary.Attributes["cluster_id"] name := rs.Primary.Attributes["name"] uuid := rs.Primary.Attributes["uuid"] diff --git a/digitalocean/resource_digitalocean_database_user.go b/digitalocean/database/resource_database_user.go similarity index 93% rename from digitalocean/resource_digitalocean_database_user.go rename to digitalocean/database/resource_database_user.go index 303d05f19..1ba5ee5a7 100644 --- a/digitalocean/resource_digitalocean_database_user.go +++ b/digitalocean/database/resource_database_user.go @@ -1,4 +1,4 @@ -package digitalocean +package database import ( "context" @@ -8,12 +8,13 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanDatabaseUser() *schema.Resource { +func ResourceDigitalOceanDatabaseUser() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanDatabaseUserCreate, ReadContext: resourceDigitalOceanDatabaseUserRead, @@ -64,7 +65,7 @@ func resourceDigitalOceanDatabaseUser() *schema.Resource { } func resourceDigitalOceanDatabaseUserCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) opts := &godo.DatabaseCreateUserRequest{ @@ -94,7 +95,7 @@ func resourceDigitalOceanDatabaseUserCreate(ctx context.Context, d *schema.Resou } func resourceDigitalOceanDatabaseUserRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) name := d.Get("name").(string) @@ -125,7 +126,7 @@ func resourceDigitalOceanDatabaseUserRead(ctx context.Context, d *schema.Resourc } func resourceDigitalOceanDatabaseUserUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() if d.HasChange("mysql_auth_plugin") { authReq := &godo.DatabaseResetUserAuthRequest{} @@ -150,7 +151,7 @@ func resourceDigitalOceanDatabaseUserUpdate(ctx context.Context, d *schema.Resou } func resourceDigitalOceanDatabaseUserDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusterID := d.Get("cluster_id").(string) name := d.Get("name").(string) diff --git a/digitalocean/resource_digitalocean_database_user_test.go b/digitalocean/database/resource_database_user_test.go similarity index 89% rename from digitalocean/resource_digitalocean_database_user_test.go rename to digitalocean/database/resource_database_user_test.go index 9e7a5d305..fdd6f28ab 100644 --- a/digitalocean/resource_digitalocean_database_user_test.go +++ b/digitalocean/database/resource_database_user_test.go @@ -1,4 +1,4 @@ -package digitalocean +package database_test import ( "context" @@ -7,19 +7,21 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanDatabaseUser_Basic(t *testing.T) { var databaseUser godo.DatabaseUser - databaseClusterName := randomTestName() - databaseUserName := randomTestName() + databaseClusterName := acceptance.RandomTestName() + databaseUserName := acceptance.RandomTestName() databaseUserNameUpdated := databaseUserName + "-up" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseUserDestroy, Steps: []resource.TestStep{ { @@ -51,12 +53,12 @@ func TestAccDigitalOceanDatabaseUser_Basic(t *testing.T) { func TestAccDigitalOceanDatabaseUser_MongoDB(t *testing.T) { var databaseUser godo.DatabaseUser - databaseClusterName := randomTestName() - databaseUserName := randomTestName() + databaseClusterName := acceptance.RandomTestName() + databaseUserName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseUserDestroy, Steps: []resource.TestStep{ { @@ -78,12 +80,12 @@ func TestAccDigitalOceanDatabaseUser_MongoDB(t *testing.T) { func TestAccDigitalOceanDatabaseUser_MySQLAuth(t *testing.T) { var databaseUser godo.DatabaseUser - databaseClusterName := randomTestName() - databaseUserName := randomTestName() + databaseClusterName := acceptance.RandomTestName() + databaseUserName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDatabaseUserDestroy, Steps: []resource.TestStep{ { @@ -136,7 +138,7 @@ func TestAccDigitalOceanDatabaseUser_MySQLAuth(t *testing.T) { } func testAccCheckDigitalOceanDatabaseUserDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_database_user" { @@ -168,7 +170,7 @@ func testAccCheckDigitalOceanDatabaseUserExists(n string, databaseUser *godo.Dat return fmt.Errorf("No Database User ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() clusterID := rs.Primary.Attributes["cluster_id"] name := rs.Primary.Attributes["name"] @@ -200,7 +202,7 @@ func testAccCheckDigitalOceanDatabaseUserNotExists(n string, databaseUserName st return fmt.Errorf("No Database User ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() clusterID := rs.Primary.Attributes["cluster_id"] _, resp, err := client.Databases.GetDB(context.Background(), clusterID, databaseUserName) diff --git a/digitalocean/database/sweep.go b/digitalocean/database/sweep.go new file mode 100644 index 000000000..8c9d2813b --- /dev/null +++ b/digitalocean/database/sweep.go @@ -0,0 +1,47 @@ +package database + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_database_cluster", &resource.Sweeper{ + Name: "digitalocean_database_cluster", + F: testSweepDatabaseCluster, + }) + +} + +func testSweepDatabaseCluster(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + databases, _, err := client.Databases.List(context.Background(), opt) + if err != nil { + return err + } + + for _, db := range databases { + if strings.HasPrefix(db.Name, sweep.TestNamePrefix) { + log.Printf("Destroying database cluster %s", db.Name) + + if _, err := client.Databases.Delete(context.Background(), db.ID); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/datasource_digitalocean_domain.go b/digitalocean/domain/datasource_domain.go similarity index 87% rename from digitalocean/datasource_digitalocean_domain.go rename to digitalocean/domain/datasource_domain.go index 1334dcbd7..5b559b1f8 100644 --- a/digitalocean/datasource_digitalocean_domain.go +++ b/digitalocean/domain/datasource_domain.go @@ -1,14 +1,15 @@ -package digitalocean +package domain import ( "context" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanDomain() *schema.Resource { +func DataSourceDigitalOceanDomain() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanDomainRead, Schema: map[string]*schema.Schema{ @@ -40,7 +41,7 @@ func dataSourceDigitalOceanDomain() *schema.Resource { } func dataSourceDigitalOceanDomainRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() name := d.Get("name").(string) diff --git a/digitalocean/datasource_digitalocean_domain_test.go b/digitalocean/domain/datasource_domain_test.go similarity index 82% rename from digitalocean/datasource_digitalocean_domain_test.go rename to digitalocean/domain/datasource_domain_test.go index 94c61dd1e..9bd8bf91d 100644 --- a/digitalocean/datasource_digitalocean_domain_test.go +++ b/digitalocean/domain/datasource_domain_test.go @@ -1,4 +1,4 @@ -package digitalocean +package domain_test import ( "context" @@ -6,13 +6,15 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceDigitalOceanDomain_Basic(t *testing.T) { var domain godo.Domain - domainName := randomTestName() + ".com" + domainName := acceptance.RandomTestName() + ".com" expectedURN := fmt.Sprintf("do:domain:%s", domainName) resourceConfig := fmt.Sprintf(` @@ -28,8 +30,8 @@ data "digitalocean_domain" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -72,7 +74,7 @@ func testAccCheckDataSourceDigitalOceanDomainExists(n string, domain *godo.Domai return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundDomain, _, err := client.Domains.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/datasource_digitalocean_domains.go b/digitalocean/domain/datasource_domains.go similarity index 84% rename from digitalocean/datasource_digitalocean_domains.go rename to digitalocean/domain/datasource_domains.go index bd65ae9cf..49895a6c7 100644 --- a/digitalocean/datasource_digitalocean_domains.go +++ b/digitalocean/domain/datasource_domains.go @@ -1,11 +1,11 @@ -package digitalocean +package domain import ( "github.com/digitalocean/terraform-provider-digitalocean/internal/datalist" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanDomains() *schema.Resource { +func DataSourceDigitalOceanDomains() *schema.Resource { dataListConfig := &datalist.ResourceConfig{ RecordSchema: domainSchema(), ResultAttributeName: "domains", diff --git a/digitalocean/datasource_digitalocean_domains_test.go b/digitalocean/domain/datasource_domains_test.go similarity index 79% rename from digitalocean/datasource_digitalocean_domains_test.go rename to digitalocean/domain/datasource_domains_test.go index 8d5d3d48e..ce0c7938a 100644 --- a/digitalocean/datasource_digitalocean_domains_test.go +++ b/digitalocean/domain/datasource_domains_test.go @@ -1,15 +1,16 @@ -package digitalocean +package domain_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDataSourceDigitalOceanDomains_Basic(t *testing.T) { - name1 := randomTestName() + ".com" - name2 := randomTestName() + ".com" + name1 := acceptance.RandomTestName() + ".com" + name2 := acceptance.RandomTestName() + ".com" resourcesConfig := fmt.Sprintf(` resource "digitalocean_domain" "foo" { @@ -31,8 +32,8 @@ data "digitalocean_domains" "result" { `, name1) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourcesConfig, diff --git a/digitalocean/datasource_digitalocean_record.go b/digitalocean/domain/datasource_record.go similarity index 93% rename from digitalocean/datasource_digitalocean_record.go rename to digitalocean/domain/datasource_record.go index c4b8cea96..9b48a554a 100644 --- a/digitalocean/datasource_digitalocean_record.go +++ b/digitalocean/domain/datasource_record.go @@ -1,4 +1,4 @@ -package digitalocean +package domain import ( "context" @@ -6,12 +6,13 @@ import ( "strconv" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanRecord() *schema.Resource { +func DataSourceDigitalOceanRecord() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanRecordRead, Schema: map[string]*schema.Schema{ @@ -74,7 +75,7 @@ func dataSourceDigitalOceanRecord() *schema.Resource { } func dataSourceDigitalOceanRecordRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() domain := d.Get("domain").(string) name := d.Get("name").(string) diff --git a/digitalocean/datasource_digitalocean_record_test.go b/digitalocean/domain/datasource_record_test.go similarity index 82% rename from digitalocean/datasource_digitalocean_record_test.go rename to digitalocean/domain/datasource_record_test.go index ca7e67526..9d2e53419 100644 --- a/digitalocean/datasource_digitalocean_record_test.go +++ b/digitalocean/domain/datasource_record_test.go @@ -1,4 +1,4 @@ -package digitalocean +package domain_test import ( "context" @@ -7,14 +7,16 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceDigitalOceanRecord_Basic(t *testing.T) { var record godo.DomainRecord - recordDomain := fmt.Sprintf("%s.com", randomTestName()) - recordName := randomTestName("record") + recordDomain := fmt.Sprintf("%s.com", acceptance.RandomTestName()) + recordName := acceptance.RandomTestName("record") resourceConfig := fmt.Sprintf(` resource "digitalocean_domain" "foo" { name = "%s" @@ -34,8 +36,8 @@ data "digitalocean_record" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -72,7 +74,7 @@ func testAccCheckDataSourceDigitalOceanRecordAttributes(record *godo.DomainRecor func testAccCheckDataSourceDigitalOceanRecordExists(n string, record *godo.DomainRecord) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[n] diff --git a/digitalocean/datasource_digitalocean_records.go b/digitalocean/domain/datasource_records.go similarity index 87% rename from digitalocean/datasource_digitalocean_records.go rename to digitalocean/domain/datasource_records.go index 578513d60..8bd98f371 100644 --- a/digitalocean/datasource_digitalocean_records.go +++ b/digitalocean/domain/datasource_records.go @@ -1,11 +1,11 @@ -package digitalocean +package domain import ( "github.com/digitalocean/terraform-provider-digitalocean/internal/datalist" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanRecords() *schema.Resource { +func DataSourceDigitalOceanRecords() *schema.Resource { dataListConfig := &datalist.ResourceConfig{ RecordSchema: recordsSchema(), ResultAttributeName: "records", diff --git a/digitalocean/datasource_digitalocean_records_test.go b/digitalocean/domain/datasource_records_test.go similarity index 89% rename from digitalocean/datasource_digitalocean_records_test.go rename to digitalocean/domain/datasource_records_test.go index ace17b363..cd7722928 100644 --- a/digitalocean/datasource_digitalocean_records_test.go +++ b/digitalocean/domain/datasource_records_test.go @@ -1,14 +1,15 @@ -package digitalocean +package domain_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDataSourceDigitalOceanRecords_Basic(t *testing.T) { - name1 := randomTestName("records") + ".com" + name1 := acceptance.RandomTestName("records") + ".com" resourcesConfig := fmt.Sprintf(` resource "digitalocean_domain" "foo" { @@ -42,8 +43,8 @@ data "digitalocean_records" "result" { `, name1) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourcesConfig, diff --git a/digitalocean/domains.go b/digitalocean/domain/domains.go similarity index 91% rename from digitalocean/domains.go rename to digitalocean/domain/domains.go index e8f5049cd..dd46476fd 100644 --- a/digitalocean/domains.go +++ b/digitalocean/domain/domains.go @@ -1,10 +1,11 @@ -package digitalocean +package domain import ( "context" "fmt" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -26,7 +27,7 @@ func domainSchema() map[string]*schema.Schema { } func getDigitalOceanDomains(meta interface{}, extra map[string]interface{}) ([]interface{}, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() opts := &godo.ListOptions{ Page: 1, diff --git a/digitalocean/import_digitalocean_domain_test.go b/digitalocean/domain/import_domain_test.go similarity index 70% rename from digitalocean/import_digitalocean_domain_test.go rename to digitalocean/domain/import_domain_test.go index acfb4c5ae..6a90514de 100644 --- a/digitalocean/import_digitalocean_domain_test.go +++ b/digitalocean/domain/import_domain_test.go @@ -1,19 +1,20 @@ -package digitalocean +package domain_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDigitalOceanDomain_importBasic(t *testing.T) { resourceName := "digitalocean_domain.foobar" - domainName := randomTestName() + ".com" + domainName := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDomainDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_record_test.go b/digitalocean/domain/import_record_test.go similarity index 78% rename from digitalocean/import_digitalocean_record_test.go rename to digitalocean/domain/import_record_test.go index e61281948..5e7c077f5 100644 --- a/digitalocean/import_digitalocean_record_test.go +++ b/digitalocean/domain/import_record_test.go @@ -1,20 +1,21 @@ -package digitalocean +package domain_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDigitalOceanRecord_importBasic(t *testing.T) { resourceName := "digitalocean_record.foobar" - domainName := randomTestName("record") + ".com" + domainName := acceptance.RandomTestName("record") + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/records.go b/digitalocean/domain/records.go similarity index 95% rename from digitalocean/records.go rename to digitalocean/domain/records.go index af806d9c6..ecf949e07 100644 --- a/digitalocean/records.go +++ b/digitalocean/domain/records.go @@ -1,10 +1,11 @@ -package digitalocean +package domain import ( "context" "fmt" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -58,7 +59,7 @@ func recordsSchema() map[string]*schema.Schema { } func getDigitalOceanRecords(meta interface{}, extra map[string]interface{}) ([]interface{}, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() domain, ok := extra["domain"].(string) if !ok { diff --git a/digitalocean/resource_digitalocean_domain.go b/digitalocean/domain/resource_domain.go similarity index 89% rename from digitalocean/resource_digitalocean_domain.go rename to digitalocean/domain/resource_domain.go index ee081fc41..079063a64 100644 --- a/digitalocean/resource_digitalocean_domain.go +++ b/digitalocean/domain/resource_domain.go @@ -1,16 +1,17 @@ -package digitalocean +package domain import ( "context" "log" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanDomain() *schema.Resource { +func ResourceDigitalOceanDomain() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanDomainCreate, ReadContext: resourceDigitalOceanDomainRead, @@ -45,7 +46,7 @@ func resourceDigitalOceanDomain() *schema.Resource { } func resourceDigitalOceanDomainCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // Build up our creation options @@ -70,7 +71,7 @@ func resourceDigitalOceanDomainCreate(ctx context.Context, d *schema.ResourceDat } func resourceDigitalOceanDomainRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() domain, resp, err := client.Domains.Get(context.Background(), d.Id()) if err != nil { @@ -92,7 +93,7 @@ func resourceDigitalOceanDomainRead(ctx context.Context, d *schema.ResourceData, } func resourceDigitalOceanDomainDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting Domain: %s", d.Id()) _, err := client.Domains.Delete(context.Background(), d.Id()) diff --git a/digitalocean/resource_digitalocean_domain_test.go b/digitalocean/domain/resource_domain_test.go similarity index 73% rename from digitalocean/resource_digitalocean_domain_test.go rename to digitalocean/domain/resource_domain_test.go index 2fc3399e3..e5d7fe719 100644 --- a/digitalocean/resource_digitalocean_domain_test.go +++ b/digitalocean/domain/resource_domain_test.go @@ -1,61 +1,26 @@ -package digitalocean +package domain_test import ( "context" "fmt" - "log" - "strings" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_domain", &resource.Sweeper{ - Name: "digitalocean_domain", - F: testSweepDomain, - }) - -} - -func testSweepDomain(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListOptions{PerPage: 200} - domains, _, err := client.Domains.List(context.Background(), opt) - if err != nil { - return err - } - - for _, d := range domains { - if strings.HasPrefix(d.Name, testNamePrefix) { - log.Printf("Destroying domain %s", d.Name) - - if _, err := client.Domains.Delete(context.Background(), d.Name); err != nil { - return err - } - } - } - - return nil -} - func TestAccDigitalOceanDomain_Basic(t *testing.T) { var domain godo.Domain - domainName := randomTestName() + ".com" + domainName := acceptance.RandomTestName() + ".com" expectedURN := fmt.Sprintf("do:domain:%s", domainName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDomainDestroy, Steps: []resource.TestStep{ { @@ -77,11 +42,11 @@ func TestAccDigitalOceanDomain_Basic(t *testing.T) { func TestAccDigitalOceanDomain_WithoutIp(t *testing.T) { var domain godo.Domain - domainName := randomTestName() + ".com" + domainName := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDomainDestroy, Steps: []resource.TestStep{ { @@ -100,7 +65,7 @@ func TestAccDigitalOceanDomain_WithoutIp(t *testing.T) { } func testAccCheckDigitalOceanDomainDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_domain" { @@ -141,7 +106,7 @@ func testAccCheckDigitalOceanDomainExists(n string, domain *godo.Domain) resourc return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundDomain, _, err := client.Domains.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/resource_digitalocean_record.go b/digitalocean/domain/resource_record.go similarity index 94% rename from digitalocean/resource_digitalocean_record.go rename to digitalocean/domain/resource_record.go index ad7809875..fcf8ea508 100644 --- a/digitalocean/resource_digitalocean_record.go +++ b/digitalocean/domain/resource_record.go @@ -1,4 +1,4 @@ -package digitalocean +package domain import ( "context" @@ -8,12 +8,13 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanRecord() *schema.Resource { +func ResourceDigitalOceanRecord() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanRecordCreate, ReadContext: resourceDigitalOceanRecordRead, @@ -153,7 +154,7 @@ func resourceDigitalOceanRecord() *schema.Resource { } func resourceDigitalOceanRecordCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() newRecord, err := expandDigitalOceanRecordResource(d) if err != nil { @@ -180,7 +181,7 @@ func resourceDigitalOceanRecordCreate(ctx context.Context, d *schema.ResourceDat } func resourceDigitalOceanRecordRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() domain := d.Get("domain").(string) id, err := strconv.Atoi(d.Id()) if err != nil { @@ -215,7 +216,7 @@ func resourceDigitalOceanRecordRead(ctx context.Context, d *schema.ResourceData, d.Set("flags", rec.Flags) d.Set("tag", rec.Tag) - en := constructFqdn(rec.Name, d.Get("domain").(string)) + en := ConstructFqdn(rec.Name, d.Get("domain").(string)) log.Printf("[DEBUG] Constructed FQDN: %s", en) d.Set("fqdn", en) @@ -239,7 +240,7 @@ func resourceDigitalOceanRecordImport(d *schema.ResourceData, meta interface{}) } func resourceDigitalOceanRecordUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() domain := d.Get("domain").(string) id, err := strconv.Atoi(d.Id()) @@ -262,7 +263,7 @@ func resourceDigitalOceanRecordUpdate(ctx context.Context, d *schema.ResourceDat } func resourceDigitalOceanRecordDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() domain := d.Get("domain").(string) id, err := strconv.Atoi(d.Id()) @@ -314,7 +315,7 @@ func expandDigitalOceanRecordResource(d *schema.ResourceData) (*godo.DomainRecor return record, nil } -func constructFqdn(name, domain string) string { +func ConstructFqdn(name, domain string) string { if name == "@" { return domain } diff --git a/digitalocean/resource_digitalocean_record_test.go b/digitalocean/domain/resource_record_test.go similarity index 90% rename from digitalocean/resource_digitalocean_record_test.go rename to digitalocean/domain/resource_record_test.go index 6c7bf96f2..ba715cf2f 100644 --- a/digitalocean/resource_digitalocean_record_test.go +++ b/digitalocean/domain/resource_record_test.go @@ -1,4 +1,4 @@ -package digitalocean +package domain_test import ( "context" @@ -9,6 +9,9 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/domain" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -26,9 +29,9 @@ func TestDigitalOceanRecordConstructFqdn(t *testing.T) { {"@", "nonexample.com"}, } - domain := "nonexample.com" + domainName := "nonexample.com" for _, tc := range cases { - actual := constructFqdn(tc.Input, domain) + actual := domain.ConstructFqdn(tc.Input, domainName) if actual != tc.Output { t.Fatalf("input: %s\noutput: %s", tc.Input, actual) } @@ -37,11 +40,11 @@ func TestDigitalOceanRecordConstructFqdn(t *testing.T) { func TestAccDigitalOceanRecord_Basic(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -65,11 +68,11 @@ func TestAccDigitalOceanRecord_Basic(t *testing.T) { func TestAccDigitalOceanRecord_BasicFullName(t *testing.T) { var record godo.DomainRecord - domain := randomTestName("record") + ".com" + domain := acceptance.RandomTestName("record") + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -93,11 +96,11 @@ func TestAccDigitalOceanRecord_BasicFullName(t *testing.T) { func TestAccDigitalOceanRecord_Updated(t *testing.T) { var record godo.DomainRecord - domain := randomTestName("record") + ".com" + domain := acceptance.RandomTestName("record") + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -141,11 +144,11 @@ func TestAccDigitalOceanRecord_Updated(t *testing.T) { func TestAccDigitalOceanRecord_HostnameValue(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -170,11 +173,11 @@ func TestAccDigitalOceanRecord_HostnameValue(t *testing.T) { func TestAccDigitalOceanRecord_ExternalHostnameValue(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -199,11 +202,11 @@ func TestAccDigitalOceanRecord_ExternalHostnameValue(t *testing.T) { func TestAccDigitalOceanRecord_FlagsAndTag(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -232,11 +235,11 @@ func TestAccDigitalOceanRecord_FlagsAndTag(t *testing.T) { func TestAccDigitalOceanRecord_MX(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -261,11 +264,11 @@ func TestAccDigitalOceanRecord_MX(t *testing.T) { func TestAccDigitalOceanRecord_MX_at(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -290,11 +293,11 @@ func TestAccDigitalOceanRecord_MX_at(t *testing.T) { func TestAccDigitalOceanRecord_SRV_zero_weight_port(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -323,11 +326,11 @@ func TestAccDigitalOceanRecord_SRV_zero_weight_port(t *testing.T) { func TestAccDigitalOceanRecord_UpdateBasic(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -372,11 +375,11 @@ func TestAccDigitalOceanRecord_UpdateBasic(t *testing.T) { func TestAccDigitalOceanRecord_MXUpdated(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -421,11 +424,11 @@ func TestAccDigitalOceanRecord_MXUpdated(t *testing.T) { func TestAccDigitalOceanRecord_SrvUpdated(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -474,11 +477,11 @@ func TestAccDigitalOceanRecord_SrvUpdated(t *testing.T) { func TestAccDigitalOceanRecord_CaaUpdated(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -527,11 +530,11 @@ func TestAccDigitalOceanRecord_CaaUpdated(t *testing.T) { func TestAccDigitalOceanRecord_iodefCAA(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -559,11 +562,11 @@ func TestAccDigitalOceanRecord_iodefCAA(t *testing.T) { func TestAccDigitalOceanRecord_TXT(t *testing.T) { var record godo.DomainRecord - domain := randomTestName() + ".com" + domain := acceptance.RandomTestName() + ".com" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { @@ -643,9 +646,9 @@ func TestAccDigitalOceanRecord_ExpectedErrors(t *testing.T) { ) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanCertificateDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: testAccCheckDigitalOceanRecordDestroy, Steps: []resource.TestStep{ { Config: srvNoPort, @@ -676,7 +679,7 @@ func TestAccDigitalOceanRecord_ExpectedErrors(t *testing.T) { } func testAccCheckDigitalOceanRecordDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_record" { @@ -732,7 +735,7 @@ func testAccCheckDigitalOceanRecordExists(n string, record *godo.DomainRecord) r return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() domain := rs.Primary.Attributes["domain"] id, err := strconv.Atoi(rs.Primary.ID) diff --git a/digitalocean/domain/sweep.go b/digitalocean/domain/sweep.go new file mode 100644 index 000000000..5a83576b5 --- /dev/null +++ b/digitalocean/domain/sweep.go @@ -0,0 +1,47 @@ +package domain + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_domain", &resource.Sweeper{ + Name: "digitalocean_domain", + F: sweepDomain, + }) + +} + +func sweepDomain(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + domains, _, err := client.Domains.List(context.Background(), opt) + if err != nil { + return err + } + + for _, d := range domains { + if strings.HasPrefix(d.Name, sweep.TestNamePrefix) { + log.Printf("Destroying domain %s", d.Name) + + if _, err := client.Domains.Delete(context.Background(), d.Name); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/datasource_digitalocean_droplet.go b/digitalocean/droplet/datasource_droplet.go similarity index 89% rename from digitalocean/datasource_digitalocean_droplet.go rename to digitalocean/droplet/datasource_droplet.go index 24d87f427..3023b07ab 100644 --- a/digitalocean/datasource_digitalocean_droplet.go +++ b/digitalocean/droplet/datasource_droplet.go @@ -1,4 +1,4 @@ -package digitalocean +package droplet import ( "context" @@ -6,12 +6,14 @@ import ( "strconv" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanDroplet() *schema.Resource { +func DataSourceDigitalOceanDroplet() *schema.Resource { recordSchema := dropletSchema() for _, f := range recordSchema { @@ -38,7 +40,7 @@ func dataSourceDigitalOceanDroplet() *schema.Resource { } func dataSourceDigitalOceanDropletRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() var foundDroplet godo.Droplet @@ -83,7 +85,7 @@ func dataSourceDigitalOceanDropletRead(ctx context.Context, d *schema.ResourceDa return diag.FromErr(err) } - if err := setResourceDataFromMap(d, flattenedDroplet); err != nil { + if err := util.SetResourceDataFromMap(d, flattenedDroplet); err != nil { return diag.FromErr(err) } diff --git a/digitalocean/datasource_digitalocean_droplet_test.go b/digitalocean/droplet/datasource_droplet_test.go similarity index 89% rename from digitalocean/datasource_digitalocean_droplet_test.go rename to digitalocean/droplet/datasource_droplet_test.go index b566303de..8267405ef 100644 --- a/digitalocean/datasource_digitalocean_droplet_test.go +++ b/digitalocean/droplet/datasource_droplet_test.go @@ -1,4 +1,4 @@ -package digitalocean +package droplet_test import ( "context" @@ -7,6 +7,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -14,7 +16,7 @@ import ( func TestAccDataSourceDigitalOceanDroplet_BasicByName(t *testing.T) { var droplet godo.Droplet - name := randomTestName() + name := acceptance.RandomTestName() resourceConfig := testAccCheckDataSourceDigitalOceanDropletConfig_basicByName(name) dataSourceConfig := ` data "digitalocean_droplet" "foobar" { @@ -22,8 +24,8 @@ data "digitalocean_droplet" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -56,8 +58,8 @@ func TestAccDataSourceDigitalOceanDroplet_BasicById(t *testing.T) { name := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10)) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccCheckDataSourceDigitalOceanDropletConfig_basicById(name), @@ -87,13 +89,13 @@ func TestAccDataSourceDigitalOceanDroplet_BasicByTag(t *testing.T) { tagName := fmt.Sprintf("tf-acc-test-tag-%s", acctest.RandString(10)) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccCheckDataSourceDigitalOceanDropletConfig_basicWithTag(tagName, name), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foo", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foo", &droplet), ), }, { @@ -132,7 +134,7 @@ func testAccCheckDataSourceDigitalOceanDropletExists(n string, droplet *godo.Dro return fmt.Errorf("No droplet ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() id, err := strconv.Atoi(rs.Primary.ID) if err != nil { @@ -169,7 +171,7 @@ resource "digitalocean_droplet" "foo" { region = "nyc3" ipv6 = true vpc_uuid = digitalocean_vpc.foobar.id -}`, randomTestName(), name) +}`, acceptance.RandomTestName(), name) } func testAccCheckDataSourceDigitalOceanDropletConfig_basicById(name string) string { diff --git a/digitalocean/datasource_digitalocean_droplets.go b/digitalocean/droplet/datasource_droplets.go similarity index 84% rename from digitalocean/datasource_digitalocean_droplets.go rename to digitalocean/droplet/datasource_droplets.go index 532afe7db..152e5448e 100644 --- a/digitalocean/datasource_digitalocean_droplets.go +++ b/digitalocean/droplet/datasource_droplets.go @@ -1,11 +1,11 @@ -package digitalocean +package droplet import ( "github.com/digitalocean/terraform-provider-digitalocean/internal/datalist" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanDroplets() *schema.Resource { +func DataSourceDigitalOceanDroplets() *schema.Resource { dataListConfig := &datalist.ResourceConfig{ RecordSchema: dropletSchema(), ResultAttributeName: "droplets", diff --git a/digitalocean/datasource_digitalocean_droplets_test.go b/digitalocean/droplet/datasource_droplets_test.go similarity index 86% rename from digitalocean/datasource_digitalocean_droplets_test.go rename to digitalocean/droplet/datasource_droplets_test.go index 513e881b0..4c742c71b 100644 --- a/digitalocean/datasource_digitalocean_droplets_test.go +++ b/digitalocean/droplet/datasource_droplets_test.go @@ -1,9 +1,10 @@ -package digitalocean +package droplet_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -37,8 +38,8 @@ data "digitalocean_droplets" "result" { } `, name1) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourcesConfig, diff --git a/digitalocean/droplets.go b/digitalocean/droplet/droplets.go similarity index 90% rename from digitalocean/droplets.go rename to digitalocean/droplet/droplets.go index 891fed4ca..cabe98616 100644 --- a/digitalocean/droplets.go +++ b/digitalocean/droplet/droplets.go @@ -1,4 +1,4 @@ -package digitalocean +package droplet import ( "context" @@ -7,6 +7,8 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -105,7 +107,7 @@ func dropletSchema() map[string]*schema.Schema { Elem: &schema.Schema{Type: schema.TypeString}, Description: "list of volumes attached to the Droplet", }, - "tags": tagsDataSourceSchema(), + "tags": tag.TagsDataSourceSchema(), "vpc_uuid": { Type: schema.TypeString, Description: "UUID of the VPC in which the Droplet is located", @@ -114,7 +116,7 @@ func dropletSchema() map[string]*schema.Schema { } func getDigitalOceanDroplets(meta interface{}, extra map[string]interface{}) ([]interface{}, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() opts := &godo.ListOptions{ Page: 1, @@ -175,19 +177,19 @@ func flattenDigitalOceanDroplet(rawDroplet, meta interface{}, extra map[string]i flattenedDroplet["image"] = droplet.Image.Slug } - if publicIPv4 := findIPv4AddrByType(&droplet, "public"); publicIPv4 != "" { + if publicIPv4 := FindIPv4AddrByType(&droplet, "public"); publicIPv4 != "" { flattenedDroplet["ipv4_address"] = publicIPv4 } - if privateIPv4 := findIPv4AddrByType(&droplet, "private"); privateIPv4 != "" { + if privateIPv4 := FindIPv4AddrByType(&droplet, "private"); privateIPv4 != "" { flattenedDroplet["ipv4_address_private"] = privateIPv4 } - if publicIPv6 := findIPv6AddrByType(&droplet, "public"); publicIPv6 != "" { + if publicIPv6 := FindIPv6AddrByType(&droplet, "public"); publicIPv6 != "" { flattenedDroplet["ipv6_address"] = strings.ToLower(publicIPv6) } - if privateIPv6 := findIPv6AddrByType(&droplet, "private"); privateIPv6 != "" { + if privateIPv6 := FindIPv6AddrByType(&droplet, "private"); privateIPv6 != "" { flattenedDroplet["ipv6_address_private"] = strings.ToLower(privateIPv6) } @@ -200,7 +202,7 @@ func flattenDigitalOceanDroplet(rawDroplet, meta interface{}, extra map[string]i flattenedDroplet["volume_ids"] = flattenDigitalOceanDropletVolumeIds(droplet.VolumeIDs) - flattenedDroplet["tags"] = flattenTags(droplet.Tags) + flattenedDroplet["tags"] = tag.FlattenTags(droplet.Tags) return flattenedDroplet, nil } diff --git a/digitalocean/import_digitalocean_droplet_test.go b/digitalocean/droplet/import_droplet_test.go similarity index 72% rename from digitalocean/import_digitalocean_droplet_test.go rename to digitalocean/droplet/import_droplet_test.go index aff5eadbc..3ae3c2279 100644 --- a/digitalocean/import_digitalocean_droplet_test.go +++ b/digitalocean/droplet/import_droplet_test.go @@ -1,4 +1,4 @@ -package digitalocean +package droplet_test import ( "context" @@ -7,6 +7,9 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -17,12 +20,12 @@ func TestAccDigitalOceanDroplet_importBasic(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), }, { @@ -50,14 +53,14 @@ func TestAccDigitalOceanDroplet_ImportWithNoImageSlug(t *testing.T) { var snapshotId []int resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), takeDropletSnapshot(rInt, &droplet, &snapshotId), ), }, @@ -74,7 +77,7 @@ func TestAccDigitalOceanDroplet_ImportWithNoImageSlug(t *testing.T) { { Config: " ", Check: resource.ComposeTestCheckFunc( - deleteDropletSnapshots(&snapshotId), + acceptance.DeleteDropletSnapshots(&snapshotId), ), }, }, @@ -83,13 +86,13 @@ func TestAccDigitalOceanDroplet_ImportWithNoImageSlug(t *testing.T) { func takeDropletSnapshot(rInt int, droplet *godo.Droplet, snapshotId *[]int) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() action, _, err := client.DropletActions.Snapshot(context.Background(), (*droplet).ID, fmt.Sprintf("snap-%d", rInt)) if err != nil { return err } - waitForAction(client, action) + util.WaitForAction(client, action) retrieveDroplet, _, err := client.Droplets.Get(context.Background(), (*droplet).ID) if err != nil { diff --git a/digitalocean/resource_digitalocean_droplet.go b/digitalocean/droplet/resource_droplet.go similarity index 92% rename from digitalocean/resource_digitalocean_droplet.go rename to digitalocean/droplet/resource_droplet.go index fc328e6ff..950b5af1d 100644 --- a/digitalocean/resource_digitalocean_droplet.go +++ b/digitalocean/droplet/resource_droplet.go @@ -1,4 +1,4 @@ -package digitalocean +package droplet import ( "context" @@ -10,13 +10,16 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanDroplet() *schema.Resource { +func ResourceDigitalOceanDroplet() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanDropletCreate, ReadContext: resourceDigitalOceanDropletRead, @@ -25,7 +28,7 @@ func resourceDigitalOceanDroplet() *schema.Resource { Importer: &schema.ResourceImporter{ State: resourceDigitalOceanDropletImport, }, - MigrateState: resourceDigitalOceanDropletMigrateState, + MigrateState: ResourceDigitalOceanDropletMigrateState, SchemaVersion: 1, // We are using these timeouts to be the minimum timeout for an operation. @@ -180,7 +183,7 @@ func resourceDigitalOceanDroplet() *schema.Resource { Optional: true, ForceNew: true, ValidateFunc: validation.NoZeroValues, - StateFunc: HashStringStateFunc(), + StateFunc: util.HashStringStateFunc(), // In order to support older statefiles with fully saved user data DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return new != "" && old == d.Get("user_data") @@ -207,7 +210,7 @@ func resourceDigitalOceanDroplet() *schema.Resource { ForceNew: true, }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), "vpc_uuid": { Type: schema.TypeString, @@ -221,7 +224,7 @@ func resourceDigitalOceanDroplet() *schema.Resource { } func resourceDigitalOceanDropletCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() image := d.Get("image").(string) @@ -231,7 +234,7 @@ func resourceDigitalOceanDropletCreate(ctx context.Context, d *schema.ResourceDa Name: d.Get("name").(string), Region: d.Get("region").(string), Size: d.Get("size").(string), - Tags: expandTags(d.Get("tags").(*schema.Set).List()), + Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()), } imageId, err := strconv.Atoi(image) @@ -279,7 +282,7 @@ func resourceDigitalOceanDropletCreate(ctx context.Context, d *schema.ResourceDa } if attr, ok := d.GetOkExists("droplet_agent"); ok { - opts.WithDropletAgent = boolPtr(attr.(bool)) + opts.WithDropletAgent = godo.PtrTo(attr.(bool)) } if attr, ok := d.GetOk("vpc_uuid"); ok { @@ -318,7 +321,7 @@ func resourceDigitalOceanDropletCreate(ctx context.Context, d *schema.ResourceDa } func resourceDigitalOceanDropletRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() id, err := strconv.Atoi(d.Id()) if err != nil { @@ -366,9 +369,9 @@ func setDropletAttributes(d *schema.ResourceData, droplet *godo.Droplet) error { d.Set("created_at", droplet.Created) d.Set("vpc_uuid", droplet.VPCUUID) - d.Set("ipv4_address", findIPv4AddrByType(droplet, "public")) - d.Set("ipv4_address_private", findIPv4AddrByType(droplet, "private")) - d.Set("ipv6_address", strings.ToLower(findIPv6AddrByType(droplet, "public"))) + d.Set("ipv4_address", FindIPv4AddrByType(droplet, "public")) + d.Set("ipv4_address_private", FindIPv4AddrByType(droplet, "private")) + d.Set("ipv6_address", strings.ToLower(FindIPv6AddrByType(droplet, "public"))) if features := droplet.Features; features != nil { d.Set("backups", containsDigitalOceanDropletFeature(features, "backups")) @@ -381,14 +384,14 @@ func setDropletAttributes(d *schema.ResourceData, droplet *godo.Droplet) error { return fmt.Errorf("Error setting `volume_ids`: %+v", err) } - if err := d.Set("tags", flattenTags(droplet.Tags)); err != nil { + if err := d.Set("tags", tag.FlattenTags(droplet.Tags)); err != nil { return fmt.Errorf("Error setting `tags`: %+v", err) } // Initialize the connection info d.SetConnInfo(map[string]string{ "type": "ssh", - "host": findIPv4AddrByType(droplet, "public"), + "host": FindIPv4AddrByType(droplet, "public"), }) return nil @@ -396,7 +399,7 @@ func setDropletAttributes(d *schema.ResourceData, droplet *godo.Droplet) error { func resourceDigitalOceanDropletImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { // Retrieve the image from API during import - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() id, err := strconv.Atoi(d.Id()) if err != nil { return nil, fmt.Errorf("Invalid droplet id: %v", err) @@ -419,7 +422,7 @@ func resourceDigitalOceanDropletImport(d *schema.ResourceData, meta interface{}) return []*schema.ResourceData{d}, nil } -func findIPv6AddrByType(d *godo.Droplet, addrType string) string { +func FindIPv6AddrByType(d *godo.Droplet, addrType string) string { for _, addr := range d.Networks.V6 { if addr.Type == addrType { if ip := net.ParseIP(addr.IPAddress); ip != nil { @@ -430,7 +433,7 @@ func findIPv6AddrByType(d *godo.Droplet, addrType string) string { return "" } -func findIPv4AddrByType(d *godo.Droplet, addrType string) string { +func FindIPv4AddrByType(d *godo.Droplet, addrType string) string { for _, addr := range d.Networks.V4 { if addr.Type == addrType { if ip := net.ParseIP(addr.IPAddress); ip != nil { @@ -442,7 +445,7 @@ func findIPv4AddrByType(d *godo.Droplet, addrType string) string { } func resourceDigitalOceanDropletUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() id, err := strconv.Atoi(d.Id()) if err != nil { @@ -480,7 +483,7 @@ func resourceDigitalOceanDropletUpdate(ctx context.Context, d *schema.ResourceDa } // Wait for the resize action to complete. - if err = waitForAction(client, action); err != nil { + if err = util.WaitForAction(client, action); err != nil { newErr := powerOnAndWait(ctx, d, meta) if newErr != nil { return diag.Errorf( @@ -534,7 +537,7 @@ func resourceDigitalOceanDropletUpdate(ctx context.Context, d *schema.ResourceDa "Error enabling backups on droplet (%s): %s", d.Id(), err) } - if err := waitForAction(client, action); err != nil { + if err := util.WaitForAction(client, action); err != nil { return diag.Errorf("Error waiting for backups to be enabled for droplet (%s): %s", d.Id(), err) } } else { @@ -545,7 +548,7 @@ func resourceDigitalOceanDropletUpdate(ctx context.Context, d *schema.ResourceDa "Error disabling backups on droplet (%s): %s", d.Id(), err) } - if err := waitForAction(client, action); err != nil { + if err := util.WaitForAction(client, action); err != nil { return diag.Errorf("Error waiting for backups to be disabled for droplet (%s): %s", d.Id(), err) } } @@ -591,7 +594,7 @@ func resourceDigitalOceanDropletUpdate(ctx context.Context, d *schema.ResourceDa } if d.HasChange("tags") { - err = setTags(client, d, godo.DropletResourceType) + err = tag.SetTags(client, d, godo.DropletResourceType) if err != nil { return diag.Errorf("Error updating tags: %s", err) } @@ -624,7 +627,7 @@ func resourceDigitalOceanDropletUpdate(ctx context.Context, d *schema.ResourceDa return diag.Errorf("Error attaching volume %q to droplet (%s): %s", volumeID, d.Id(), err) } // can't fire >1 action at a time, so waiting for each is OK - if err := waitForAction(client, action); err != nil { + if err := util.WaitForAction(client, action); err != nil { return diag.Errorf("Error waiting for volume %q to attach to droplet (%s): %s", volumeID, d.Id(), err) } } @@ -637,7 +640,7 @@ func resourceDigitalOceanDropletUpdate(ctx context.Context, d *schema.ResourceDa } func resourceDigitalOceanDropletDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() id, err := strconv.Atoi(d.Id()) if err != nil { @@ -742,7 +745,7 @@ func waitForDropletAttribute( // cleaner and more efficient func dropletStateRefreshFunc( ctx context.Context, d *schema.ResourceData, attribute string, meta interface{}) resource.StateRefreshFunc { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() return func() (interface{}, string, error) { id, err := strconv.Atoi(d.Id()) if err != nil { @@ -789,7 +792,7 @@ func powerOnAndWait(ctx context.Context, d *schema.ResourceData, meta interface{ return fmt.Errorf("invalid droplet id: %v", err) } - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() _, _, err = client.DropletActions.PowerOn(context.Background(), id) if err != nil { return err @@ -826,13 +829,13 @@ func detachVolumeIDOnDroplet(d *schema.ResourceData, volumeID string, meta inter if err != nil { return fmt.Errorf("invalid droplet id: %v", err) } - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() action, _, err := client.StorageActions.DetachByDropletID(context.Background(), volumeID, id) if err != nil { return fmt.Errorf("Error detaching volume %q from droplet (%s): %s", volumeID, d.Id(), err) } // can't fire >1 action at a time, so waiting for each is OK - if err := waitForAction(client, action); err != nil { + if err := util.WaitForAction(client, action); err != nil { return fmt.Errorf("Error waiting for volume %q to detach from droplet (%s): %s", volumeID, d.Id(), err) } diff --git a/digitalocean/resource_digitalocean_droplet_migrate.go b/digitalocean/droplet/resource_droplet_migrate.go similarity index 92% rename from digitalocean/resource_digitalocean_droplet_migrate.go rename to digitalocean/droplet/resource_droplet_migrate.go index 5e8a37714..098a4cee0 100644 --- a/digitalocean/resource_digitalocean_droplet_migrate.go +++ b/digitalocean/droplet/resource_droplet_migrate.go @@ -1,4 +1,4 @@ -package digitalocean +package droplet import ( "fmt" @@ -7,7 +7,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func resourceDigitalOceanDropletMigrateState(v int, is *terraform.InstanceState, meta interface{}) (*terraform.InstanceState, error) { +func ResourceDigitalOceanDropletMigrateState(v int, is *terraform.InstanceState, meta interface{}) (*terraform.InstanceState, error) { switch v { case 0: diff --git a/digitalocean/resource_digitalocean_droplet_migrate_test.go b/digitalocean/droplet/resource_droplet_migrate_test.go similarity index 85% rename from digitalocean/resource_digitalocean_droplet_migrate_test.go rename to digitalocean/droplet/resource_droplet_migrate_test.go index db49caae9..7443a8a30 100644 --- a/digitalocean/resource_digitalocean_droplet_migrate_test.go +++ b/digitalocean/droplet/resource_droplet_migrate_test.go @@ -1,9 +1,10 @@ -package digitalocean +package droplet_test import ( "reflect" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/droplet" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -42,7 +43,7 @@ func TestDigitalOceanDropletMigrateState(t *testing.T) { ID: tc.ID, Attributes: tc.Attributes, } - is, err := resourceDigitalOceanDropletMigrateState(tc.StateVersion, is, nil) + is, err := droplet.ResourceDigitalOceanDropletMigrateState(tc.StateVersion, is, nil) if err != nil { t.Fatalf("bad: %q, err: %#v", tn, err) diff --git a/digitalocean/resource_digitalocean_droplet_test.go b/digitalocean/droplet/resource_droplet_test.go similarity index 72% rename from digitalocean/resource_digitalocean_droplet_test.go rename to digitalocean/droplet/resource_droplet_test.go index d4aea2af2..53cb16c7e 100644 --- a/digitalocean/resource_digitalocean_droplet_test.go +++ b/digitalocean/droplet/resource_droplet_test.go @@ -1,69 +1,33 @@ -package digitalocean +package droplet_test import ( - "context" "fmt" - "log" "regexp" - "strconv" "strings" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/droplet" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_droplet", &resource.Sweeper{ - Name: "digitalocean_droplet", - F: testSweepDroplets, - }) - -} - -func testSweepDroplets(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListOptions{PerPage: 200} - droplets, _, err := client.Droplets.List(context.Background(), opt) - if err != nil { - return err - } - log.Printf("[DEBUG] Found %d droplets to sweep", len(droplets)) - - for _, d := range droplets { - if strings.HasPrefix(d.Name, "foo-") || strings.HasPrefix(d.Name, "bar-") || strings.HasPrefix(d.Name, "baz-") || strings.HasPrefix(d.Name, "tf-acc-test-") || strings.HasPrefix(d.Name, "foobar-") { - log.Printf("Destroying Droplet %s", d.Name) - - if _, err := client.Droplets.Delete(context.Background(), d.ID); err != nil { - return err - } - } - } - - return nil -} - func TestAccDigitalOceanDroplet_Basic(t *testing.T) { var droplet godo.Droplet rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletAttributes(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -78,7 +42,7 @@ func TestAccDigitalOceanDroplet_Basic(t *testing.T) { resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "region", "nyc3"), resource.TestCheckResourceAttr( - "digitalocean_droplet.foobar", "user_data", HashString("foobar")), + "digitalocean_droplet.foobar", "user_data", util.HashString("foobar")), resource.TestCheckResourceAttrSet( "digitalocean_droplet.foobar", "ipv4_address_private"), resource.TestCheckResourceAttrSet( @@ -99,14 +63,14 @@ func TestAccDigitalOceanDroplet_WithID(t *testing.T) { slug := "ubuntu-22-04-x64" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanDropletConfig_withID(rInt, slug), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), ), }, }, @@ -122,14 +86,14 @@ func TestAccDigitalOceanDroplet_withSSH(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanDropletConfig_withSSH(rInt, publicKeyMaterial), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletAttributes(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -140,7 +104,7 @@ func TestAccDigitalOceanDroplet_withSSH(t *testing.T) { resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "region", "nyc3"), resource.TestCheckResourceAttr( - "digitalocean_droplet.foobar", "user_data", HashString("foobar")), + "digitalocean_droplet.foobar", "user_data", util.HashString("foobar")), ), }, }, @@ -152,14 +116,14 @@ func TestAccDigitalOceanDroplet_Update(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletAttributes(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -169,7 +133,7 @@ func TestAccDigitalOceanDroplet_Update(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_RenameAndResize(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletRenamedAndResized(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("baz-%d", rInt)), @@ -188,14 +152,14 @@ func TestAccDigitalOceanDroplet_ResizeWithOutDisk(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletAttributes(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -205,7 +169,7 @@ func TestAccDigitalOceanDroplet_ResizeWithOutDisk(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_resize_without_disk(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletResizeWithOutDisk(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -224,14 +188,14 @@ func TestAccDigitalOceanDroplet_ResizeSmaller(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletAttributes(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -241,7 +205,7 @@ func TestAccDigitalOceanDroplet_ResizeSmaller(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_resize_without_disk(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletResizeWithOutDisk(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -253,9 +217,9 @@ func TestAccDigitalOceanDroplet_ResizeSmaller(t *testing.T) { }, // Test that we can downgrade a Droplet plan as long as the disk remains the same { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletAttributes(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -269,7 +233,7 @@ func TestAccDigitalOceanDroplet_ResizeSmaller(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_resize(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletResizeSmaller(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -288,14 +252,14 @@ func TestAccDigitalOceanDroplet_UpdateUserData(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterCreate), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterCreate), testAccCheckDigitalOceanDropletAttributes(&afterCreate), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -305,13 +269,13 @@ func TestAccDigitalOceanDroplet_UpdateUserData(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_userdata_update(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterUpdate), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterUpdate), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "user_data", - HashString("foobar foobar")), + util.HashString("foobar foobar")), testAccCheckDigitalOceanDropletRecreated( t, &afterCreate, &afterUpdate), ), @@ -325,14 +289,14 @@ func TestAccDigitalOceanDroplet_UpdateTags(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterCreate), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterCreate), testAccCheckDigitalOceanDropletAttributes(&afterCreate), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -342,7 +306,7 @@ func TestAccDigitalOceanDroplet_UpdateTags(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_tag_update(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterUpdate), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterUpdate), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), resource.TestCheckResourceAttr( @@ -360,14 +324,14 @@ func TestAccDigitalOceanDroplet_VPCAndIpv6(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanDropletConfig_VPCAndIpv6(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletAttributes_PrivateNetworkingIpv6(&droplet), resource.TestCheckResourceAttrSet( "digitalocean_droplet.foobar", "vpc_uuid"), @@ -384,14 +348,14 @@ func TestAccDigitalOceanDroplet_UpdatePrivateNetworkingIpv6(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterCreate), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterCreate), testAccCheckDigitalOceanDropletAttributes(&afterCreate), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -402,7 +366,7 @@ func TestAccDigitalOceanDroplet_UpdatePrivateNetworkingIpv6(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_PrivateNetworkingIpv6(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterUpdate), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &afterUpdate), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), resource.TestCheckResourceAttr( @@ -420,14 +384,14 @@ func TestAccDigitalOceanDroplet_Monitoring(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanDropletConfig_Monitoring(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "monitoring", "true"), ), @@ -442,15 +406,15 @@ func TestAccDigitalOceanDroplet_conditionalVolumes(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanDropletConfig_conditionalVolumes(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar.0", &firstDroplet), - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar.1", &secondDroplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar.0", &firstDroplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar.1", &secondDroplet), resource.TestCheckResourceAttr("digitalocean_droplet.foobar.0", "volume_ids.#", "1"), // This could be improved in core/HCL to make it less confusing @@ -467,14 +431,14 @@ func TestAccDigitalOceanDroplet_EnableAndDisableBackups(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletAttributes(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -486,7 +450,7 @@ func TestAccDigitalOceanDroplet_EnableAndDisableBackups(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_EnableBackups(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "backups", "true"), ), @@ -495,7 +459,7 @@ func TestAccDigitalOceanDroplet_EnableAndDisableBackups(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_DisableBackups(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "backups", "false"), ), @@ -509,14 +473,14 @@ func TestAccDigitalOceanDroplet_EnableAndDisableGracefulShutdown(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanDropletAttributes(&droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", fmt.Sprintf("foo-%d", rInt)), @@ -528,7 +492,7 @@ func TestAccDigitalOceanDroplet_EnableAndDisableGracefulShutdown(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_EnableGracefulShutdown(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "graceful_shutdown", "true"), ), @@ -537,7 +501,7 @@ func TestAccDigitalOceanDroplet_EnableAndDisableGracefulShutdown(t *testing.T) { { Config: testAccCheckDigitalOceanDropletConfig_DisableGracefulShutdown(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "graceful_shutdown", "false"), ), @@ -551,23 +515,23 @@ func TestAccDigitalOceanDroplet_EnableAndDisableGracefulShutdown(t *testing.T) { // if the `droplet_agent` field is explicitly set to true. func TestAccDigitalOceanDroplet_withDropletAgentSetTrue(t *testing.T) { var droplet godo.Droplet - keyName := randomTestName() + keyName := acceptance.RandomTestName() publicKeyMaterial, _, err := acctest.RandSSHKeyPair("digitalocean@ssh-acceptance-test") if err != nil { t.Fatalf("Cannot generate test SSH key pair: %s", err) } - dropletName := randomTestName() + dropletName := acceptance.RandomTestName() agent := "droplet_agent = true" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanDropletConfig_DropletAgent(keyName, publicKeyMaterial, dropletName, "ubuntu-20-04-x64", agent), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", dropletName), resource.TestCheckResourceAttr( @@ -585,23 +549,23 @@ func TestAccDigitalOceanDroplet_withDropletAgentSetTrue(t *testing.T) { // if the `droplet_agent` field is explicitly set to false. func TestAccDigitalOceanDroplet_withDropletAgentSetFalse(t *testing.T) { var droplet godo.Droplet - keyName := randomTestName() + keyName := acceptance.RandomTestName() publicKeyMaterial, _, err := acctest.RandSSHKeyPair("digitalocean@ssh-acceptance-test") if err != nil { t.Fatalf("Cannot generate test SSH key pair: %s", err) } - dropletName := randomTestName() + dropletName := acceptance.RandomTestName() agent := "droplet_agent = false" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanDropletConfig_DropletAgent(keyName, publicKeyMaterial, dropletName, "rancheros", agent), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", dropletName), resource.TestCheckResourceAttr( @@ -619,22 +583,22 @@ func TestAccDigitalOceanDroplet_withDropletAgentSetFalse(t *testing.T) { // if the `droplet_agent` field is not explicitly set. func TestAccDigitalOceanDroplet_withDropletAgentNotSet(t *testing.T) { var droplet godo.Droplet - keyName := randomTestName() + keyName := acceptance.RandomTestName() publicKeyMaterial, _, err := acctest.RandSSHKeyPair("digitalocean@ssh-acceptance-test") if err != nil { t.Fatalf("Cannot generate test SSH key pair: %s", err) } - dropletName := randomTestName() + dropletName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanDropletConfig_DropletAgent(keyName, publicKeyMaterial, dropletName, "rancheros", ""), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", dropletName), resource.TestCheckResourceAttr( @@ -653,18 +617,18 @@ func TestAccDigitalOceanDroplet_withDropletAgentNotSet(t *testing.T) { // from the API when creating a Droplet using an OS that does not support the agent // if the `droplet_agent` field is explicitly set to true. func TestAccDigitalOceanDroplet_withDropletAgentExpectError(t *testing.T) { - keyName := randomTestName() + keyName := acceptance.RandomTestName() publicKeyMaterial, _, err := acctest.RandSSHKeyPair("digitalocean@ssh-acceptance-test") if err != nil { t.Fatalf("Cannot generate test SSH key pair: %s", err) } - dropletName := randomTestName() + dropletName := acceptance.RandomTestName() agent := "droplet_agent = true" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanDropletConfig_DropletAgent(keyName, publicKeyMaterial, dropletName, "rancheros", agent), @@ -675,12 +639,12 @@ func TestAccDigitalOceanDroplet_withDropletAgentExpectError(t *testing.T) { } func TestAccDigitalOceanDroplet_withTimeout(t *testing.T) { - dropletName := randomTestName() + dropletName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: fmt.Sprintf(`resource "digitalocean_droplet" "foobar" { @@ -700,12 +664,12 @@ func TestAccDigitalOceanDroplet_withTimeout(t *testing.T) { func TestAccDigitalOceanDroplet_Regionless(t *testing.T) { var droplet godo.Droplet - dropletName := randomTestName() + dropletName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: fmt.Sprintf(` @@ -715,7 +679,7 @@ resource "digitalocean_droplet" "foobar" { image = "ubuntu-22-04-x64" }`, dropletName), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "name", dropletName), resource.TestCheckResourceAttr( @@ -730,34 +694,6 @@ resource "digitalocean_droplet" "foobar" { }) } -func testAccCheckDigitalOceanDropletDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() - - for _, rs := range s.RootModule().Resources { - if rs.Type != "digitalocean_droplet" { - continue - } - - id, err := strconv.Atoi(rs.Primary.ID) - if err != nil { - return err - } - - // Try to find the Droplet - _, _, err = client.Droplets.Get(context.Background(), id) - - // Wait - - if err != nil && !strings.Contains(err.Error(), "404") { - return fmt.Errorf( - "Error waiting for droplet (%s) to be destroyed: %s", - rs.Primary.ID, err) - } - } - - return nil -} - func testAccCheckDigitalOceanDropletAttributes(droplet *godo.Droplet) resource.TestCheckFunc { return func(s *terraform.State) error { @@ -834,38 +770,38 @@ func testAccCheckDigitalOceanDropletResizeSmaller(droplet *godo.Droplet) resourc } } -func testAccCheckDigitalOceanDropletAttributes_PrivateNetworkingIpv6(droplet *godo.Droplet) resource.TestCheckFunc { +func testAccCheckDigitalOceanDropletAttributes_PrivateNetworkingIpv6(d *godo.Droplet) resource.TestCheckFunc { return func(s *terraform.State) error { - if droplet.Image.Slug != "ubuntu-22-04-x64" { - return fmt.Errorf("Bad image_slug: %s", droplet.Image.Slug) + if d.Image.Slug != "ubuntu-22-04-x64" { + return fmt.Errorf("Bad image_slug: %s", d.Image.Slug) } - if droplet.Size.Slug != "s-1vcpu-1gb" { - return fmt.Errorf("Bad size_slug: %s", droplet.Size.Slug) + if d.Size.Slug != "s-1vcpu-1gb" { + return fmt.Errorf("Bad size_slug: %s", d.Size.Slug) } - if droplet.Region.Slug != "nyc3" { - return fmt.Errorf("Bad region_slug: %s", droplet.Region.Slug) + if d.Region.Slug != "nyc3" { + return fmt.Errorf("Bad region_slug: %s", d.Region.Slug) } - if findIPv4AddrByType(droplet, "private") == "" { - return fmt.Errorf("No ipv4 private: %s", findIPv4AddrByType(droplet, "private")) + if droplet.FindIPv4AddrByType(d, "private") == "" { + return fmt.Errorf("No ipv4 private: %s", droplet.FindIPv4AddrByType(d, "private")) } - if findIPv4AddrByType(droplet, "public") == "" { - return fmt.Errorf("No ipv4 public: %s", findIPv4AddrByType(droplet, "public")) + if droplet.FindIPv4AddrByType(d, "public") == "" { + return fmt.Errorf("No ipv4 public: %s", droplet.FindIPv4AddrByType(d, "public")) } - if findIPv6AddrByType(droplet, "public") == "" { - return fmt.Errorf("No ipv6 public: %s", findIPv6AddrByType(droplet, "public")) + if droplet.FindIPv6AddrByType(d, "public") == "" { + return fmt.Errorf("No ipv6 public: %s", droplet.FindIPv6AddrByType(d, "public")) } for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_droplet" { continue } - if rs.Primary.Attributes["ipv6_address"] != strings.ToLower(findIPv6AddrByType(droplet, "public")) { + if rs.Primary.Attributes["ipv6_address"] != strings.ToLower(droplet.FindIPv6AddrByType(d, "public")) { return fmt.Errorf("IPV6 Address should be lowercase") } @@ -875,41 +811,6 @@ func testAccCheckDigitalOceanDropletAttributes_PrivateNetworkingIpv6(droplet *go } } -func testAccCheckDigitalOceanDropletExists(n string, droplet *godo.Droplet) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[n] - if !ok { - return fmt.Errorf("Not found: %s", n) - } - - if rs.Primary.ID == "" { - return fmt.Errorf("No Droplet ID is set") - } - - client := testAccProvider.Meta().(*CombinedConfig).godoClient() - - id, err := strconv.Atoi(rs.Primary.ID) - if err != nil { - return err - } - - // Try to find the Droplet - retrieveDroplet, _, err := client.Droplets.Get(context.Background(), id) - - if err != nil { - return err - } - - if strconv.Itoa(retrieveDroplet.ID) != rs.Primary.ID { - return fmt.Errorf("Droplet not found") - } - - *droplet = *retrieveDroplet - - return nil - } -} - func testAccCheckDigitalOceanDropletRecreated(t *testing.T, before, after *godo.Droplet) resource.TestCheckFunc { return func(s *terraform.State) error { @@ -920,17 +821,6 @@ func testAccCheckDigitalOceanDropletRecreated(t *testing.T, } } -func testAccCheckDigitalOceanDropletConfig_basic(rInt int) string { - return fmt.Sprintf(` -resource "digitalocean_droplet" "foobar" { - name = "foo-%d" - size = "s-1vcpu-1gb" - image = "ubuntu-22-04-x64" - region = "nyc3" - user_data = "foobar" -}`, rInt) -} - func testAccCheckDigitalOceanDropletConfig_withID(rInt int, slug string) string { return fmt.Sprintf(` data "digitalocean_image" "foobar" { @@ -1057,7 +947,7 @@ resource "digitalocean_droplet" "foobar" { ipv6 = true vpc_uuid = digitalocean_vpc.foobar.id } -`, randomTestName(), rInt) +`, acceptance.RandomTestName(), rInt) } func testAccCheckDigitalOceanDropletConfig_Monitoring(rInt int) string { diff --git a/digitalocean/droplet/sweep.go b/digitalocean/droplet/sweep.go new file mode 100644 index 000000000..4e70a82fa --- /dev/null +++ b/digitalocean/droplet/sweep.go @@ -0,0 +1,47 @@ +package droplet + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_droplet", &resource.Sweeper{ + Name: "digitalocean_droplet", + F: sweepDroplets, + }) +} + +func sweepDroplets(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + droplets, _, err := client.Droplets.List(context.Background(), opt) + if err != nil { + return err + } + log.Printf("[DEBUG] Found %d droplets to sweep", len(droplets)) + + for _, d := range droplets { + if strings.HasPrefix(d.Name, "foo-") || strings.HasPrefix(d.Name, "bar-") || strings.HasPrefix(d.Name, "baz-") || strings.HasPrefix(d.Name, "tf-acc-test-") || strings.HasPrefix(d.Name, "foobar-") { + log.Printf("Destroying Droplet %s", d.Name) + + if _, err := client.Droplets.Delete(context.Background(), d.ID); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/filter.go b/digitalocean/filter.go deleted file mode 100644 index 8a358fa79..000000000 --- a/digitalocean/filter.go +++ /dev/null @@ -1,57 +0,0 @@ -package digitalocean - -import ( - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" -) - -type commonFilter struct { - key string - values []string -} - -func filterSchema(allowedKeys []string) *schema.Schema { - return &schema.Schema{ - Type: schema.TypeSet, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "key": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validation.StringInSlice(allowedKeys, false), - }, - "values": { - Type: schema.TypeList, - Required: true, - Elem: &schema.Schema{Type: schema.TypeString}, - }, - }, - }, - Optional: true, - Description: "One or more key/value pairs to filter droplet size results.", - } -} - -func expandFilters(rawFilters []interface{}) []commonFilter { - expandedFilters := make([]commonFilter, len(rawFilters)) - for i, rawFilter := range rawFilters { - f := rawFilter.(map[string]interface{}) - - expandedFilter := commonFilter{ - key: f["key"].(string), - values: expandFilterValues(f["values"].([]interface{})), - } - - expandedFilters[i] = expandedFilter - } - return expandedFilters -} - -func expandFilterValues(rawFilterValues []interface{}) []string { - expandedFilterValues := make([]string, len(rawFilterValues)) - for i, v := range rawFilterValues { - expandedFilterValues[i] = v.(string) - } - - return expandedFilterValues -} diff --git a/digitalocean/filter_test.go b/digitalocean/filter_test.go deleted file mode 100644 index d3f86d128..000000000 --- a/digitalocean/filter_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package digitalocean - -import "testing" - -func TestExpandFilters(t *testing.T) { - rawFilters := []interface{}{ - map[string]interface{}{ - "key": "fieldA", - "values": []interface{}{"foo", "bar"}, - }, - map[string]interface{}{ - "key": "fieldB", - "values": []interface{}{"20", "40"}, - }, - } - - expandedFilters := expandFilters(rawFilters) - - if len(rawFilters) != len(expandedFilters) { - t.Fatalf("incorrect expected length of expanded filters") - } - if expandedFilters[0].key != "fieldA" || - len(expandedFilters[0].values) != 2 || - expandedFilters[0].values[0] != "foo" || - expandedFilters[0].values[1] != "bar" { - t.Fatalf("incorrect expansion of the 1st expanded filters") - } - if expandedFilters[1].key != "fieldB" || - len(expandedFilters[1].values) != 2 || - expandedFilters[1].values[0] != "20" || - expandedFilters[1].values[1] != "40" { - t.Fatalf("incorrect expansion of the 2nd expanded filters") - } -} diff --git a/digitalocean/datasource_digitalocean_firewall.go b/digitalocean/firewall/datasource_firewall.go similarity index 90% rename from digitalocean/datasource_digitalocean_firewall.go rename to digitalocean/firewall/datasource_firewall.go index efde1e959..395974b12 100644 --- a/digitalocean/datasource_digitalocean_firewall.go +++ b/digitalocean/firewall/datasource_firewall.go @@ -1,4 +1,4 @@ -package digitalocean +package firewall import ( "context" @@ -7,7 +7,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanFirewall() *schema.Resource { +func DataSourceDigitalOceanFirewall() *schema.Resource { fwSchema := firewallSchema() for _, f := range fwSchema { diff --git a/digitalocean/datasource_digitalocean_firewall_test.go b/digitalocean/firewall/datasource_firewall_test.go similarity index 93% rename from digitalocean/datasource_digitalocean_firewall_test.go rename to digitalocean/firewall/datasource_firewall_test.go index c1695f99b..e913cc4e3 100644 --- a/digitalocean/datasource_digitalocean_firewall_test.go +++ b/digitalocean/firewall/datasource_firewall_test.go @@ -1,10 +1,11 @@ -package digitalocean +package firewall_test import ( "fmt" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -15,14 +16,14 @@ data "digitalocean_firewall" "foobar" { }` var firewall godo.Firewall - fwName := randomTestName() + fwName := acceptance.RandomTestName() fwCreateConfig := fmt.Sprintf(testAccDigitalOceanFirewallConfig_OnlyInbound(fwName)) updatedFWCreateConfig := testAccDigitalOceanFirewallConfig_OnlyMultipleInbound(fwName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: fwCreateConfig, diff --git a/digitalocean/firewalls.go b/digitalocean/firewall/firewalls.go similarity index 94% rename from digitalocean/firewalls.go rename to digitalocean/firewall/firewalls.go index c8a33ab06..de4b5f273 100644 --- a/digitalocean/firewalls.go +++ b/digitalocean/firewall/firewalls.go @@ -1,7 +1,8 @@ -package digitalocean +package firewall import ( "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) @@ -63,7 +64,7 @@ func firewallSchema() map[string]*schema.Schema { }, }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), } } @@ -117,7 +118,7 @@ func firewallRuleSchema(prefix string) *schema.Resource { }, Optional: true, }, - prefix + "tags": tagsSchema(), + prefix + "tags": tag.TagsSchema(), }, } } @@ -155,7 +156,7 @@ func expandFirewallInboundRules(rules []interface{}) []godo.InboundRule { src.KubernetesIDs = expandFirewallRuleStringSet(rule["source_kubernetes_ids"].(*schema.Set).List()) - src.Tags = expandTags(rule["source_tags"].(*schema.Set).List()) + src.Tags = tag.ExpandTags(rule["source_tags"].(*schema.Set).List()) r := godo.InboundRule{ Protocol: rule["protocol"].(string), @@ -183,7 +184,7 @@ func expandFirewallOutboundRules(rules []interface{}) []godo.OutboundRule { dest.KubernetesIDs = expandFirewallRuleStringSet(rule["destination_kubernetes_ids"].(*schema.Set).List()) - dest.Tags = expandTags(rule["destination_tags"].(*schema.Set).List()) + dest.Tags = tag.ExpandTags(rule["destination_tags"].(*schema.Set).List()) r := godo.OutboundRule{ Protocol: rule["protocol"].(string), @@ -258,7 +259,7 @@ func flattenFirewallInboundRules(rules []godo.InboundRule) []interface{} { } if sources.Tags != nil { - rawRule["source_tags"] = flattenTags(sources.Tags) + rawRule["source_tags"] = tag.FlattenTags(sources.Tags) } if sources.DropletIDs != nil { @@ -310,7 +311,7 @@ func flattenFirewallOutboundRules(rules []godo.OutboundRule) []interface{} { } if destinations.Tags != nil { - rawRule["destination_tags"] = flattenTags(destinations.Tags) + rawRule["destination_tags"] = tag.FlattenTags(destinations.Tags) } if destinations.DropletIDs != nil { diff --git a/digitalocean/resource_digitalocean_firewall.go b/digitalocean/firewall/resource_firewall.go similarity index 89% rename from digitalocean/resource_digitalocean_firewall.go rename to digitalocean/firewall/resource_firewall.go index 87dbde067..8236f4014 100644 --- a/digitalocean/resource_digitalocean_firewall.go +++ b/digitalocean/firewall/resource_firewall.go @@ -1,4 +1,4 @@ -package digitalocean +package firewall import ( "context" @@ -7,11 +7,13 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func resourceDigitalOceanFirewall() *schema.Resource { +func ResourceDigitalOceanFirewall() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanFirewallCreate, ReadContext: resourceDigitalOceanFirewallRead, @@ -58,7 +60,7 @@ func resourceDigitalOceanFirewall() *schema.Resource { } func resourceDigitalOceanFirewallCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() opts, err := firewallRequest(d, client) if err != nil { @@ -81,7 +83,7 @@ func resourceDigitalOceanFirewallCreate(ctx context.Context, d *schema.ResourceD } func resourceDigitalOceanFirewallRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // Retrieve the firewall properties for updating the state firewall, resp, err := client.Firewalls.Get(context.Background(), d.Id()) @@ -113,7 +115,7 @@ func resourceDigitalOceanFirewallRead(ctx context.Context, d *schema.ResourceDat return diag.Errorf("[DEBUG] Error setting Firewall outbound_rule error: %#v", err) } - if err := d.Set("tags", flattenTags(firewall.Tags)); err != nil { + if err := d.Set("tags", tag.FlattenTags(firewall.Tags)); err != nil { return diag.Errorf("[DEBUG] Error setting `tags`: %+v", err) } @@ -121,7 +123,7 @@ func resourceDigitalOceanFirewallRead(ctx context.Context, d *schema.ResourceDat } func resourceDigitalOceanFirewallUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() opts, err := firewallRequest(d, client) if err != nil { @@ -139,7 +141,7 @@ func resourceDigitalOceanFirewallUpdate(ctx context.Context, d *schema.ResourceD } func resourceDigitalOceanFirewallDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting firewall: %s", d.Id()) @@ -179,7 +181,7 @@ func firewallRequest(d *schema.ResourceData, client *godo.Client) (*godo.Firewal } // Get tags - opts.Tags = expandTags(d.Get("tags").(*schema.Set).List()) + opts.Tags = tag.ExpandTags(d.Get("tags").(*schema.Set).List()) return opts, nil } diff --git a/digitalocean/resource_digitalocean_firewall_test.go b/digitalocean/firewall/resource_firewall_test.go similarity index 85% rename from digitalocean/resource_digitalocean_firewall_test.go rename to digitalocean/firewall/resource_firewall_test.go index 61820f33e..566245ef2 100644 --- a/digitalocean/resource_digitalocean_firewall_test.go +++ b/digitalocean/firewall/resource_firewall_test.go @@ -1,60 +1,25 @@ -package digitalocean +package firewall_test import ( "context" "fmt" - "log" - "strings" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_firewall", &resource.Sweeper{ - Name: "digitalocean_firewall", - F: testSweepFirewall, - }) - -} - -func testSweepFirewall(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListOptions{PerPage: 200} - fws, _, err := client.Firewalls.List(context.Background(), opt) - if err != nil { - return err - } - - for _, f := range fws { - if strings.HasPrefix(f.Name, "foobar-") { - log.Printf("Destroying firewall %s", f.Name) - - if _, err := client.Firewalls.Delete(context.Background(), f.ID); err != nil { - return err - } - } - } - - return nil -} - func TestAccDigitalOceanFirewall_AllowOnlyInbound(t *testing.T) { rName := acctest.RandString(10) var firewall godo.Firewall resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFirewallDestroy, Steps: []resource.TestStep{ { @@ -73,8 +38,8 @@ func TestAccDigitalOceanFirewall_AllowMultipleInbound(t *testing.T) { var firewall godo.Firewall resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFirewallDestroy, Steps: []resource.TestStep{ { @@ -93,8 +58,8 @@ func TestAccDigitalOceanFirewall_AllowOnlyOutbound(t *testing.T) { var firewall godo.Firewall resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFirewallDestroy, Steps: []resource.TestStep{ { @@ -113,8 +78,8 @@ func TestAccDigitalOceanFirewall_AllowMultipleOutbound(t *testing.T) { var firewall godo.Firewall resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFirewallDestroy, Steps: []resource.TestStep{ { @@ -134,8 +99,8 @@ func TestAccDigitalOceanFirewall_MultipleInboundAndOutbound(t *testing.T) { var firewall godo.Firewall resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFirewallDestroy, Steps: []resource.TestStep{ { @@ -155,8 +120,8 @@ func TestAccDigitalOceanFirewall_fullPortRange(t *testing.T) { var firewall godo.Firewall resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFirewallDestroy, Steps: []resource.TestStep{ { @@ -176,8 +141,8 @@ func TestAccDigitalOceanFirewall_icmp(t *testing.T) { var firewall godo.Firewall resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFirewallDestroy, Steps: []resource.TestStep{ { @@ -197,8 +162,8 @@ func TestAccDigitalOceanFirewall_ImportMultipleRules(t *testing.T) { rName := acctest.RandString(10) tagName := "tag-" + rName resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFirewallDestroy, Steps: []resource.TestStep{ { @@ -351,7 +316,7 @@ resource "digitalocean_firewall" "foobar" { } func testAccCheckDigitalOceanFirewallDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_firewall" { @@ -381,7 +346,7 @@ func testAccCheckDigitalOceanFirewallExists(n string, firewall *godo.Firewall) r return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundFirewall, _, err := client.Firewalls.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/firewall/sweep.go b/digitalocean/firewall/sweep.go new file mode 100644 index 000000000..38112c1e7 --- /dev/null +++ b/digitalocean/firewall/sweep.go @@ -0,0 +1,47 @@ +package firewall + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_firewall", &resource.Sweeper{ + Name: "digitalocean_firewall", + F: sweepFirewall, + }) + +} + +func sweepFirewall(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + fws, _, err := client.Firewalls.List(context.Background(), opt) + if err != nil { + return err + } + + for _, f := range fws { + if strings.HasPrefix(f.Name, "foobar-") { + log.Printf("Destroying firewall %s", f.Name) + + if _, err := client.Firewalls.Delete(context.Background(), f.ID); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/hash.go b/digitalocean/hash.go deleted file mode 100644 index 3f341d1d7..000000000 --- a/digitalocean/hash.go +++ /dev/null @@ -1,40 +0,0 @@ -package digitalocean - -import ( - "crypto/sha1" - "encoding/hex" - "hash/crc32" - - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" -) - -func HashString(s string) string { - hash := sha1.Sum([]byte(s)) - return hex.EncodeToString(hash[:]) -} - -func HashStringStateFunc() schema.SchemaStateFunc { - return func(v interface{}) string { - switch v.(type) { - case string: - return HashString(v.(string)) - default: - return "" - } - } -} - -// hashcode.String in the terraform-plugin-sdk was made internal to the SDK in v2. -// Embed the implementation here to allow same hash function to continue to be used -// by the code in this provider that used it for hash computation. -func SDKHashString(s string) int { - v := int(crc32.ChecksumIEEE([]byte(s))) - if v >= 0 { - return v - } - if -v >= 0 { - return -v - } - // v == MinInt - return 0 -} diff --git a/digitalocean/datasource_digitalocean_image.go b/digitalocean/image/datasource_image.go similarity index 90% rename from digitalocean/datasource_digitalocean_image.go rename to digitalocean/image/datasource_image.go index 11a88b1c7..acb1662e0 100644 --- a/digitalocean/datasource_digitalocean_image.go +++ b/digitalocean/image/datasource_image.go @@ -1,4 +1,4 @@ -package digitalocean +package image import ( "context" @@ -6,12 +6,14 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanImage() *schema.Resource { +func DataSourceDigitalOceanImage() *schema.Resource { recordSchema := imageSchema() for _, f := range recordSchema { @@ -45,7 +47,7 @@ func dataSourceDigitalOceanImage() *schema.Resource { } func dataSourceDigitalOceanImageRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() var foundImage *godo.Image @@ -113,7 +115,7 @@ func dataSourceDigitalOceanImageRead(ctx context.Context, d *schema.ResourceData return diag.FromErr(err) } - if err := setResourceDataFromMap(d, flattenedImage); err != nil { + if err := util.SetResourceDataFromMap(d, flattenedImage); err != nil { return diag.FromErr(err) } diff --git a/digitalocean/datasource_digitalocean_image_test.go b/digitalocean/image/datasource_image_test.go similarity index 58% rename from digitalocean/datasource_digitalocean_image_test.go rename to digitalocean/image/datasource_image_test.go index 044f7d247..c1e19099c 100644 --- a/digitalocean/datasource_digitalocean_image_test.go +++ b/digitalocean/image/datasource_image_test.go @@ -1,16 +1,14 @@ -package digitalocean +package image_test import ( - "context" "fmt" - "log" "regexp" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanImage_Basic(t *testing.T) { @@ -19,15 +17,15 @@ func TestAccDigitalOceanImage_Basic(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { - Config: testAccCheckDigitalOceanDropletConfig_basic(rInt), + Config: acceptance.TestAccCheckDigitalOceanDropletConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), - takeSnapshotsOfDroplet(rInt, &droplet, &snapshotsId), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TakeSnapshotsOfDroplet(rInt, &droplet, &snapshotsId), ), }, { @@ -55,7 +53,7 @@ func TestAccDigitalOceanImage_Basic(t *testing.T) { { Config: " ", Check: resource.ComposeTestCheckFunc( - deleteDropletSnapshots(&snapshotsId), + acceptance.DeleteDropletSnapshots(&snapshotsId), ), }, }, @@ -64,9 +62,9 @@ func TestAccDigitalOceanImage_Basic(t *testing.T) { func TestAccDigitalOceanImage_PublicSlug(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDropletDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: acceptance.TestAccCheckDigitalOceanDropletDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanImageConfig_slug("ubuntu-18-04-x64"), @@ -87,52 +85,6 @@ func TestAccDigitalOceanImage_PublicSlug(t *testing.T) { }) } -func takeSnapshotsOfDroplet(rInt int, droplet *godo.Droplet, snapshotsId *[]int) resource.TestCheckFunc { - return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() - for i := 0; i < 3; i++ { - err := takeSnapshotOfDroplet(rInt, i%2, droplet) - if err != nil { - return err - } - } - retrieveDroplet, _, err := client.Droplets.Get(context.Background(), (*droplet).ID) - if err != nil { - return err - } - *snapshotsId = retrieveDroplet.SnapshotIDs - return nil - } -} - -func takeSnapshotOfDroplet(rInt, sInt int, droplet *godo.Droplet) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() - action, _, err := client.DropletActions.Snapshot(context.Background(), (*droplet).ID, fmt.Sprintf("snap-%d-%d", rInt, sInt)) - if err != nil { - return err - } - waitForAction(client, action) - return nil -} - -func deleteDropletSnapshots(snapshotsId *[]int) resource.TestCheckFunc { - return func(s *terraform.State) error { - log.Printf("Deleting Droplet snapshots") - - client := testAccProvider.Meta().(*CombinedConfig).godoClient() - - snapshots := *snapshotsId - for _, value := range snapshots { - log.Printf("Deleting %d", value) - _, err := client.Images.Delete(context.Background(), value) - if err != nil { - return err - } - } - return nil - } -} - func testAccCheckDigitalOceanImageConfig_basic(rInt, sInt int) string { return fmt.Sprintf(` data "digitalocean_image" "foobar" { diff --git a/digitalocean/datasource_digitalocean_images.go b/digitalocean/image/datasource_images.go similarity index 84% rename from digitalocean/datasource_digitalocean_images.go rename to digitalocean/image/datasource_images.go index 919a7c984..dfe4ad2b9 100644 --- a/digitalocean/datasource_digitalocean_images.go +++ b/digitalocean/image/datasource_images.go @@ -1,11 +1,11 @@ -package digitalocean +package image import ( "github.com/digitalocean/terraform-provider-digitalocean/internal/datalist" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanImages() *schema.Resource { +func DataSourceDigitalOceanImages() *schema.Resource { dataListConfig := &datalist.ResourceConfig{ RecordSchema: imageSchema(), ResultAttributeName: "images", diff --git a/digitalocean/datasource_digitalocean_images_test.go b/digitalocean/image/datasource_images_test.go similarity index 78% rename from digitalocean/datasource_digitalocean_images_test.go rename to digitalocean/image/datasource_images_test.go index 852432c4e..49f00971c 100644 --- a/digitalocean/datasource_digitalocean_images_test.go +++ b/digitalocean/image/datasource_images_test.go @@ -1,4 +1,4 @@ -package digitalocean +package image_test import ( "context" @@ -7,6 +7,8 @@ import ( "strconv" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -21,14 +23,14 @@ data "digitalocean_images" "ubuntu" { } ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: config, Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrSet("data.digitalocean_images.ubuntu", "images.#"), - testResourceInstanceState("data.digitalocean_images.ubuntu", testAccDataSourceDigitalOceanImages_VerifyImageData), + acceptance.TestResourceInstanceState("data.digitalocean_images.ubuntu", testAccDataSourceDigitalOceanImages_VerifyImageData), ), }, }, @@ -56,7 +58,7 @@ func testAccDataSourceDigitalOceanImages_VerifyImageData(is *terraform.InstanceS return fmt.Errorf("images.0.slug attribute not found") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() image, _, err := client.Images.GetBySlug(context.Background(), slug) if err != nil { diff --git a/digitalocean/images.go b/digitalocean/image/images.go similarity index 93% rename from digitalocean/images.go rename to digitalocean/image/images.go index 58b63e170..ceda658fc 100644 --- a/digitalocean/images.go +++ b/digitalocean/image/images.go @@ -1,4 +1,4 @@ -package digitalocean +package image import ( "context" @@ -6,6 +6,8 @@ import ( "strconv" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -78,7 +80,7 @@ func imageSchema() map[string]*schema.Schema { } func getDigitalOceanImages(meta interface{}, extra map[string]interface{}) ([]interface{}, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() return listDigitalOceanImages(client.Images.List) } @@ -126,7 +128,7 @@ func flattenDigitalOceanImage(rawImage interface{}, meta interface{}, extra map[ flattenedRegions.Add(region) } - flattenedTags := flattenTags(image.Tags) + flattenedTags := tag.FlattenTags(image.Tags) flattenedImage := map[string]interface{}{ "id": image.ID, diff --git a/digitalocean/resource_digitalocean_custom_image.go b/digitalocean/image/resource_custom_image.go similarity index 88% rename from digitalocean/resource_digitalocean_custom_image.go rename to digitalocean/image/resource_custom_image.go index 0f377e3bf..f833991d1 100644 --- a/digitalocean/resource_digitalocean_custom_image.go +++ b/digitalocean/image/resource_custom_image.go @@ -1,4 +1,4 @@ -package digitalocean +package image import ( "context" @@ -9,6 +9,9 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" @@ -18,11 +21,11 @@ import ( // Ref: https://developers.digitalocean.com/documentation/v2/#retrieve-an-existing-image-by-id const ( - imageAvailableStatus = "available" - imageDeletedStatus = "deleted" + ImageAvailableStatus = "available" + ImageDeletedStatus = "deleted" ) -func resourceDigitalOceanCustomImage() *schema.Resource { +func ResourceDigitalOceanCustomImage() *schema.Resource { return &schema.Resource{ ReadContext: resourceDigitalOceanCustomImageRead, CreateContext: resourceDigitalOceanCustomImageCreate, @@ -58,7 +61,7 @@ func resourceDigitalOceanCustomImage() *schema.Resource { Default: "Unknown", ValidateFunc: validation.StringInSlice(validImageDistributions(), false), }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), "image_id": { Type: schema.TypeInt, Computed: true, @@ -94,14 +97,14 @@ func resourceDigitalOceanCustomImage() *schema.Resource { }, // Images can not currently be removed from a region. CustomizeDiff: customdiff.ForceNewIfChange("regions", func(ctx context.Context, old, new, meta interface{}) bool { - remove, _ := getSetChanges(old.(*schema.Set), new.(*schema.Set)) + remove, _ := util.GetSetChanges(old.(*schema.Set), new.(*schema.Set)) return len(remove.List()) > 0 }), } } func resourceDigitalOceanCustomImageCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // We import the image to the first region. We can distribute it to others once it is available. regions := d.Get("regions").(*schema.Set).List() @@ -122,7 +125,7 @@ func resourceDigitalOceanCustomImageCreate(ctx context.Context, d *schema.Resour } if tags, ok := d.GetOk("tags"); ok { - imageCreateRequest.Tags = expandTags(tags.(*schema.Set).List()) + imageCreateRequest.Tags = tag.ExpandTags(tags.(*schema.Set).List()) } imageResponse, _, err := client.Images.Create(ctx, &imageCreateRequest) @@ -133,7 +136,7 @@ func resourceDigitalOceanCustomImageCreate(ctx context.Context, d *schema.Resour id := strconv.Itoa(imageResponse.ID) d.SetId(id) - _, err = waitForImage(ctx, d, imageAvailableStatus, imagePendingStatuses(), "status", meta) + _, err = waitForImage(ctx, d, ImageAvailableStatus, imagePendingStatuses(), "status", meta) if err != nil { return diag.Errorf("Error waiting for image (%s) to become ready: %s", d.Id(), err) } @@ -154,7 +157,7 @@ func resourceDigitalOceanCustomImageCreate(ctx context.Context, d *schema.Resour } func resourceDigitalOceanCustomImageRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() imageID := d.Id() @@ -168,7 +171,7 @@ func resourceDigitalOceanCustomImageRead(ctx context.Context, d *schema.Resource return diag.Errorf("Error retrieving image with id %s: %s", imageID, err) } // Set status as deleted if image is deleted - if imageResponse.Status == imageDeletedStatus { + if imageResponse.Status == ImageDeletedStatus { d.SetId("") return nil } @@ -183,7 +186,7 @@ func resourceDigitalOceanCustomImageRead(ctx context.Context, d *schema.Resource d.Set("size_gigabytes", imageResponse.SizeGigaBytes) d.Set("created_at", imageResponse.Created) d.Set("description", imageResponse.Description) - if err := d.Set("tags", flattenTags(imageResponse.Tags)); err != nil { + if err := d.Set("tags", tag.FlattenTags(imageResponse.Tags)); err != nil { return diag.Errorf("Error setting `tags`: %+v", err) } d.Set("status", imageResponse.Status) @@ -191,7 +194,7 @@ func resourceDigitalOceanCustomImageRead(ctx context.Context, d *schema.Resource } func resourceDigitalOceanCustomImageUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() imageID := d.Id() @@ -216,7 +219,7 @@ func resourceDigitalOceanCustomImageUpdate(ctx context.Context, d *schema.Resour if d.HasChange("regions") { old, new := d.GetChange("regions") - _, add := getSetChanges(old.(*schema.Set), new.(*schema.Set)) + _, add := util.GetSetChanges(old.(*schema.Set), new.(*schema.Set)) err = distributeImageToRegions(client, id, add.List()) if err != nil { return diag.Errorf("Error distributing image (%s) to additional regions: %s", d.Id(), err) @@ -227,7 +230,7 @@ func resourceDigitalOceanCustomImageUpdate(ctx context.Context, d *schema.Resour } func resourceDigitalOceanCustomImageDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() imageID := d.Id() @@ -263,7 +266,7 @@ func waitForImage(ctx context.Context, d *schema.ResourceData, target string, pe func imageStateRefreshFunc(ctx context.Context, d *schema.ResourceData, state string, meta interface{}) resource.StateRefreshFunc { return func() (interface{}, string, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() imageID := d.Id() @@ -277,7 +280,7 @@ func imageStateRefreshFunc(ctx context.Context, d *schema.ResourceData, state st return nil, "", err } - if imageResponse.Status == imageDeletedStatus { + if imageResponse.Status == ImageDeletedStatus { return nil, "", fmt.Errorf(imageResponse.ErrorMessage) } @@ -298,7 +301,7 @@ func distributeImageToRegions(client *godo.Client, imageId int, regions []interf return err } - err = waitForAction(client, action) + err = util.WaitForAction(client, action) if err != nil { return err } diff --git a/digitalocean/resource_digitalocean_custom_image_test.go b/digitalocean/image/resource_custom_image_test.go similarity index 85% rename from digitalocean/resource_digitalocean_custom_image_test.go rename to digitalocean/image/resource_custom_image_test.go index d853091c6..1650af639 100644 --- a/digitalocean/resource_digitalocean_custom_image_test.go +++ b/digitalocean/image/resource_custom_image_test.go @@ -1,4 +1,4 @@ -package digitalocean +package image_test import ( "context" @@ -6,19 +6,22 @@ import ( "strconv" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/image" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanCustomImageFull(t *testing.T) { - rString := randomTestName() + rString := acceptance.RandomTestName() name := fmt.Sprintf("digitalocean_custom_image.%s", rString) regions := `["nyc3"]` - updatedString := randomTestName() + updatedString := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanCustomImageDestroy, Steps: []resource.TestStep{ { @@ -52,14 +55,14 @@ func TestAccDigitalOceanCustomImageFull(t *testing.T) { } func TestAccDigitalOceanCustomImageMultiRegion(t *testing.T) { - rString := randomTestName() + rString := acceptance.RandomTestName() name := fmt.Sprintf("digitalocean_custom_image.%s", rString) regions := `["nyc3", "nyc2"]` regionsUpdated := `["nyc3", "nyc2", "tor1"]` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanCustomImageDestroy, Steps: []resource.TestStep{ { @@ -107,7 +110,7 @@ resource "digitalocean_custom_image" "%s" { } func testAccCheckDigitalOceanCustomImageDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_custom_image" { @@ -125,7 +128,7 @@ func testAccCheckDigitalOceanCustomImageDestroy(s *terraform.State) error { return err } - if resp.Status != imageDeletedStatus { + if resp.Status != image.ImageDeletedStatus { return fmt.Errorf("Image %d not destroyed", id) } } diff --git a/digitalocean/datasource_digitalocean_kubernetes_cluster.go b/digitalocean/kubernetes/datasource_kubernetes_cluster.go similarity index 90% rename from digitalocean/datasource_digitalocean_kubernetes_cluster.go rename to digitalocean/kubernetes/datasource_kubernetes_cluster.go index c8b07b927..8c5e28bdf 100644 --- a/digitalocean/datasource_digitalocean_kubernetes_cluster.go +++ b/digitalocean/kubernetes/datasource_kubernetes_cluster.go @@ -1,15 +1,17 @@ -package digitalocean +package kubernetes import ( "context" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanKubernetesCluster() *schema.Resource { +func DataSourceDigitalOceanKubernetesCluster() *schema.Resource { dsNodePoolSchema := nodePoolSchema(false) for _, k := range dsNodePoolSchema { @@ -73,7 +75,7 @@ func dataSourceDigitalOceanKubernetesCluster() *schema.Resource { Computed: true, }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), "maintenance_policy": { Type: schema.TypeList, @@ -135,7 +137,7 @@ func dataSourceDigitalOceanKubernetesCluster() *schema.Resource { } func dataSourceDigitalOceanKubernetesClusterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() clusters, resp, err := client.Kubernetes.List(context.Background(), &godo.ListOptions{}) if err != nil { diff --git a/digitalocean/datasource_digitalocean_kubernetes_cluster_test.go b/digitalocean/kubernetes/datasource_kubernetes_cluster_test.go similarity index 89% rename from digitalocean/datasource_digitalocean_kubernetes_cluster_test.go rename to digitalocean/kubernetes/datasource_kubernetes_cluster_test.go index 2c33cbec0..c5788028e 100644 --- a/digitalocean/datasource_digitalocean_kubernetes_cluster_test.go +++ b/digitalocean/kubernetes/datasource_kubernetes_cluster_test.go @@ -1,4 +1,4 @@ -package digitalocean +package kubernetes_test import ( "context" @@ -7,12 +7,14 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceDigitalOceanKubernetesCluster_Basic(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster expectedURNRegEx, _ := regexp.Compile(`do:kubernetes:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) resourceConfig := testAccDigitalOceanKubernetesConfigForDataSource(testClusterVersionLatest, rName) @@ -22,8 +24,8 @@ data "digitalocean_kubernetes_cluster" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, ExternalProviders: map[string]resource.ExternalProvider{ "kubernetes": { Source: "hashicorp/kubernetes", @@ -93,7 +95,7 @@ func testAccCheckDataSourceDigitalOceanKubernetesClusterExists(n string, cluster return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundCluster, _, err := client.Kubernetes.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/datasource_digitalocean_kubernetes_versions.go b/digitalocean/kubernetes/datasource_kubernetes_versions.go similarity index 85% rename from digitalocean/datasource_digitalocean_kubernetes_versions.go rename to digitalocean/kubernetes/datasource_kubernetes_versions.go index 566ec38a9..64d9929a2 100644 --- a/digitalocean/datasource_digitalocean_kubernetes_versions.go +++ b/digitalocean/kubernetes/datasource_kubernetes_versions.go @@ -1,15 +1,16 @@ -package digitalocean +package kubernetes import ( "context" "strings" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanKubernetesVersions() *schema.Resource { +func DataSourceDigitalOceanKubernetesVersions() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanKubernetesVersionsRead, Schema: map[string]*schema.Schema{ @@ -31,7 +32,7 @@ func dataSourceDigitalOceanKubernetesVersions() *schema.Resource { } func dataSourceDigitalOceanKubernetesVersionsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() k8sOptions, _, err := client.Kubernetes.GetOptions(context.Background()) if err != nil { diff --git a/digitalocean/datasource_digitalocean_kubernetes_versions_test.go b/digitalocean/kubernetes/datasource_kubernetes_versions_test.go similarity index 82% rename from digitalocean/datasource_digitalocean_kubernetes_versions_test.go rename to digitalocean/kubernetes/datasource_kubernetes_versions_test.go index 600c6e094..db36442bd 100644 --- a/digitalocean/datasource_digitalocean_kubernetes_versions_test.go +++ b/digitalocean/kubernetes/datasource_kubernetes_versions_test.go @@ -1,17 +1,18 @@ -package digitalocean +package kubernetes_test import ( "fmt" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDataSourceDigitalOceanKubernetesVersions_Basic(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: fmt.Sprintf(testAccCheckDataSourceDigitalOceanKubernetesVersionsConfig_basic), @@ -26,8 +27,8 @@ func TestAccDataSourceDigitalOceanKubernetesVersions_Basic(t *testing.T) { func TestAccDataSourceDigitalOceanKubernetesVersions_Filtered(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: fmt.Sprintf(testAccCheckDataSourceDigitalOceanKubernetesVersionsConfig_filtered), @@ -41,12 +42,12 @@ func TestAccDataSourceDigitalOceanKubernetesVersions_Filtered(t *testing.T) { } func TestAccDataSourceDigitalOceanKubernetesVersions_CreateCluster(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_kubernetes_cluster_test.go b/digitalocean/kubernetes/import_kubernetes_cluster_test.go similarity index 82% rename from digitalocean/import_digitalocean_kubernetes_cluster_test.go rename to digitalocean/kubernetes/import_kubernetes_cluster_test.go index 56e660304..441af9625 100644 --- a/digitalocean/import_digitalocean_kubernetes_cluster_test.go +++ b/digitalocean/kubernetes/import_kubernetes_cluster_test.go @@ -1,4 +1,4 @@ -package digitalocean +package kubernetes_test import ( "context" @@ -8,16 +8,19 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/kubernetes" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanKubernetesCluster_ImportBasic(t *testing.T) { - clusterName := randomTestName() + clusterName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { @@ -42,7 +45,7 @@ func TestAccDigitalOceanKubernetesCluster_ImportBasic(t *testing.T) { func testAccDigitalOceanKubernetesRemoveDefaultNodePoolTag(clusterName string) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() clusters, resp, err := client.Kubernetes.List(context.Background(), &godo.ListOptions{}) if err != nil { @@ -67,7 +70,7 @@ func testAccDigitalOceanKubernetesRemoveDefaultNodePoolTag(clusterName string) r for _, nodePool := range cluster.NodePools { tags := make([]string, 0) for _, tag := range nodePool.Tags { - if tag != digitaloceanKubernetesDefaultNodePoolTag { + if tag != kubernetes.DigitaloceanKubernetesDefaultNodePoolTag { tags = append(tags, tag) } } @@ -89,8 +92,8 @@ func testAccDigitalOceanKubernetesRemoveDefaultNodePoolTag(clusterName string) r } func TestAccDigitalOceanKubernetesCluster_ImportNonDefaultNodePool(t *testing.T) { - testName1 := randomTestName() - testName2 := randomTestName() + testName1 := acceptance.RandomTestName() + testName2 := acceptance.RandomTestName() config := fmt.Sprintf(`%s @@ -115,8 +118,8 @@ resource "digitalocean_kubernetes_node_pool" "barfoo" { `, testClusterVersionLatest, testName1, testName2) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_kubernetes_node_pool_test.go b/digitalocean/kubernetes/import_kubernetes_node_pool_test.go similarity index 80% rename from digitalocean/import_digitalocean_kubernetes_node_pool_test.go rename to digitalocean/kubernetes/import_kubernetes_node_pool_test.go index 09d4479ce..7c608ce3e 100644 --- a/digitalocean/import_digitalocean_kubernetes_node_pool_test.go +++ b/digitalocean/kubernetes/import_kubernetes_node_pool_test.go @@ -1,16 +1,17 @@ -package digitalocean +package kubernetes_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDigitalOceanKubernetesNodePool_Import(t *testing.T) { - testName1 := randomTestName() - testName2 := randomTestName() + testName1 := acceptance.RandomTestName() + testName2 := acceptance.RandomTestName() config := fmt.Sprintf(`%s @@ -36,8 +37,8 @@ resource "digitalocean_kubernetes_node_pool" "barfoo" { resourceName := "digitalocean_kubernetes_node_pool.barfoo" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/kubernetes.go b/digitalocean/kubernetes/kubernetes.go similarity index 92% rename from digitalocean/kubernetes.go rename to digitalocean/kubernetes/kubernetes.go index 7877aa05e..e15e3c322 100644 --- a/digitalocean/kubernetes.go +++ b/digitalocean/kubernetes/kubernetes.go @@ -1,9 +1,10 @@ -package digitalocean +package kubernetes import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) @@ -80,7 +81,7 @@ func nodePoolSchema(isResource bool) map[string]*schema.Schema { Optional: true, }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), "labels": { Type: schema.TypeMap, @@ -208,7 +209,7 @@ func expandNodePools(nodePools []interface{}) []*godo.KubernetesNodePool { AutoScale: pool["auto_scale"].(bool), MinNodes: pool["min_nodes"].(int), MaxNodes: pool["max_nodes"].(int), - Tags: expandTags(pool["tags"].(*schema.Set).List()), + Tags: tag.ExpandTags(pool["tags"].(*schema.Set).List()), Labels: expandLabels(pool["labels"].(map[string]interface{})), Nodes: expandNodes(pool["nodes"].([]interface{})), Taints: expandNodePoolTaints(pool["taint"].(*schema.Set).List()), @@ -264,7 +265,7 @@ func flattenNodePool(d *schema.ResourceData, keyPrefix string, pool *godo.Kubern } if pool.Tags != nil { - rawPool["tags"] = flattenTags(filterTags(pool.Tags)) + rawPool["tags"] = tag.FlattenTags(FilterTags(pool.Tags)) } if pool.Labels != nil { @@ -359,3 +360,18 @@ func flattenNodePoolTaints(taints []godo.Taint) []interface{} { return flattenedTaints } + +// FilterTags filters tags to remove any automatically added to avoid state problems, +// these are tags starting with "k8s:" or named "k8s" +func FilterTags(tags []string) []string { + filteredTags := make([]string, 0) + for _, t := range tags { + if !strings.HasPrefix(t, "k8s:") && + !strings.HasPrefix(t, "terraform:") && + t != "k8s" { + filteredTags = append(filteredTags, t) + } + } + + return filteredTags +} diff --git a/digitalocean/resource_digitalocean_kubernetes_cluster.go b/digitalocean/kubernetes/resource_kubernetes_cluster.go similarity index 91% rename from digitalocean/resource_digitalocean_kubernetes_cluster.go rename to digitalocean/kubernetes/resource_kubernetes_cluster.go index 4527a013a..3aa751e33 100644 --- a/digitalocean/resource_digitalocean_kubernetes_cluster.go +++ b/digitalocean/kubernetes/resource_kubernetes_cluster.go @@ -1,4 +1,4 @@ -package digitalocean +package kubernetes import ( "context" @@ -9,6 +9,8 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/go-version" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff" @@ -17,7 +19,7 @@ import ( yaml "gopkg.in/yaml.v2" ) -func resourceDigitalOceanKubernetesCluster() *schema.Resource { +func ResourceDigitalOceanKubernetesCluster() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanKubernetesClusterCreate, ReadContext: resourceDigitalOceanKubernetesClusterRead, @@ -92,7 +94,7 @@ func resourceDigitalOceanKubernetesCluster() *schema.Resource { Computed: true, }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), "maintenance_policy": { Type: schema.TypeList, @@ -232,12 +234,12 @@ func kubernetesConfigSchema() *schema.Schema { } func resourceDigitalOceanKubernetesClusterCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() pools := expandNodePools(d.Get("node_pool").([]interface{})) poolCreateRequests := make([]*godo.KubernetesNodePoolCreateRequest, len(pools)) for i, pool := range pools { - tags := append(pool.Tags, digitaloceanKubernetesDefaultNodePoolTag) + tags := append(pool.Tags, DigitaloceanKubernetesDefaultNodePoolTag) poolCreateRequests[i] = &godo.KubernetesNodePoolCreateRequest{ Name: pool.Name, Size: pool.Size, @@ -257,7 +259,7 @@ func resourceDigitalOceanKubernetesClusterCreate(ctx context.Context, d *schema. VersionSlug: d.Get("version").(string), SurgeUpgrade: d.Get("surge_upgrade").(bool), HA: d.Get("ha").(bool), - Tags: expandTags(d.Get("tags").(*schema.Set).List()), + Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()), NodePools: poolCreateRequests, } @@ -296,7 +298,7 @@ func resourceDigitalOceanKubernetesClusterCreate(ctx context.Context, d *schema. } func resourceDigitalOceanKubernetesClusterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() cluster, resp, err := client.Kubernetes.Get(context.Background(), d.Id()) if err != nil { @@ -325,7 +327,7 @@ func digitaloceanKubernetesClusterRead( d.Set("service_subnet", cluster.ServiceSubnet) d.Set("ipv4_address", cluster.IPv4) d.Set("endpoint", cluster.Endpoint) - d.Set("tags", flattenTags(filterTags(cluster.Tags))) + d.Set("tags", tag.FlattenTags(FilterTags(cluster.Tags))) d.Set("status", cluster.Status.State) d.Set("created_at", cluster.CreatedAt.UTC().String()) d.Set("updated_at", cluster.UpdatedAt.UTC().String()) @@ -342,9 +344,9 @@ func digitaloceanKubernetesClusterRead( foundDefaultNodePool := false for i, p := range cluster.NodePools { for _, t := range p.Tags { - if t == digitaloceanKubernetesDefaultNodePoolTag { + if t == DigitaloceanKubernetesDefaultNodePoolTag { if foundDefaultNodePool { - log.Printf("[WARN] Multiple node pools are marked as the default; only one node pool may have the `%s` tag", digitaloceanKubernetesDefaultNodePoolTag) + log.Printf("[WARN] Multiple node pools are marked as the default; only one node pool may have the `%s` tag", DigitaloceanKubernetesDefaultNodePoolTag) } keyPrefix := fmt.Sprintf("node_pool.%d.", i) @@ -357,7 +359,7 @@ func digitaloceanKubernetesClusterRead( } } if !foundDefaultNodePool { - log.Printf("[WARN] No default node pool was found. The default node pool must have the `%s` tag if created with Terraform.", digitaloceanKubernetesDefaultNodePoolTag) + log.Printf("[WARN] No default node pool was found. The default node pool must have the `%s` tag if created with Terraform.", DigitaloceanKubernetesDefaultNodePoolTag) } // fetch cluster credentials and update the resource if the credentials are expired. @@ -387,14 +389,14 @@ func digitaloceanKubernetesClusterRead( } func resourceDigitalOceanKubernetesClusterUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // Figure out the changes and then call the appropriate API methods if d.HasChanges("name", "tags", "auto_upgrade", "surge_upgrade", "maintenance_policy") { opts := &godo.KubernetesClusterUpdateRequest{ Name: d.Get("name").(string), - Tags: expandTags(d.Get("tags").(*schema.Set).List()), + Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()), AutoUpgrade: godo.Bool(d.Get("auto_upgrade").(bool)), SurgeUpgrade: d.Get("surge_upgrade").(bool), } @@ -431,7 +433,7 @@ func resourceDigitalOceanKubernetesClusterUpdate(ctx context.Context, d *schema. // update the existing default pool timeout := d.Timeout(schema.TimeoutCreate) - _, err := digitaloceanKubernetesNodePoolUpdate(client, timeout, newPool, d.Id(), oldPool["id"].(string), digitaloceanKubernetesDefaultNodePoolTag) + _, err := digitaloceanKubernetesNodePoolUpdate(client, timeout, newPool, d.Id(), oldPool["id"].(string), DigitaloceanKubernetesDefaultNodePoolTag) if err != nil { return diag.FromErr(err) } @@ -452,7 +454,7 @@ func resourceDigitalOceanKubernetesClusterUpdate(ctx context.Context, d *schema. } func resourceDigitalOceanKubernetesClusterDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() resp, err := client.Kubernetes.Delete(context.Background(), d.Id()) if err != nil { @@ -475,7 +477,7 @@ func resourceDigitalOceanKubernetesClusterDelete(ctx context.Context, d *schema. // required to ensure the default node pool has the `terraform:default-node-pool` tag and to // import any non-default node pools associated with the cluster. func resourceDigitalOceanKubernetesClusterImportState(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() cluster, _, err := client.Kubernetes.Get(context.Background(), d.Id()) if err != nil { @@ -488,7 +490,7 @@ func resourceDigitalOceanKubernetesClusterImportState(d *schema.ResourceData, me refreshCluster := false for _, nodePool := range cluster.NodePools { for _, tag := range nodePool.Tags { - if tag == digitaloceanKubernetesDefaultNodePoolTag { + if tag == DigitaloceanKubernetesDefaultNodePoolTag { countOfNodePoolsWithTag += 1 } } @@ -496,19 +498,19 @@ func resourceDigitalOceanKubernetesClusterImportState(d *schema.ResourceData, me if countOfNodePoolsWithTag > 1 { // Multiple node pools have the tag. Stop the import and notify the user they need to manually ensure // only one node pool has the tag. - return nil, fmt.Errorf("Multiple node pools are tagged as the default node pool; only one node pool may have the `%s` tag", digitaloceanKubernetesDefaultNodePoolTag) + return nil, fmt.Errorf("Multiple node pools are tagged as the default node pool; only one node pool may have the `%s` tag", DigitaloceanKubernetesDefaultNodePoolTag) } else if countOfNodePoolsWithTag == 0 { // None of the node pools have the tag. If there is only one node pool, then it must be the default // node pool and thus add the tag. Adding the tag is non-destructive, and thus should be fine. if len(cluster.NodePools) == 1 { nodePool := cluster.NodePools[0] - tags := append(nodePool.Tags, digitaloceanKubernetesDefaultNodePoolTag) + tags := append(nodePool.Tags, DigitaloceanKubernetesDefaultNodePoolTag) nodePoolUpdateRequest := &godo.KubernetesNodePoolUpdateRequest{ Tags: tags, } - log.Printf("[INFO] Adding %s tag to node pool %s in cluster %s", digitaloceanKubernetesDefaultNodePoolTag, + log.Printf("[INFO] Adding %s tag to node pool %s in cluster %s", DigitaloceanKubernetesDefaultNodePoolTag, nodePool.ID, cluster.ID) _, _, err := client.Kubernetes.UpdateNodePool(context.Background(), cluster.ID, nodePool.ID, nodePoolUpdateRequest) @@ -518,7 +520,7 @@ func resourceDigitalOceanKubernetesClusterImportState(d *schema.ResourceData, me refreshCluster = true } else { - return nil, fmt.Errorf("Cannot infer default node pool since there are multiple node pools; please manually add the `%s` tag to the default node pool", digitaloceanKubernetesDefaultNodePoolTag) + return nil, fmt.Errorf("Cannot infer default node pool since there are multiple node pools; please manually add the `%s` tag to the default node pool", DigitaloceanKubernetesDefaultNodePoolTag) } } @@ -538,13 +540,13 @@ func resourceDigitalOceanKubernetesClusterImportState(d *schema.ResourceData, me importNodePool := true for _, tag := range nodePool.Tags { - if tag == digitaloceanKubernetesDefaultNodePoolTag { + if tag == DigitaloceanKubernetesDefaultNodePoolTag { importNodePool = false } } if importNodePool { - resource := resourceDigitalOceanKubernetesNodePool() + resource := ResourceDigitalOceanKubernetesNodePool() // Note: Must set type and ID. // See https://www.terraform.io/docs/extend/resources/import.html#multiple-resource-import @@ -651,7 +653,7 @@ func flattenCredentials(name string, region string, creds *godo.KubernetesCluste raw["client_certificate"] = string(creds.ClientCertificateData) } - kubeconfigYAML, err := renderKubeconfig(name, region, creds) + kubeconfigYAML, err := RenderKubeconfig(name, region, creds) if err != nil { log.Printf("[DEBUG] error marshalling config: %s", err) return nil @@ -661,7 +663,7 @@ func flattenCredentials(name string, region string, creds *godo.KubernetesCluste return []interface{}{raw} } -func renderKubeconfig(name string, region string, creds *godo.KubernetesClusterCredentials) ([]byte, error) { +func RenderKubeconfig(name string, region string, creds *godo.KubernetesClusterCredentials) ([]byte, error) { clusterName := fmt.Sprintf("do-%s-%s", region, name) userName := fmt.Sprintf("do-%s-%s-admin", region, name) config := kubernetesConfig{ @@ -697,18 +699,3 @@ func renderKubeconfig(name string, region string, creds *godo.KubernetesClusterC } return yaml.Marshal(config) } - -// we need to filter tags to remove any automatically added to avoid state problems, -// these are tags starting with "k8s:" or named "k8s" -func filterTags(tags []string) []string { - filteredTags := make([]string, 0) - for _, t := range tags { - if !strings.HasPrefix(t, "k8s:") && - !strings.HasPrefix(t, "terraform:") && - t != "k8s" { - filteredTags = append(filteredTags, t) - } - } - - return filteredTags -} diff --git a/digitalocean/resource_digitalocean_kubernetes_cluster_test.go b/digitalocean/kubernetes/resource_kubernetes_cluster_test.go similarity index 93% rename from digitalocean/resource_digitalocean_kubernetes_cluster_test.go rename to digitalocean/kubernetes/resource_kubernetes_cluster_test.go index c7ded3f2a..d01eee220 100644 --- a/digitalocean/resource_digitalocean_kubernetes_cluster_test.go +++ b/digitalocean/kubernetes/resource_kubernetes_cluster_test.go @@ -1,17 +1,18 @@ -package digitalocean +package kubernetes_test import ( "context" "encoding/base64" "fmt" - "log" "reflect" "regexp" - "strings" "testing" "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/kubernetes" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -37,49 +38,14 @@ data "digitalocean_kubernetes_versions" "test" { }` ) -func init() { - resource.AddTestSweepers("digitalocean_kubernetes_cluster", &resource.Sweeper{ - Name: "digitalocean_kubernetes_cluster", - F: testSweepKubernetesClusters, - }) - -} - -func testSweepKubernetesClusters(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListOptions{PerPage: 200} - clusters, _, err := client.Kubernetes.List(context.Background(), opt) - if err != nil { - return err - } - log.Printf("[DEBUG] Found %d Kubernetes clusters to sweep", len(clusters)) - - for _, c := range clusters { - if strings.HasPrefix(c.Name, testNamePrefix) { - log.Printf("Destroying Kubernetes cluster %s", c.Name) - if _, err := client.Kubernetes.Delete(context.Background(), c.ID); err != nil { - return err - } - } - } - - return nil -} - func TestAccDigitalOceanKubernetesCluster_Basic(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster expectedURNRegEx, _ := regexp.Compile(`do:kubernetes:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { @@ -164,12 +130,12 @@ resource "digitalocean_kubernetes_cluster" "foobar" { } func TestAccDigitalOceanKubernetesCluster_CreateWithHAControlPlane(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { @@ -206,12 +172,12 @@ func TestAccDigitalOceanKubernetesCluster_CreateWithHAControlPlane(t *testing.T) } func TestAccDigitalOceanKubernetesCluster_UpdateCluster(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { @@ -238,7 +204,7 @@ func TestAccDigitalOceanKubernetesCluster_UpdateCluster(t *testing.T) { } func TestAccDigitalOceanKubernetesCluster_MaintenancePolicy(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster policy := ` @@ -256,8 +222,8 @@ func TestAccDigitalOceanKubernetesCluster_MaintenancePolicy(t *testing.T) { ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { @@ -285,12 +251,12 @@ func TestAccDigitalOceanKubernetesCluster_MaintenancePolicy(t *testing.T) { } func TestAccDigitalOceanKubernetesCluster_UpdatePoolDetails(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { @@ -324,12 +290,12 @@ func TestAccDigitalOceanKubernetesCluster_UpdatePoolDetails(t *testing.T) { } func TestAccDigitalOceanKubernetesCluster_UpdatePoolSize(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { @@ -359,12 +325,12 @@ func TestAccDigitalOceanKubernetesCluster_UpdatePoolSize(t *testing.T) { } func TestAccDigitalOceanKubernetesCluster_CreatePoolWithAutoScale(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ // Create with auto-scaling and explicit node_count. @@ -500,12 +466,12 @@ func TestAccDigitalOceanKubernetesCluster_CreatePoolWithAutoScale(t *testing.T) } func TestAccDigitalOceanKubernetesCluster_UpdatePoolWithAutoScale(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ // Create with auto-scaling disabled. @@ -602,12 +568,12 @@ func TestAccDigitalOceanKubernetesCluster_UpdatePoolWithAutoScale(t *testing.T) } func TestAccDigitalOceanKubernetesCluster_KubernetesProviderInteroperability(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, ExternalProviders: map[string]resource.ExternalProvider{ "kubernetes": { Source: "hashicorp/kubernetes", @@ -630,12 +596,12 @@ func TestAccDigitalOceanKubernetesCluster_KubernetesProviderInteroperability(t * } func TestAccDigitalOceanKubernetesCluster_UpgradeVersion(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { @@ -833,7 +799,7 @@ resource "kubernetes_service_account" "tiller" { } func testAccCheckDigitalOceanKubernetesClusterDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_kubernetes_cluster" { @@ -863,7 +829,7 @@ func testAccCheckDigitalOceanKubernetesClusterExists(n string, cluster *godo.Kub return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundCluster, _, err := client.Kubernetes.Get(context.Background(), rs.Primary.ID) @@ -905,7 +871,7 @@ func Test_filterTags(t *testing.T) { } for _, tt := range tests { - filteredTags := filterTags(tt.have) + filteredTags := kubernetes.FilterTags(tt.have) if !reflect.DeepEqual(filteredTags, tt.want) { t.Errorf("filterTags returned %+v, expected %+v", filteredTags, tt.want) } @@ -939,7 +905,7 @@ users: Token: "97ae2bbcfd85c34155a56b822ffa73909d6770b28eb7e5dfa78fa83e02ffc60f", ExpiresAt: time.Now(), } - kubeConfigRenderd, err := renderKubeconfig("test-cluster", "lon1", &creds) + kubeConfigRenderd, err := kubernetes.RenderKubeconfig("test-cluster", "lon1", &creds) if err != nil { t.Errorf("error calling renderKubeconfig: %s", err) diff --git a/digitalocean/resource_digitalocean_kubernetes_node_pool.go b/digitalocean/kubernetes/resource_kubernetes_node_pool.go similarity index 90% rename from digitalocean/resource_digitalocean_kubernetes_node_pool.go rename to digitalocean/kubernetes/resource_kubernetes_node_pool.go index 61a4c985d..cdb1dc116 100644 --- a/digitalocean/resource_digitalocean_kubernetes_node_pool.go +++ b/digitalocean/kubernetes/resource_kubernetes_node_pool.go @@ -1,4 +1,4 @@ -package digitalocean +package kubernetes import ( "context" @@ -7,15 +7,17 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) // to distinguish between a node pool resource and the default pool from the cluster // we automatically add this tag to the default pool -const digitaloceanKubernetesDefaultNodePoolTag = "terraform:default-node-pool" +const DigitaloceanKubernetesDefaultNodePoolTag = "terraform:default-node-pool" -func resourceDigitalOceanKubernetesNodePool() *schema.Resource { +func ResourceDigitalOceanKubernetesNodePool() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanKubernetesNodePoolCreate, @@ -37,7 +39,7 @@ func resourceDigitalOceanKubernetesNodePool() *schema.Resource { } func resourceDigitalOceanKubernetesNodePoolCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() rawPool := map[string]interface{}{ "name": d.Get("name"), @@ -63,7 +65,7 @@ func resourceDigitalOceanKubernetesNodePoolCreate(ctx context.Context, d *schema } func resourceDigitalOceanKubernetesNodePoolRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() pool, resp, err := client.Kubernetes.GetNodePool(context.Background(), d.Get("cluster_id").(string), d.Id()) if err != nil { @@ -79,7 +81,7 @@ func resourceDigitalOceanKubernetesNodePoolRead(ctx context.Context, d *schema.R d.Set("size", pool.Size) d.Set("node_count", pool.Count) d.Set("actual_node_count", pool.Count) - d.Set("tags", flattenTags(filterTags(pool.Tags))) + d.Set("tags", tag.FlattenTags(FilterTags(pool.Tags))) d.Set("labels", flattenLabels(pool.Labels)) d.Set("auto_scale", pool.AutoScale) d.Set("min_nodes", pool.MinNodes) @@ -97,7 +99,7 @@ func resourceDigitalOceanKubernetesNodePoolRead(ctx context.Context, d *schema.R } func resourceDigitalOceanKubernetesNodePoolUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() rawPool := map[string]interface{}{ "name": d.Get("name"), @@ -126,7 +128,7 @@ func resourceDigitalOceanKubernetesNodePoolUpdate(ctx context.Context, d *schema } func resourceDigitalOceanKubernetesNodePoolDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() _, err := client.Kubernetes.DeleteNodePool(context.Background(), d.Get("cluster_id").(string), d.Id()) if err != nil { return diag.Errorf("Unable to delete node pool %s", err) @@ -146,7 +148,7 @@ func resourceDigitalOceanKubernetesNodePoolImportState(d *schema.ResourceData, m return []*schema.ResourceData{d}, nil } - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() nodePoolId := d.Id() @@ -191,7 +193,7 @@ func resourceDigitalOceanKubernetesNodePoolImportState(d *schema.ResourceData, m // Ensure that the node pool does not have the default tag set. for _, tag := range nodePool.Tags { - if tag == digitaloceanKubernetesDefaultNodePoolTag { + if tag == DigitaloceanKubernetesDefaultNodePoolTag { return nil, fmt.Errorf("Node pool %s has the default node pool tag set; import the owning digitalocean_kubernetes_cluster resource instead (cluster ID=%s)", nodePoolId, clusterId) } @@ -204,7 +206,7 @@ func resourceDigitalOceanKubernetesNodePoolImportState(d *schema.ResourceData, m func digitaloceanKubernetesNodePoolCreate(client *godo.Client, timeout time.Duration, pool map[string]interface{}, clusterID string, customTags ...string) (*godo.KubernetesNodePool, error) { // append any custom tags - tags := expandTags(pool["tags"].(*schema.Set).List()) + tags := tag.ExpandTags(pool["tags"].(*schema.Set).List()) tags = append(tags, customTags...) req := &godo.KubernetesNodePoolCreateRequest{ @@ -234,7 +236,7 @@ func digitaloceanKubernetesNodePoolCreate(client *godo.Client, timeout time.Dura } func digitaloceanKubernetesNodePoolUpdate(client *godo.Client, timeout time.Duration, pool map[string]interface{}, clusterID, poolID string, customTags ...string) (*godo.KubernetesNodePool, error) { - tags := expandTags(pool["tags"].(*schema.Set).List()) + tags := tag.ExpandTags(pool["tags"].(*schema.Set).List()) tags = append(tags, customTags...) req := &godo.KubernetesNodePoolUpdateRequest{ @@ -243,20 +245,20 @@ func digitaloceanKubernetesNodePoolUpdate(client *godo.Client, timeout time.Dura } if pool["node_count"] != nil { - req.Count = intPtr(pool["node_count"].(int)) + req.Count = godo.PtrTo(pool["node_count"].(int)) } if pool["auto_scale"] == nil { pool["auto_scale"] = false } - req.AutoScale = boolPtr(pool["auto_scale"].(bool)) + req.AutoScale = godo.PtrTo(pool["auto_scale"].(bool)) if pool["min_nodes"] != nil { - req.MinNodes = intPtr(pool["min_nodes"].(int)) + req.MinNodes = godo.PtrTo(pool["min_nodes"].(int)) } if pool["max_nodes"] != nil { - req.MaxNodes = intPtr(pool["max_nodes"].(int)) + req.MaxNodes = godo.PtrTo(pool["max_nodes"].(int)) } if pool["labels"] != nil { diff --git a/digitalocean/resource_digitalocean_kubernetes_node_pool_test.go b/digitalocean/kubernetes/resource_kubernetes_node_pool_test.go similarity index 96% rename from digitalocean/resource_digitalocean_kubernetes_node_pool_test.go rename to digitalocean/kubernetes/resource_kubernetes_node_pool_test.go index 532f98830..3d128ed45 100644 --- a/digitalocean/resource_digitalocean_kubernetes_node_pool_test.go +++ b/digitalocean/kubernetes/resource_kubernetes_node_pool_test.go @@ -1,4 +1,4 @@ -package digitalocean +package kubernetes_test import ( "context" @@ -6,12 +6,14 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanKubernetesNodePool_Basic(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster var k8sPool godo.KubernetesNodePool @@ -57,8 +59,8 @@ resource "digitalocean_kubernetes_cluster" "foobar" { `, rName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { @@ -91,13 +93,13 @@ resource "digitalocean_kubernetes_cluster" "foobar" { } func TestAccDigitalOceanKubernetesNodePool_Update(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster var k8sPool godo.KubernetesNodePool resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ { @@ -158,13 +160,13 @@ func TestAccDigitalOceanKubernetesNodePool_Update(t *testing.T) { } func TestAccDigitalOceanKubernetesNodePool_CreateWithAutoScale(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster var k8sPool godo.KubernetesNodePool resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ // Create without auto-scaling. @@ -324,13 +326,13 @@ func TestAccDigitalOceanKubernetesNodePool_CreateWithAutoScale(t *testing.T) { } func TestAccDigitalOceanKubernetesNodePool_UpdateWithAutoScale(t *testing.T) { - rName := randomTestName() + rName := acceptance.RandomTestName() var k8s godo.KubernetesCluster var k8sPool godo.KubernetesNodePool resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanKubernetesClusterDestroy, Steps: []resource.TestStep{ // Create without auto-scaling. @@ -598,7 +600,7 @@ func testAccCheckDigitalOceanKubernetesNodePoolExists(n string, cluster *godo.Ku return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundPool, _, err := client.Kubernetes.GetNodePool(context.Background(), cluster.ID, rs.Primary.ID) diff --git a/digitalocean/kubernetes/sweep.go b/digitalocean/kubernetes/sweep.go new file mode 100644 index 000000000..fa500c51d --- /dev/null +++ b/digitalocean/kubernetes/sweep.go @@ -0,0 +1,47 @@ +package kubernetes + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_kubernetes_cluster", &resource.Sweeper{ + Name: "digitalocean_kubernetes_cluster", + F: sweepKubernetesClusters, + }) + +} + +func sweepKubernetesClusters(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + clusters, _, err := client.Kubernetes.List(context.Background(), opt) + if err != nil { + return err + } + log.Printf("[DEBUG] Found %d Kubernetes clusters to sweep", len(clusters)) + + for _, c := range clusters { + if strings.HasPrefix(c.Name, sweep.TestNamePrefix) { + log.Printf("Destroying Kubernetes cluster %s", c.Name) + if _, err := client.Kubernetes.Delete(context.Background(), c.ID); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/datasource_digitalocean_loadbalancer.go b/digitalocean/loadbalancer/datasource_loadbalancer.go similarity index 98% rename from digitalocean/datasource_digitalocean_loadbalancer.go rename to digitalocean/loadbalancer/datasource_loadbalancer.go index 55a908e68..446e9ee5a 100644 --- a/digitalocean/datasource_digitalocean_loadbalancer.go +++ b/digitalocean/loadbalancer/datasource_loadbalancer.go @@ -1,16 +1,17 @@ -package digitalocean +package loadbalancer import ( "context" "fmt" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanLoadbalancer() *schema.Resource { +func DataSourceDigitalOceanLoadbalancer() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanLoadbalancerRead, Schema: map[string]*schema.Schema{ @@ -251,7 +252,7 @@ func dataSourceDigitalOceanLoadbalancer() *schema.Resource { } func dataSourceDigitalOceanLoadbalancerRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() var foundLoadbalancer *godo.LoadBalancer diff --git a/digitalocean/datasource_digitalocean_loadbalancer_test.go b/digitalocean/loadbalancer/datasource_loadbalancer_test.go similarity index 92% rename from digitalocean/datasource_digitalocean_loadbalancer_test.go rename to digitalocean/loadbalancer/datasource_loadbalancer_test.go index 1795ca85f..43beedf40 100644 --- a/digitalocean/datasource_digitalocean_loadbalancer_test.go +++ b/digitalocean/loadbalancer/datasource_loadbalancer_test.go @@ -1,4 +1,4 @@ -package digitalocean +package loadbalancer_test import ( "context" @@ -7,6 +7,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -14,7 +16,7 @@ import ( func TestAccDataSourceDigitalOceanLoadBalancer_BasicByName(t *testing.T) { var loadbalancer godo.LoadBalancer - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := testAccCheckDataSourceDigitalOceanLoadBalancerConfig(testName, "lb-small") dataSourceConfig := ` data "digitalocean_loadbalancer" "foobar" { @@ -24,8 +26,8 @@ data "digitalocean_loadbalancer" "foobar" { expectedURNRegEx, _ := regexp.Compile(`do:loadbalancer:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -82,7 +84,7 @@ data "digitalocean_loadbalancer" "foobar" { func TestAccDataSourceDigitalOceanLoadBalancer_BasicById(t *testing.T) { var loadbalancer godo.LoadBalancer - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := testAccCheckDataSourceDigitalOceanLoadBalancerConfig(testName, "lb-small") dataSourceConfig := ` data "digitalocean_loadbalancer" "foobar" { @@ -92,8 +94,8 @@ data "digitalocean_loadbalancer" "foobar" { expectedURNRegEx, _ := regexp.Compile(`do:loadbalancer:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -146,7 +148,7 @@ data "digitalocean_loadbalancer" "foobar" { func TestAccDataSourceDigitalOceanLoadBalancer_LargeByName(t *testing.T) { var loadbalancer godo.LoadBalancer - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := testAccCheckDataSourceDigitalOceanLoadBalancerConfig(testName, "lb-large") dataSourceConfig := ` data "digitalocean_loadbalancer" "foobar" { @@ -156,8 +158,8 @@ data "digitalocean_loadbalancer" "foobar" { expectedURNRegEx, _ := regexp.Compile(`do:loadbalancer:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -208,7 +210,7 @@ data "digitalocean_loadbalancer" "foobar" { func TestAccDataSourceDigitalOceanLoadBalancer_LargeById(t *testing.T) { var loadbalancer godo.LoadBalancer - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := testAccCheckDataSourceDigitalOceanLoadBalancerConfig(testName, "lb-large") dataSourceConfig := ` data "digitalocean_loadbalancer" "foobar" { @@ -218,8 +220,8 @@ data "digitalocean_loadbalancer" "foobar" { expectedURNRegEx, _ := regexp.Compile(`do:loadbalancer:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -270,7 +272,7 @@ data "digitalocean_loadbalancer" "foobar" { func TestAccDataSourceDigitalOceanLoadBalancer_Size2ByName(t *testing.T) { var loadbalancer godo.LoadBalancer - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := testAccCheckDataSourceDigitalOceanLoadBalancerConfigSizeUnit(testName, 2) dataSourceConfig := ` data "digitalocean_loadbalancer" "foobar" { @@ -280,8 +282,8 @@ data "digitalocean_loadbalancer" "foobar" { expectedURNRegEx, _ := regexp.Compile(`do:loadbalancer:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -332,7 +334,7 @@ data "digitalocean_loadbalancer" "foobar" { func TestAccDataSourceDigitalOceanLoadBalancer_Size2ById(t *testing.T) { var loadbalancer godo.LoadBalancer - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := testAccCheckDataSourceDigitalOceanLoadBalancerConfigSizeUnit(testName, 2) dataSourceConfig := ` data "digitalocean_loadbalancer" "foobar" { @@ -342,8 +344,8 @@ data "digitalocean_loadbalancer" "foobar" { expectedURNRegEx, _ := regexp.Compile(`do:loadbalancer:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -394,7 +396,7 @@ data "digitalocean_loadbalancer" "foobar" { func TestAccDataSourceDigitalOceanLoadBalancer_multipleRulesByName(t *testing.T) { var loadbalancer godo.LoadBalancer - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := testAccCheckDigitalOceanLoadbalancerConfig_multipleRules(testName) dataSourceConfig := ` data "digitalocean_loadbalancer" "foobar" { @@ -402,8 +404,8 @@ data "digitalocean_loadbalancer" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -449,7 +451,7 @@ data "digitalocean_loadbalancer" "foobar" { func TestAccDataSourceDigitalOceanLoadBalancer_multipleRulesById(t *testing.T) { var loadbalancer godo.LoadBalancer - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := testAccCheckDigitalOceanLoadbalancerConfig_multipleRules(testName) dataSourceConfig := ` data "digitalocean_loadbalancer" "foobar" { @@ -457,8 +459,8 @@ data "digitalocean_loadbalancer" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -504,9 +506,9 @@ data "digitalocean_loadbalancer" "foobar" { func TestAccDataSourceDigitalOceanLoadBalancer_tlsCertByName(t *testing.T) { var loadbalancer godo.LoadBalancer - testName := randomTestName() + testName := acceptance.RandomTestName() rInt := acctest.RandInt() - privateKeyMaterial, leafCertMaterial, certChainMaterial := generateTestCertMaterial(t) + privateKeyMaterial, leafCertMaterial, certChainMaterial := acceptance.GenerateTestCertMaterial(t) resourceConfig := testAccCheckDigitalOceanLoadbalancerConfig_sslTermination( testName+"-cert", rInt, privateKeyMaterial, leafCertMaterial, certChainMaterial, "certificate_name", ) @@ -516,8 +518,8 @@ data "digitalocean_loadbalancer" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -559,9 +561,9 @@ data "digitalocean_loadbalancer" "foobar" { func TestAccDataSourceDigitalOceanLoadBalancer_tlsCertById(t *testing.T) { var loadbalancer godo.LoadBalancer - testName := randomTestName() + testName := acceptance.RandomTestName() rInt := acctest.RandInt() - privateKeyMaterial, leafCertMaterial, certChainMaterial := generateTestCertMaterial(t) + privateKeyMaterial, leafCertMaterial, certChainMaterial := acceptance.GenerateTestCertMaterial(t) resourceConfig := testAccCheckDigitalOceanLoadbalancerConfig_sslTermination( testName+"-cert", rInt, privateKeyMaterial, leafCertMaterial, certChainMaterial, "certificate_name", ) @@ -571,8 +573,8 @@ data "digitalocean_loadbalancer" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -624,7 +626,7 @@ func testAccCheckDataSourceDigitalOceanLoadBalancerExists(n string, loadbalancer return fmt.Errorf("No Load Balancer ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundLoadbalancer, _, err := client.LoadBalancers.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/import_digitalocean_loadbalancer_test.go b/digitalocean/loadbalancer/import_loadbalancer_test.go similarity index 73% rename from digitalocean/import_digitalocean_loadbalancer_test.go rename to digitalocean/loadbalancer/import_loadbalancer_test.go index 1300c8d81..161e90bf3 100644 --- a/digitalocean/import_digitalocean_loadbalancer_test.go +++ b/digitalocean/loadbalancer/import_loadbalancer_test.go @@ -1,8 +1,9 @@ -package digitalocean +package loadbalancer_test import ( "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -12,8 +13,8 @@ func TestAccDigitalOceanLoadBalancer_importBasic(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/loadbalancer.go b/digitalocean/loadbalancer/loadbalancer.go similarity index 95% rename from digitalocean/loadbalancer.go rename to digitalocean/loadbalancer/loadbalancer.go index e14e98cf2..7affdb09c 100644 --- a/digitalocean/loadbalancer.go +++ b/digitalocean/loadbalancer/loadbalancer.go @@ -1,4 +1,4 @@ -package digitalocean +package loadbalancer import ( "bytes" @@ -8,6 +8,8 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/certificate" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -101,7 +103,7 @@ func expandForwardingRules(client *godo.Client, config []interface{}) ([]godo.Fo if name, nameOk := rule["certificate_name"]; nameOk { certName := name.(string) if certName != "" { - cert, err := findCertificateByName(client, certName) + cert, err := certificate.FindCertificateByName(client, certName) if err != nil { return nil, err } @@ -116,7 +118,7 @@ func expandForwardingRules(client *godo.Client, config []interface{}) ([]godo.Fo // certificate name as the primary identifier instead. certName := id.(string) if certName != "" { - cert, err := findCertificateByName(client, certName) + cert, err := certificate.FindCertificateByName(client, certName) if err != nil { if strings.Contains(err.Error(), "not found") { log.Println("[DEBUG] Certificate not found looking up by name. Falling back to lookup by ID.") @@ -164,7 +166,7 @@ func hashForwardingRules(v interface{}) int { buf.WriteString(fmt.Sprintf("%t-", v.(bool))) } - return SDKHashString(buf.String()) + return util.SDKHashString(buf.String()) } func flattenDropletIds(list []int) *schema.Set { diff --git a/digitalocean/resource_digitalocean_loadbalancer.go b/digitalocean/loadbalancer/resource_loadbalancer.go similarity index 96% rename from digitalocean/resource_digitalocean_loadbalancer.go rename to digitalocean/loadbalancer/resource_loadbalancer.go index 1f04abf07..ac034a2a6 100644 --- a/digitalocean/resource_digitalocean_loadbalancer.go +++ b/digitalocean/loadbalancer/resource_loadbalancer.go @@ -1,4 +1,4 @@ -package digitalocean +package loadbalancer import ( "context" @@ -8,13 +8,16 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanLoadbalancer() *schema.Resource { +func ResourceDigitalOceanLoadbalancer() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanLoadbalancerCreate, ReadContext: resourceDigitalOceanLoadbalancerRead, @@ -320,8 +323,8 @@ func resourceDigitalOceanLoadBalancerV0() *schema.Resource { "droplet_tag": { Type: schema.TypeString, Optional: true, - DiffSuppressFunc: CaseSensitive, - ValidateFunc: validateTag, + DiffSuppressFunc: util.CaseSensitive, + ValidateFunc: tag.ValidateTag, }, "redirect_http_to_https": { @@ -410,7 +413,7 @@ func migrateLoadBalancerStateV0toV1(ctx context.Context, rawState map[string]int return rawState, nil } log.Println("[DEBUG] Migrating load balancer schema from v0 to v1.") - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // When the certificate type is lets_encrypt, the certificate // ID will change when it's renewed, so we have to rely on the @@ -494,7 +497,7 @@ func buildLoadBalancerRequest(client *godo.Client, d *schema.ResourceData) (*god } func resourceDigitalOceanLoadbalancerCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Create a Loadbalancer Request") @@ -527,7 +530,7 @@ func resourceDigitalOceanLoadbalancerCreate(ctx context.Context, d *schema.Resou } func resourceDigitalOceanLoadbalancerRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Reading the details of the Loadbalancer %s", d.Id()) loadbalancer, resp, err := client.LoadBalancers.Get(context.Background(), d.Id()) @@ -592,7 +595,7 @@ func resourceDigitalOceanLoadbalancerRead(ctx context.Context, d *schema.Resourc } func resourceDigitalOceanLoadbalancerUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() lbOpts, err := buildLoadBalancerRequest(client, d) if err != nil { @@ -609,7 +612,7 @@ func resourceDigitalOceanLoadbalancerUpdate(ctx context.Context, d *schema.Resou } func resourceDigitalOceanLoadbalancerDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting Load Balancer: %s", d.Id()) _, err := client.LoadBalancers.Delete(context.Background(), d.Id()) diff --git a/digitalocean/resource_digitalocean_loadbalancer_test.go b/digitalocean/loadbalancer/resource_loadbalancer_test.go similarity index 93% rename from digitalocean/resource_digitalocean_loadbalancer_test.go rename to digitalocean/loadbalancer/resource_loadbalancer_test.go index 510935736..0a06bb7d5 100644 --- a/digitalocean/resource_digitalocean_loadbalancer_test.go +++ b/digitalocean/loadbalancer/resource_loadbalancer_test.go @@ -1,55 +1,21 @@ -package digitalocean +package loadbalancer_test import ( "context" "fmt" - "log" "regexp" "strings" "testing" "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_loadbalancer", &resource.Sweeper{ - Name: "digitalocean_loadbalancer", - F: testSweepLoadbalancer, - }) - -} - -func testSweepLoadbalancer(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListOptions{PerPage: 200} - lbs, _, err := client.LoadBalancers.List(context.Background(), opt) - if err != nil { - return err - } - - for _, l := range lbs { - if strings.HasPrefix(l.Name, "loadbalancer-") { - log.Printf("Destroying loadbalancer %s", l.Name) - - if _, err := client.LoadBalancers.Delete(context.Background(), l.ID); err != nil { - return err - } - } - } - - return nil -} - func TestAccDigitalOceanLoadbalancer_Basic(t *testing.T) { var loadbalancer godo.LoadBalancer rInt := acctest.RandInt() @@ -57,8 +23,8 @@ func TestAccDigitalOceanLoadbalancer_Basic(t *testing.T) { expectedURNRegEx, _ := regexp.Compile(`do:loadbalancer:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -116,8 +82,8 @@ func TestAccDigitalOceanLoadbalancer_Updated(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -215,8 +181,8 @@ func TestAccDigitalOceanLoadbalancer_dropletTag(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -261,8 +227,8 @@ func TestAccDigitalOceanLoadbalancer_minimal(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -314,8 +280,8 @@ func TestAccDigitalOceanLoadbalancer_minimal(t *testing.T) { func TestAccDigitalOceanLoadbalancer_NonDefaultProject(t *testing.T) { var loadbalancer godo.LoadBalancer - lbName := randomTestName() - projectName := randomTestName() + lbName := acceptance.RandomTestName() + projectName := acceptance.RandomTestName() projectConfig := ` @@ -325,8 +291,8 @@ resource "digitalocean_project" "test" { ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -384,8 +350,8 @@ func TestAccDigitalOceanLoadbalancer_minimalUDP(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -438,8 +404,8 @@ func TestAccDigitalOceanLoadbalancer_stickySessions(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -490,12 +456,12 @@ func TestAccDigitalOceanLoadbalancer_stickySessions(t *testing.T) { func TestAccDigitalOceanLoadbalancer_sslTermination(t *testing.T) { var loadbalancer godo.LoadBalancer rInt := acctest.RandInt() - privateKeyMaterial, leafCertMaterial, certChainMaterial := generateTestCertMaterial(t) - certName := randomTestName() + privateKeyMaterial, leafCertMaterial, certChainMaterial := acceptance.GenerateTestCertMaterial(t) + certName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -536,12 +502,12 @@ func TestAccDigitalOceanLoadbalancer_sslTermination(t *testing.T) { func TestAccDigitalOceanLoadbalancer_sslCertByName(t *testing.T) { var loadbalancer godo.LoadBalancer rInt := acctest.RandInt() - privateKeyMaterial, leafCertMaterial, certChainMaterial := generateTestCertMaterial(t) - certName := randomTestName() + privateKeyMaterial, leafCertMaterial, certChainMaterial := acceptance.GenerateTestCertMaterial(t) + certName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -607,8 +573,8 @@ func TestAccDigitalOceanLoadbalancer_resizeExpectedFailure(t *testing.T) { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + Providers: acceptance.TestAccProviders, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -631,11 +597,11 @@ func TestAccDigitalOceanLoadbalancer_resizeExpectedFailure(t *testing.T) { func TestAccDigitalOceanLoadbalancer_multipleRules(t *testing.T) { var loadbalancer godo.LoadBalancer - rName := randomTestName() + rName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -712,11 +678,11 @@ func TestAccDigitalOceanLoadbalancer_multipleRules(t *testing.T) { func TestAccDigitalOceanLoadbalancer_WithVPC(t *testing.T) { var loadbalancer godo.LoadBalancer - lbName := randomTestName() + lbName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -737,11 +703,11 @@ func TestAccDigitalOceanLoadbalancer_WithVPC(t *testing.T) { func TestAccDigitalOceanLoadbalancer_Firewall(t *testing.T) { var loadbalancer godo.LoadBalancer - lbName := randomTestName() + lbName := acceptance.RandomTestName() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanLoadbalancerDestroy, Steps: []resource.TestStep{ { @@ -767,7 +733,7 @@ func TestAccDigitalOceanLoadbalancer_Firewall(t *testing.T) { } func testAccCheckDigitalOceanLoadbalancerDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_loadbalancer" { @@ -797,7 +763,7 @@ func testAccCheckDigitalOceanLoadbalancerExists(n string, loadbalancer *godo.Loa return fmt.Errorf("No Loadbalancer ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() lb, _, err := client.LoadBalancers.Get(context.Background(), rs.Primary.ID) @@ -1151,7 +1117,7 @@ resource "digitalocean_loadbalancer" "foobar" { vpc_uuid = digitalocean_vpc.foobar.id droplet_ids = [digitalocean_droplet.foobar.id] -}`, randomTestName(), randomTestName(), name) +}`, acceptance.RandomTestName(), acceptance.RandomTestName(), name) } func testAccCheckDigitalOceanLoadbalancerConfig_Firewall(name string) string { @@ -1182,5 +1148,5 @@ resource "digitalocean_loadbalancer" "foobar" { } droplet_ids = [digitalocean_droplet.foobar.id] -}`, randomTestName(), name) +}`, acceptance.RandomTestName(), name) } diff --git a/digitalocean/loadbalancer/sweep.go b/digitalocean/loadbalancer/sweep.go new file mode 100644 index 000000000..e8ad2c1e7 --- /dev/null +++ b/digitalocean/loadbalancer/sweep.go @@ -0,0 +1,47 @@ +package loadbalancer + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_loadbalancer", &resource.Sweeper{ + Name: "digitalocean_loadbalancer", + F: sweepLoadbalancer, + }) + +} + +func sweepLoadbalancer(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + lbs, _, err := client.LoadBalancers.List(context.Background(), opt) + if err != nil { + return err + } + + for _, l := range lbs { + if strings.HasPrefix(l.Name, "loadbalancer-") { + log.Printf("Destroying loadbalancer %s", l.Name) + + if _, err := client.LoadBalancers.Delete(context.Background(), l.ID); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/import_digitalocean_monitor_alert_test.go b/digitalocean/monitoring/import_monitor_alert_test.go similarity index 79% rename from digitalocean/import_digitalocean_monitor_alert_test.go rename to digitalocean/monitoring/import_monitor_alert_test.go index c1d668146..2fd3a60c3 100644 --- a/digitalocean/import_digitalocean_monitor_alert_test.go +++ b/digitalocean/monitoring/import_monitor_alert_test.go @@ -1,20 +1,21 @@ -package digitalocean +package monitoring_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDigitalOceanMonitorAlert_importBasic(t *testing.T) { - randName := randomTestName() + randName := acceptance.RandomTestName() resourceName := fmt.Sprintf("digitalocean_monitor_alert.%s", randName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanMonitorAlertDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_monitor_alert.go b/digitalocean/monitoring/resource_monitor_alert.go similarity index 87% rename from digitalocean/resource_digitalocean_monitor_alert.go rename to digitalocean/monitoring/resource_monitor_alert.go index c66bd4e0b..ad9717912 100644 --- a/digitalocean/resource_digitalocean_monitor_alert.go +++ b/digitalocean/monitoring/resource_monitor_alert.go @@ -1,16 +1,19 @@ -package digitalocean +package monitoring import ( "context" "log" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanMonitorAlert() *schema.Resource { +func ResourceDigitalOceanMonitorAlert() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanMonitorAlertCreate, ReadContext: resourceDigitalOceanMonitorAlertRead, @@ -89,7 +92,7 @@ func resourceDigitalOceanMonitorAlert() *schema.Resource { ValidateFunc: validation.FloatAtLeast(0), }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), "alerts": { Type: schema.TypeList, @@ -106,14 +109,14 @@ func resourceDigitalOceanMonitorAlert() *schema.Resource { "channel": { Type: schema.TypeString, Required: true, - DiffSuppressFunc: CaseSensitive, + DiffSuppressFunc: util.CaseSensitive, Description: "The Slack channel to send alerts to", ValidateFunc: validation.StringIsNotEmpty, }, "url": { Type: schema.TypeString, Required: true, - DiffSuppressFunc: CaseSensitive, + DiffSuppressFunc: util.CaseSensitive, Description: "The webhook URL for Slack", ValidateFunc: validation.StringIsNotEmpty, }, @@ -154,13 +157,13 @@ func resourceDigitalOceanMonitorAlert() *schema.Resource { } func resourceDigitalOceanMonitorAlertCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() alertCreateRequest := &godo.AlertPolicyCreateRequest{ Type: d.Get("type").(string), Enabled: godo.Bool(d.Get("enabled").(bool)), Description: d.Get("description").(string), - Tags: expandTags(d.Get("tags").(*schema.Set).List()), + Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()), Compare: godo.AlertPolicyComp(d.Get("compare").(string)), Window: d.Get("window").(string), Value: float32(d.Get("value").(float64)), @@ -183,8 +186,8 @@ func resourceDigitalOceanMonitorAlertCreate(ctx context.Context, d *schema.Resou func expandAlerts(config []interface{}) godo.Alerts { alertConfig := config[0].(map[string]interface{}) alerts := godo.Alerts{ - Slack: expandSlack(alertConfig["slack"].([]interface{})), - Email: expandEmail(alertConfig["email"].([]interface{})), + Slack: ExpandSlack(alertConfig["slack"].([]interface{})), + Email: ExpandEmail(alertConfig["email"].([]interface{})), } return alerts } @@ -192,13 +195,13 @@ func expandAlerts(config []interface{}) godo.Alerts { func flattenAlerts(alerts godo.Alerts) []interface{} { return []interface{}{ map[string]interface{}{ - "email": flattenEmail(alerts.Email), - "slack": flattenSlack(alerts.Slack), + "email": FlattenEmail(alerts.Email), + "slack": FlattenSlack(alerts.Slack), }, } } -func expandSlack(slackChannels []interface{}) []godo.SlackDetails { +func ExpandSlack(slackChannels []interface{}) []godo.SlackDetails { if len(slackChannels) == 0 { return nil } @@ -218,7 +221,7 @@ func expandSlack(slackChannels []interface{}) []godo.SlackDetails { return expandedSlackChannels } -func flattenSlack(slackChannels []godo.SlackDetails) []map[string]interface{} { +func FlattenSlack(slackChannels []godo.SlackDetails) []map[string]interface{} { result := make([]map[string]interface{}, 0, len(slackChannels)) for _, slackChannel := range slackChannels { @@ -231,7 +234,7 @@ func flattenSlack(slackChannels []godo.SlackDetails) []map[string]interface{} { return result } -func expandEmail(config []interface{}) []string { +func ExpandEmail(config []interface{}) []string { if len(config) == 0 { return nil } @@ -244,7 +247,7 @@ func expandEmail(config []interface{}) []string { return emailList } -func flattenEmail(emails []string) []string { +func FlattenEmail(emails []string) []string { if len(emails) == 0 { return nil } @@ -270,13 +273,13 @@ func expandEntities(config []interface{}) []string { } func resourceDigitalOceanMonitorAlertUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() updateRequest := &godo.AlertPolicyUpdateRequest{ Type: d.Get("type").(string), Enabled: godo.Bool(d.Get("enabled").(bool)), Description: d.Get("description").(string), - Tags: expandTags(d.Get("tags").(*schema.Set).List()), + Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()), Compare: godo.AlertPolicyComp(d.Get("compare").(string)), Window: d.Get("window").(string), Value: float32(d.Get("value").(float64)), @@ -293,7 +296,7 @@ func resourceDigitalOceanMonitorAlertUpdate(ctx context.Context, d *schema.Resou } func resourceDigitalOceanMonitorAlertRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() alert, resp, err := client.Monitoring.GetAlertPolicy(ctx, d.Id()) @@ -314,14 +317,14 @@ func resourceDigitalOceanMonitorAlertRead(ctx context.Context, d *schema.Resourc d.Set("value", alert.Value) d.Set("window", alert.Window) d.Set("entities", alert.Entities) - d.Set("tags", flattenTags(alert.Tags)) + d.Set("tags", tag.FlattenTags(alert.Tags)) d.Set("type", alert.Type) return nil } func resourceDigitalOceanMonitorAlertDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting the monitor alert") _, err := client.Monitoring.DeleteAlertPolicy(context.Background(), d.Id()) diff --git a/digitalocean/resource_digitalocean_monitor_alert_test.go b/digitalocean/monitoring/resource_monitor_alert_test.go similarity index 89% rename from digitalocean/resource_digitalocean_monitor_alert_test.go rename to digitalocean/monitoring/resource_monitor_alert_test.go index 56003d311..39a0dfa2c 100644 --- a/digitalocean/resource_digitalocean_monitor_alert_test.go +++ b/digitalocean/monitoring/resource_monitor_alert_test.go @@ -1,10 +1,12 @@ -package digitalocean +package monitoring_test import ( "context" "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -134,12 +136,12 @@ resource "digitalocean_monitor_alert" "%s" { ) func TestAccDigitalOceanMonitorAlert(t *testing.T) { - var randName = randomTestName() + var randName = acceptance.RandomTestName() resourceName := fmt.Sprintf("digitalocean_monitor_alert.%s", randName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanMonitorAlertDestroy, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ @@ -157,12 +159,12 @@ func TestAccDigitalOceanMonitorAlert(t *testing.T) { } func TestAccDigitalOceanMonitorAlertSlackEmailAlerts(t *testing.T) { - var randName = randomTestName() + var randName = acceptance.RandomTestName() resourceName := fmt.Sprintf("digitalocean_monitor_alert.%s", randName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanMonitorAlertDestroy, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ @@ -182,12 +184,12 @@ func TestAccDigitalOceanMonitorAlertSlackEmailAlerts(t *testing.T) { } func TestAccDigitalOceanMonitorAlertUpdate(t *testing.T) { - var randName = randomTestName() + var randName = acceptance.RandomTestName() resourceName := fmt.Sprintf("digitalocean_monitor_alert.%s", randName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanMonitorAlertDestroy, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ @@ -227,14 +229,14 @@ func TestAccDigitalOceanMonitorAlertUpdate(t *testing.T) { func TestAccDigitalOceanMonitorAlertWithTag(t *testing.T) { var ( - randName = randomTestName() - tagName = randomTestName() + randName = acceptance.RandomTestName() + tagName = acceptance.RandomTestName() ) resourceName := fmt.Sprintf("digitalocean_monitor_alert.%s", randName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanMonitorAlertDestroy, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ @@ -253,7 +255,7 @@ func TestAccDigitalOceanMonitorAlertWithTag(t *testing.T) { } func testAccCheckDigitalOceanMonitorAlertDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_monitor_alert" { diff --git a/digitalocean/datasource_digitalocean_project.go b/digitalocean/project/datasource_project.go similarity index 86% rename from digitalocean/datasource_digitalocean_project.go rename to digitalocean/project/datasource_project.go index 6c6e0a47b..50ffeaa4d 100644 --- a/digitalocean/datasource_digitalocean_project.go +++ b/digitalocean/project/datasource_project.go @@ -1,14 +1,16 @@ -package digitalocean +package project import ( "context" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanProject() *schema.Resource { +func DataSourceDigitalOceanProject() *schema.Resource { recordSchema := projectSchema() for _, f := range recordSchema { @@ -27,7 +29,7 @@ func dataSourceDigitalOceanProject() *schema.Resource { } func dataSourceDigitalOceanProjectRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // Load the specified project, otherwise load the default project. var foundProject *godo.Project @@ -75,7 +77,7 @@ func dataSourceDigitalOceanProjectRead(ctx context.Context, d *schema.ResourceDa return diag.FromErr(err) } - if err := setResourceDataFromMap(d, flattenedProject); err != nil { + if err := util.SetResourceDataFromMap(d, flattenedProject); err != nil { return diag.FromErr(err) } diff --git a/digitalocean/datasource_digitalocean_project_test.go b/digitalocean/project/datasource_project_test.go similarity index 81% rename from digitalocean/datasource_digitalocean_project_test.go rename to digitalocean/project/datasource_project_test.go index 658561be4..51e6f6ff4 100644 --- a/digitalocean/datasource_digitalocean_project_test.go +++ b/digitalocean/project/datasource_project_test.go @@ -1,9 +1,10 @@ -package digitalocean +package project_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -13,8 +14,8 @@ data "digitalocean_project" "default" { } ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: config, @@ -29,7 +30,7 @@ data "digitalocean_project" "default" { } func TestAccDataSourceDigitalOceanProject_NonDefaultProject(t *testing.T) { - nonDefaultProjectName := randomName("tf-acc-project-", 6) + nonDefaultProjectName := acceptance.RandomTestName("project") resourceConfig := fmt.Sprintf(` resource "digitalocean_project" "foo" { name = "%s" @@ -45,8 +46,8 @@ data "digitalocean_project" "barfoo" { ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/datasource_digitalocean_projects.go b/digitalocean/project/datasource_projects.go similarity index 84% rename from digitalocean/datasource_digitalocean_projects.go rename to digitalocean/project/datasource_projects.go index afc55e9c0..7a623b4c9 100644 --- a/digitalocean/datasource_digitalocean_projects.go +++ b/digitalocean/project/datasource_projects.go @@ -1,11 +1,11 @@ -package digitalocean +package project import ( "github.com/digitalocean/terraform-provider-digitalocean/internal/datalist" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanProjects() *schema.Resource { +func DataSourceDigitalOceanProjects() *schema.Resource { dataListConfig := &datalist.ResourceConfig{ RecordSchema: projectSchema(), ResultAttributeName: "projects", diff --git a/digitalocean/datasource_digitalocean_projects_test.go b/digitalocean/project/datasource_projects_test.go similarity index 85% rename from digitalocean/datasource_digitalocean_projects_test.go rename to digitalocean/project/datasource_projects_test.go index c2b300399..c5c336849 100644 --- a/digitalocean/datasource_digitalocean_projects_test.go +++ b/digitalocean/project/datasource_projects_test.go @@ -1,15 +1,16 @@ -package digitalocean +package project_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDataSourceDigitalOceanProjects_Basic(t *testing.T) { - prodProjectName := randomName("tf-acc-project-", 6) - stagingProjectName := randomName("tf-acc-project-", 6) + prodProjectName := acceptance.RandomTestName("project") + stagingProjectName := acceptance.RandomTestName("project") resourcesConfig := fmt.Sprintf(` resource "digitalocean_project" "prod" { @@ -58,8 +59,8 @@ data "digitalocean_projects" "both" { } `, stagingProjectName, stagingProjectName) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_project_test.go b/digitalocean/project/import_project_test.go similarity index 71% rename from digitalocean/import_digitalocean_project_test.go rename to digitalocean/project/import_project_test.go index 762994902..a98787123 100644 --- a/digitalocean/import_digitalocean_project_test.go +++ b/digitalocean/project/import_project_test.go @@ -1,8 +1,9 @@ -package digitalocean +package project_test import ( "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -12,8 +13,8 @@ func TestAccDigitalOceanProject_importBasic(t *testing.T) { createConfig := fixtureCreateWithDefaults(name) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/projects.go b/digitalocean/project/projects.go similarity index 73% rename from digitalocean/projects.go rename to digitalocean/project/projects.go index 6d2af0b28..bbebd9749 100644 --- a/digitalocean/projects.go +++ b/digitalocean/project/projects.go @@ -1,4 +1,4 @@ -package digitalocean +package project import ( "context" @@ -6,6 +6,7 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -51,7 +52,7 @@ func projectSchema() map[string]*schema.Schema { } func getDigitalOceanProjects(meta interface{}, extra map[string]interface{}) ([]interface{}, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() var allProjects []interface{} @@ -87,7 +88,7 @@ func getDigitalOceanProjects(meta interface{}, extra map[string]interface{}) ([] } func flattenDigitalOceanProject(rawProject interface{}, meta interface{}, extra map[string]interface{}) (map[string]interface{}, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() project, ok := rawProject.(godo.Project) if !ok { @@ -106,7 +107,7 @@ func flattenDigitalOceanProject(rawProject interface{}, meta interface{}, extra flattenedProject["created_at"] = project.CreatedAt flattenedProject["updated_at"] = project.UpdatedAt - urns, err := loadResourceURNs(client, project.ID) + urns, err := LoadResourceURNs(client, project.ID) if err != nil { return nil, fmt.Errorf("Error loading project resource URNs for project ID %s: %s", project.ID, err) } @@ -119,3 +120,38 @@ func flattenDigitalOceanProject(rawProject interface{}, meta interface{}, extra return flattenedProject, nil } + +func LoadResourceURNs(client *godo.Client, projectId string) (*[]string, error) { + opts := &godo.ListOptions{ + Page: 1, + PerPage: 200, + } + + resourceList := []godo.ProjectResource{} + for { + resources, resp, err := client.Projects.ListResources(context.Background(), projectId, opts) + if err != nil { + return nil, fmt.Errorf("Error loading project resources: %s", err) + } + + resourceList = append(resourceList, resources...) + + if resp.Links == nil || resp.Links.IsLastPage() { + break + } + + page, err := resp.Links.CurrentPage() + if err != nil { + return nil, fmt.Errorf("Error loading project resources: %s", err) + } + + opts.Page = page + 1 + } + + var urns []string + for _, rsrc := range resourceList { + urns = append(urns, rsrc.URN) + } + + return &urns, nil +} diff --git a/digitalocean/resource_digitalocean_project.go b/digitalocean/project/resource_project.go similarity index 87% rename from digitalocean/resource_digitalocean_project.go rename to digitalocean/project/resource_project.go index 5c273a376..62ecf497f 100644 --- a/digitalocean/resource_digitalocean_project.go +++ b/digitalocean/project/resource_project.go @@ -1,4 +1,4 @@ -package digitalocean +package project import ( "context" @@ -7,12 +7,14 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanProject() *schema.Resource { +func ResourceDigitalOceanProject() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanProjectCreate, ReadContext: resourceDigitalOceanProjectRead, @@ -93,7 +95,7 @@ func resourceDigitalOceanProject() *schema.Resource { } func resourceDigitalOceanProjectCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() projectRequest := &godo.CreateProjectRequest{ Name: d.Get("name").(string), @@ -147,7 +149,7 @@ func resourceDigitalOceanProjectCreate(ctx context.Context, d *schema.ResourceDa } func resourceDigitalOceanProjectRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() project, resp, err := client.Projects.Get(context.Background(), d.Id()) @@ -189,7 +191,7 @@ func resourceDigitalOceanProjectRead(ctx context.Context, d *schema.ResourceData return diag.FromErr(err) } - urns, err := loadResourceURNs(client, project.ID) + urns, err := LoadResourceURNs(client, project.ID) if err != nil { return diag.Errorf("Error reading Project: %s", err) } @@ -202,7 +204,7 @@ func resourceDigitalOceanProjectRead(ctx context.Context, d *schema.ResourceData } func resourceDigitalOceanProjectUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() projectId := d.Id() d.Partial(true) @@ -224,7 +226,7 @@ func resourceDigitalOceanProjectUpdate(ctx context.Context, d *schema.ResourceDa // The API requires project resources to be reassigned to another project if the association needs to be deleted. if d.HasChange("resources") { oldURNs, newURNs := d.GetChange("resources") - remove, add := getSetChanges(oldURNs.(*schema.Set), newURNs.(*schema.Set)) + remove, add := util.GetSetChanges(oldURNs.(*schema.Set), newURNs.(*schema.Set)) if remove.Len() > 0 { _, err = assignResourcesToDefaultProject(client, remove) @@ -250,7 +252,7 @@ func resourceDigitalOceanProjectUpdate(ctx context.Context, d *schema.ResourceDa } func resourceDigitalOceanProjectDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() projectId := d.Id() @@ -311,38 +313,3 @@ func assignResourcesToProject(client *godo.Client, projectId string, resources * return &urns, nil } - -func loadResourceURNs(client *godo.Client, projectId string) (*[]string, error) { - opts := &godo.ListOptions{ - Page: 1, - PerPage: 200, - } - - resourceList := []godo.ProjectResource{} - for { - resources, resp, err := client.Projects.ListResources(context.Background(), projectId, opts) - if err != nil { - return nil, fmt.Errorf("Error loading project resources: %s", err) - } - - resourceList = append(resourceList, resources...) - - if resp.Links == nil || resp.Links.IsLastPage() { - break - } - - page, err := resp.Links.CurrentPage() - if err != nil { - return nil, fmt.Errorf("Error loading project resources: %s", err) - } - - opts.Page = page + 1 - } - - var urns []string - for _, rsrc := range resourceList { - urns = append(urns, rsrc.URN) - } - - return &urns, nil -} diff --git a/digitalocean/resource_digitalocean_project_resources.go b/digitalocean/project/resource_project_resources.go similarity index 87% rename from digitalocean/resource_digitalocean_project_resources.go rename to digitalocean/project/resource_project_resources.go index 1e2a26358..3a65f5941 100644 --- a/digitalocean/resource_digitalocean_project_resources.go +++ b/digitalocean/project/resource_project_resources.go @@ -1,14 +1,16 @@ -package digitalocean +package project import ( "context" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanProjectResources() *schema.Resource { +func ResourceDigitalOceanProjectResources() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanProjectResourcesUpdate, UpdateContext: resourceDigitalOceanProjectResourcesUpdate, @@ -34,7 +36,7 @@ func resourceDigitalOceanProjectResources() *schema.Resource { } func resourceDigitalOceanProjectResourcesUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() projectId := d.Get("project").(string) @@ -51,7 +53,7 @@ func resourceDigitalOceanProjectResourcesUpdate(ctx context.Context, d *schema.R if d.HasChange("resources") { oldURNs, newURNs := d.GetChange("resources") - remove, add := getSetChanges(oldURNs.(*schema.Set), newURNs.(*schema.Set)) + remove, add := util.GetSetChanges(oldURNs.(*schema.Set), newURNs.(*schema.Set)) if remove.Len() > 0 { _, err = assignResourcesToDefaultProject(client, remove) @@ -78,7 +80,7 @@ func resourceDigitalOceanProjectResourcesUpdate(ctx context.Context, d *schema.R } func resourceDigitalOceanProjectResourcesRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() projectId := d.Id() @@ -97,7 +99,7 @@ func resourceDigitalOceanProjectResourcesRead(ctx context.Context, d *schema.Res return diag.FromErr(err) } - apiURNs, err := loadResourceURNs(client, projectId) + apiURNs, err := LoadResourceURNs(client, projectId) if err != nil { return diag.Errorf("Error while retrieving project resources: %s", err) } @@ -123,7 +125,7 @@ func resourceDigitalOceanProjectResourcesRead(ctx context.Context, d *schema.Res } func resourceDigitalOceanProjectResourcesDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() projectId := d.Get("project").(string) urns := d.Get("resources").(*schema.Set) diff --git a/digitalocean/resource_digitalocean_project_resources_test.go b/digitalocean/project/resource_project_resources_test.go similarity index 82% rename from digitalocean/resource_digitalocean_project_resources_test.go rename to digitalocean/project/resource_project_resources_test.go index 0a0aedcfa..5a914f421 100644 --- a/digitalocean/resource_digitalocean_project_resources_test.go +++ b/digitalocean/project/resource_project_resources_test.go @@ -1,4 +1,4 @@ -package digitalocean +package project_test import ( "context" @@ -6,6 +6,9 @@ import ( "strconv" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/project" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -43,8 +46,8 @@ resource "digitalocean_project_resources" "barfoo" { ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectResourcesDestroy, Steps: []resource.TestStep{ { @@ -78,15 +81,15 @@ resource "digitalocean_project_resources" "barfoo" { } func testProjectMembershipCount(name string, expectedCount int) resource.TestCheckFunc { - return testResourceInstanceState(name, func(is *terraform.InstanceState) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + return acceptance.TestResourceInstanceState(name, func(is *terraform.InstanceState) error { + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() projectId, ok := is.Attributes["project"] if !ok { return fmt.Errorf("project attribute not set") } - resources, err := loadResourceURNs(client, projectId) + resources, err := project.LoadResourceURNs(client, projectId) if err != nil { return fmt.Errorf("Error retrieving project resources: %s", err) } @@ -103,7 +106,7 @@ func testProjectMembershipCount(name string, expectedCount int) resource.TestChe } func testAccCheckDigitalOceanProjectResourcesDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { switch rs.Type { diff --git a/digitalocean/resource_digitalocean_project_test.go b/digitalocean/project/resource_project_test.go similarity index 91% rename from digitalocean/resource_digitalocean_project_test.go rename to digitalocean/project/resource_project_test.go index b5de65a41..593bcc718 100644 --- a/digitalocean/resource_digitalocean_project_test.go +++ b/digitalocean/project/resource_project_test.go @@ -1,4 +1,4 @@ -package digitalocean +package project_test import ( "context" @@ -6,6 +6,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -17,8 +19,8 @@ func TestAccDigitalOceanProject_CreateWithDefaults(t *testing.T) { createConfig := fixtureCreateWithDefaults(expectedName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { @@ -56,17 +58,17 @@ func TestAccDigitalOceanProject_CreateWithIsDefault(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { - testAccPreCheck(t) + acceptance.TestAccPreCheck(t) // Get an store original default project ID - client = testAccProvider.Meta().(*CombinedConfig).godoClient() + client = acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() defaultProject, _, defaultProjErr := client.Projects.GetDefault(context.Background()) if defaultProjErr != nil { t.Errorf("Error locating default project %s", defaultProjErr) } originalDefaultProject = defaultProject }, - ProviderFactories: testAccProviderFactories, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { @@ -124,8 +126,8 @@ func TestAccDigitalOceanProject_CreateWithInitialValues(t *testing.T) { expectedPurpose, expectedEnvironment) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { @@ -165,8 +167,8 @@ func TestAccDigitalOceanProject_UpdateWithInitialValues(t *testing.T) { expectedUpdatePurpose, expectedUpdateEnv) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { @@ -209,8 +211,8 @@ func TestAccDigitalOceanProject_CreateWithDropletResource(t *testing.T) { createConfig := fixtureCreateWithDropletResource(expectedDropletName, expectedName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { @@ -236,8 +238,8 @@ func TestAccDigitalOceanProject_UpdateWithDropletResource(t *testing.T) { updateConfig := fixtureCreateWithDefaults(expectedName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { @@ -276,8 +278,8 @@ func TestAccDigitalOceanProject_UpdateFromDropletToSpacesResource(t *testing.T) updateConfig := fixtureCreateWithSpacesResource(expectedSpacesName, expectedName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { @@ -310,15 +312,15 @@ func TestAccDigitalOceanProject_UpdateFromDropletToSpacesResource(t *testing.T) func TestAccDigitalOceanProject_WithManyResources(t *testing.T) { projectName := generateProjectName() - domainBase := randomTestName("project") + domainBase := acceptance.RandomTestName("project") createConfig := fixtureCreateDomainResources(domainBase) updateConfig := fixtureWithManyResources(domainBase, projectName) destroyConfig := fixtureCreateWithDefaults(projectName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanProjectDestroy, Steps: []resource.TestStep{ { @@ -351,7 +353,7 @@ func TestAccDigitalOceanProject_WithManyResources(t *testing.T) { func testAccCheckDigitalOceanProjectResourceURNIsPresent(resource, expectedURN string) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[resource] @@ -381,7 +383,7 @@ func testAccCheckDigitalOceanProjectResourceURNIsPresent(resource, expectedURN s } func testAccCheckDigitalOceanProjectDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { @@ -400,7 +402,7 @@ func testAccCheckDigitalOceanProjectDestroy(s *terraform.State) error { func testAccCheckDigitalOceanProjectExists(resource string) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[resource] diff --git a/digitalocean/provider.go b/digitalocean/provider.go index e8ed88c10..42ec97947 100644 --- a/digitalocean/provider.go +++ b/digitalocean/provider.go @@ -1,13 +1,35 @@ package digitalocean import ( - "github.com/digitalocean/terraform-provider-digitalocean/internal/mutexkv" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/account" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/app" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/cdn" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/certificate" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/database" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/domain" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/droplet" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/firewall" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/image" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/kubernetes" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/loadbalancer" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/monitoring" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/project" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/region" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/registry" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/reservedip" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/size" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/snapshot" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/spaces" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sshkey" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/uptime" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/volume" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/vpc" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -// Global MutexKV -var mutexKV = mutexkv.NewMutexKV() - // Provider returns a schema.Provider for DigitalOcean. func Provider() *schema.Provider { p := &schema.Provider{ @@ -47,85 +69,85 @@ func Provider() *schema.Provider { }, }, DataSourcesMap: map[string]*schema.Resource{ - "digitalocean_account": dataSourceDigitalOceanAccount(), - "digitalocean_app": dataSourceDigitalOceanApp(), - "digitalocean_certificate": dataSourceDigitalOceanCertificate(), - "digitalocean_container_registry": dataSourceDigitalOceanContainerRegistry(), - "digitalocean_database_cluster": dataSourceDigitalOceanDatabaseCluster(), - "digitalocean_database_ca": dataSourceDigitalOceanDatabaseCA(), - "digitalocean_database_replica": dataSourceDigitalOceanDatabaseReplica(), - "digitalocean_domain": dataSourceDigitalOceanDomain(), - "digitalocean_domains": dataSourceDigitalOceanDomains(), - "digitalocean_droplet": dataSourceDigitalOceanDroplet(), - "digitalocean_droplets": dataSourceDigitalOceanDroplets(), - "digitalocean_droplet_snapshot": dataSourceDigitalOceanDropletSnapshot(), - "digitalocean_firewall": dataSourceDigitalOceanFirewall(), - "digitalocean_floating_ip": dataSourceDigitalOceanFloatingIP(), - "digitalocean_image": dataSourceDigitalOceanImage(), - "digitalocean_images": dataSourceDigitalOceanImages(), - "digitalocean_kubernetes_cluster": dataSourceDigitalOceanKubernetesCluster(), - "digitalocean_kubernetes_versions": dataSourceDigitalOceanKubernetesVersions(), - "digitalocean_loadbalancer": dataSourceDigitalOceanLoadbalancer(), - "digitalocean_project": dataSourceDigitalOceanProject(), - "digitalocean_projects": dataSourceDigitalOceanProjects(), - "digitalocean_record": dataSourceDigitalOceanRecord(), - "digitalocean_records": dataSourceDigitalOceanRecords(), - "digitalocean_region": dataSourceDigitalOceanRegion(), - "digitalocean_regions": dataSourceDigitalOceanRegions(), - "digitalocean_reserved_ip": dataSourceDigitalOceanReservedIP(), - "digitalocean_sizes": dataSourceDigitalOceanSizes(), - "digitalocean_spaces_bucket": dataSourceDigitalOceanSpacesBucket(), - "digitalocean_spaces_buckets": dataSourceDigitalOceanSpacesBuckets(), - "digitalocean_spaces_bucket_object": dataSourceDigitalOceanSpacesBucketObject(), - "digitalocean_spaces_bucket_objects": dataSourceDigitalOceanSpacesBucketObjects(), - "digitalocean_ssh_key": dataSourceDigitalOceanSSHKey(), - "digitalocean_ssh_keys": dataSourceDigitalOceanSSHKeys(), - "digitalocean_tag": dataSourceDigitalOceanTag(), - "digitalocean_tags": dataSourceDigitalOceanTags(), - "digitalocean_volume_snapshot": dataSourceDigitalOceanVolumeSnapshot(), - "digitalocean_volume": dataSourceDigitalOceanVolume(), - "digitalocean_vpc": dataSourceDigitalOceanVPC(), + "digitalocean_account": account.DataSourceDigitalOceanAccount(), + "digitalocean_app": app.DataSourceDigitalOceanApp(), + "digitalocean_certificate": certificate.DataSourceDigitalOceanCertificate(), + "digitalocean_container_registry": registry.DataSourceDigitalOceanContainerRegistry(), + "digitalocean_database_cluster": database.DataSourceDigitalOceanDatabaseCluster(), + "digitalocean_database_ca": database.DataSourceDigitalOceanDatabaseCA(), + "digitalocean_database_replica": database.DataSourceDigitalOceanDatabaseReplica(), + "digitalocean_domain": domain.DataSourceDigitalOceanDomain(), + "digitalocean_domains": domain.DataSourceDigitalOceanDomains(), + "digitalocean_droplet": droplet.DataSourceDigitalOceanDroplet(), + "digitalocean_droplets": droplet.DataSourceDigitalOceanDroplets(), + "digitalocean_droplet_snapshot": snapshot.DataSourceDigitalOceanDropletSnapshot(), + "digitalocean_firewall": firewall.DataSourceDigitalOceanFirewall(), + "digitalocean_floating_ip": reservedip.DataSourceDigitalOceanFloatingIP(), + "digitalocean_image": image.DataSourceDigitalOceanImage(), + "digitalocean_images": image.DataSourceDigitalOceanImages(), + "digitalocean_kubernetes_cluster": kubernetes.DataSourceDigitalOceanKubernetesCluster(), + "digitalocean_kubernetes_versions": kubernetes.DataSourceDigitalOceanKubernetesVersions(), + "digitalocean_loadbalancer": loadbalancer.DataSourceDigitalOceanLoadbalancer(), + "digitalocean_project": project.DataSourceDigitalOceanProject(), + "digitalocean_projects": project.DataSourceDigitalOceanProjects(), + "digitalocean_record": domain.DataSourceDigitalOceanRecord(), + "digitalocean_records": domain.DataSourceDigitalOceanRecords(), + "digitalocean_region": region.DataSourceDigitalOceanRegion(), + "digitalocean_regions": region.DataSourceDigitalOceanRegions(), + "digitalocean_reserved_ip": reservedip.DataSourceDigitalOceanReservedIP(), + "digitalocean_sizes": size.DataSourceDigitalOceanSizes(), + "digitalocean_spaces_bucket": spaces.DataSourceDigitalOceanSpacesBucket(), + "digitalocean_spaces_buckets": spaces.DataSourceDigitalOceanSpacesBuckets(), + "digitalocean_spaces_bucket_object": spaces.DataSourceDigitalOceanSpacesBucketObject(), + "digitalocean_spaces_bucket_objects": spaces.DataSourceDigitalOceanSpacesBucketObjects(), + "digitalocean_ssh_key": sshkey.DataSourceDigitalOceanSSHKey(), + "digitalocean_ssh_keys": sshkey.DataSourceDigitalOceanSSHKeys(), + "digitalocean_tag": tag.DataSourceDigitalOceanTag(), + "digitalocean_tags": tag.DataSourceDigitalOceanTags(), + "digitalocean_volume_snapshot": snapshot.DataSourceDigitalOceanVolumeSnapshot(), + "digitalocean_volume": volume.DataSourceDigitalOceanVolume(), + "digitalocean_vpc": vpc.DataSourceDigitalOceanVPC(), }, ResourcesMap: map[string]*schema.Resource{ - "digitalocean_app": resourceDigitalOceanApp(), - "digitalocean_certificate": resourceDigitalOceanCertificate(), - "digitalocean_container_registry": resourceDigitalOceanContainerRegistry(), - "digitalocean_container_registry_docker_credentials": resourceDigitalOceanContainerRegistryDockerCredentials(), - "digitalocean_cdn": resourceDigitalOceanCDN(), - "digitalocean_database_cluster": resourceDigitalOceanDatabaseCluster(), - "digitalocean_database_connection_pool": resourceDigitalOceanDatabaseConnectionPool(), - "digitalocean_database_db": resourceDigitalOceanDatabaseDB(), - "digitalocean_database_firewall": resourceDigitalOceanDatabaseFirewall(), - "digitalocean_database_replica": resourceDigitalOceanDatabaseReplica(), - "digitalocean_database_user": resourceDigitalOceanDatabaseUser(), - "digitalocean_domain": resourceDigitalOceanDomain(), - "digitalocean_droplet": resourceDigitalOceanDroplet(), - "digitalocean_droplet_snapshot": resourceDigitalOceanDropletSnapshot(), - "digitalocean_firewall": resourceDigitalOceanFirewall(), - "digitalocean_floating_ip": resourceDigitalOceanFloatingIP(), - "digitalocean_floating_ip_assignment": resourceDigitalOceanFloatingIPAssignment(), - "digitalocean_kubernetes_cluster": resourceDigitalOceanKubernetesCluster(), - "digitalocean_kubernetes_node_pool": resourceDigitalOceanKubernetesNodePool(), - "digitalocean_loadbalancer": resourceDigitalOceanLoadbalancer(), - "digitalocean_monitor_alert": resourceDigitalOceanMonitorAlert(), - "digitalocean_project": resourceDigitalOceanProject(), - "digitalocean_project_resources": resourceDigitalOceanProjectResources(), - "digitalocean_record": resourceDigitalOceanRecord(), - "digitalocean_reserved_ip": resourceDigitalOceanReservedIP(), - "digitalocean_reserved_ip_assignment": resourceDigitalOceanReservedIPAssignment(), - "digitalocean_spaces_bucket": resourceDigitalOceanBucket(), - "digitalocean_spaces_bucket_object": resourceDigitalOceanSpacesBucketObject(), - "digitalocean_spaces_bucket_policy": resourceDigitalOceanSpacesBucketPolicy(), - "digitalocean_ssh_key": resourceDigitalOceanSSHKey(), - "digitalocean_tag": resourceDigitalOceanTag(), - "digitalocean_uptime_check": resourceDigitalOceanUptimeCheck(), - "digitalocean_uptime_alert": resourceDigitalOceanUptimeAlert(), - "digitalocean_volume": resourceDigitalOceanVolume(), - "digitalocean_volume_attachment": resourceDigitalOceanVolumeAttachment(), - "digitalocean_volume_snapshot": resourceDigitalOceanVolumeSnapshot(), - "digitalocean_vpc": resourceDigitalOceanVPC(), - "digitalocean_custom_image": resourceDigitalOceanCustomImage(), + "digitalocean_app": app.ResourceDigitalOceanApp(), + "digitalocean_certificate": certificate.ResourceDigitalOceanCertificate(), + "digitalocean_container_registry": registry.ResourceDigitalOceanContainerRegistry(), + "digitalocean_container_registry_docker_credentials": registry.ResourceDigitalOceanContainerRegistryDockerCredentials(), + "digitalocean_cdn": cdn.ResourceDigitalOceanCDN(), + "digitalocean_database_cluster": database.ResourceDigitalOceanDatabaseCluster(), + "digitalocean_database_connection_pool": database.ResourceDigitalOceanDatabaseConnectionPool(), + "digitalocean_database_db": database.ResourceDigitalOceanDatabaseDB(), + "digitalocean_database_firewall": database.ResourceDigitalOceanDatabaseFirewall(), + "digitalocean_database_replica": database.ResourceDigitalOceanDatabaseReplica(), + "digitalocean_database_user": database.ResourceDigitalOceanDatabaseUser(), + "digitalocean_domain": domain.ResourceDigitalOceanDomain(), + "digitalocean_droplet": droplet.ResourceDigitalOceanDroplet(), + "digitalocean_droplet_snapshot": snapshot.ResourceDigitalOceanDropletSnapshot(), + "digitalocean_firewall": firewall.ResourceDigitalOceanFirewall(), + "digitalocean_floating_ip": reservedip.ResourceDigitalOceanFloatingIP(), + "digitalocean_floating_ip_assignment": reservedip.ResourceDigitalOceanFloatingIPAssignment(), + "digitalocean_kubernetes_cluster": kubernetes.ResourceDigitalOceanKubernetesCluster(), + "digitalocean_kubernetes_node_pool": kubernetes.ResourceDigitalOceanKubernetesNodePool(), + "digitalocean_loadbalancer": loadbalancer.ResourceDigitalOceanLoadbalancer(), + "digitalocean_monitor_alert": monitoring.ResourceDigitalOceanMonitorAlert(), + "digitalocean_project": project.ResourceDigitalOceanProject(), + "digitalocean_project_resources": project.ResourceDigitalOceanProjectResources(), + "digitalocean_record": domain.ResourceDigitalOceanRecord(), + "digitalocean_reserved_ip": reservedip.ResourceDigitalOceanReservedIP(), + "digitalocean_reserved_ip_assignment": reservedip.ResourceDigitalOceanReservedIPAssignment(), + "digitalocean_spaces_bucket": spaces.ResourceDigitalOceanBucket(), + "digitalocean_spaces_bucket_object": spaces.ResourceDigitalOceanSpacesBucketObject(), + "digitalocean_spaces_bucket_policy": spaces.ResourceDigitalOceanSpacesBucketPolicy(), + "digitalocean_ssh_key": sshkey.ResourceDigitalOceanSSHKey(), + "digitalocean_tag": tag.ResourceDigitalOceanTag(), + "digitalocean_uptime_check": uptime.ResourceDigitalOceanUptimeCheck(), + "digitalocean_uptime_alert": uptime.ResourceDigitalOceanUptimeAlert(), + "digitalocean_volume": volume.ResourceDigitalOceanVolume(), + "digitalocean_volume_attachment": volume.ResourceDigitalOceanVolumeAttachment(), + "digitalocean_volume_snapshot": snapshot.ResourceDigitalOceanVolumeSnapshot(), + "digitalocean_vpc": vpc.ResourceDigitalOceanVPC(), + "digitalocean_custom_image": image.ResourceDigitalOceanCustomImage(), }, } @@ -143,7 +165,7 @@ func Provider() *schema.Provider { } func providerConfigure(d *schema.ResourceData, terraformVersion string) (interface{}, error) { - config := Config{ + conf := config.Config{ Token: d.Get("token").(string), APIEndpoint: d.Get("api_endpoint").(string), AccessID: d.Get("spaces_access_id").(string), @@ -152,8 +174,8 @@ func providerConfigure(d *schema.ResourceData, terraformVersion string) (interfa } if endpoint, ok := d.GetOk("spaces_endpoint"); ok { - config.SpacesAPIEndpoint = endpoint.(string) + conf.SpacesAPIEndpoint = endpoint.(string) } - return config.Client() + return conf.Client() } diff --git a/digitalocean/provider_test.go b/digitalocean/provider_test.go index da5df6fd9..6c9d1fcdb 100644 --- a/digitalocean/provider_test.go +++ b/digitalocean/provider_test.go @@ -2,36 +2,17 @@ package digitalocean import ( "context" - "fmt" - "os" "strings" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/aws/aws-sdk-go/aws/session" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -const testNamePrefix = "tf-acc-test-" - -var testAccProvider *schema.Provider -var testAccProviders map[string]*schema.Provider -var testAccProviderFactories map[string]func() (*schema.Provider, error) - -func init() { - testAccProvider = Provider() - testAccProviders = map[string]*schema.Provider{ - "digitalocean": testAccProvider, - } - testAccProviderFactories = map[string]func() (*schema.Provider, error){ - "digitalocean": func() (*schema.Provider, error) { - return testAccProvider, nil - }, - } -} - func TestProvider(t *testing.T) { if err := Provider().InternalValidate(); err != nil { t.Fatalf("err: %s", err) @@ -42,17 +23,6 @@ func TestProvider_impl(t *testing.T) { var _ *schema.Provider = Provider() } -func testAccPreCheck(t *testing.T) { - if v := os.Getenv("DIGITALOCEAN_TOKEN"); v == "" { - t.Fatal("DIGITALOCEAN_TOKEN must be set for acceptance tests") - } - - err := testAccProvider.Configure(context.Background(), terraform.NewResourceConfigRaw(nil)) - if err != nil { - t.Fatal(err) - } -} - func TestURLOverride(t *testing.T) { customEndpoint := "https://mock-api.internal.example.com/" @@ -72,7 +42,7 @@ func TestURLOverride(t *testing.T) { t.Fatalf("Expected metadata, got nil") } - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() if client.BaseURL.String() != customEndpoint { t.Fatalf("Expected %s, got %s", customEndpoint, client.BaseURL.String()) } @@ -94,7 +64,7 @@ func TestURLDefault(t *testing.T) { t.Fatal("Expected metadata, got nil") } - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() if client.BaseURL.String() != "https://api.digitalocean.com" { t.Fatalf("Expected %s, got %s", "https://api.digitalocean.com", client.BaseURL.String()) } @@ -129,7 +99,7 @@ func TestSpaceAPIDefaultEndpoint(t *testing.T) { var client *session.Session var err error - client, err = meta.(*CombinedConfig).spacesClient("sfo2") + client, err = meta.(*config.CombinedConfig).SpacesClient("sfo2") if err != nil { t.Fatalf("Failed to create Spaces client: %s", err) } @@ -163,7 +133,7 @@ func TestSpaceAPIEndpointOverride(t *testing.T) { var client *session.Session var err error - client, err = meta.(*CombinedConfig).spacesClient("sfo2") + client, err = meta.(*config.CombinedConfig).SpacesClient("sfo2") if err != nil { t.Fatalf("Failed to create Spaces client: %s", err) } @@ -173,15 +143,3 @@ func TestSpaceAPIEndpointOverride(t *testing.T) { t.Fatalf("Expected %s, got %s", expectedEndpoint, *client.Config.Endpoint) } } - -func randomTestName(additionalNames ...string) string { - prefix := testNamePrefix - for _, n := range additionalNames { - prefix += "-" + strings.Replace(n, " ", "_", -1) - } - return randomName(prefix, 10) -} - -func randomName(prefix string, length int) string { - return fmt.Sprintf("%s%s", prefix, acctest.RandString(length)) -} diff --git a/digitalocean/datasource_digitalocean_region.go b/digitalocean/region/datasource_region.go similarity index 88% rename from digitalocean/datasource_digitalocean_region.go rename to digitalocean/region/datasource_region.go index 1dc6f5364..a6c6c0cf9 100644 --- a/digitalocean/datasource_digitalocean_region.go +++ b/digitalocean/region/datasource_region.go @@ -1,16 +1,17 @@ -package digitalocean +package region import ( "context" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanRegion() *schema.Resource { +func DataSourceDigitalOceanRegion() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanRegionRead, Schema: map[string]*schema.Schema{ @@ -66,7 +67,7 @@ func dataSourceDigitalOceanRegionRead(ctx context.Context, d *schema.ResourceDat return nil } - if err := setResourceDataFromMap(d, flattenedRegion); err != nil { + if err := util.SetResourceDataFromMap(d, flattenedRegion); err != nil { return diag.FromErr(err) } diff --git a/digitalocean/datasource_digitalocean_region_test.go b/digitalocean/region/datasource_region_test.go similarity index 76% rename from digitalocean/datasource_digitalocean_region_test.go rename to digitalocean/region/datasource_region_test.go index 27eede6cc..42e26a3e8 100644 --- a/digitalocean/datasource_digitalocean_region_test.go +++ b/digitalocean/region/datasource_region_test.go @@ -1,9 +1,10 @@ -package digitalocean +package region_test import ( "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -14,8 +15,8 @@ data "digitalocean_region" "lon1" { } ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: config, @@ -38,8 +39,8 @@ data "digitalocean_region" "xyz5" { } ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: config, diff --git a/digitalocean/datasource_digitalocean_regions.go b/digitalocean/region/datasource_regions.go similarity index 90% rename from digitalocean/datasource_digitalocean_regions.go rename to digitalocean/region/datasource_regions.go index d11de078b..c1671b894 100644 --- a/digitalocean/datasource_digitalocean_regions.go +++ b/digitalocean/region/datasource_regions.go @@ -1,11 +1,11 @@ -package digitalocean +package region import ( "github.com/digitalocean/terraform-provider-digitalocean/internal/datalist" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanRegions() *schema.Resource { +func DataSourceDigitalOceanRegions() *schema.Resource { dataListConfig := &datalist.ResourceConfig{ RecordSchema: map[string]*schema.Schema{ "slug": { diff --git a/digitalocean/datasource_digitalocean_regions_test.go b/digitalocean/region/datasource_regions_test.go similarity index 86% rename from digitalocean/datasource_digitalocean_regions_test.go rename to digitalocean/region/datasource_regions_test.go index 165fda54f..f87cba7eb 100644 --- a/digitalocean/datasource_digitalocean_regions_test.go +++ b/digitalocean/region/datasource_regions_test.go @@ -1,10 +1,11 @@ -package digitalocean +package region_test import ( "fmt" "strconv" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -52,15 +53,15 @@ data "digitalocean_regions" "filtered" { } ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: configNoFilter, Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrSet("data.digitalocean_regions.all", "regions.#"), resource.TestCheckResourceAttrSet("data.digitalocean_regions.all", "regions.#"), - testResourceInstanceState("data.digitalocean_regions.all", func(is *terraform.InstanceState) error { + acceptance.TestResourceInstanceState("data.digitalocean_regions.all", func(is *terraform.InstanceState) error { n, err := strconv.Atoi(is.Attributes["regions.#"]) if err != nil { return err diff --git a/digitalocean/regions.go b/digitalocean/region/regions.go similarity index 91% rename from digitalocean/regions.go rename to digitalocean/region/regions.go index ebed2d0ea..7bdca343a 100644 --- a/digitalocean/regions.go +++ b/digitalocean/region/regions.go @@ -1,15 +1,16 @@ -package digitalocean +package region import ( "context" "fmt" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func getDigitalOceanRegions(meta interface{}, extra map[string]interface{}) ([]interface{}, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() allRegions := []interface{}{} diff --git a/digitalocean/datasource_digitalocean_container_registry.go b/digitalocean/registry/datasource_container_registry.go similarity index 93% rename from digitalocean/datasource_digitalocean_container_registry.go rename to digitalocean/registry/datasource_container_registry.go index c0f61fac8..a29cf513d 100644 --- a/digitalocean/datasource_digitalocean_container_registry.go +++ b/digitalocean/registry/datasource_container_registry.go @@ -1,4 +1,4 @@ -package digitalocean +package registry import ( "context" @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanContainerRegistry() *schema.Resource { +func DataSourceDigitalOceanContainerRegistry() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanContainerRegistryRead, Schema: map[string]*schema.Schema{ diff --git a/digitalocean/datasource_digitalocean_container_registry_test.go b/digitalocean/registry/datasource_container_registry_test.go similarity index 82% rename from digitalocean/datasource_digitalocean_container_registry_test.go rename to digitalocean/registry/datasource_container_registry_test.go index a223b2c99..1eefcda16 100644 --- a/digitalocean/datasource_digitalocean_container_registry_test.go +++ b/digitalocean/registry/datasource_container_registry_test.go @@ -1,4 +1,4 @@ -package digitalocean +package registry_test import ( "context" @@ -6,13 +6,15 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceDigitalOceanContainerRegistry_Basic(t *testing.T) { var reg godo.Registry - regName := randomTestName() + regName := acceptance.RandomTestName() resourceConfig := fmt.Sprintf(` resource "digitalocean_container_registry" "foo" { @@ -28,8 +30,8 @@ data "digitalocean_container_registry" "foobar" { ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -66,7 +68,7 @@ func testAccCheckDataSourceDigitalOceanContainerRegistryExists(n string, reg *go return fmt.Errorf("No registry ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundReg, _, err := client.Registry.Get(context.Background()) diff --git a/digitalocean/import_digitalocean_container_registry_test.go b/digitalocean/registry/import_container_registry_test.go similarity index 69% rename from digitalocean/import_digitalocean_container_registry_test.go rename to digitalocean/registry/import_container_registry_test.go index 39cb54725..7d386926c 100644 --- a/digitalocean/import_digitalocean_container_registry_test.go +++ b/digitalocean/registry/import_container_registry_test.go @@ -1,19 +1,20 @@ -package digitalocean +package registry_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDigitalOceanContainerRegistry_importBasic(t *testing.T) { resourceName := "digitalocean_container_registry.foobar" - name := randomTestName() + name := acceptance.RandomTestName() resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanContainerRegistryDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_container_registry.go b/digitalocean/registry/resource_container_registry.go similarity index 91% rename from digitalocean/resource_digitalocean_container_registry.go rename to digitalocean/registry/resource_container_registry.go index d7a902a48..eea00cc1a 100644 --- a/digitalocean/resource_digitalocean_container_registry.go +++ b/digitalocean/registry/resource_container_registry.go @@ -1,4 +1,4 @@ -package digitalocean +package registry import ( "context" @@ -6,6 +6,7 @@ import ( "log" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" @@ -13,7 +14,7 @@ import ( const RegistryHostname = "registry.digitalocean.com" -func resourceDigitalOceanContainerRegistry() *schema.Resource { +func ResourceDigitalOceanContainerRegistry() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanContainerRegistryCreate, ReadContext: resourceDigitalOceanContainerRegistryRead, @@ -67,7 +68,7 @@ func resourceDigitalOceanContainerRegistry() *schema.Resource { } func resourceDigitalOceanContainerRegistryCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // Build up our creation options opts := &godo.RegistryCreateRequest{ @@ -92,7 +93,7 @@ func resourceDigitalOceanContainerRegistryCreate(ctx context.Context, d *schema. } func resourceDigitalOceanContainerRegistryRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() reg, resp, err := client.Registry.Get(context.Background()) if err != nil { @@ -124,7 +125,7 @@ func resourceDigitalOceanContainerRegistryRead(ctx context.Context, d *schema.Re } func resourceDigitalOceanContainerRegistryUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() if d.HasChange("subscription_tier_slug") { req := &godo.RegistrySubscriptionUpdateRequest{ TierSlug: d.Get("subscription_tier_slug").(string), @@ -139,7 +140,7 @@ func resourceDigitalOceanContainerRegistryUpdate(ctx context.Context, d *schema. } func resourceDigitalOceanContainerRegistryDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting container registry: %s", d.Id()) _, err := client.Registry.Delete(context.Background()) diff --git a/digitalocean/resource_digitalocean_container_registry_docker_credentials.go b/digitalocean/registry/resource_container_registry_docker_credentials.go similarity index 93% rename from digitalocean/resource_digitalocean_container_registry_docker_credentials.go rename to digitalocean/registry/resource_container_registry_docker_credentials.go index 66a5994c2..90df821fe 100644 --- a/digitalocean/resource_digitalocean_container_registry_docker_credentials.go +++ b/digitalocean/registry/resource_container_registry_docker_credentials.go @@ -1,4 +1,4 @@ -package digitalocean +package registry import ( "context" @@ -12,6 +12,7 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" @@ -22,7 +23,7 @@ const ( oauthTokenRevokeEndpoint = "https://cloud.digitalocean.com/v1/oauth/revoke" ) -func resourceDigitalOceanContainerRegistryDockerCredentials() *schema.Resource { +func ResourceDigitalOceanContainerRegistryDockerCredentials() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanContainerRegistryDockerCredentialsCreate, ReadContext: resourceDigitalOceanContainerRegistryDockerCredentialsRead, @@ -68,7 +69,7 @@ func resourceDigitalOceanContainerRegistryDockerCredentialsCreate(ctx context.Co } func resourceDigitalOceanContainerRegistryDockerCredentialsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() reg, response, err := client.Registry.Get(context.Background()) @@ -96,7 +97,7 @@ func resourceDigitalOceanContainerRegistryDockerCredentialsUpdate(ctx context.Co if d.HasChange("expiry_seconds") { write := d.Get("write").(bool) expirySeconds := d.Get("expiry_seconds").(int) - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() currentTime := time.Now().UTC() expirationTime := currentTime.Add(time.Second * time.Duration(expirySeconds)) d.Set("credential_expiration_time", expirationTime.Format(time.RFC3339)) @@ -110,7 +111,7 @@ func resourceDigitalOceanContainerRegistryDockerCredentialsUpdate(ctx context.Co if d.HasChange("write") { write := d.Get("write").(bool) expirySeconds := d.Get("expiry_seconds").(int) - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() dockerConfigJSON, err := generateDockerCredentials(write, expirySeconds, client) if err != nil { return diag.FromErr(err) @@ -150,7 +151,7 @@ func resourceDigitalOceanContainerRegistryDockerCredentialsDelete(ctx context.Co return diag.FromErr(errors.New("unable to find OAuth token")) } - err = revokeOAuthToken(tokens[0], oauthTokenRevokeEndpoint) + err = RevokeOAuthToken(tokens[0], oauthTokenRevokeEndpoint) if err != nil { diag.FromErr(err) } @@ -159,7 +160,7 @@ func resourceDigitalOceanContainerRegistryDockerCredentialsDelete(ctx context.Co return nil } -func revokeOAuthToken(token string, endpoint string) error { +func RevokeOAuthToken(token string, endpoint string) error { data := url.Values{} data.Set("token", token) req, err := http.NewRequest(http.MethodPost, endpoint, strings.NewReader(data.Encode())) diff --git a/digitalocean/resource_digitalocean_container_registry_docker_credentials_test.go b/digitalocean/registry/resource_container_registry_docker_credentials_test.go similarity index 87% rename from digitalocean/resource_digitalocean_container_registry_docker_credentials_test.go rename to digitalocean/registry/resource_container_registry_docker_credentials_test.go index dd547bcd5..81e87d2d7 100644 --- a/digitalocean/resource_digitalocean_container_registry_docker_credentials_test.go +++ b/digitalocean/registry/resource_container_registry_docker_credentials_test.go @@ -1,4 +1,4 @@ -package digitalocean +package registry_test import ( "context" @@ -6,17 +6,19 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanContainerRegistryDockerCredentials_Basic(t *testing.T) { var reg godo.Registry - name := randomTestName() + name := acceptance.RandomTestName() resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanContainerRegistryDockerCredentialsDestroy, Steps: []resource.TestStep{ { @@ -40,11 +42,11 @@ func TestAccDigitalOceanContainerRegistryDockerCredentials_Basic(t *testing.T) { func TestAccDigitalOceanContainerRegistryDockerCredentials_withExpiry(t *testing.T) { var reg godo.Registry - name := randomTestName() + name := acceptance.RandomTestName() resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanContainerRegistryDockerCredentialsDestroy, Steps: []resource.TestStep{ { @@ -69,7 +71,7 @@ func TestAccDigitalOceanContainerRegistryDockerCredentials_withExpiry(t *testing } func testAccCheckDigitalOceanContainerRegistryDockerCredentialsDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_container_registry_docker_credentials" { @@ -110,7 +112,7 @@ func testAccCheckDigitalOceanContainerRegistryDockerCredentialsExists(n string, return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() // Try to find the registry foundReg, _, err := client.Registry.Get(context.Background()) diff --git a/digitalocean/resource_digitalocean_container_registry_test.go b/digitalocean/registry/resource_container_registry_test.go similarity index 88% rename from digitalocean/resource_digitalocean_container_registry_test.go rename to digitalocean/registry/resource_container_registry_test.go index 5ed4c887c..99bbdb729 100644 --- a/digitalocean/resource_digitalocean_container_registry_test.go +++ b/digitalocean/registry/resource_container_registry_test.go @@ -1,4 +1,4 @@ -package digitalocean +package registry_test import ( "context" @@ -8,6 +8,9 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/registry" "github.com/hashicorp/go-uuid" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -15,13 +18,13 @@ import ( func TestAccDigitalOceanContainerRegistry_Basic(t *testing.T) { var reg godo.Registry - name := randomTestName() + name := acceptance.RandomTestName() starterConfig := fmt.Sprintf(testAccCheckDigitalOceanContainerRegistryConfig_basic, name, "starter", "") basicConfig := fmt.Sprintf(testAccCheckDigitalOceanContainerRegistryConfig_basic, name, "basic", "") resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanContainerRegistryDestroy, Steps: []resource.TestStep{ { @@ -72,12 +75,12 @@ func TestAccDigitalOceanContainerRegistry_Basic(t *testing.T) { func TestAccDigitalOceanContainerRegistry_CustomRegion(t *testing.T) { var reg godo.Registry - name := randomTestName() + name := acceptance.RandomTestName() starterConfig := fmt.Sprintf(testAccCheckDigitalOceanContainerRegistryConfig_basic, name, "starter", ` region = "sfo3"`) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanContainerRegistryDestroy, Steps: []resource.TestStep{ { @@ -106,7 +109,7 @@ func TestAccDigitalOceanContainerRegistry_CustomRegion(t *testing.T) { } func testAccCheckDigitalOceanContainerRegistryDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_container_registry" { @@ -147,7 +150,7 @@ func testAccCheckDigitalOceanContainerRegistryExists(n string, reg *godo.Registr return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() // Try to find the registry foundReg, _, err := client.Registry.Get(context.Background()) @@ -199,7 +202,7 @@ func TestRevokeOAuthToken(t *testing.T) { w.WriteHeader(http.StatusOK) }) - err = revokeOAuthToken(token, server.URL+"/revoke") + err = registry.RevokeOAuthToken(token, server.URL+"/revoke") if err != nil { t.Errorf("error revoking token: %s", err.Error()) } diff --git a/digitalocean/datasource_digitalocean_floating_ip.go b/digitalocean/reservedip/datasource_floating_ip.go similarity index 94% rename from digitalocean/datasource_digitalocean_floating_ip.go rename to digitalocean/reservedip/datasource_floating_ip.go index a9bb6b9d5..28038de5e 100644 --- a/digitalocean/datasource_digitalocean_floating_ip.go +++ b/digitalocean/reservedip/datasource_floating_ip.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip import ( "context" @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanFloatingIP() *schema.Resource { +func DataSourceDigitalOceanFloatingIP() *schema.Resource { return &schema.Resource{ // TODO: Uncomment when dates for deprecation timeline are set. // DeprecationMessage: "This data source is deprecated and will be removed in a future release. Please use digitalocean_reserved_ip instead.", diff --git a/digitalocean/datasource_digitalocean_floating_ip_test.go b/digitalocean/reservedip/datasource_floating_ip_test.go similarity index 83% rename from digitalocean/datasource_digitalocean_floating_ip_test.go rename to digitalocean/reservedip/datasource_floating_ip_test.go index 004385b81..42f536770 100644 --- a/digitalocean/datasource_digitalocean_floating_ip_test.go +++ b/digitalocean/reservedip/datasource_floating_ip_test.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip_test import ( "context" @@ -7,6 +7,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -17,8 +19,8 @@ func TestAccDataSourceDigitalOceanFloatingIp_Basic(t *testing.T) { expectedURNRegEx, _ := regexp.Compile(`do:floatingip:(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccCheckDataSourceDigitalOceanFloatingIpConfig_basic, @@ -47,7 +49,7 @@ func testAccCheckDataSourceDigitalOceanFloatingIpExists(n string, floatingIp *go return fmt.Errorf("No floating ip ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundFloatingIp, _, err := client.FloatingIPs.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/datasource_digitalocean_reserved_ip.go b/digitalocean/reservedip/datasource_reserved_ip.go similarity index 93% rename from digitalocean/datasource_digitalocean_reserved_ip.go rename to digitalocean/reservedip/datasource_reserved_ip.go index 57a69796b..d9547e89d 100644 --- a/digitalocean/datasource_digitalocean_reserved_ip.go +++ b/digitalocean/reservedip/datasource_reserved_ip.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip import ( "context" @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanReservedIP() *schema.Resource { +func DataSourceDigitalOceanReservedIP() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanReservedIPRead, Schema: map[string]*schema.Schema{ diff --git a/digitalocean/datasource_digitalocean_reserved_ip_test.go b/digitalocean/reservedip/datasource_reserved_ip_test.go similarity index 85% rename from digitalocean/datasource_digitalocean_reserved_ip_test.go rename to digitalocean/reservedip/datasource_reserved_ip_test.go index e9806c535..fad7d6bd2 100644 --- a/digitalocean/datasource_digitalocean_reserved_ip_test.go +++ b/digitalocean/reservedip/datasource_reserved_ip_test.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip_test import ( "context" @@ -7,6 +7,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -17,8 +19,8 @@ func TestAccDataSourceDigitalOceanReservedIP_Basic(t *testing.T) { expectedURNRegEx, _ := regexp.Compile(`do:reservedip:(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccCheckDataSourceDigitalOceanReservedIPConfig_Basic, @@ -41,8 +43,8 @@ func TestAccDataSourceDigitalOceanReservedIP_FindsFloatingIP(t *testing.T) { expectedURNRegEx, _ := regexp.Compile(`do:reservedip:(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccCheckDataSourceDigitalOceanReservedIPConfig_FindsFloatingIP, @@ -71,7 +73,7 @@ func testAccCheckDataSourceDigitalOceanReservedIPExists(n string, reservedIP *go return fmt.Errorf("No reserved IP ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundReservedIP, _, err := client.ReservedIPs.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/import_digitalocean_floating_ip_assignment_test.go b/digitalocean/reservedip/import_floating_ip_assignment_test.go similarity index 83% rename from digitalocean/import_digitalocean_floating_ip_assignment_test.go rename to digitalocean/reservedip/import_floating_ip_assignment_test.go index 60b55b018..06ba7525e 100644 --- a/digitalocean/import_digitalocean_floating_ip_assignment_test.go +++ b/digitalocean/reservedip/import_floating_ip_assignment_test.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip_test import ( "context" @@ -8,6 +8,8 @@ import ( "fmt" "regexp" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -15,9 +17,9 @@ import ( func TestAccDigitalOceanFloatingIPAssignment_importBasic(t *testing.T) { resourceName := "digitalocean_floating_ip_assignment.foobar" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, - CheckDestroy: testAccCheckDigitalOceanDatabaseReplicaDestroy, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, + CheckDestroy: testAccCheckDigitalOceanFloatingIPDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanFloatingIPAssignmentConfig, @@ -45,7 +47,7 @@ func TestAccDigitalOceanFloatingIPAssignment_importBasic(t *testing.T) { return err } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundFloatingIP, _, err := client.FloatingIPs.Get(context.Background(), flipID) if err != nil { return err diff --git a/digitalocean/import_digitalocean_floating_ip_test.go b/digitalocean/reservedip/import_floating_ip_test.go similarity index 75% rename from digitalocean/import_digitalocean_floating_ip_test.go rename to digitalocean/reservedip/import_floating_ip_test.go index 449c3b139..eb06aa725 100644 --- a/digitalocean/import_digitalocean_floating_ip_test.go +++ b/digitalocean/reservedip/import_floating_ip_test.go @@ -1,8 +1,9 @@ -package digitalocean +package reservedip_test import ( "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -11,8 +12,8 @@ func TestAccDigitalOceanFloatingIP_importBasicRegion(t *testing.T) { resourceName := "digitalocean_floating_ip.foobar" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFloatingIPDestroy, Steps: []resource.TestStep{ { @@ -33,8 +34,8 @@ func TestAccDigitalOceanFloatingIP_importBasicDroplet(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFloatingIPDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_reserved_ip_test.go b/digitalocean/reservedip/import_reserved_ip_test.go similarity index 75% rename from digitalocean/import_digitalocean_reserved_ip_test.go rename to digitalocean/reservedip/import_reserved_ip_test.go index 48e2a7cca..45d4130ea 100644 --- a/digitalocean/import_digitalocean_reserved_ip_test.go +++ b/digitalocean/reservedip/import_reserved_ip_test.go @@ -1,8 +1,9 @@ -package digitalocean +package reservedip_test import ( "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -11,8 +12,8 @@ func TestAccDigitalOceanReservedIP_importBasicRegion(t *testing.T) { resourceName := "digitalocean_reserved_ip.foobar" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanReservedIPDestroy, Steps: []resource.TestStep{ { @@ -33,8 +34,8 @@ func TestAccDigitalOceanReservedIP_importBasicDroplet(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanReservedIPDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_floating_ip.go b/digitalocean/reservedip/resource_floating_ip.go similarity index 97% rename from digitalocean/resource_digitalocean_floating_ip.go rename to digitalocean/reservedip/resource_floating_ip.go index 9dd9fd78d..5c669d7ba 100644 --- a/digitalocean/resource_digitalocean_floating_ip.go +++ b/digitalocean/reservedip/resource_floating_ip.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip import ( "context" @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanFloatingIP() *schema.Resource { +func ResourceDigitalOceanFloatingIP() *schema.Resource { return &schema.Resource{ // TODO: Uncomment when dates for deprecation timeline are set. // DeprecationMessage: "This resource is deprecated and will be removed in a future release. Please use digitalocean_reserved_ip instead.", diff --git a/digitalocean/resource_digitalocean_floating_ip_assignment.go b/digitalocean/reservedip/resource_floating_ip_assignment.go similarity index 92% rename from digitalocean/resource_digitalocean_floating_ip_assignment.go rename to digitalocean/reservedip/resource_floating_ip_assignment.go index 1b08c8632..b50b02450 100644 --- a/digitalocean/resource_digitalocean_floating_ip_assignment.go +++ b/digitalocean/reservedip/resource_floating_ip_assignment.go @@ -1,11 +1,11 @@ -package digitalocean +package reservedip import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanFloatingIPAssignment() *schema.Resource { +func ResourceDigitalOceanFloatingIPAssignment() *schema.Resource { return &schema.Resource{ // TODO: Uncomment when dates for deprecation timeline are set. // DeprecationMessage: "This resource is deprecated and will be removed in a future release. Please use digitalocean_reserved_ip_assignment instead.", diff --git a/digitalocean/resource_digitalocean_floating_ip_assignment_test.go b/digitalocean/reservedip/resource_floating_ip_assignment_test.go similarity index 92% rename from digitalocean/resource_digitalocean_floating_ip_assignment_test.go rename to digitalocean/reservedip/resource_floating_ip_assignment_test.go index 30e891f70..aeaaf7fe3 100644 --- a/digitalocean/resource_digitalocean_floating_ip_assignment_test.go +++ b/digitalocean/reservedip/resource_floating_ip_assignment_test.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip_test import ( "context" @@ -8,6 +8,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -16,8 +18,8 @@ func TestAccDigitalOceanFloatingIPAssignment(t *testing.T) { var floatingIP godo.FloatingIP resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFloatingIPDestroy, Steps: []resource.TestStep{ { @@ -54,8 +56,8 @@ func TestAccDigitalOceanFloatingIPAssignment(t *testing.T) { func TestAccDigitalOceanFloatingIPAssignment_createBeforeDestroy(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFloatingIPDestroy, Steps: []resource.TestStep{ { @@ -98,7 +100,7 @@ func testAccCheckDigitalOceanFloatingIPAttachmentExists(n string) resource.TestC return err } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() // Try to find the FloatingIP foundFloatingIP, _, err := client.FloatingIPs.Get(context.Background(), fipID) diff --git a/digitalocean/resource_digitalocean_floating_ip_test.go b/digitalocean/reservedip/resource_floating_ip_test.go similarity index 83% rename from digitalocean/resource_digitalocean_floating_ip_test.go rename to digitalocean/reservedip/resource_floating_ip_test.go index 27ebd77f5..1df56548b 100644 --- a/digitalocean/resource_digitalocean_floating_ip_test.go +++ b/digitalocean/reservedip/resource_floating_ip_test.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip_test import ( "context" @@ -7,49 +7,21 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_floating_ip", &resource.Sweeper{ - Name: "digitalocean_floating_ip", - F: testSweepFloatingIps, - }) - -} - -func testSweepFloatingIps(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - ips, _, err := client.FloatingIPs.List(context.Background(), nil) - if err != nil { - return err - } - - for _, ip := range ips { - if _, err := client.FloatingIPs.Delete(context.Background(), ip.IP); err != nil { - return err - } - } - - return nil -} - func TestAccDigitalOceanFloatingIP_Region(t *testing.T) { var floatingIP godo.FloatingIP expectedURNRegEx, _ := regexp.Compile(`do:floatingip:(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFloatingIPDestroy, Steps: []resource.TestStep{ { @@ -70,8 +42,8 @@ func TestAccDigitalOceanFloatingIP_Droplet(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanFloatingIPDestroy, Steps: []resource.TestStep{ { @@ -103,7 +75,7 @@ func TestAccDigitalOceanFloatingIP_Droplet(t *testing.T) { } func testAccCheckDigitalOceanFloatingIPDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_floating_ip" { @@ -133,7 +105,7 @@ func testAccCheckDigitalOceanFloatingIPExists(n string, floatingIP *godo.Floatin return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() // Try to find the FloatingIP foundFloatingIP, _, err := client.FloatingIPs.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/resource_digitalocean_reserved_ip.go b/digitalocean/reservedip/resource_reserved_ip.go similarity index 94% rename from digitalocean/resource_digitalocean_reserved_ip.go rename to digitalocean/reservedip/resource_reserved_ip.go index 586ce28ea..eedcfb3dd 100644 --- a/digitalocean/resource_digitalocean_reserved_ip.go +++ b/digitalocean/reservedip/resource_reserved_ip.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip import ( "context" @@ -8,13 +8,14 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanReservedIP() *schema.Resource { +func ResourceDigitalOceanReservedIP() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanReservedIPCreate, UpdateContext: resourceDigitalOceanReservedIPUpdate, @@ -54,7 +55,7 @@ func resourceDigitalOceanReservedIP() *schema.Resource { } func resourceDigitalOceanReservedIPCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Creating a reserved IP in a region") regionOpts := &godo.ReservedIPCreateRequest{ @@ -88,7 +89,7 @@ func resourceDigitalOceanReservedIPCreate(ctx context.Context, d *schema.Resourc } func resourceDigitalOceanReservedIPUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() if d.HasChange("droplet_id") { if v, ok := d.GetOk("droplet_id"); ok { @@ -124,7 +125,7 @@ func resourceDigitalOceanReservedIPUpdate(ctx context.Context, d *schema.Resourc } func resourceDigitalOceanReservedIPRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Reading the details of the reserved IP %s", d.Id()) reservedIP, resp, err := client.ReservedIPs.Get(context.Background(), d.Id()) @@ -152,7 +153,7 @@ func resourceDigitalOceanReservedIPRead(ctx context.Context, d *schema.ResourceD } func resourceDigitalOceanReservedIPDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() if _, ok := d.GetOk("droplet_id"); ok { log.Printf("[INFO] Unassigning the reserved IP from the Droplet") @@ -184,7 +185,7 @@ func resourceDigitalOceanReservedIPDelete(ctx context.Context, d *schema.Resourc } func resourceDigitalOceanReservedIPImport(ctx context.Context, d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() reservedIP, resp, err := client.ReservedIPs.Get(context.Background(), d.Id()) if resp.StatusCode != 404 { if err != nil { @@ -225,7 +226,7 @@ func waitForReservedIPReady( func newReservedIPStateRefreshFunc( d *schema.ResourceData, attribute string, meta interface{}, actionID int) resource.StateRefreshFunc { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() return func() (interface{}, string, error) { log.Printf("[INFO] Assigning the reserved IP to the Droplet") diff --git a/digitalocean/resource_digitalocean_reserved_ip_assignment.go b/digitalocean/reservedip/resource_reserved_ip_assignment.go similarity index 93% rename from digitalocean/resource_digitalocean_reserved_ip_assignment.go rename to digitalocean/reservedip/resource_reserved_ip_assignment.go index d7f7600fa..7752c9b92 100644 --- a/digitalocean/resource_digitalocean_reserved_ip_assignment.go +++ b/digitalocean/reservedip/resource_reserved_ip_assignment.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip import ( "context" @@ -9,13 +9,14 @@ import ( "strings" "time" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanReservedIPAssignment() *schema.Resource { +func ResourceDigitalOceanReservedIPAssignment() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanReservedIPAssignmentCreate, ReadContext: resourceDigitalOceanReservedIPAssignmentRead, @@ -42,7 +43,7 @@ func resourceDigitalOceanReservedIPAssignment() *schema.Resource { } func resourceDigitalOceanReservedIPAssignmentCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() ipAddress := d.Get("ip_address").(string) dropletID := d.Get("droplet_id").(int) @@ -65,7 +66,7 @@ func resourceDigitalOceanReservedIPAssignmentCreate(ctx context.Context, d *sche } func resourceDigitalOceanReservedIPAssignmentRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() ipAddress := d.Get("ip_address").(string) dropletID := d.Get("droplet_id").(int) @@ -85,7 +86,7 @@ func resourceDigitalOceanReservedIPAssignmentRead(ctx context.Context, d *schema } func resourceDigitalOceanReservedIPAssignmentDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() ipAddress := d.Get("ip_address").(string) dropletID := d.Get("droplet_id").(int) @@ -138,7 +139,7 @@ func waitForReservedIPAssignmentReady( func newReservedIPAssignmentStateRefreshFunc( d *schema.ResourceData, attribute string, meta interface{}, actionID int) resource.StateRefreshFunc { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() return func() (interface{}, string, error) { log.Printf("[INFO] Refreshing the reserved IP state") diff --git a/digitalocean/resource_digitalocean_reserved_ip_assignment_test.go b/digitalocean/reservedip/resource_reserved_ip_assignment_test.go similarity index 92% rename from digitalocean/resource_digitalocean_reserved_ip_assignment_test.go rename to digitalocean/reservedip/resource_reserved_ip_assignment_test.go index 54c7d2db4..e8f4f0a37 100644 --- a/digitalocean/resource_digitalocean_reserved_ip_assignment_test.go +++ b/digitalocean/reservedip/resource_reserved_ip_assignment_test.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip_test import ( "context" @@ -8,6 +8,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -16,8 +18,8 @@ func TestAccDigitalOceanReservedIPAssignment(t *testing.T) { var reservedIP godo.ReservedIP resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanReservedIPDestroy, Steps: []resource.TestStep{ { @@ -54,8 +56,8 @@ func TestAccDigitalOceanReservedIPAssignment(t *testing.T) { func TestAccDigitalOceanReservedIPAssignment_createBeforeDestroy(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanReservedIPDestroy, Steps: []resource.TestStep{ { @@ -98,7 +100,7 @@ func testAccCheckDigitalOceanReservedIPAttachmentExists(n string) resource.TestC return err } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() // Try to find the ReservedIP foundReservedIP, _, err := client.ReservedIPs.Get(context.Background(), fipID) diff --git a/digitalocean/resource_digitalocean_reserved_ip_test.go b/digitalocean/reservedip/resource_reserved_ip_test.go similarity index 83% rename from digitalocean/resource_digitalocean_reserved_ip_test.go rename to digitalocean/reservedip/resource_reserved_ip_test.go index 30dcf7727..f48ff3e72 100644 --- a/digitalocean/resource_digitalocean_reserved_ip_test.go +++ b/digitalocean/reservedip/resource_reserved_ip_test.go @@ -1,4 +1,4 @@ -package digitalocean +package reservedip_test import ( "context" @@ -7,49 +7,21 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_reserved_ip", &resource.Sweeper{ - Name: "digitalocean_reserved_ip", - F: testSweepReservedIPs, - }) - -} - -func testSweepReservedIPs(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - ips, _, err := client.ReservedIPs.List(context.Background(), nil) - if err != nil { - return err - } - - for _, ip := range ips { - if _, err := client.ReservedIPs.Delete(context.Background(), ip.IP); err != nil { - return err - } - } - - return nil -} - func TestAccDigitalOceanReservedIP_Region(t *testing.T) { var reservedIP godo.ReservedIP expectedURNRegEx, _ := regexp.Compile(`do:reservedip:(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanReservedIPDestroy, Steps: []resource.TestStep{ { @@ -70,8 +42,8 @@ func TestAccDigitalOceanReservedIP_Droplet(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanReservedIPDestroy, Steps: []resource.TestStep{ { @@ -103,7 +75,7 @@ func TestAccDigitalOceanReservedIP_Droplet(t *testing.T) { } func testAccCheckDigitalOceanReservedIPDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_reserved_ip" { @@ -133,7 +105,7 @@ func testAccCheckDigitalOceanReservedIPExists(n string, reservedIP *godo.Reserve return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() // Try to find the ReservedIP foundReservedIP, _, err := client.ReservedIPs.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/reservedip/sweep.go b/digitalocean/reservedip/sweep.go new file mode 100644 index 000000000..3333bb988 --- /dev/null +++ b/digitalocean/reservedip/sweep.go @@ -0,0 +1,65 @@ +package reservedip + +import ( + "context" + + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_reserved_ip", &resource.Sweeper{ + Name: "digitalocean_reserved_ip", + F: sweepReservedIPs, + }) + + resource.AddTestSweepers("digitalocean_floating_ip", &resource.Sweeper{ + Name: "digitalocean_floating_ip", + F: testSweepFloatingIps, + }) +} + +func sweepReservedIPs(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + ips, _, err := client.ReservedIPs.List(context.Background(), nil) + if err != nil { + return err + } + + for _, ip := range ips { + if _, err := client.ReservedIPs.Delete(context.Background(), ip.IP); err != nil { + return err + } + } + + return nil +} + +func testSweepFloatingIps(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + ips, _, err := client.FloatingIPs.List(context.Background(), nil) + if err != nil { + return err + } + + for _, ip := range ips { + if _, err := client.FloatingIPs.Delete(context.Background(), ip.IP); err != nil { + return err + } + } + + return nil +} diff --git a/digitalocean/datasource_digitalocean_sizes.go b/digitalocean/size/datasource_sizes.go similarity index 94% rename from digitalocean/datasource_digitalocean_sizes.go rename to digitalocean/size/datasource_sizes.go index c27bc5c14..7c5155adb 100644 --- a/digitalocean/datasource_digitalocean_sizes.go +++ b/digitalocean/size/datasource_sizes.go @@ -1,15 +1,16 @@ -package digitalocean +package size import ( "context" "fmt" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/digitalocean/terraform-provider-digitalocean/internal/datalist" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanSizes() *schema.Resource { +func DataSourceDigitalOceanSizes() *schema.Resource { dataListConfig := &datalist.ResourceConfig{ RecordSchema: map[string]*schema.Schema{ "slug": { @@ -59,7 +60,7 @@ func dataSourceDigitalOceanSizes() *schema.Resource { } func getDigitalOceanSizes(meta interface{}, extra map[string]interface{}) ([]interface{}, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() sizes := []interface{}{} diff --git a/digitalocean/datasource_digitalocean_sizes_test.go b/digitalocean/size/datasource_sizes_test.go similarity index 91% rename from digitalocean/datasource_digitalocean_sizes_test.go rename to digitalocean/size/datasource_sizes_test.go index eb94cd36a..8abeea1a3 100644 --- a/digitalocean/datasource_digitalocean_sizes_test.go +++ b/digitalocean/size/datasource_sizes_test.go @@ -1,18 +1,19 @@ -package digitalocean +package size_test import ( "fmt" "strconv" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceDigitalOceanSizes_Basic(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: fmt.Sprintf(testAccCheckDataSourceDigitalOceanSizesConfigBasic), @@ -26,8 +27,8 @@ func TestAccDataSourceDigitalOceanSizes_Basic(t *testing.T) { func TestAccDataSourceDigitalOceanSizes_WithFilterAndSort(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: fmt.Sprintf(testAccCheckDataSourceDigitalOceanSizesConfigWithFilterAndSort), diff --git a/digitalocean/datasource_digitalocean_droplet_snapshot.go b/digitalocean/snapshot/datasource_droplet_snapshot.go similarity index 94% rename from digitalocean/datasource_digitalocean_droplet_snapshot.go rename to digitalocean/snapshot/datasource_droplet_snapshot.go index a970a6466..4c41a03f4 100644 --- a/digitalocean/datasource_digitalocean_droplet_snapshot.go +++ b/digitalocean/snapshot/datasource_droplet_snapshot.go @@ -1,4 +1,4 @@ -package digitalocean +package snapshot import ( "context" @@ -6,12 +6,13 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanDropletSnapshot() *schema.Resource { +func DataSourceDigitalOceanDropletSnapshot() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanDropletSnapshotRead, Schema: map[string]*schema.Schema{ @@ -68,7 +69,7 @@ func dataSourceDigitalOceanDropletSnapshot() *schema.Resource { // dataSourceDoSnapshotRead performs the Snapshot lookup. func dataSourceDigitalOceanDropletSnapshotRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() name, hasName := d.GetOk("name") nameRegex, hasNameRegex := d.GetOk("name_regex") diff --git a/digitalocean/datasource_digitalocean_droplet_snapshot_test.go b/digitalocean/snapshot/datasource_droplet_snapshot_test.go similarity index 86% rename from digitalocean/datasource_digitalocean_droplet_snapshot_test.go rename to digitalocean/snapshot/datasource_droplet_snapshot_test.go index 134e7ec1c..03a5edffc 100644 --- a/digitalocean/datasource_digitalocean_droplet_snapshot_test.go +++ b/digitalocean/snapshot/datasource_droplet_snapshot_test.go @@ -1,4 +1,4 @@ -package digitalocean +package snapshot_test import ( "context" @@ -6,13 +6,15 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceDigitalOceanDropletSnapshot_basic(t *testing.T) { var snapshot godo.Snapshot - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := fmt.Sprintf(testAccCheckDataSourceDigitalOceanDropletSnapshot_basic, testName, testName) dataSourceConfig := ` data "digitalocean_droplet_snapshot" "foobar" { @@ -21,8 +23,8 @@ data "digitalocean_droplet_snapshot" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -43,7 +45,7 @@ data "digitalocean_droplet_snapshot" "foobar" { func TestAccDataSourceDigitalOceanDropletSnapshot_regex(t *testing.T) { var snapshot godo.Snapshot - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := fmt.Sprintf(testAccCheckDataSourceDigitalOceanDropletSnapshot_basic, testName, testName) dataSourceConfig := fmt.Sprintf(` data "digitalocean_droplet_snapshot" "foobar" { @@ -52,8 +54,8 @@ data "digitalocean_droplet_snapshot" "foobar" { }`, testName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -74,7 +76,7 @@ data "digitalocean_droplet_snapshot" "foobar" { func TestAccDataSourceDigitalOceanDropletSnapshot_region(t *testing.T) { var snapshot godo.Snapshot - testName := randomTestName() + testName := acceptance.RandomTestName() nycResourceConfig := fmt.Sprintf(testAccCheckDataSourceDigitalOceanDropletSnapshot_basic, testName, testName) lonResourceConfig := fmt.Sprintf(` resource "digitalocean_droplet" "bar" { @@ -95,8 +97,8 @@ data "digitalocean_droplet_snapshot" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: nycResourceConfig + lonResourceConfig, @@ -117,7 +119,7 @@ data "digitalocean_droplet_snapshot" "foobar" { func testAccCheckDataSourceDigitalOceanDropletSnapshotExists(n string, snapshot *godo.Snapshot) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[n] diff --git a/digitalocean/datasource_digitalocean_volume_snapshot.go b/digitalocean/snapshot/datasource_volume_snapshot.go similarity index 92% rename from digitalocean/datasource_digitalocean_volume_snapshot.go rename to digitalocean/snapshot/datasource_volume_snapshot.go index a3daf85b1..eb65a148d 100644 --- a/digitalocean/datasource_digitalocean_volume_snapshot.go +++ b/digitalocean/snapshot/datasource_volume_snapshot.go @@ -1,4 +1,4 @@ -package digitalocean +package snapshot import ( "context" @@ -9,12 +9,14 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanVolumeSnapshot() *schema.Resource { +func DataSourceDigitalOceanVolumeSnapshot() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanVolumeSnapshotRead, Schema: map[string]*schema.Schema{ @@ -65,14 +67,14 @@ func dataSourceDigitalOceanVolumeSnapshot() *schema.Resource { Type: schema.TypeFloat, Computed: true, }, - "tags": tagsDataSourceSchema(), + "tags": tag.TagsDataSourceSchema(), }, } } // dataSourceDoSnapshotRead performs the Snapshot lookup. func dataSourceDigitalOceanVolumeSnapshotRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() name, hasName := d.GetOk("name") nameRegex, hasNameRegex := d.GetOk("name_regex") @@ -145,7 +147,7 @@ func dataSourceDigitalOceanVolumeSnapshotRead(ctx context.Context, d *schema.Res d.Set("regions", snapshot.Regions) d.Set("volume_id", snapshot.ResourceID) d.Set("size", snapshot.SizeGigaBytes) - d.Set("tags", flattenTags(snapshot.Tags)) + d.Set("tags", tag.FlattenTags(snapshot.Tags)) return nil } diff --git a/digitalocean/datasource_digitalocean_volume_snapshot_test.go b/digitalocean/snapshot/datasource_volume_snapshot_test.go similarity index 87% rename from digitalocean/datasource_digitalocean_volume_snapshot_test.go rename to digitalocean/snapshot/datasource_volume_snapshot_test.go index 33748e191..22ae483d9 100644 --- a/digitalocean/datasource_digitalocean_volume_snapshot_test.go +++ b/digitalocean/snapshot/datasource_volume_snapshot_test.go @@ -1,4 +1,4 @@ -package digitalocean +package snapshot_test import ( "context" @@ -6,13 +6,15 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceDigitalOceanVolumeSnapshot_basic(t *testing.T) { var snapshot godo.Snapshot - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := fmt.Sprintf(testAccCheckDataSourceDigitalOceanVolumeSnapshot_basic, testName, testName) dataSourceConfig := ` data "digitalocean_volume_snapshot" "foobar" { @@ -21,8 +23,8 @@ data "digitalocean_volume_snapshot" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -45,7 +47,7 @@ data "digitalocean_volume_snapshot" "foobar" { func TestAccDataSourceDigitalOceanVolumeSnapshot_regex(t *testing.T) { var snapshot godo.Snapshot - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := fmt.Sprintf(testAccCheckDataSourceDigitalOceanVolumeSnapshot_basic, testName, testName) dataSourceConfig := ` data "digitalocean_volume_snapshot" "foobar" { @@ -54,8 +56,8 @@ data "digitalocean_volume_snapshot" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -78,7 +80,7 @@ data "digitalocean_volume_snapshot" "foobar" { func TestAccDataSourceDigitalOceanVolumeSnapshot_region(t *testing.T) { var snapshot godo.Snapshot - testName := randomTestName() + testName := acceptance.RandomTestName() nycResourceConfig := fmt.Sprintf(testAccCheckDataSourceDigitalOceanVolumeSnapshot_basic, testName, testName) lonResourceConfig := fmt.Sprintf(` resource "digitalocean_volume" "bar" { @@ -99,8 +101,8 @@ data "digitalocean_volume_snapshot" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: nycResourceConfig + lonResourceConfig, @@ -123,7 +125,7 @@ data "digitalocean_volume_snapshot" "foobar" { func testAccCheckDataSourceDigitalOceanVolumeSnapshotExists(n string, snapshot *godo.Snapshot) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[n] diff --git a/digitalocean/import_digitalocean_droplet_snapshot_test.go b/digitalocean/snapshot/import_droplet_snapshot_test.go similarity index 75% rename from digitalocean/import_digitalocean_droplet_snapshot_test.go rename to digitalocean/snapshot/import_droplet_snapshot_test.go index 69657e470..11f472470 100644 --- a/digitalocean/import_digitalocean_droplet_snapshot_test.go +++ b/digitalocean/snapshot/import_droplet_snapshot_test.go @@ -1,9 +1,10 @@ -package digitalocean +package snapshot_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -14,8 +15,8 @@ func TestAccDigitalOceanDropletSnapshot_importBasic(t *testing.T) { rInt2 := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeSnapshotDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_volume_snapshot_test.go b/digitalocean/snapshot/import_volume_snapshot_test.go similarity index 74% rename from digitalocean/import_digitalocean_volume_snapshot_test.go rename to digitalocean/snapshot/import_volume_snapshot_test.go index d1b6d511e..11d08b7d5 100644 --- a/digitalocean/import_digitalocean_volume_snapshot_test.go +++ b/digitalocean/snapshot/import_volume_snapshot_test.go @@ -1,9 +1,10 @@ -package digitalocean +package snapshot_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -13,8 +14,8 @@ func TestAccDigitalOceanVolumeSnapshot_importBasic(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeSnapshotDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_droplet_snapshot.go b/digitalocean/snapshot/resource_droplet_snapshot.go similarity index 90% rename from digitalocean/resource_digitalocean_droplet_snapshot.go rename to digitalocean/snapshot/resource_droplet_snapshot.go index 6dcd1b27a..6562d83f0 100644 --- a/digitalocean/resource_digitalocean_droplet_snapshot.go +++ b/digitalocean/snapshot/resource_droplet_snapshot.go @@ -1,4 +1,4 @@ -package digitalocean +package snapshot import ( "context" @@ -8,12 +8,14 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanDropletSnapshot() *schema.Resource { +func ResourceDigitalOceanDropletSnapshot() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanDropletSnapshotCreate, ReadContext: resourceDigitalOceanDropletSnapshotRead, @@ -57,7 +59,7 @@ func resourceDigitalOceanDropletSnapshot() *schema.Resource { } func resourceDigitalOceanDropletSnapshotCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() resourceId, _ := strconv.Atoi(d.Get("droplet_id").(string)) action, _, err := client.DropletActions.Snapshot(context.Background(), resourceId, d.Get("name").(string)) @@ -65,7 +67,7 @@ func resourceDigitalOceanDropletSnapshotCreate(ctx context.Context, d *schema.Re return diag.Errorf("Error creating Droplet Snapshot: %s", err) } - if err = waitForAction(client, action); err != nil { + if err = util.WaitForAction(client, action); err != nil { return diag.Errorf( "Error waiting for Droplet snapshot (%v) to finish: %s", resourceId, err) } @@ -97,7 +99,7 @@ func resourceDigitalOceanDropletSnapshotCreate(ctx context.Context, d *schema.Re } func resourceDigitalOceanDropletSnapshotRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() snapshot, resp, err := client.Snapshots.Get(context.Background(), d.Id()) if err != nil { @@ -121,7 +123,7 @@ func resourceDigitalOceanDropletSnapshotRead(ctx context.Context, d *schema.Reso } func resourceDigitalOceanDropletSnapshotDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting snaphot: %s", d.Id()) _, err := client.Snapshots.Delete(context.Background(), d.Id()) diff --git a/digitalocean/resource_digitalocean_droplet_snapshot_test.go b/digitalocean/snapshot/resource_droplet_snapshot_test.go similarity index 66% rename from digitalocean/resource_digitalocean_droplet_snapshot_test.go rename to digitalocean/snapshot/resource_droplet_snapshot_test.go index e02e2aec4..2204935be 100644 --- a/digitalocean/resource_digitalocean_droplet_snapshot_test.go +++ b/digitalocean/snapshot/resource_droplet_snapshot_test.go @@ -1,61 +1,26 @@ -package digitalocean +package snapshot_test import ( "context" "fmt" - "log" - "strings" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_droplet_snapshot", &resource.Sweeper{ - Name: "digitalocean_droplet_snapshot", - F: testSweepDropletSnapshots, - Dependencies: []string{"digitalocean_droplet"}, - }) -} - -func testSweepDropletSnapshots(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListOptions{PerPage: 200} - snapshots, _, err := client.Snapshots.ListDroplet(context.Background(), opt) - if err != nil { - return err - } - - for _, s := range snapshots { - if strings.HasPrefix(s.Name, "snapshot-") || strings.HasPrefix(s.Name, "snap-") { - log.Printf("Destroying Droplet Snapshot %s", s.Name) - - if _, err := client.Snapshots.Delete(context.Background(), s.ID); err != nil { - return err - } - } - } - - return nil -} - func TestAccDigitalOceanDropletSnapshot_Basic(t *testing.T) { var snapshot godo.Snapshot rInt1 := acctest.RandInt() rInt2 := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanDropletSnapshotDestroy, Steps: []resource.TestStep{ { @@ -72,7 +37,7 @@ func TestAccDigitalOceanDropletSnapshot_Basic(t *testing.T) { func testAccCheckDigitalOceanDropletSnapshotExists(n string, snapshot *godo.Snapshot) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[n] @@ -100,7 +65,7 @@ func testAccCheckDigitalOceanDropletSnapshotExists(n string, snapshot *godo.Snap } func testAccCheckDigitalOceanDropletSnapshotDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_droplet_snapshot" { diff --git a/digitalocean/resource_digitalocean_volume_snapshot.go b/digitalocean/snapshot/resource_volume_snapshot.go similarity index 83% rename from digitalocean/resource_digitalocean_volume_snapshot.go rename to digitalocean/snapshot/resource_volume_snapshot.go index 049a602ac..b927a6388 100644 --- a/digitalocean/resource_digitalocean_volume_snapshot.go +++ b/digitalocean/snapshot/resource_volume_snapshot.go @@ -1,16 +1,18 @@ -package digitalocean +package snapshot import ( "context" "log" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanVolumeSnapshot() *schema.Resource { +func ResourceDigitalOceanVolumeSnapshot() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanVolumeSnapshotCreate, ReadContext: resourceDigitalOceanVolumeSnapshotRead, @@ -56,18 +58,18 @@ func resourceDigitalOceanVolumeSnapshot() *schema.Resource { Computed: true, }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), }, } } func resourceDigitalOceanVolumeSnapshotCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() opts := &godo.SnapshotCreateRequest{ Name: d.Get("name").(string), VolumeID: d.Get("volume_id").(string), - Tags: expandTags(d.Get("tags").(*schema.Set).List()), + Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()), } log.Printf("[DEBUG] Volume Snapshot create configuration: %#v", opts) @@ -83,10 +85,10 @@ func resourceDigitalOceanVolumeSnapshotCreate(ctx context.Context, d *schema.Res } func resourceDigitalOceanVolumeSnapshotUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() if d.HasChange("tags") { - err := setTags(client, d, godo.VolumeSnapshotResourceType) + err := tag.SetTags(client, d, godo.VolumeSnapshotResourceType) if err != nil { return diag.Errorf("Error updating tags: %s", err) } @@ -96,7 +98,7 @@ func resourceDigitalOceanVolumeSnapshotUpdate(ctx context.Context, d *schema.Res } func resourceDigitalOceanVolumeSnapshotRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() snapshot, resp, err := client.Snapshots.Get(context.Background(), d.Id()) if err != nil { @@ -116,13 +118,13 @@ func resourceDigitalOceanVolumeSnapshotRead(ctx context.Context, d *schema.Resou d.Set("size", snapshot.SizeGigaBytes) d.Set("created_at", snapshot.Created) d.Set("min_disk_size", snapshot.MinDiskSize) - d.Set("tags", flattenTags(snapshot.Tags)) + d.Set("tags", tag.FlattenTags(snapshot.Tags)) return nil } func resourceDigitalOceanVolumeSnapshotDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting snaphot: %s", d.Id()) _, err := client.Snapshots.Delete(context.Background(), d.Id()) diff --git a/digitalocean/resource_digitalocean_volume_snapshot_test.go b/digitalocean/snapshot/resource_volume_snapshot_test.go similarity index 77% rename from digitalocean/resource_digitalocean_volume_snapshot_test.go rename to digitalocean/snapshot/resource_volume_snapshot_test.go index c279f38b5..572f748af 100644 --- a/digitalocean/resource_digitalocean_volume_snapshot_test.go +++ b/digitalocean/snapshot/resource_volume_snapshot_test.go @@ -1,60 +1,25 @@ -package digitalocean +package snapshot_test import ( "context" "fmt" - "log" - "strings" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_volume_snapshot", &resource.Sweeper{ - Name: "digitalocean_volume_snapshot", - F: testSweepVolumeSnapshots, - Dependencies: []string{"digitalocean_volume"}, - }) -} - -func testSweepVolumeSnapshots(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListOptions{PerPage: 200} - snapshots, _, err := client.Snapshots.ListVolume(context.Background(), opt) - if err != nil { - return err - } - - for _, s := range snapshots { - if strings.HasPrefix(s.Name, "snapshot-") { - log.Printf("Destroying Volume Snapshot %s", s.Name) - - if _, err := client.Snapshots.Delete(context.Background(), s.ID); err != nil { - return err - } - } - } - - return nil -} - func TestAccDigitalOceanVolumeSnapshot_Basic(t *testing.T) { var snapshot godo.Snapshot rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeSnapshotDestroy, Steps: []resource.TestStep{ { @@ -81,7 +46,7 @@ func TestAccDigitalOceanVolumeSnapshot_Basic(t *testing.T) { func testAccCheckDigitalOceanVolumeSnapshotExists(n string, snapshot *godo.Snapshot) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[n] @@ -109,7 +74,7 @@ func testAccCheckDigitalOceanVolumeSnapshotExists(n string, snapshot *godo.Snaps } func testAccCheckDigitalOceanVolumeSnapshotDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_volume_snapshot" { @@ -146,8 +111,8 @@ func TestAccDigitalOceanVolumeSnapshot_UpdateTags(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeSnapshotDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/snapshot/sweep.go b/digitalocean/snapshot/sweep.go new file mode 100644 index 000000000..b8310ce98 --- /dev/null +++ b/digitalocean/snapshot/sweep.go @@ -0,0 +1,80 @@ +package snapshot + +import ( + "context" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_droplet_snapshot", &resource.Sweeper{ + Name: "digitalocean_droplet_snapshot", + F: testSweepDropletSnapshots, + Dependencies: []string{"digitalocean_droplet"}, + }) + + resource.AddTestSweepers("digitalocean_volume_snapshot", &resource.Sweeper{ + Name: "digitalocean_volume_snapshot", + F: testSweepVolumeSnapshots, + Dependencies: []string{"digitalocean_volume"}, + }) +} + +func testSweepDropletSnapshots(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + snapshots, _, err := client.Snapshots.ListDroplet(context.Background(), opt) + if err != nil { + return err + } + + for _, s := range snapshots { + if strings.HasPrefix(s.Name, "snapshot-") || strings.HasPrefix(s.Name, "snap-") { + log.Printf("Destroying Droplet Snapshot %s", s.Name) + + if _, err := client.Snapshots.Delete(context.Background(), s.ID); err != nil { + return err + } + } + } + + return nil +} + +func testSweepVolumeSnapshots(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListOptions{PerPage: 200} + snapshots, _, err := client.Snapshots.ListVolume(context.Background(), opt) + if err != nil { + return err + } + + for _, s := range snapshots { + if strings.HasPrefix(s.Name, "snapshot-") { + log.Printf("Destroying Volume Snapshot %s", s.Name) + + if _, err := client.Snapshots.Delete(context.Background(), s.ID); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/sort.go b/digitalocean/sort.go deleted file mode 100644 index a6ec19b7f..000000000 --- a/digitalocean/sort.go +++ /dev/null @@ -1,52 +0,0 @@ -package digitalocean - -import ( - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" -) - -var ( - sortKeys = []string{"asc", "desc"} -) - -type commonSort struct { - key string - direction string -} - -func sortSchema(allowedKeys []string) *schema.Schema { - return &schema.Schema{ - Type: schema.TypeList, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "key": { - Type: schema.TypeString, - Required: true, - ValidateFunc: validation.StringInSlice(allowedKeys, false), - }, - "direction": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice(sortKeys, false), - }, - }, - }, - Optional: true, - Description: "One or more key/direction pairs to sort droplet size results.", - } -} - -func expandSorts(rawSorts []interface{}) []commonSort { - expandedSorts := make([]commonSort, len(rawSorts)) - for i, rawSort := range rawSorts { - f := rawSort.(map[string]interface{}) - - expandedSort := commonSort{ - key: f["key"].(string), - direction: f["direction"].(string), - } - - expandedSorts[i] = expandedSort - } - return expandedSorts -} diff --git a/digitalocean/sort_test.go b/digitalocean/sort_test.go deleted file mode 100644 index a879111b3..000000000 --- a/digitalocean/sort_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package digitalocean - -import "testing" - -func TestExpandSorts(t *testing.T) { - rawSorts := []interface{}{ - map[string]interface{}{ - "key": "fieldA", - "direction": "asc", - }, - map[string]interface{}{ - "key": "fieldB", - "direction": "desc", - }, - } - - expandedSorts := expandSorts(rawSorts) - - if len(rawSorts) != len(expandedSorts) { - t.Fatalf("incorrect expected length of expanded sorts") - } - if expandedSorts[0].key != "fieldA" || - expandedSorts[0].direction != "asc" { - t.Fatalf("incorrect expansion of the 1st expanded sorts") - } - if expandedSorts[1].key != "fieldB" || - expandedSorts[1].direction != "desc" { - t.Fatalf("incorrect expansion of the 2nd expanded sorts") - } -} diff --git a/digitalocean/datasource_digitalocean_spaces_bucket.go b/digitalocean/spaces/datasource_spaces_bucket.go similarity index 83% rename from digitalocean/datasource_digitalocean_spaces_bucket.go rename to digitalocean/spaces/datasource_spaces_bucket.go index 9b384a3d2..2e61729a1 100644 --- a/digitalocean/datasource_digitalocean_spaces_bucket.go +++ b/digitalocean/spaces/datasource_spaces_bucket.go @@ -1,4 +1,4 @@ -package digitalocean +package spaces import ( "context" @@ -6,12 +6,14 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanSpacesBucket() *schema.Resource { +func DataSourceDigitalOceanSpacesBucket() *schema.Resource { recordSchema := spacesBucketSchema() for _, f := range recordSchema { @@ -34,7 +36,7 @@ func dataSourceDigitalOceanSpacesBucketRead(ctx context.Context, d *schema.Resou region := d.Get("region").(string) name := d.Get("name").(string) - client, err := meta.(*CombinedConfig).spacesClient(region) + client, err := meta.(*config.CombinedConfig).SpacesClient(region) if err != nil { return diag.Errorf("Error reading bucket: %s", err) } @@ -67,7 +69,7 @@ func dataSourceDigitalOceanSpacesBucketRead(ctx context.Context, d *schema.Resou return diag.FromErr(err) } - if err := setResourceDataFromMap(d, flattenedBucket); err != nil { + if err := util.SetResourceDataFromMap(d, flattenedBucket); err != nil { return diag.FromErr(err) } diff --git a/digitalocean/datasource_digitalocean_spaces_bucket_object.go b/digitalocean/spaces/datasource_spaces_bucket_object.go similarity index 95% rename from digitalocean/datasource_digitalocean_spaces_bucket_object.go rename to digitalocean/spaces/datasource_spaces_bucket_object.go index e2002cb3a..1ac15e65c 100644 --- a/digitalocean/datasource_digitalocean_spaces_bucket_object.go +++ b/digitalocean/spaces/datasource_spaces_bucket_object.go @@ -1,4 +1,4 @@ -package digitalocean +package spaces import ( "bytes" @@ -11,12 +11,13 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanSpacesBucketObject() *schema.Resource { +func DataSourceDigitalOceanSpacesBucketObject() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanSpacesBucketObjectRead, @@ -105,7 +106,7 @@ func dataSourceDigitalOceanSpacesBucketObject() *schema.Resource { func dataSourceDigitalOceanSpacesBucketObjectRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { region := d.Get("region").(string) - client, err := meta.(*CombinedConfig).spacesClient(region) + client, err := meta.(*config.CombinedConfig).SpacesClient(region) if err != nil { return diag.FromErr(err) } diff --git a/digitalocean/datasource_digitalocean_spaces_bucket_object_test.go b/digitalocean/spaces/datasource_spaces_bucket_object_test.go similarity index 94% rename from digitalocean/datasource_digitalocean_spaces_bucket_object_test.go rename to digitalocean/spaces/datasource_spaces_bucket_object_test.go index f8897994e..0c287dc6a 100644 --- a/digitalocean/datasource_digitalocean_spaces_bucket_object_test.go +++ b/digitalocean/spaces/datasource_spaces_bucket_object_test.go @@ -1,4 +1,4 @@ -package digitalocean +package spaces_test import ( "fmt" @@ -7,6 +7,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -20,8 +21,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObject_basic(t *testing.T) { var dsObj s3.GetObjectOutput resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ @@ -55,8 +56,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObject_readableBody(t *testing.T) var dsObj s3.GetObjectOutput resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { @@ -89,8 +90,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObject_allParams(t *testing.T) { var dsObj s3.GetObjectOutput resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { @@ -137,8 +138,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObject_LeadingSlash(t *testing.T) resourceOnlyConf, conf := testAccDataSourceDigitalOceanSpacesObjectConfig_leadingSlash(rInt) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { @@ -189,8 +190,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObject_MultipleSlashes(t *testing. resourceOnlyConf, conf := testAccDataSourceDigitalOceanSpacesObjectConfig_multipleSlashes(rInt) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { @@ -224,8 +225,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObject_MultipleSlashes(t *testing. func TestAccDataSourceDigitalOceanSpacesBucketObject_RegionError(t *testing.T) { badRegion := "ny2" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/datasource_digitalocean_spaces_bucket_objects.go b/digitalocean/spaces/datasource_spaces_bucket_objects.go similarity index 94% rename from digitalocean/datasource_digitalocean_spaces_bucket_objects.go rename to digitalocean/spaces/datasource_spaces_bucket_objects.go index 04bc39ceb..9f75c1bf4 100644 --- a/digitalocean/datasource_digitalocean_spaces_bucket_objects.go +++ b/digitalocean/spaces/datasource_spaces_bucket_objects.go @@ -1,10 +1,11 @@ -package digitalocean +package spaces import ( "context" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -13,7 +14,7 @@ import ( const keyRequestPageSize = 1000 -func dataSourceDigitalOceanSpacesBucketObjects() *schema.Resource { +func DataSourceDigitalOceanSpacesBucketObjects() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanSpacesBucketObjectsRead, @@ -70,7 +71,7 @@ func dataSourceDigitalOceanSpacesBucketObjects() *schema.Resource { func dataSourceDigitalOceanSpacesBucketObjectsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { region := d.Get("region").(string) - client, err := meta.(*CombinedConfig).spacesClient(region) + client, err := meta.(*config.CombinedConfig).SpacesClient(region) if err != nil { return diag.FromErr(err) } diff --git a/digitalocean/datasource_digitalocean_spaces_bucket_objects_test.go b/digitalocean/spaces/datasource_spaces_bucket_objects_test.go similarity index 93% rename from digitalocean/datasource_digitalocean_spaces_bucket_objects_test.go rename to digitalocean/spaces/datasource_spaces_bucket_objects_test.go index d3410e340..f25e60da8 100644 --- a/digitalocean/datasource_digitalocean_spaces_bucket_objects_test.go +++ b/digitalocean/spaces/datasource_spaces_bucket_objects_test.go @@ -1,9 +1,10 @@ -package digitalocean +package spaces_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -13,8 +14,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObjects_basic(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { @@ -38,8 +39,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObjects_all(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { @@ -68,8 +69,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObjects_prefixes(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { @@ -97,8 +98,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObjects_encoded(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { @@ -122,8 +123,8 @@ func TestAccDataSourceDigitalOceanSpacesBucketObjects_maxKeys(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, PreventPostDestroyRefresh: true, Steps: []resource.TestStep{ { diff --git a/digitalocean/datasource_digitalocean_spaces_bucket_test.go b/digitalocean/spaces/datasource_spaces_bucket_test.go similarity index 79% rename from digitalocean/datasource_digitalocean_spaces_bucket_test.go rename to digitalocean/spaces/datasource_spaces_bucket_test.go index 8b87477ba..6124196d6 100644 --- a/digitalocean/datasource_digitalocean_spaces_bucket_test.go +++ b/digitalocean/spaces/datasource_spaces_bucket_test.go @@ -1,10 +1,12 @@ -package digitalocean +package spaces_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/spaces" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -32,8 +34,8 @@ data "digitalocean_spaces_bucket" "bucket" { config2 := config1 + datasourceConfig resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -44,8 +46,8 @@ data "digitalocean_spaces_bucket" "bucket" { Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttr("data.digitalocean_spaces_bucket.bucket", "name", bucketName), resource.TestCheckResourceAttr("data.digitalocean_spaces_bucket.bucket", "region", bucketRegion), - resource.TestCheckResourceAttr("data.digitalocean_spaces_bucket.bucket", "bucket_domain_name", bucketDomainName(bucketName, bucketRegion)), - resource.TestCheckResourceAttr("data.digitalocean_spaces_bucket.bucket", "endpoint", bucketEndpoint(bucketRegion)), + resource.TestCheckResourceAttr("data.digitalocean_spaces_bucket.bucket", "bucket_domain_name", spaces.BucketDomainName(bucketName, bucketRegion)), + resource.TestCheckResourceAttr("data.digitalocean_spaces_bucket.bucket", "endpoint", spaces.BucketEndpoint(bucketRegion)), resource.TestCheckResourceAttr("data.digitalocean_spaces_bucket.bucket", "urn", fmt.Sprintf("do:space:%s", bucketName)), ), }, @@ -68,8 +70,8 @@ data "digitalocean_spaces_bucket" "bucket" { ` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -83,8 +85,8 @@ data "digitalocean_spaces_bucket" "bucket" { func TestAccDataSourceDigitalOceanSpacesBucket_RegionError(t *testing.T) { badRegion := "ny2" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/datasource_digitalocean_spaces_buckets.go b/digitalocean/spaces/datasource_spaces_buckets.go similarity index 83% rename from digitalocean/datasource_digitalocean_spaces_buckets.go rename to digitalocean/spaces/datasource_spaces_buckets.go index 0c2fe252a..731091c6c 100644 --- a/digitalocean/datasource_digitalocean_spaces_buckets.go +++ b/digitalocean/spaces/datasource_spaces_buckets.go @@ -1,11 +1,11 @@ -package digitalocean +package spaces import ( "github.com/digitalocean/terraform-provider-digitalocean/internal/datalist" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanSpacesBuckets() *schema.Resource { +func DataSourceDigitalOceanSpacesBuckets() *schema.Resource { dataListConfig := &datalist.ResourceConfig{ RecordSchema: spacesBucketSchema(), ResultAttributeName: "buckets", diff --git a/digitalocean/datasource_digitalocean_spaces_buckets_test.go b/digitalocean/spaces/datasource_spaces_buckets_test.go similarity index 80% rename from digitalocean/datasource_digitalocean_spaces_buckets_test.go rename to digitalocean/spaces/datasource_spaces_buckets_test.go index f41284c48..e1b496a53 100644 --- a/digitalocean/datasource_digitalocean_spaces_buckets_test.go +++ b/digitalocean/spaces/datasource_spaces_buckets_test.go @@ -1,9 +1,11 @@ -package digitalocean +package spaces_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/spaces" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -37,8 +39,8 @@ data "digitalocean_spaces_buckets" "result" { `, bucketName1) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -50,8 +52,8 @@ data "digitalocean_spaces_buckets" "result" { resource.TestCheckResourceAttr("data.digitalocean_spaces_buckets.result", "buckets.#", "1"), resource.TestCheckResourceAttr("data.digitalocean_spaces_buckets.result", "buckets.0.name", bucketName1), resource.TestCheckResourceAttr("data.digitalocean_spaces_buckets.result", "buckets.0.region", bucketRegion1), - resource.TestCheckResourceAttr("data.digitalocean_spaces_buckets.result", "buckets.0.bucket_domain_name", bucketDomainName(bucketName1, bucketRegion1)), - resource.TestCheckResourceAttr("data.digitalocean_spaces_buckets.result", "buckets.0.endpoint", bucketEndpoint(bucketRegion1)), + resource.TestCheckResourceAttr("data.digitalocean_spaces_buckets.result", "buckets.0.bucket_domain_name", spaces.BucketDomainName(bucketName1, bucketRegion1)), + resource.TestCheckResourceAttr("data.digitalocean_spaces_buckets.result", "buckets.0.endpoint", spaces.BucketEndpoint(bucketRegion1)), resource.TestCheckResourceAttr("data.digitalocean_spaces_buckets.result", "buckets.0.urn", fmt.Sprintf("do:space:%s", bucketName1)), ), }, diff --git a/digitalocean/import_digitalocean_spaces_bucket_policy_test.go b/digitalocean/spaces/import_spaces_bucket_policy_test.go similarity index 88% rename from digitalocean/import_digitalocean_spaces_bucket_policy_test.go rename to digitalocean/spaces/import_spaces_bucket_policy_test.go index 27fc3154f..71f81c0ac 100644 --- a/digitalocean/import_digitalocean_spaces_bucket_policy_test.go +++ b/digitalocean/spaces/import_spaces_bucket_policy_test.go @@ -1,10 +1,11 @@ -package digitalocean +package spaces_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -16,8 +17,8 @@ func TestAccDigitalOceanBucketPolicy_importBasic(t *testing.T) { bucketPolicy := `{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":"s3:*","Resource":"*"}]}` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketPolicyDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/import_digitalocean_spaces_bucket_test.go b/digitalocean/spaces/import_spaces_bucket_test.go similarity index 89% rename from digitalocean/import_digitalocean_spaces_bucket_test.go rename to digitalocean/spaces/import_spaces_bucket_test.go index a4ea782b2..35355658f 100644 --- a/digitalocean/import_digitalocean_spaces_bucket_test.go +++ b/digitalocean/spaces/import_spaces_bucket_test.go @@ -1,10 +1,11 @@ -package digitalocean +package spaces_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -14,8 +15,8 @@ func TestAccDigitalOceanBucket_importBasic(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_spaces_bucket.go b/digitalocean/spaces/resource_spaces_bucket.go similarity index 96% rename from digitalocean/resource_digitalocean_spaces_bucket.go rename to digitalocean/spaces/resource_spaces_bucket.go index 253e4723e..1a22d01a8 100644 --- a/digitalocean/resource_digitalocean_spaces_bucket.go +++ b/digitalocean/spaces/resource_spaces_bucket.go @@ -1,4 +1,4 @@ -package digitalocean +package spaces import ( "bytes" @@ -11,13 +11,15 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanBucket() *schema.Resource { +func ResourceDigitalOceanBucket() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanBucketCreate, ReadContext: resourceDigitalOceanBucketRead, @@ -203,7 +205,7 @@ func resourceDigitalOceanBucket() *schema.Resource { func resourceDigitalOceanBucketCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { region := d.Get("region").(string) - client, err := meta.(*CombinedConfig).spacesClient(region) + client, err := meta.(*config.CombinedConfig).SpacesClient(region) if err != nil { return diag.Errorf("Error creating bucket: %s", err) @@ -260,7 +262,7 @@ func resourceDigitalOceanBucketCreate(ctx context.Context, d *schema.ResourceDat func resourceDigitalOceanBucketUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { region := d.Get("region").(string) - client, err := meta.(*CombinedConfig).spacesClient(region) + client, err := meta.(*config.CombinedConfig).SpacesClient(region) if err != nil { return diag.Errorf("Error updating bucket: %s", err) @@ -297,7 +299,7 @@ func resourceDigitalOceanBucketUpdate(ctx context.Context, d *schema.ResourceDat func resourceDigitalOceanBucketRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { region := d.Get("region").(string) - client, err := meta.(*CombinedConfig).spacesClient(region) + client, err := meta.(*config.CombinedConfig).SpacesClient(region) if err != nil { return diag.Errorf("Error reading bucket: %s", err) @@ -327,7 +329,7 @@ func resourceDigitalOceanBucketRead(ctx context.Context, d *schema.ResourceData, d.Set("name", d.Id()) } - d.Set("bucket_domain_name", bucketDomainName(d.Get("name").(string), d.Get("region").(string))) + d.Set("bucket_domain_name", BucketDomainName(d.Get("name").(string), d.Get("region").(string))) // Add the region as an attribute locationResponse, err := retryOnAwsCode("NoSuchBucket", func() (interface{}, error) { @@ -344,7 +346,7 @@ func resourceDigitalOceanBucketRead(ctx context.Context, d *schema.ResourceData, if location.LocationConstraint != nil { region = *location.LocationConstraint } - region = normalizeRegion(region) + region = NormalizeRegion(region) if err := d.Set("region", region); err != nil { return diag.FromErr(err) } @@ -378,7 +380,7 @@ func resourceDigitalOceanBucketRead(ctx context.Context, d *schema.ResourceData, Bucket: aws.String(d.Id()), }) }) - if err != nil && !isAWSErr(err, "NoSuchLifecycleConfiguration", "") { + if err != nil && !IsAWSErr(err, "NoSuchLifecycleConfiguration", "") { return diag.FromErr(err) } @@ -469,14 +471,14 @@ func resourceDigitalOceanBucketRead(ctx context.Context, d *schema.ResourceData, d.Set("urn", urn) // Set the bucket's endpoint. - d.Set("endpoint", bucketEndpoint(d.Get("region").(string))) + d.Set("endpoint", BucketEndpoint(d.Get("region").(string))) return nil } func resourceDigitalOceanBucketDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { region := d.Get("region").(string) - client, err := meta.(*CombinedConfig).spacesClient(region) + client, err := meta.(*config.CombinedConfig).SpacesClient(region) if err != nil { return diag.Errorf("Error deleting bucket: %s", err) @@ -779,11 +781,11 @@ func resourceDigitalOceanBucketImport(d *schema.ResourceData, meta interface{}) return []*schema.ResourceData{d}, nil } -func bucketDomainName(bucket string, region string) string { +func BucketDomainName(bucket string, region string) string { return fmt.Sprintf("%s.%s.digitaloceanspaces.com", bucket, region) } -func bucketEndpoint(region string) string { +func BucketEndpoint(region string) string { return fmt.Sprintf("%s.digitaloceanspaces.com", region) } @@ -804,7 +806,7 @@ func retryOnAwsCode(code string, f func() (interface{}, error)) (interface{}, er return resp, err } -func normalizeRegion(region string) string { +func NormalizeRegion(region string) string { // Default to nyc3 if the bucket doesn't have a region: if region == "" { region = "nyc3" @@ -830,7 +832,7 @@ func expirationHash(v interface{}) int { if v, ok := m["expired_object_delete_marker"]; ok { buf.WriteString(fmt.Sprintf("%t-", v.(bool))) } - return SDKHashString(buf.String()) + return util.SDKHashString(buf.String()) } func validateS3BucketLifecycleTimestamp(v interface{}, k string) (ws []string, errors []error) { @@ -844,7 +846,7 @@ func validateS3BucketLifecycleTimestamp(v interface{}, k string) (ws []string, e return } -func isAWSErr(err error, code string, message string) bool { +func IsAWSErr(err error, code string, message string) bool { if err, ok := err.(awserr.Error); ok { return err.Code() == code && strings.Contains(err.Message(), message) } diff --git a/digitalocean/resource_digitalocean_spaces_bucket_object.go b/digitalocean/spaces/resource_spaces_bucket_object.go similarity index 97% rename from digitalocean/resource_digitalocean_spaces_bucket_object.go rename to digitalocean/spaces/resource_spaces_bucket_object.go index e23d3195f..460e833b8 100644 --- a/digitalocean/resource_digitalocean_spaces_bucket_object.go +++ b/digitalocean/spaces/resource_spaces_bucket_object.go @@ -1,4 +1,4 @@ -package digitalocean +package spaces import ( "bytes" @@ -13,13 +13,14 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/mitchellh/go-homedir" ) -func resourceDigitalOceanSpacesBucketObject() *schema.Resource { +func ResourceDigitalOceanSpacesBucketObject() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanSpacesBucketObjectCreate, ReadContext: resourceDigitalOceanSpacesBucketObjectRead, @@ -139,7 +140,7 @@ func resourceDigitalOceanSpacesBucketObject() *schema.Resource { func s3connFromResourceData(d *schema.ResourceData, meta interface{}) (*s3.S3, error) { region := d.Get("region").(string) - client, err := meta.(*CombinedConfig).spacesClient(region) + client, err := meta.(*config.CombinedConfig).SpacesClient(region) if err != nil { return nil, err } @@ -405,7 +406,7 @@ func deleteAllS3ObjectVersions(conn *s3.S3, bucketName, key string, force, ignor } err := deleteS3ObjectVersion(conn, bucketName, objectKey, objectVersionID, force) - if isAWSErr(err, "AccessDenied", "") && force { + if IsAWSErr(err, "AccessDenied", "") && force { // Remove any legal hold. resp, err := conn.HeadObject(&s3.HeadObjectInput{ Bucket: aws.String(bucketName), @@ -458,7 +459,7 @@ func deleteAllS3ObjectVersions(conn *s3.S3, bucketName, key string, force, ignor return !lastPage }) - if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") { + if IsAWSErr(err, s3.ErrCodeNoSuchBucket, "") { err = nil } @@ -498,7 +499,7 @@ func deleteAllS3ObjectVersions(conn *s3.S3, bucketName, key string, force, ignor return !lastPage }) - if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") { + if IsAWSErr(err, s3.ErrCodeNoSuchBucket, "") { err = nil } @@ -540,7 +541,7 @@ func deleteS3ObjectVersion(conn *s3.S3, b, k, v string, force bool) error { log.Printf("[WARN] Error deleting Spaces Bucket (%s) Object (%s) Version (%s): %s", b, k, v, err) } - if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") || isAWSErr(err, s3.ErrCodeNoSuchKey, "") { + if IsAWSErr(err, s3.ErrCodeNoSuchBucket, "") || IsAWSErr(err, s3.ErrCodeNoSuchKey, "") { return nil } diff --git a/digitalocean/resource_digitalocean_spaces_bucket_object_test.go b/digitalocean/spaces/resource_spaces_bucket_object_test.go similarity index 92% rename from digitalocean/resource_digitalocean_spaces_bucket_object_test.go rename to digitalocean/spaces/resource_spaces_bucket_object_test.go index ce27f0084..33b8d0589 100644 --- a/digitalocean/resource_digitalocean_spaces_bucket_object_test.go +++ b/digitalocean/spaces/resource_spaces_bucket_object_test.go @@ -1,4 +1,4 @@ -package digitalocean +package spaces_test import ( "encoding/base64" @@ -12,6 +12,8 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -26,8 +28,8 @@ func TestAccDigitalOceanSpacesBucketObject_noNameNoKey(t *testing.T) { keyError := regexp.MustCompile(`key must not be empty`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -49,8 +51,8 @@ func TestAccDigitalOceanSpacesBucketObject_empty(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -74,8 +76,8 @@ func TestAccDigitalOceanSpacesBucketObject_source(t *testing.T) { defer os.Remove(source) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -95,8 +97,8 @@ func TestAccDigitalOceanSpacesBucketObject_content(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -117,8 +119,8 @@ func TestAccDigitalOceanSpacesBucketObject_contentBase64(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -142,8 +144,8 @@ func TestAccDigitalOceanSpacesBucketObject_withContentCharacteristics(t *testing defer os.Remove(source) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -167,8 +169,8 @@ func TestAccDigitalOceanSpacesBucketObject_NonVersioned(t *testing.T) { resourceName := "digitalocean_spaces_bucket_object.object" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -194,8 +196,8 @@ func TestAccDigitalOceanSpacesBucketObject_updates(t *testing.T) { defer os.Remove(sourceInitial) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -238,8 +240,8 @@ func TestAccDigitalOceanSpacesBucketObject_updateSameFile(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -275,8 +277,8 @@ func TestAccDigitalOceanSpacesBucketObject_updatesWithVersioning(t *testing.T) { defer os.Remove(sourceInitial) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -306,8 +308,8 @@ func TestAccDigitalOceanSpacesBucketObject_acl(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -349,8 +351,8 @@ func TestAccDigitalOceanSpacesBucketObject_metadata(t *testing.T) { resourceName := "digitalocean_spaces_bucket_object.object" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketObjectDestroy, Steps: []resource.TestStep{ { @@ -385,8 +387,8 @@ func TestAccDigitalOceanSpacesBucketObject_metadata(t *testing.T) { func TestAccDigitalOceanSpacesBucketObject_RegionError(t *testing.T) { badRegion := "ny2" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -402,7 +404,7 @@ func TestAccDigitalOceanSpacesBucketObject_RegionError(t *testing.T) { } func testAccGetS3Conn() (*s3.S3, error) { - client, err := testAccProvider.Meta().(*CombinedConfig).spacesClient(testAccDigitalOceanSpacesBucketObject_TestRegion) + client, err := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).SpacesClient(testAccDigitalOceanSpacesBucketObject_TestRegion) if err != nil { return nil, err } diff --git a/digitalocean/resource_digitalocean_spaces_bucket_policy.go b/digitalocean/spaces/resource_spaces_bucket_policy.go similarity index 94% rename from digitalocean/resource_digitalocean_spaces_bucket_policy.go rename to digitalocean/spaces/resource_spaces_bucket_policy.go index 7e9aa3562..7ba8442f5 100644 --- a/digitalocean/resource_digitalocean_spaces_bucket_policy.go +++ b/digitalocean/spaces/resource_spaces_bucket_policy.go @@ -1,4 +1,4 @@ -package digitalocean +package spaces import ( "context" @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -16,7 +17,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanSpacesBucketPolicy() *schema.Resource { +func ResourceDigitalOceanSpacesBucketPolicy() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanBucketPolicyCreate, ReadContext: resourceDigitalOceanBucketPolicyRead, @@ -43,7 +44,7 @@ func resourceDigitalOceanSpacesBucketPolicy() *schema.Resource { Required: true, ValidateFunc: validation.StringIsJSON, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { - return compareSpacesBucketPolicy(old, new) + return CompareSpacesBucketPolicy(old, new) }, StateFunc: func(v interface{}) string { json, _ := structure.NormalizeJsonString(v) @@ -57,7 +58,7 @@ func resourceDigitalOceanSpacesBucketPolicy() *schema.Resource { func s3connFromSpacesBucketPolicyResourceData(d *schema.ResourceData, meta interface{}) (*s3.S3, error) { region := d.Get("region").(string) - client, err := meta.(*CombinedConfig).spacesClient(region) + client, err := meta.(*config.CombinedConfig).SpacesClient(region) if err != nil { return nil, err } diff --git a/digitalocean/resource_digitalocean_spaces_bucket_policy_test.go b/digitalocean/spaces/resource_spaces_bucket_policy_test.go similarity index 86% rename from digitalocean/resource_digitalocean_spaces_bucket_policy_test.go rename to digitalocean/spaces/resource_spaces_bucket_policy_test.go index 3ff93b274..41631d4cb 100644 --- a/digitalocean/resource_digitalocean_spaces_bucket_policy_test.go +++ b/digitalocean/spaces/resource_spaces_bucket_policy_test.go @@ -1,4 +1,4 @@ -package digitalocean +package spaces_test import ( "fmt" @@ -7,6 +7,9 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/spaces" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" @@ -23,8 +26,8 @@ func TestAccDigitalOceanBucketPolicy_basic(t *testing.T) { bucketPolicy := `{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":"s3:*","Resource":"*"}]}` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketPolicyDestroy, Steps: []resource.TestStep{ { @@ -45,8 +48,8 @@ func TestAccDigitalOceanBucketPolicy_update(t *testing.T) { updatedBucketPolicy := `{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":"s3:*","Resource":"*"},{"Effect":"Allow","Principal":"*","Action":"s3:GetObject","Resource":"*"}]}` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketPolicyDestroy, Steps: []resource.TestStep{ { @@ -74,8 +77,8 @@ func TestAccDigitalOceanBucketPolicy_invalidJson(t *testing.T) { expectError := regexp.MustCompile(`"policy" contains an invalid JSON`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketPolicyDestroy, Steps: []resource.TestStep{ { @@ -92,8 +95,8 @@ func TestAccDigitalOceanBucketPolicy_emptyPolicy(t *testing.T) { expectError := regexp.MustCompile(`policy must not be empty`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketPolicyDestroy, Steps: []resource.TestStep{ { @@ -108,8 +111,8 @@ func TestAccDigitalOceanBucketPolicy_unknownBucket(t *testing.T) { expectError := regexp.MustCompile(`bucket 'unknown' does not exist`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSpacesBucketPolicyDestroy, Steps: []resource.TestStep{ { @@ -121,7 +124,7 @@ func TestAccDigitalOceanBucketPolicy_unknownBucket(t *testing.T) { } func testAccGetS3PolicyConn() (*s3.S3, error) { - client, err := testAccProvider.Meta().(*CombinedConfig).spacesClient(testAccDigitalOceanSpacesBucketPolicy_TestRegion) + client, err := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).SpacesClient(testAccDigitalOceanSpacesBucketPolicy_TestRegion) if err != nil { return nil, err } @@ -156,7 +159,7 @@ func testAccCheckDigitalOceanSpacesBucketPolicy(n string, expectedPolicy string) } actualPolicy := aws.StringValue(response.Policy) - equivalent := compareSpacesBucketPolicy(expectedPolicy, actualPolicy) + equivalent := spaces.CompareSpacesBucketPolicy(expectedPolicy, actualPolicy) if !equivalent { return fmt.Errorf("Expected policy to be '%v', got '%v'", expectedPolicy, actualPolicy) } diff --git a/digitalocean/resource_digitalocean_spaces_bucket_test.go b/digitalocean/spaces/resource_spaces_bucket_test.go similarity index 92% rename from digitalocean/resource_digitalocean_spaces_bucket_test.go rename to digitalocean/spaces/resource_spaces_bucket_test.go index 82ccf83f7..b2faa3e0f 100644 --- a/digitalocean/resource_digitalocean_spaces_bucket_test.go +++ b/digitalocean/spaces/resource_spaces_bucket_test.go @@ -1,4 +1,4 @@ -package digitalocean +package spaces_test import ( "fmt" @@ -11,6 +11,8 @@ import ( "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/spaces" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -25,8 +27,8 @@ func TestAccDigitalOceanBucket_basic(t *testing.T) { expectBucketURN := fmt.Sprintf("do:space:%s", expectedBucketName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, /* IDRefreshName: "digitalocean_spaces_bucket.bucket", IDRefreshIgnore: []string{"force_destroy"}, @@ -52,8 +54,8 @@ func TestAccDigitalOceanBucket_region(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -73,8 +75,8 @@ func TestAccDigitalOceanBucket_UpdateAcl(t *testing.T) { postConfig := fmt.Sprintf(testAccDigitalOceanBucketConfigWithACLUpdate, ri) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -103,8 +105,8 @@ func TestAccDigitalOceanBucket_UpdateCors(t *testing.T) { postConfig := fmt.Sprintf(testAccDigitalOceanBucketConfigWithCORSUpdate, ri) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -140,8 +142,8 @@ func TestAccDigitalOceanBucket_WithCors(t *testing.T) { ri := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -169,8 +171,8 @@ func TestAccDigitalOceanBucket_WithMultipleCorsRules(t *testing.T) { ri := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -206,8 +208,8 @@ func TestAccDigitalOceanBucket_WithMultipleCorsRules(t *testing.T) { func TestAccDigitalOceanBucket_shouldFailNotFound(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -245,8 +247,8 @@ resource "digitalocean_spaces_bucket" "bucket" { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -303,8 +305,8 @@ func TestAccDigitalOceanSpacesBucket_LifecycleBasic(t *testing.T) { resourceName := "digitalocean_spaces_bucket.bucket" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -382,8 +384,8 @@ func TestAccDigitalOceanSpacesBucket_LifecycleExpireMarkerOnly(t *testing.T) { resourceName := "digitalocean_spaces_bucket.bucket" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -424,8 +426,8 @@ func TestAccDigitalOceanSpacesBucket_LifecycleExpireMarkerOnly(t *testing.T) { func TestAccDigitalOceanSpacesBucket_RegionError(t *testing.T) { badRegion := "ny2" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanBucketDestroy, Steps: []resource.TestStep{ { @@ -445,7 +447,7 @@ func testAccGetS3ConnForSpacesBucket(rs *terraform.ResourceState) (*s3.S3, error if actualRegion, ok := rs.Primary.Attributes["region"]; ok { rawRegion = actualRegion } - region := normalizeRegion(rawRegion) + region := spaces.NormalizeRegion(rawRegion) spacesAccessKeyId := os.Getenv("SPACES_ACCESS_KEY_ID") if spacesAccessKeyId == "" { @@ -473,7 +475,7 @@ func testAccGetS3ConnForSpacesBucket(rs *terraform.ResourceState) (*s3.S3, error } func testAccCheckDigitalOceanBucketDestroy(s *terraform.State) error { - return testAccCheckDigitalOceanBucketDestroyWithProvider(s, testAccProvider) + return testAccCheckDigitalOceanBucketDestroyWithProvider(s, acceptance.TestAccProvider) } func testAccCheckDigitalOceanBucketDestroyWithProvider(s *terraform.State, provider *schema.Provider) error { @@ -495,7 +497,7 @@ func testAccCheckDigitalOceanBucketDestroyWithProvider(s *terraform.State, provi Bucket: aws.String(rs.Primary.ID), }) if err != nil { - if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") { + if spaces.IsAWSErr(err, s3.ErrCodeNoSuchBucket, "") { return nil } return err @@ -505,7 +507,7 @@ func testAccCheckDigitalOceanBucketDestroyWithProvider(s *terraform.State, provi } func testAccCheckDigitalOceanBucketExists(n string) resource.TestCheckFunc { - return testAccCheckDigitalOceanBucketExistsWithProvider(n, func() *schema.Provider { return testAccProvider }) + return testAccCheckDigitalOceanBucketExistsWithProvider(n, func() *schema.Provider { return acceptance.TestAccProvider }) } func testAccCheckDigitalOceanBucketExistsWithProvider(n string, providerF func() *schema.Provider) resource.TestCheckFunc { @@ -529,7 +531,7 @@ func testAccCheckDigitalOceanBucketExistsWithProvider(n string, providerF func() }) if err != nil { - if isAWSErr(err, s3.ErrCodeNoSuchBucket, "") { + if spaces.IsAWSErr(err, s3.ErrCodeNoSuchBucket, "") { return fmt.Errorf("Spaces bucket not found") } return err diff --git a/digitalocean/spaces_buckets.go b/digitalocean/spaces/spaces_buckets.go similarity index 88% rename from digitalocean/spaces_buckets.go rename to digitalocean/spaces/spaces_buckets.go index a4bfd7843..4113b971f 100644 --- a/digitalocean/spaces_buckets.go +++ b/digitalocean/spaces/spaces_buckets.go @@ -1,9 +1,10 @@ -package digitalocean +package spaces import ( "fmt" "github.com/aws/aws-sdk-go/service/s3" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" awspolicy "github.com/hashicorp/awspolicyequivalence" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -44,7 +45,7 @@ func spacesBucketSchema() map[string]*schema.Schema { } func getSpacesBucketsInRegion(meta interface{}, region string) ([]*s3.Bucket, error) { - client, err := meta.(*CombinedConfig).spacesClient(region) + client, err := meta.(*config.CombinedConfig).SpacesClient(region) if err != nil { return nil, err } @@ -92,14 +93,14 @@ func flattenSpacesBucket(rawBucketMetadata, meta interface{}, extra map[string]i flattenedBucket := map[string]interface{}{} flattenedBucket["name"] = name flattenedBucket["region"] = region - flattenedBucket["bucket_domain_name"] = bucketDomainName(name, region) + flattenedBucket["bucket_domain_name"] = BucketDomainName(name, region) flattenedBucket["urn"] = fmt.Sprintf("do:space:%s", name) - flattenedBucket["endpoint"] = bucketEndpoint(region) + flattenedBucket["endpoint"] = BucketEndpoint(region) return flattenedBucket, nil } -func compareSpacesBucketPolicy(policy1, policy2 string) bool { +func CompareSpacesBucketPolicy(policy1, policy2 string) bool { equivalent, err := awspolicy.PoliciesAreEquivalent(policy1, policy2) if err != nil { return false diff --git a/digitalocean/datasource_digitalocean_ssh_key.go b/digitalocean/sshkey/datasource_ssh_key.go similarity index 87% rename from digitalocean/datasource_digitalocean_ssh_key.go rename to digitalocean/sshkey/datasource_ssh_key.go index 9c1e3998a..adfddca0b 100644 --- a/digitalocean/datasource_digitalocean_ssh_key.go +++ b/digitalocean/sshkey/datasource_ssh_key.go @@ -1,4 +1,4 @@ -package digitalocean +package sshkey import ( "context" @@ -6,11 +6,12 @@ import ( "strconv" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanSSHKey() *schema.Resource { +func DataSourceDigitalOceanSSHKey() *schema.Resource { recordSchema := sshKeySchema() for _, f := range recordSchema { @@ -42,7 +43,7 @@ func dataSourceDigitalOceanSSHKeyRead(ctx context.Context, d *schema.ResourceDat return diag.FromErr(err) } - if err := setResourceDataFromMap(d, flattenedKey); err != nil { + if err := util.SetResourceDataFromMap(d, flattenedKey); err != nil { return diag.FromErr(err) } diff --git a/digitalocean/datasource_digitalocean_ssh_key_test.go b/digitalocean/sshkey/datasource_ssh_key_test.go similarity index 84% rename from digitalocean/datasource_digitalocean_ssh_key_test.go rename to digitalocean/sshkey/datasource_ssh_key_test.go index 07ad46e43..467dcd9c7 100644 --- a/digitalocean/datasource_digitalocean_ssh_key_test.go +++ b/digitalocean/sshkey/datasource_ssh_key_test.go @@ -1,4 +1,4 @@ -package digitalocean +package sshkey_test import ( "context" @@ -10,6 +10,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "golang.org/x/crypto/ssh" @@ -17,7 +19,7 @@ import ( func TestAccDataSourceDigitalOceanSSHKey_Basic(t *testing.T) { var key godo.Key - keyName := randomTestName() + keyName := acceptance.RandomTestName() pubKey, err := testAccGenerateDataSourceDigitalOceanSSHKeyPublic() if err != nil { @@ -37,8 +39,8 @@ data "digitalocean_ssh_key" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -69,7 +71,7 @@ func testAccCheckDataSourceDigitalOceanSSHKeyExists(n string, key *godo.Key) res return fmt.Errorf("No ssh key ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() id, err := strconv.Atoi(rs.Primary.ID) if err != nil { diff --git a/digitalocean/datasource_digitalocean_ssh_keys.go b/digitalocean/sshkey/datasource_ssh_keys.go similarity index 84% rename from digitalocean/datasource_digitalocean_ssh_keys.go rename to digitalocean/sshkey/datasource_ssh_keys.go index 799781ff5..4a9d1d271 100644 --- a/digitalocean/datasource_digitalocean_ssh_keys.go +++ b/digitalocean/sshkey/datasource_ssh_keys.go @@ -1,11 +1,11 @@ -package digitalocean +package sshkey import ( "github.com/digitalocean/terraform-provider-digitalocean/internal/datalist" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanSSHKeys() *schema.Resource { +func DataSourceDigitalOceanSSHKeys() *schema.Resource { dataListConfig := &datalist.ResourceConfig{ RecordSchema: sshKeySchema(), ResultAttributeName: "ssh_keys", diff --git a/digitalocean/datasource_digitalocean_ssh_keys_test.go b/digitalocean/sshkey/datasource_ssh_keys_test.go similarity index 87% rename from digitalocean/datasource_digitalocean_ssh_keys_test.go rename to digitalocean/sshkey/datasource_ssh_keys_test.go index 6654bf1d1..c19efef4d 100644 --- a/digitalocean/datasource_digitalocean_ssh_keys_test.go +++ b/digitalocean/sshkey/datasource_ssh_keys_test.go @@ -1,9 +1,10 @@ -package digitalocean +package sshkey_test import ( "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -43,8 +44,8 @@ data "digitalocean_ssh_keys" "result" { } `) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourcesConfig, diff --git a/digitalocean/import_digitalocean_ssh_key_test.go b/digitalocean/sshkey/import_ssh_key_test.go similarity index 78% rename from digitalocean/import_digitalocean_ssh_key_test.go rename to digitalocean/sshkey/import_ssh_key_test.go index d33d70e61..728e04f42 100644 --- a/digitalocean/import_digitalocean_ssh_key_test.go +++ b/digitalocean/sshkey/import_ssh_key_test.go @@ -1,8 +1,9 @@ -package digitalocean +package sshkey_test import ( "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -16,8 +17,8 @@ func TestAccDigitalOceanSSHKey_importBasic(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSSHKeyDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_ssh_key.go b/digitalocean/sshkey/resource_ssh_key.go similarity index 90% rename from digitalocean/resource_digitalocean_ssh_key.go rename to digitalocean/sshkey/resource_ssh_key.go index 2c50fff53..647cfbade 100644 --- a/digitalocean/resource_digitalocean_ssh_key.go +++ b/digitalocean/sshkey/resource_ssh_key.go @@ -1,4 +1,4 @@ -package digitalocean +package sshkey import ( "context" @@ -7,12 +7,13 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanSSHKey() *schema.Resource { +func ResourceDigitalOceanSSHKey() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanSSHKeyCreate, ReadContext: resourceDigitalOceanSSHKeyRead, @@ -50,7 +51,7 @@ func resourceDigitalOceanSSHKeyPublicKeyDiffSuppress(k, old, new string, d *sche } func resourceDigitalOceanSSHKeyCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // Build up our creation options opts := &godo.KeyCreateRequest{ @@ -71,7 +72,7 @@ func resourceDigitalOceanSSHKeyCreate(ctx context.Context, d *schema.ResourceDat } func resourceDigitalOceanSSHKeyRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() id, err := strconv.Atoi(d.Id()) if err != nil { @@ -98,7 +99,7 @@ func resourceDigitalOceanSSHKeyRead(ctx context.Context, d *schema.ResourceData, } func resourceDigitalOceanSSHKeyUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() id, err := strconv.Atoi(d.Id()) if err != nil { @@ -123,7 +124,7 @@ func resourceDigitalOceanSSHKeyUpdate(ctx context.Context, d *schema.ResourceDat } func resourceDigitalOceanSSHKeyDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() id, err := strconv.Atoi(d.Id()) if err != nil { diff --git a/digitalocean/resource_digitalocean_ssh_key_test.go b/digitalocean/sshkey/resource_ssh_key_test.go similarity index 83% rename from digitalocean/resource_digitalocean_ssh_key_test.go rename to digitalocean/sshkey/resource_ssh_key_test.go index 9ceff5f2e..b94c45d1a 100644 --- a/digitalocean/resource_digitalocean_ssh_key_test.go +++ b/digitalocean/sshkey/resource_ssh_key_test.go @@ -1,4 +1,4 @@ -package digitalocean +package sshkey_test import ( "context" @@ -7,6 +7,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -21,8 +23,8 @@ func TestAccDigitalOceanSSHKey_Basic(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanSSHKeyDestroy, Steps: []resource.TestStep{ { @@ -40,7 +42,7 @@ func TestAccDigitalOceanSSHKey_Basic(t *testing.T) { } func testAccCheckDigitalOceanSSHKeyDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_ssh_key" { @@ -75,7 +77,7 @@ func testAccCheckDigitalOceanSSHKeyExists(n string, key *godo.Key) resource.Test return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() id, err := strconv.Atoi(rs.Primary.ID) if err != nil { diff --git a/digitalocean/ssh_keys.go b/digitalocean/sshkey/ssh_keys.go similarity index 91% rename from digitalocean/ssh_keys.go rename to digitalocean/sshkey/ssh_keys.go index c51be73b4..c0710e209 100644 --- a/digitalocean/ssh_keys.go +++ b/digitalocean/sshkey/ssh_keys.go @@ -1,10 +1,11 @@ -package digitalocean +package sshkey import ( "context" "fmt" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -30,7 +31,7 @@ func sshKeySchema() map[string]*schema.Schema { } func getDigitalOceanSshKeys(meta interface{}, extra map[string]interface{}) ([]interface{}, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() opts := &godo.ListOptions{ Page: 1, diff --git a/digitalocean/sweeper_test.go b/digitalocean/sweep/sweep.go similarity index 72% rename from digitalocean/sweeper_test.go rename to digitalocean/sweep/sweep.go index 7409c95d9..d65434ac4 100644 --- a/digitalocean/sweeper_test.go +++ b/digitalocean/sweep/sweep.go @@ -1,18 +1,15 @@ -package digitalocean +package sweep import ( "fmt" "os" - "testing" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" ) -func TestMain(m *testing.M) { - resource.TestMain(m) -} +const TestNamePrefix = "tf-acc-test-" -func sharedConfigForRegion(region string) (interface{}, error) { +func SharedConfigForRegion(region string) (interface{}, error) { if os.Getenv("DIGITALOCEAN_TOKEN") == "" { return nil, fmt.Errorf("empty DIGITALOCEAN_TOKEN") } @@ -27,14 +24,14 @@ func sharedConfigForRegion(region string) (interface{}, error) { spacesEndpoint = "https://{{.Region}}.digitaloceanspaces.com" } - config := Config{ + conf := config.Config{ Token: os.Getenv("DIGITALOCEAN_TOKEN"), APIEndpoint: apiEndpoint, SpacesAPIEndpoint: spacesEndpoint, } // configures a default client for the region, using the above env vars - client, err := config.Client() + client, err := conf.Client() if err != nil { return nil, fmt.Errorf("error getting DigitalOcean client") } diff --git a/digitalocean/sweep/sweep_test.go b/digitalocean/sweep/sweep_test.go new file mode 100644 index 000000000..60af1b37d --- /dev/null +++ b/digitalocean/sweep/sweep_test.go @@ -0,0 +1,23 @@ +package sweep_test + +import ( + "testing" + + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/app" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/certificate" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/database" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/domain" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/droplet" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/firewall" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/kubernetes" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/loadbalancer" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/reservedip" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/snapshot" + _ "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/volume" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func TestMain(m *testing.M) { + resource.TestMain(m) +} diff --git a/digitalocean/datasource_digitalocean_tag.go b/digitalocean/tag/datasource_tag.go similarity index 87% rename from digitalocean/datasource_digitalocean_tag.go rename to digitalocean/tag/datasource_tag.go index 6dc8acf11..ea266b2ad 100644 --- a/digitalocean/datasource_digitalocean_tag.go +++ b/digitalocean/tag/datasource_tag.go @@ -1,13 +1,14 @@ -package digitalocean +package tag import ( "context" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanTag() *schema.Resource { +func DataSourceDigitalOceanTag() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanTagRead, Schema: map[string]*schema.Schema{ @@ -16,7 +17,7 @@ func dataSourceDigitalOceanTag() *schema.Resource { Type: schema.TypeString, Required: true, Description: "name of the tag", - ValidateFunc: validateTag, + ValidateFunc: ValidateTag, }, "total_resource_count": { Type: schema.TypeInt, @@ -47,7 +48,7 @@ func dataSourceDigitalOceanTag() *schema.Resource { } func dataSourceDigitalOceanTagRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() name := d.Get("name").(string) diff --git a/digitalocean/datasource_digitalocean_tag_test.go b/digitalocean/tag/datasource_tag_test.go similarity index 82% rename from digitalocean/datasource_digitalocean_tag_test.go rename to digitalocean/tag/datasource_tag_test.go index 0ca0f2f97..a97914b29 100644 --- a/digitalocean/datasource_digitalocean_tag_test.go +++ b/digitalocean/tag/datasource_tag_test.go @@ -1,4 +1,4 @@ -package digitalocean +package tag_test import ( "context" @@ -6,13 +6,15 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceDigitalOceanTag_Basic(t *testing.T) { var tag godo.Tag - tagName := randomTestName() + tagName := acceptance.RandomTestName() resourceConfig := fmt.Sprintf(` resource "digitalocean_tag" "foo" { name = "%s" @@ -23,8 +25,8 @@ data "digitalocean_tag" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -65,7 +67,7 @@ func testAccCheckDataSourceDigitalOceanTagExists(n string, tag *godo.Tag) resour return fmt.Errorf("No tag ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundTag, _, err := client.Tags.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/datasource_digitalocean_tags.go b/digitalocean/tag/datasource_tags.go similarity index 91% rename from digitalocean/datasource_digitalocean_tags.go rename to digitalocean/tag/datasource_tags.go index dc56dde6d..1afd827be 100644 --- a/digitalocean/datasource_digitalocean_tags.go +++ b/digitalocean/tag/datasource_tags.go @@ -1,15 +1,16 @@ -package digitalocean +package tag import ( "context" "fmt" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/digitalocean/terraform-provider-digitalocean/internal/datalist" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func dataSourceDigitalOceanTags() *schema.Resource { +func DataSourceDigitalOceanTags() *schema.Resource { dataListConfig := &datalist.ResourceConfig{ RecordSchema: map[string]*schema.Schema{ "name": { @@ -43,7 +44,7 @@ func dataSourceDigitalOceanTags() *schema.Resource { } func getDigitalOceanTags(meta interface{}, extra map[string]interface{}) ([]interface{}, error) { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() tagsList := []interface{}{} diff --git a/digitalocean/datasource_digitalocean_tags_test.go b/digitalocean/tag/datasource_tags_test.go similarity index 85% rename from digitalocean/datasource_digitalocean_tags_test.go rename to digitalocean/tag/datasource_tags_test.go index d6817b8cb..d7e98a347 100644 --- a/digitalocean/datasource_digitalocean_tags_test.go +++ b/digitalocean/tag/datasource_tags_test.go @@ -1,16 +1,17 @@ -package digitalocean +package tag_test import ( "fmt" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDataSourceDigitalOceanTags_Basic(t *testing.T) { var tag godo.Tag - tagName := randomTestName() + tagName := acceptance.RandomTestName() resourceConfig := fmt.Sprintf(` resource "digitalocean_tag" "foo" { name = "%s" @@ -24,8 +25,8 @@ data "digitalocean_tags" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, diff --git a/digitalocean/import_digitalocean_tag_test.go b/digitalocean/tag/import_tag_test.go similarity index 69% rename from digitalocean/import_digitalocean_tag_test.go rename to digitalocean/tag/import_tag_test.go index 818130170..02c3cfa88 100644 --- a/digitalocean/import_digitalocean_tag_test.go +++ b/digitalocean/tag/import_tag_test.go @@ -1,8 +1,9 @@ -package digitalocean +package tag_test import ( "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -10,8 +11,8 @@ func TestAccDigitalOceanTag_importBasic(t *testing.T) { resourceName := "digitalocean_tag.foobar" resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanTagDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_tag.go b/digitalocean/tag/resource_tag.go similarity index 89% rename from digitalocean/resource_digitalocean_tag.go rename to digitalocean/tag/resource_tag.go index f64309471..610491595 100644 --- a/digitalocean/resource_digitalocean_tag.go +++ b/digitalocean/tag/resource_tag.go @@ -1,15 +1,16 @@ -package digitalocean +package tag import ( "context" "log" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func resourceDigitalOceanTag() *schema.Resource { +func ResourceDigitalOceanTag() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanTagCreate, ReadContext: resourceDigitalOceanTagRead, @@ -23,7 +24,7 @@ func resourceDigitalOceanTag() *schema.Resource { Type: schema.TypeString, Required: true, ForceNew: true, - ValidateFunc: validateTag, + ValidateFunc: ValidateTag, }, "total_resource_count": { Type: schema.TypeInt, @@ -54,7 +55,7 @@ func resourceDigitalOceanTag() *schema.Resource { } func resourceDigitalOceanTagCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() // Build up our creation options opts := &godo.TagCreateRequest{ @@ -74,7 +75,7 @@ func resourceDigitalOceanTagCreate(ctx context.Context, d *schema.ResourceData, } func resourceDigitalOceanTagRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() tag, resp, err := client.Tags.Get(context.Background(), d.Id()) if err != nil { @@ -100,7 +101,7 @@ func resourceDigitalOceanTagRead(ctx context.Context, d *schema.ResourceData, me } func resourceDigitalOceanTagDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting tag: %s", d.Id()) _, err := client.Tags.Delete(context.Background(), d.Id()) diff --git a/digitalocean/resource_digitalocean_tag_test.go b/digitalocean/tag/resource_tag_test.go similarity index 84% rename from digitalocean/resource_digitalocean_tag_test.go rename to digitalocean/tag/resource_tag_test.go index f82e46ed2..5cc5762be 100644 --- a/digitalocean/resource_digitalocean_tag_test.go +++ b/digitalocean/tag/resource_tag_test.go @@ -1,4 +1,4 @@ -package digitalocean +package tag_test import ( "context" @@ -6,6 +6,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -14,8 +16,8 @@ func TestAccDigitalOceanTag_Basic(t *testing.T) { var tag godo.Tag resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanTagDestroy, Steps: []resource.TestStep{ { @@ -44,7 +46,7 @@ func TestAccDigitalOceanTag_Basic(t *testing.T) { } func testAccCheckDigitalOceanTagDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_tag" { @@ -85,7 +87,7 @@ func testAccCheckDigitalOceanTagExists(n string, tag *godo.Tag) resource.TestChe return fmt.Errorf("No Record ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() // Try to find the tag foundTag, _, err := client.Tags.Get(context.Background(), rs.Primary.ID) diff --git a/digitalocean/tags.go b/digitalocean/tag/tags.go similarity index 72% rename from digitalocean/tags.go rename to digitalocean/tag/tags.go index f1a56ddf5..f20dd1640 100644 --- a/digitalocean/tags.go +++ b/digitalocean/tag/tags.go @@ -1,4 +1,4 @@ -package digitalocean +package tag import ( "context" @@ -7,24 +7,25 @@ import ( "regexp" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) var tagNameRe = regexp.MustCompile("^[a-zA-Z0-9:\\-_]{1,255}$") -func tagsSchema() *schema.Schema { +func TagsSchema() *schema.Schema { return &schema.Schema{ Type: schema.TypeSet, Optional: true, Elem: &schema.Schema{ Type: schema.TypeString, - ValidateFunc: validateTag, + ValidateFunc: ValidateTag, }, - Set: HashStringIgnoreCase, + Set: util.HashStringIgnoreCase, } } -func tagsDataSourceSchema() *schema.Schema { +func TagsDataSourceSchema() *schema.Schema { return &schema.Schema{ Type: schema.TypeSet, Computed: true, @@ -32,7 +33,7 @@ func tagsDataSourceSchema() *schema.Schema { } } -func validateTag(value interface{}, key string) ([]string, []error) { +func ValidateTag(value interface{}, key string) ([]string, []error) { if !tagNameRe.MatchString(value.(string)) { return nil, []error{fmt.Errorf("tags may contain lowercase letters, numbers, colons, dashes, and underscores; there is a limit of 255 characters per tag")} } @@ -40,11 +41,11 @@ func validateTag(value interface{}, key string) ([]string, []error) { return nil, nil } -// setTags is a helper to set the tags for a resource. It expects the +// SetTags is a helper to set the tags for a resource. It expects the // tags field to be named "tags" -func setTags(conn *godo.Client, d *schema.ResourceData, resourceType godo.ResourceType) error { +func SetTags(conn *godo.Client, d *schema.ResourceData, resourceType godo.ResourceType) error { oraw, nraw := d.GetChange("tags") - remove, create := diffTags(tagsFromSchema(oraw), tagsFromSchema(nraw)) + remove, create := DiffTags(TagsFromSchema(oraw), TagsFromSchema(nraw)) log.Printf("[DEBUG] Removing tags: %#v from %s", remove, d.Id()) for _, tag := range remove { @@ -87,9 +88,9 @@ func setTags(conn *godo.Client, d *schema.ResourceData, resourceType godo.Resour return nil } -// tagsFromSchema takes the raw schema tags and returns them as a +// TagsFromSchema takes the raw schema tags and returns them as a // properly asserted map[string]string -func tagsFromSchema(raw interface{}) map[string]string { +func TagsFromSchema(raw interface{}) map[string]string { result := make(map[string]string) for _, t := range raw.(*schema.Set).List() { result[t.(string)] = t.(string) @@ -98,9 +99,9 @@ func tagsFromSchema(raw interface{}) map[string]string { return result } -// diffTags takes the old and the new tag sets and returns the difference of +// DiffTags takes the old and the new tag sets and returns the difference of // both. The remaining tags are those that need to be removed and created -func diffTags(oldTags, newTags map[string]string) (map[string]string, map[string]string) { +func DiffTags(oldTags, newTags map[string]string) (map[string]string, map[string]string) { for k := range oldTags { _, ok := newTags[k] if ok { @@ -112,7 +113,7 @@ func diffTags(oldTags, newTags map[string]string) (map[string]string, map[string return oldTags, newTags } -func expandTags(tags []interface{}) []string { +func ExpandTags(tags []interface{}) []string { expandedTags := make([]string, len(tags)) for i, v := range tags { expandedTags[i] = v.(string) @@ -121,12 +122,12 @@ func expandTags(tags []interface{}) []string { return expandedTags } -func flattenTags(tags []string) *schema.Set { +func FlattenTags(tags []string) *schema.Set { if tags == nil { return nil } - flattenedTags := schema.NewSet(HashStringIgnoreCase, []interface{}{}) + flattenedTags := schema.NewSet(util.HashStringIgnoreCase, []interface{}{}) for _, v := range tags { if v != "" { flattenedTags.Add(v) diff --git a/digitalocean/tags_test.go b/digitalocean/tag/tags_test.go similarity index 78% rename from digitalocean/tags_test.go rename to digitalocean/tag/tags_test.go index 511e781ec..086952886 100644 --- a/digitalocean/tags_test.go +++ b/digitalocean/tag/tags_test.go @@ -1,9 +1,11 @@ -package digitalocean +package tag_test import ( "reflect" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) @@ -15,10 +17,10 @@ func TestDiffTags(t *testing.T) { }{ // Basic add/remove { - Old: schema.NewSet(HashStringIgnoreCase, []interface{}{ + Old: schema.NewSet(util.HashStringIgnoreCase, []interface{}{ "foo", }), - New: schema.NewSet(HashStringIgnoreCase, []interface{}{ + New: schema.NewSet(util.HashStringIgnoreCase, []interface{}{ "bar", }), Create: map[string]string{ @@ -31,10 +33,10 @@ func TestDiffTags(t *testing.T) { // Noop { - Old: schema.NewSet(HashStringIgnoreCase, []interface{}{ + Old: schema.NewSet(util.HashStringIgnoreCase, []interface{}{ "foo", }), - New: schema.NewSet(HashStringIgnoreCase, []interface{}{ + New: schema.NewSet(util.HashStringIgnoreCase, []interface{}{ "foo", }), Create: map[string]string{}, @@ -43,7 +45,7 @@ func TestDiffTags(t *testing.T) { } for i, tc := range cases { - r, c := diffTags(tagsFromSchema(tc.Old), tagsFromSchema(tc.New)) + r, c := tag.DiffTags(tag.TagsFromSchema(tc.Old), tag.TagsFromSchema(tc.New)) if !reflect.DeepEqual(r, tc.Remove) { t.Fatalf("%d: bad remove: %#v", i, r) } @@ -105,7 +107,7 @@ func TestAccDigitalOceanTag_NameValidation(t *testing.T) { } for _, tc := range cases { - _, errors := validateTag(tc.Input, tc.Input) + _, errors := tag.ValidateTag(tc.Input, tc.Input) hasError := len(errors) > 0 @@ -122,7 +124,7 @@ func TestAccDigitalOceanTag_NameValidation(t *testing.T) { func TestExpandTags(t *testing.T) { tags := []interface{}{"foo", "bar"} - expandedTags := expandTags(tags) + expandedTags := tag.ExpandTags(tags) if len(tags) != len(expandedTags) { t.Fatalf("incorrect expected length of expanded tags") @@ -131,7 +133,7 @@ func TestExpandTags(t *testing.T) { func TestFlattenTags(t *testing.T) { tags := []string{"foo", "bar"} - flattenedTags := flattenTags(tags) + flattenedTags := tag.FlattenTags(tags) if len(tags) != flattenedTags.Len() { t.Fatalf("incorrect expected length of flattened tags") diff --git a/digitalocean/resource_digitalocean_uptime_alert.go b/digitalocean/uptime/resource_uptime_alert.go similarity index 88% rename from digitalocean/resource_digitalocean_uptime_alert.go rename to digitalocean/uptime/resource_uptime_alert.go index 5f1e77382..c41e99173 100644 --- a/digitalocean/resource_digitalocean_uptime_alert.go +++ b/digitalocean/uptime/resource_uptime_alert.go @@ -1,16 +1,19 @@ -package digitalocean +package uptime import ( "context" "log" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/monitoring" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanUptimeAlert() *schema.Resource { +func ResourceDigitalOceanUptimeAlert() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanUptimeAlertCreate, ReadContext: resourceDigitalOceanUptimeAlertRead, @@ -88,14 +91,14 @@ func resourceDigitalOceanUptimeAlert() *schema.Resource { "channel": { Type: schema.TypeString, Required: true, - DiffSuppressFunc: CaseSensitive, + DiffSuppressFunc: util.CaseSensitive, Description: "The Slack channel to send alerts to", ValidateFunc: validation.StringIsNotEmpty, }, "url": { Type: schema.TypeString, Required: true, - DiffSuppressFunc: CaseSensitive, + DiffSuppressFunc: util.CaseSensitive, Description: "The webhook URL for Slack", ValidateFunc: validation.StringIsNotEmpty, }, @@ -118,7 +121,7 @@ func resourceDigitalOceanUptimeAlert() *schema.Resource { } func resourceDigitalOceanUptimeAlertCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() checkID := d.Get("check_id").(string) @@ -146,14 +149,14 @@ func resourceDigitalOceanUptimeAlertCreate(ctx context.Context, d *schema.Resour func expandNotifications(config []interface{}) *godo.Notifications { alertConfig := config[0].(map[string]interface{}) alerts := &godo.Notifications{ - Slack: expandSlack(alertConfig["slack"].([]interface{})), - Email: expandEmail(alertConfig["email"].([]interface{})), + Slack: monitoring.ExpandSlack(alertConfig["slack"].([]interface{})), + Email: monitoring.ExpandEmail(alertConfig["email"].([]interface{})), } return alerts } func resourceDigitalOceanUptimeAlertUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() checkID := d.Get("check_id").(string) @@ -186,7 +189,7 @@ func resourceDigitalOceanUptimeAlertUpdate(ctx context.Context, d *schema.Resour } func resourceDigitalOceanUptimeAlertDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() checkID := d.Get("check_id").(string) @@ -203,7 +206,7 @@ func resourceDigitalOceanUptimeAlertDelete(ctx context.Context, d *schema.Resour } func resourceDigitalOceanUptimeAlertRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() checkID := d.Get("check_id").(string) @@ -233,8 +236,8 @@ func resourceDigitalOceanUptimeAlertRead(ctx context.Context, d *schema.Resource func flattenNotifications(alerts *godo.Notifications) []interface{} { return []interface{}{ map[string]interface{}{ - "email": flattenEmail(alerts.Email), - "slack": flattenSlack(alerts.Slack), + "email": monitoring.FlattenEmail(alerts.Email), + "slack": monitoring.FlattenSlack(alerts.Slack), }, } } diff --git a/digitalocean/resource_digitalocean_uptime_alert_test.go b/digitalocean/uptime/resource_uptime_alert_test.go similarity index 88% rename from digitalocean/resource_digitalocean_uptime_alert_test.go rename to digitalocean/uptime/resource_uptime_alert_test.go index 629bc3950..aeacd7389 100644 --- a/digitalocean/resource_digitalocean_uptime_alert_test.go +++ b/digitalocean/uptime/resource_uptime_alert_test.go @@ -1,10 +1,12 @@ -package digitalocean +package uptime_test import ( "context" "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -32,7 +34,7 @@ resource "digitalocean_uptime_check" "test" { ` func TestAccDigitalOceanUptimeAlert_Basic(t *testing.T) { - originalAlertName := randomTestName() + originalAlertName := acceptance.RandomTestName() originalThreshold := "300" updateThreshold := "250" @@ -40,8 +42,8 @@ func TestAccDigitalOceanUptimeAlert_Basic(t *testing.T) { checkUpdateConfig := fmt.Sprintf(testAccCheckDigitalOceanUptimeAlertConfig_basic, originalAlertName, updateThreshold) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanUptimeAlertDestroy, Steps: []resource.TestStep{ { @@ -81,7 +83,7 @@ func TestAccDigitalOceanUptimeAlert_Basic(t *testing.T) { } func testAccCheckDigitalOceanUptimeAlertDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() var checkID string @@ -109,7 +111,7 @@ func testAccCheckDigitalOceanUptimeAlertDestroy(s *terraform.State) error { func testAccCheckDigitalOceanUptimeAlertExists(resource string) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[resource] @@ -141,7 +143,7 @@ func testAccCheckDigitalOceanUptimeAlertExists(resource string) resource.TestChe } func getCheckID(resource string, s *terraform.State) (error, string) { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[resource] diff --git a/digitalocean/resource_digitalocean_uptime_check.go b/digitalocean/uptime/resource_uptime_check.go similarity index 92% rename from digitalocean/resource_digitalocean_uptime_check.go rename to digitalocean/uptime/resource_uptime_check.go index c1602b1ca..3e80294c7 100644 --- a/digitalocean/resource_digitalocean_uptime_check.go +++ b/digitalocean/uptime/resource_uptime_check.go @@ -1,16 +1,17 @@ -package digitalocean +package uptime import ( "context" "log" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanUptimeCheck() *schema.Resource { +func ResourceDigitalOceanUptimeCheck() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanUptimeCheckCreate, ReadContext: resourceDigitalOceanUptimeCheckRead, @@ -66,7 +67,7 @@ func resourceDigitalOceanUptimeCheck() *schema.Resource { } func resourceDigitalOceanUptimeCheckCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() opts := &godo.CreateUptimeCheckRequest{ Name: d.Get("name").(string), @@ -105,7 +106,7 @@ func expandRegions(regions []interface{}) []string { } func resourceDigitalOceanUptimeCheckUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() id := d.Id() @@ -136,7 +137,7 @@ func resourceDigitalOceanUptimeCheckUpdate(ctx context.Context, d *schema.Resour } func resourceDigitalOceanUptimeCheckDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting uptime check: %s", d.Id()) @@ -151,7 +152,7 @@ func resourceDigitalOceanUptimeCheckDelete(ctx context.Context, d *schema.Resour } func resourceDigitalOceanUptimeCheckRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() check, resp, err := client.UptimeChecks.Get(context.Background(), d.Id()) if err != nil { diff --git a/digitalocean/resource_digitalocean_uptime_check_test.go b/digitalocean/uptime/resource_uptime_check_test.go similarity index 84% rename from digitalocean/resource_digitalocean_uptime_check_test.go rename to digitalocean/uptime/resource_uptime_check_test.go index ce4715f3f..d8476c349 100644 --- a/digitalocean/resource_digitalocean_uptime_check_test.go +++ b/digitalocean/uptime/resource_uptime_check_test.go @@ -1,10 +1,12 @@ -package digitalocean +package uptime_test import ( "context" "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) @@ -18,18 +20,18 @@ resource "digitalocean_uptime_check" "foobar" { ` func TestAccDigitalOceanUptimeCheck_Basic(t *testing.T) { - checkName := randomTestName() + checkName := acceptance.RandomTestName() checkTarget := "https://www.landingpage.com" checkRegions := "eu_west" checkCreateConfig := fmt.Sprintf(testAccCheckDigitalOceanUptimeCheckConfig_Basic, checkName, checkTarget, checkRegions) - updatedCheckName := randomTestName() + updatedCheckName := acceptance.RandomTestName() updatedCheckRegions := "us_east" checkUpdateConfig := fmt.Sprintf(testAccCheckDigitalOceanUptimeCheckConfig_Basic, updatedCheckName, checkTarget, updatedCheckRegions) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanUptimeCheckDestroy, Steps: []resource.TestStep{ { @@ -61,7 +63,7 @@ func TestAccDigitalOceanUptimeCheck_Basic(t *testing.T) { } func testAccCheckDigitalOceanUptimeCheckDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { @@ -80,7 +82,7 @@ func testAccCheckDigitalOceanUptimeCheckDestroy(s *terraform.State) error { func testAccCheckDigitalOceanUptimeCheckExists(resource string) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[resource] diff --git a/digitalocean/util.go b/digitalocean/util.go deleted file mode 100644 index 944223262..000000000 --- a/digitalocean/util.go +++ /dev/null @@ -1,9 +0,0 @@ -package digitalocean - -func boolPtr(val bool) *bool { - return &val -} - -func intPtr(val int) *int { - return &val -} diff --git a/digitalocean/util/errors.go b/digitalocean/util/errors.go new file mode 100644 index 000000000..a8b7603f6 --- /dev/null +++ b/digitalocean/util/errors.go @@ -0,0 +1,17 @@ +package util + +import ( + "strings" + + "github.com/digitalocean/godo" +) + +// IsDigitalOceanError detects if a given error is a *godo.ErrorResponse for +// the specified code and message. +func IsDigitalOceanError(err error, code int, message string) bool { + if err, ok := err.(*godo.ErrorResponse); ok { + return err.Response.StatusCode == code && + strings.Contains(strings.ToLower(err.Message), strings.ToLower(message)) + } + return false +} diff --git a/digitalocean/util/hash.go b/digitalocean/util/hash.go new file mode 100644 index 000000000..777137f21 --- /dev/null +++ b/digitalocean/util/hash.go @@ -0,0 +1,49 @@ +package util + +import ( + "crypto/sha1" + "encoding/hex" + "hash/crc32" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +// HashString produces a hash of a string. +func HashString(s string) string { + hash := sha1.Sum([]byte(s)) + return hex.EncodeToString(hash[:]) +} + +// HashStringIgnoreCase is a helper function for sets of strings that are case insensitive +func HashStringIgnoreCase(v interface{}) int { + return SDKHashString(strings.ToLower(v.(string))) +} + +// HashStringStateFunc implements a schema.SchemaStateFunc with HashString +func HashStringStateFunc() schema.SchemaStateFunc { + return func(v interface{}) string { + switch v.(type) { + case string: + return HashString(v.(string)) + default: + return "" + } + } +} + +// SDKHashString implements hashcode.String from the terraform-plugin-sdk which +// was made internal to the SDK in v2. Embed the implementation here to allow +// same hash function to continue to be used by the code in this provider that +// used it for hash computation. +func SDKHashString(s string) int { + v := int(crc32.ChecksumIEEE([]byte(s))) + if v >= 0 { + return v + } + if -v >= 0 { + return -v + } + // v == MinInt + return 0 +} diff --git a/digitalocean/schema.go b/digitalocean/util/schema.go similarity index 65% rename from digitalocean/schema.go rename to digitalocean/util/schema.go index 03c4b3f03..19e1f9d87 100644 --- a/digitalocean/schema.go +++ b/digitalocean/util/schema.go @@ -1,4 +1,4 @@ -package digitalocean +package util import ( "fmt" @@ -6,7 +6,8 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -func setResourceDataFromMap(d *schema.ResourceData, m map[string]interface{}) error { +// SetResourceDataFromMap sets a *schema.ResourceData from a map. +func SetResourceDataFromMap(d *schema.ResourceData, m map[string]interface{}) error { for key, value := range m { if err := d.Set(key, value); err != nil { return fmt.Errorf("Unable to set `%s` attribute: %s", key, err) diff --git a/digitalocean/set.go b/digitalocean/util/set.go similarity index 63% rename from digitalocean/set.go rename to digitalocean/util/set.go index 06b9ee97e..37806472b 100644 --- a/digitalocean/set.go +++ b/digitalocean/util/set.go @@ -1,22 +1,15 @@ -package digitalocean +package util import ( - "strings" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -// Helper function for sets of strings that are case insensitive -func HashStringIgnoreCase(v interface{}) int { - return SDKHashString(strings.ToLower(v.(string))) -} - -// getSetChanges compares two *schema.Set, "old" and "new." It returns one +// GetSetChanges compares two *schema.Set, "old" and "new." It returns one // *schema.Set only containing items not found in the "new" set and another // containing items not found in the "old" set. // // Originally written to update the resources in a project. -func getSetChanges(old *schema.Set, new *schema.Set) (remove *schema.Set, add *schema.Set) { +func GetSetChanges(old *schema.Set, new *schema.Set) (remove *schema.Set, add *schema.Set) { remove = schema.NewSet(old.F, []interface{}{}) for _, x := range old.List() { if !new.Contains(x) { diff --git a/digitalocean/set_test.go b/digitalocean/util/set_test.go similarity index 97% rename from digitalocean/set_test.go rename to digitalocean/util/set_test.go index 66270ee85..394fe3802 100644 --- a/digitalocean/set_test.go +++ b/digitalocean/util/set_test.go @@ -1,4 +1,4 @@ -package digitalocean +package util import ( "testing" @@ -110,7 +110,7 @@ func TestGetSetChanges(t *testing.T) { } for _, item := range tt { - remove, add := getSetChanges(item.old, item.new) + remove, add := GetSetChanges(item.old, item.new) if !remove.Equal(item.remove) || !add.Equal(item.add) { t.Errorf("expected add: %#v, remove: %#v; got add: %#v, remove: %#v", add, remove, item.add, item.remove) } diff --git a/digitalocean/suppress.go b/digitalocean/util/suppress.go similarity index 69% rename from digitalocean/suppress.go rename to digitalocean/util/suppress.go index 29259e39d..4cca626cb 100644 --- a/digitalocean/suppress.go +++ b/digitalocean/util/suppress.go @@ -1,4 +1,4 @@ -package digitalocean +package util import ( "strings" @@ -6,6 +6,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) +// CaseSensitive implements a schema.SchemaDiffSuppressFunc that ignores case func CaseSensitive(_, old, new string, _ *schema.ResourceData) bool { return strings.ToLower(old) == strings.ToLower(new) } diff --git a/digitalocean/suppress_test.go b/digitalocean/util/suppress_test.go similarity index 97% rename from digitalocean/suppress_test.go rename to digitalocean/util/suppress_test.go index 59f69cbbb..e11c71288 100644 --- a/digitalocean/suppress_test.go +++ b/digitalocean/util/suppress_test.go @@ -1,4 +1,4 @@ -package digitalocean +package util import "testing" diff --git a/digitalocean/util/wait.go b/digitalocean/util/wait.go new file mode 100644 index 000000000..7dd2c87e2 --- /dev/null +++ b/digitalocean/util/wait.go @@ -0,0 +1,45 @@ +package util + +import ( + "context" + "time" + + "github.com/digitalocean/godo" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +// WaitForAction waits for the action to finish using the resource.StateChangeConf. +func WaitForAction(client *godo.Client, action *godo.Action) error { + var ( + pending = "in-progress" + target = "completed" + refreshfn = func() (result interface{}, state string, err error) { + a, _, err := client.Actions.Get(context.Background(), action.ID) + if err != nil { + return nil, "", err + } + if a.Status == "errored" { + return a, "errored", nil + } + if a.CompletedAt != nil { + return a, target, nil + } + return a, pending, nil + } + ) + _, err := (&resource.StateChangeConf{ + Pending: []string{pending}, + Refresh: refreshfn, + Target: []string{target}, + + Delay: 10 * time.Second, + Timeout: 60 * time.Minute, + MinTimeout: 3 * time.Second, + + // This is a hack around DO API strangeness. + // https://github.com/hashicorp/terraform/issues/481 + // + NotFoundChecks: 60, + }).WaitForState() + return err +} diff --git a/digitalocean/datasource_digitalocean_volume.go b/digitalocean/volume/datasource_volume.go similarity index 91% rename from digitalocean/datasource_digitalocean_volume.go rename to digitalocean/volume/datasource_volume.go index 3191ae7bf..04a5edfd9 100644 --- a/digitalocean/datasource_digitalocean_volume.go +++ b/digitalocean/volume/datasource_volume.go @@ -1,4 +1,4 @@ -package digitalocean +package volume import ( "context" @@ -6,12 +6,14 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanVolume() *schema.Resource { +func DataSourceDigitalOceanVolume() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanVolumeRead, Schema: map[string]*schema.Schema{ @@ -64,13 +66,13 @@ func dataSourceDigitalOceanVolume() *schema.Resource { Computed: true, Description: "list of droplet ids the volume is attached to", }, - "tags": tagsDataSourceSchema(), + "tags": tag.TagsDataSourceSchema(), }, } } func dataSourceDigitalOceanVolumeRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() name := d.Get("name").(string) @@ -120,7 +122,7 @@ func dataSourceDigitalOceanVolumeRead(ctx context.Context, d *schema.ResourceDat d.Set("urn", volume.URN()) d.Set("region", volume.Region.Slug) d.Set("size", int(volume.SizeGigaBytes)) - d.Set("tags", flattenTags(volume.Tags)) + d.Set("tags", tag.FlattenTags(volume.Tags)) if v := volume.Description; v != "" { d.Set("description", v) diff --git a/digitalocean/datasource_digitalocean_volume_test.go b/digitalocean/volume/datasource_volume_test.go similarity index 86% rename from digitalocean/datasource_digitalocean_volume_test.go rename to digitalocean/volume/datasource_volume_test.go index 8f96350a4..3bdd635ba 100644 --- a/digitalocean/datasource_digitalocean_volume_test.go +++ b/digitalocean/volume/datasource_volume_test.go @@ -1,4 +1,4 @@ -package digitalocean +package volume_test import ( "context" @@ -7,13 +7,15 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDataSourceDigitalOceanVolume_Basic(t *testing.T) { var volume godo.Volume - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := testAccCheckDataSourceDigitalOceanVolumeConfig_basic(testName) dataSourceConfig := ` data "digitalocean_volume" "foobar" { @@ -23,8 +25,8 @@ data "digitalocean_volume" "foobar" { expectedURNRegEx, _ := regexp.Compile(`do:volume:[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -52,7 +54,7 @@ data "digitalocean_volume" "foobar" { func TestAccDataSourceDigitalOceanVolume_RegionScoped(t *testing.T) { var volume godo.Volume - testName := randomTestName() + testName := acceptance.RandomTestName() resourceConfig := testAccCheckDataSourceDigitalOceanVolumeConfig_region_scoped(testName) dataSourceConfig := ` data "digitalocean_volume" "foobar" { @@ -61,8 +63,8 @@ data "digitalocean_volume" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -99,7 +101,7 @@ func testAccCheckDataSourceDigitalOceanVolumeExists(n string, volume *godo.Volum return fmt.Errorf("No Volume ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() foundVolume, _, err := client.Storage.GetVolume(context.Background(), rs.Primary.ID) diff --git a/digitalocean/import_digitalocean_volume_test.go b/digitalocean/volume/import_volume_test.go similarity index 81% rename from digitalocean/import_digitalocean_volume_test.go rename to digitalocean/volume/import_volume_test.go index de5b09868..f9ac97345 100644 --- a/digitalocean/import_digitalocean_volume_test.go +++ b/digitalocean/volume/import_volume_test.go @@ -1,10 +1,11 @@ -package digitalocean +package volume_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) @@ -14,8 +15,8 @@ func TestAccDigitalOceanVolume_importBasic(t *testing.T) { volumeName := fmt.Sprintf("volume-%s", acctest.RandString(10)) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_volume.go b/digitalocean/volume/resource_volume.go similarity index 89% rename from digitalocean/resource_digitalocean_volume.go rename to digitalocean/volume/resource_volume.go index 388335322..bb8f8315d 100644 --- a/digitalocean/resource_digitalocean_volume.go +++ b/digitalocean/volume/resource_volume.go @@ -1,4 +1,4 @@ -package digitalocean +package volume import ( "context" @@ -7,12 +7,15 @@ import ( "strings" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/tag" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanVolume() *schema.Resource { +func ResourceDigitalOceanVolume() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanVolumeCreate, ReadContext: resourceDigitalOceanVolumeRead, @@ -104,7 +107,7 @@ func resourceDigitalOceanVolume() *schema.Resource { Computed: true, }, - "tags": tagsSchema(), + "tags": tag.TagsSchema(), }, CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, v interface{}) error { @@ -122,12 +125,12 @@ func resourceDigitalOceanVolume() *schema.Resource { } func resourceDigitalOceanVolumeCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() opts := &godo.VolumeCreateRequest{ Name: d.Get("name").(string), Description: d.Get("description").(string), - Tags: expandTags(d.Get("tags").(*schema.Set).List()), + Tags: tag.ExpandTags(d.Get("tags").(*schema.Set).List()), } if v, ok := d.GetOk("region"); ok { @@ -162,7 +165,7 @@ func resourceDigitalOceanVolumeCreate(ctx context.Context, d *schema.ResourceDat } func resourceDigitalOceanVolumeUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() id := d.Id() region := d.Get("region").(string) @@ -177,14 +180,14 @@ func resourceDigitalOceanVolumeUpdate(ctx context.Context, d *schema.ResourceDat } log.Printf("[DEBUG] Volume resize action id: %d", action.ID) - if err = waitForAction(client, action); err != nil { + if err = util.WaitForAction(client, action); err != nil { return diag.Errorf( "Error waiting for resize volume (%s) to finish: %s", id, err) } } if d.HasChange("tags") { - err := setTags(client, d, godo.VolumeResourceType) + err := tag.SetTags(client, d, godo.VolumeResourceType) if err != nil { return diag.Errorf("Error updating tags: %s", err) } @@ -194,7 +197,7 @@ func resourceDigitalOceanVolumeUpdate(ctx context.Context, d *schema.ResourceDat } func resourceDigitalOceanVolumeRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() volume, resp, err := client.Storage.GetVolume(context.Background(), d.Id()) if err != nil { @@ -212,7 +215,7 @@ func resourceDigitalOceanVolumeRead(ctx context.Context, d *schema.ResourceData, d.Set("region", volume.Region.Slug) d.Set("size", int(volume.SizeGigaBytes)) d.Set("urn", volume.URN()) - d.Set("tags", flattenTags(volume.Tags)) + d.Set("tags", tag.FlattenTags(volume.Tags)) if v := volume.Description; v != "" { d.Set("description", v) @@ -232,7 +235,7 @@ func resourceDigitalOceanVolumeRead(ctx context.Context, d *schema.ResourceData, } func resourceDigitalOceanVolumeDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() log.Printf("[INFO] Deleting volume: %s", d.Id()) _, err := client.Storage.DeleteVolume(context.Background(), d.Id()) diff --git a/digitalocean/resource_digitalocean_volume_attachment.go b/digitalocean/volume/resource_volume_attachment.go similarity index 86% rename from digitalocean/resource_digitalocean_volume_attachment.go rename to digitalocean/volume/resource_volume_attachment.go index 23f796952..f7aca0a6e 100644 --- a/digitalocean/resource_digitalocean_volume_attachment.go +++ b/digitalocean/volume/resource_volume_attachment.go @@ -1,4 +1,4 @@ -package digitalocean +package volume import ( "context" @@ -6,13 +6,15 @@ import ( "log" "time" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanVolumeAttachment() *schema.Resource { +func ResourceDigitalOceanVolumeAttachment() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanVolumeAttachmentCreate, ReadContext: resourceDigitalOceanVolumeAttachmentRead, @@ -37,7 +39,7 @@ func resourceDigitalOceanVolumeAttachment() *schema.Resource { } func resourceDigitalOceanVolumeAttachmentCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() dropletId := d.Get("droplet_id").(int) volumeId := d.Get("volume_id").(string) @@ -55,7 +57,7 @@ func resourceDigitalOceanVolumeAttachmentCreate(ctx context.Context, d *schema.R log.Printf("[DEBUG] Attaching Volume (%s) to Droplet (%d)", volumeId, dropletId) action, _, err := client.StorageActions.Attach(context.Background(), volumeId, dropletId) if err != nil { - if isDigitalOceanError(err, 422, "Droplet already has a pending event.") { + if util.IsDigitalOceanError(err, 422, "Droplet already has a pending event.") { log.Printf("[DEBUG] Received %s, retrying attaching volume to droplet", err) return resource.RetryableError(err) } @@ -65,7 +67,7 @@ func resourceDigitalOceanVolumeAttachmentCreate(ctx context.Context, d *schema.R } log.Printf("[DEBUG] Volume attach action id: %d", action.ID) - if err = waitForAction(client, action); err != nil { + if err = util.WaitForAction(client, action); err != nil { return resource.NonRetryableError( fmt.Errorf("[DEBUG] Error waiting for attach volume (%s) to Droplet (%d) to finish: %s", volumeId, dropletId, err)) } @@ -84,7 +86,7 @@ func resourceDigitalOceanVolumeAttachmentCreate(ctx context.Context, d *schema.R } func resourceDigitalOceanVolumeAttachmentRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() dropletId := d.Get("droplet_id").(int) volumeId := d.Get("volume_id").(string) @@ -110,7 +112,7 @@ func resourceDigitalOceanVolumeAttachmentRead(ctx context.Context, d *schema.Res } func resourceDigitalOceanVolumeAttachmentDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() dropletId := d.Get("droplet_id").(int) volumeId := d.Get("volume_id").(string) @@ -121,7 +123,7 @@ func resourceDigitalOceanVolumeAttachmentDelete(ctx context.Context, d *schema.R log.Printf("[DEBUG] Detaching Volume (%s) from Droplet (%d)", volumeId, dropletId) action, _, err := client.StorageActions.DetachByDropletID(context.Background(), volumeId, dropletId) if err != nil { - if isDigitalOceanError(err, 422, "Droplet already has a pending event.") { + if util.IsDigitalOceanError(err, 422, "Droplet already has a pending event.") { log.Printf("[DEBUG] Received %s, retrying detaching volume from droplet", err) return resource.RetryableError(err) } @@ -131,7 +133,7 @@ func resourceDigitalOceanVolumeAttachmentDelete(ctx context.Context, d *schema.R } log.Printf("[DEBUG] Volume detach action id: %d", action.ID) - if err = waitForAction(client, action); err != nil { + if err = util.WaitForAction(client, action); err != nil { return resource.NonRetryableError( fmt.Errorf("Error waiting for detach volume (%s) from Droplet (%d) to finish: %s", volumeId, dropletId, err)) } diff --git a/digitalocean/resource_digitalocean_volume_attachment_test.go b/digitalocean/volume/resource_volume_attachment_test.go similarity index 88% rename from digitalocean/resource_digitalocean_volume_attachment_test.go rename to digitalocean/volume/resource_volume_attachment_test.go index 5ab8d8677..f78e755ac 100644 --- a/digitalocean/resource_digitalocean_volume_attachment_test.go +++ b/digitalocean/volume/resource_volume_attachment_test.go @@ -1,4 +1,4 @@ -package digitalocean +package volume_test import ( "context" @@ -7,6 +7,8 @@ import ( "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" @@ -20,15 +22,15 @@ func TestAccDigitalOceanVolumeAttachment_Basic(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeAttachmentDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanVolumeAttachmentConfig_basic(rInt, volume.Name), Check: resource.ComposeTestCheckFunc( testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar", &volume), - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanVolumeAttachmentExists("digitalocean_volume_attachment.foobar"), resource.TestCheckResourceAttrSet( "digitalocean_volume_attachment.foobar", "id"), @@ -51,15 +53,15 @@ func TestAccDigitalOceanVolumeAttachment_Update(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeAttachmentDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanVolumeAttachmentConfig_basic(rInt, firstVolume.Name), Check: resource.ComposeTestCheckFunc( testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar", &firstVolume), - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanVolumeAttachmentExists("digitalocean_volume_attachment.foobar"), resource.TestCheckResourceAttrSet( "digitalocean_volume_attachment.foobar", "id"), @@ -73,7 +75,7 @@ func TestAccDigitalOceanVolumeAttachment_Update(t *testing.T) { Config: testAccCheckDigitalOceanVolumeAttachmentConfig_basic(rInt, secondVolume.Name), Check: resource.ComposeTestCheckFunc( testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar", &secondVolume), - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanVolumeAttachmentExists("digitalocean_volume_attachment.foobar"), resource.TestCheckResourceAttrSet( "digitalocean_volume_attachment.foobar", "id"), @@ -96,8 +98,8 @@ func TestAccDigitalOceanVolumeAttachment_UpdateToSecondVolume(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeAttachmentDestroy, Steps: []resource.TestStep{ { @@ -105,7 +107,7 @@ func TestAccDigitalOceanVolumeAttachment_UpdateToSecondVolume(t *testing.T) { Check: resource.ComposeTestCheckFunc( testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar", &firstVolume), testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar_second", &secondVolume), - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanVolumeAttachmentExists("digitalocean_volume_attachment.foobar"), resource.TestCheckResourceAttrSet( "digitalocean_volume_attachment.foobar", "id"), @@ -120,7 +122,7 @@ func TestAccDigitalOceanVolumeAttachment_UpdateToSecondVolume(t *testing.T) { Check: resource.ComposeTestCheckFunc( testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar", &firstVolume), testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar_second", &secondVolume), - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanVolumeAttachmentExists("digitalocean_volume_attachment.foobar"), resource.TestCheckResourceAttrSet( "digitalocean_volume_attachment.foobar", "id"), @@ -143,8 +145,8 @@ func TestAccDigitalOceanVolumeAttachment_Multiple(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeAttachmentDestroy, Steps: []resource.TestStep{ { @@ -152,7 +154,7 @@ func TestAccDigitalOceanVolumeAttachment_Multiple(t *testing.T) { Check: resource.ComposeTestCheckFunc( testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar", &firstVolume), testAccCheckDigitalOceanVolumeExists("digitalocean_volume.barfoo", &secondVolume), - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), testAccCheckDigitalOceanVolumeAttachmentExists("digitalocean_volume_attachment.foobar"), testAccCheckDigitalOceanVolumeAttachmentExists("digitalocean_volume_attachment.barfoo"), resource.TestCheckResourceAttrSet( @@ -183,7 +185,7 @@ func testAccCheckDigitalOceanVolumeAttachmentExists(rn string) resource.TestChec return fmt.Errorf("no volume ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() volumeId := rs.Primary.Attributes["volume_id"] dropletId, err := strconv.Atoi(rs.Primary.Attributes["droplet_id"]) diff --git a/digitalocean/resource_digitalocean_volume_test.go b/digitalocean/volume/resource_volume_test.go similarity index 82% rename from digitalocean/resource_digitalocean_volume_test.go rename to digitalocean/volume/resource_volume_test.go index a43199fd3..2ff533791 100644 --- a/digitalocean/resource_digitalocean_volume_test.go +++ b/digitalocean/volume/resource_volume_test.go @@ -1,71 +1,19 @@ -package digitalocean +package volume_test import ( "context" "fmt" - "log" "regexp" - "strings" "testing" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) -func init() { - resource.AddTestSweepers("digitalocean_volume", &resource.Sweeper{ - Name: "digitalocean_volume", - F: testSweepVolumes, - Dependencies: []string{"digitalocean_droplet"}, - }) -} - -func testSweepVolumes(region string) error { - meta, err := sharedConfigForRegion(region) - if err != nil { - return err - } - - client := meta.(*CombinedConfig).godoClient() - - opt := &godo.ListVolumeParams{ - ListOptions: &godo.ListOptions{PerPage: 200}, - } - volumes, _, err := client.Storage.ListVolumes(context.Background(), opt) - if err != nil { - return err - } - - for _, v := range volumes { - if strings.HasPrefix(v.Name, "volume-") || strings.HasPrefix(v.Name, "tf-acc-test-") { - - if len(v.DropletIDs) > 0 { - log.Printf("Detaching volume %v from Droplet %v", v.ID, v.DropletIDs[0]) - - action, _, err := client.StorageActions.DetachByDropletID(context.Background(), v.ID, v.DropletIDs[0]) - if err != nil { - return fmt.Errorf("Error resizing volume (%s): %s", v.ID, err) - } - - if err = waitForAction(client, action); err != nil { - return fmt.Errorf( - "Error waiting for volume (%s): %s", v.ID, err) - } - } - - log.Printf("Destroying Volume %s", v.Name) - - if _, err := client.Storage.DeleteVolume(context.Background(), v.ID); err != nil { - return err - } - } - } - - return nil -} - func TestAccDigitalOceanVolume_Basic(t *testing.T) { name := fmt.Sprintf("volume-%s", acctest.RandString(10)) @@ -76,8 +24,8 @@ func TestAccDigitalOceanVolume_Basic(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeDestroy, Steps: []resource.TestStep{ { @@ -120,7 +68,7 @@ func testAccCheckDigitalOceanVolumeExists(rn string, volume *godo.Volume) resour return fmt.Errorf("no volume ID is set") } - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() got, _, err := client.Storage.GetVolume(context.Background(), rs.Primary.ID) if err != nil { @@ -136,7 +84,7 @@ func testAccCheckDigitalOceanVolumeExists(rn string, volume *godo.Volume) resour } func testAccCheckDigitalOceanVolumeDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { if rs.Type != "digitalocean_volume" { @@ -162,15 +110,15 @@ func TestAccDigitalOceanVolume_Droplet(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanVolumeConfig_droplet(rInt, volume.Name), Check: resource.ComposeTestCheckFunc( testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar", &volume), - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), // the droplet should see an attached volume resource.TestCheckResourceAttr( "digitalocean_droplet.foobar", "volume_ids.#", "1"), @@ -208,8 +156,8 @@ func TestAccDigitalOceanVolume_LegacyFilesystemType(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeDestroy, Steps: []resource.TestStep{ { @@ -249,8 +197,8 @@ func TestAccDigitalOceanVolume_FilesystemType(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeDestroy, Steps: []resource.TestStep{ { @@ -297,15 +245,15 @@ func TestAccDigitalOceanVolume_Resize(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeDestroy, Steps: []resource.TestStep{ { Config: testAccCheckDigitalOceanVolumeConfig_resize(rInt, volume.Name, 20), Check: resource.ComposeTestCheckFunc( testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar", &volume), - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), // the droplet should see an attached volume resource.TestCheckResourceAttr("digitalocean_droplet.foobar", "volume_ids.#", "1"), resource.TestCheckResourceAttr("digitalocean_volume.foobar", "size", "20"), @@ -315,7 +263,7 @@ func TestAccDigitalOceanVolume_Resize(t *testing.T) { Config: testAccCheckDigitalOceanVolumeConfig_resize(rInt, volume.Name, 50), Check: resource.ComposeTestCheckFunc( testAccCheckDigitalOceanVolumeExists("digitalocean_volume.foobar", &volume), - testAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), + acceptance.TestAccCheckDigitalOceanDropletExists("digitalocean_droplet.foobar", &droplet), // the droplet should see an attached volume resource.TestCheckResourceAttr("digitalocean_droplet.foobar", "volume_ids.#", "1"), resource.TestCheckResourceAttr("digitalocean_volume.foobar", "size", "50"), @@ -353,8 +301,8 @@ func TestAccDigitalOceanVolume_CreateFromSnapshot(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeDestroy, Steps: []resource.TestStep{ { @@ -400,8 +348,8 @@ func TestAccDigitalOceanVolume_UpdateTags(t *testing.T) { } resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVolumeDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/volume/sweep.go b/digitalocean/volume/sweep.go new file mode 100644 index 000000000..16d6191ea --- /dev/null +++ b/digitalocean/volume/sweep.go @@ -0,0 +1,66 @@ +package volume + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/sweep" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/util" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("digitalocean_volume", &resource.Sweeper{ + Name: "digitalocean_volume", + F: testSweepVolumes, + Dependencies: []string{"digitalocean_droplet"}, + }) +} + +func testSweepVolumes(region string) error { + meta, err := sweep.SharedConfigForRegion(region) + if err != nil { + return err + } + + client := meta.(*config.CombinedConfig).GodoClient() + + opt := &godo.ListVolumeParams{ + ListOptions: &godo.ListOptions{PerPage: 200}, + } + volumes, _, err := client.Storage.ListVolumes(context.Background(), opt) + if err != nil { + return err + } + + for _, v := range volumes { + if strings.HasPrefix(v.Name, "volume-") || strings.HasPrefix(v.Name, "tf-acc-test-") { + + if len(v.DropletIDs) > 0 { + log.Printf("Detaching volume %v from Droplet %v", v.ID, v.DropletIDs[0]) + + action, _, err := client.StorageActions.DetachByDropletID(context.Background(), v.ID, v.DropletIDs[0]) + if err != nil { + return fmt.Errorf("Error resizing volume (%s): %s", v.ID, err) + } + + if err = util.WaitForAction(client, action); err != nil { + return fmt.Errorf( + "Error waiting for volume (%s): %s", v.ID, err) + } + } + + log.Printf("Destroying Volume %s", v.Name) + + if _, err := client.Storage.DeleteVolume(context.Background(), v.ID); err != nil { + return err + } + } + } + + return nil +} diff --git a/digitalocean/datasource_digitalocean_vpc.go b/digitalocean/vpc/datasource_vpc.go similarity index 95% rename from digitalocean/datasource_digitalocean_vpc.go rename to digitalocean/vpc/datasource_vpc.go index 96b2d2b2e..b56c2e6fa 100644 --- a/digitalocean/datasource_digitalocean_vpc.go +++ b/digitalocean/vpc/datasource_vpc.go @@ -1,16 +1,17 @@ -package digitalocean +package vpc import ( "context" "fmt" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func dataSourceDigitalOceanVPC() *schema.Resource { +func DataSourceDigitalOceanVPC() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceDigitalOceanVPCRead, Schema: map[string]*schema.Schema{ @@ -60,7 +61,7 @@ func dataSourceDigitalOceanVPC() *schema.Resource { } func dataSourceDigitalOceanVPCRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() var foundVPC *godo.VPC if id, ok := d.GetOk("id"); ok { diff --git a/digitalocean/datasource_digitalocean_vpc_test.go b/digitalocean/vpc/datasource_vpc_test.go similarity index 84% rename from digitalocean/datasource_digitalocean_vpc_test.go rename to digitalocean/vpc/datasource_vpc_test.go index 45e41c77c..fb4fa71c2 100644 --- a/digitalocean/datasource_digitalocean_vpc_test.go +++ b/digitalocean/vpc/datasource_vpc_test.go @@ -1,15 +1,16 @@ -package digitalocean +package vpc_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDataSourceDigitalOceanVPC_ByName(t *testing.T) { - vpcName := randomTestName() + vpcName := acceptance.RandomTestName() vpcDesc := "A description for the VPC" resourceConfig := fmt.Sprintf(testAccCheckDataSourceDigitalOceanVPCConfig_Basic, vpcName, vpcDesc) dataSourceConfig := ` @@ -18,8 +19,8 @@ data "digitalocean_vpc" "foobar" { }` resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: resourceConfig, @@ -47,12 +48,12 @@ data "digitalocean_vpc" "foobar" { } func TestAccDataSourceDigitalOceanVPC_RegionDefault(t *testing.T) { - vpcDropletName := randomTestName() + vpcDropletName := acceptance.RandomTestName() vpcConfigRegionDefault := fmt.Sprintf(testAccCheckDataSourceDigitalOceanVPCConfig_RegionDefault, vpcDropletName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: vpcConfigRegionDefault, @@ -71,12 +72,12 @@ func TestAccDataSourceDigitalOceanVPC_RegionDefault(t *testing.T) { } func TestAccDataSourceDigitalOceanVPC_ExpectErrors(t *testing.T) { - vpcName := randomTestName() + vpcName := acceptance.RandomTestName() vpcNotExist := fmt.Sprintf(testAccCheckDataSourceDigitalOceanVPCConfig_DoesNotExist, vpcName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, Steps: []resource.TestStep{ { Config: testAccCheckDataSourceDigitalOceanVPCConfig_MissingRegionDefault, diff --git a/digitalocean/import_digitalocean_vpc_test.go b/digitalocean/vpc/import_vpc_test.go similarity index 78% rename from digitalocean/import_digitalocean_vpc_test.go rename to digitalocean/vpc/import_vpc_test.go index 21a679963..720e526c2 100644 --- a/digitalocean/import_digitalocean_vpc_test.go +++ b/digitalocean/vpc/import_vpc_test.go @@ -1,21 +1,22 @@ -package digitalocean +package vpc_test import ( "fmt" "regexp" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) func TestAccDigitalOceanVPC_importBasic(t *testing.T) { resourceName := "digitalocean_vpc.foobar" - vpcName := randomTestName() + vpcName := acceptance.RandomTestName() vpcCreateConfig := fmt.Sprintf(testAccCheckDigitalOceanVPCConfig_Basic, vpcName, "A description for the VPC") resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVPCDestroy, Steps: []resource.TestStep{ { diff --git a/digitalocean/resource_digitalocean_vpc.go b/digitalocean/vpc/resource_vpc.go similarity index 91% rename from digitalocean/resource_digitalocean_vpc.go rename to digitalocean/vpc/resource_vpc.go index af6c426f0..435263b2a 100644 --- a/digitalocean/resource_digitalocean_vpc.go +++ b/digitalocean/vpc/resource_vpc.go @@ -1,4 +1,4 @@ -package digitalocean +package vpc import ( "context" @@ -7,13 +7,17 @@ import ( "time" "github.com/digitalocean/godo" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" + "github.com/digitalocean/terraform-provider-digitalocean/internal/mutexkv" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -func resourceDigitalOceanVPC() *schema.Resource { +var mutexKV = mutexkv.NewMutexKV() + +func ResourceDigitalOceanVPC() *schema.Resource { return &schema.Resource{ CreateContext: resourceDigitalOceanVPCCreate, ReadContext: resourceDigitalOceanVPCRead, @@ -77,7 +81,7 @@ func resourceDigitalOceanVPC() *schema.Resource { } func resourceDigitalOceanVPCCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() region := d.Get("region").(string) vpcRequest := &godo.VPCCreateRequest{ @@ -112,7 +116,7 @@ func resourceDigitalOceanVPCCreate(ctx context.Context, d *schema.ResourceData, } func resourceDigitalOceanVPCRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() vpc, resp, err := client.VPCs.Get(context.Background(), d.Id()) @@ -138,7 +142,7 @@ func resourceDigitalOceanVPCRead(ctx context.Context, d *schema.ResourceData, me } func resourceDigitalOceanVPCUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() if d.HasChanges("name", "description") { vpcUpdateRequest := &godo.VPCUpdateRequest{ @@ -158,7 +162,7 @@ func resourceDigitalOceanVPCUpdate(ctx context.Context, d *schema.ResourceData, } func resourceDigitalOceanVPCDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - client := meta.(*CombinedConfig).godoClient() + client := meta.(*config.CombinedConfig).GodoClient() vpcID := d.Id() err := resource.RetryContext(ctx, d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { diff --git a/digitalocean/resource_digitalocean_vpc_test.go b/digitalocean/vpc/resource_vpc_test.go similarity index 84% rename from digitalocean/resource_digitalocean_vpc_test.go rename to digitalocean/vpc/resource_vpc_test.go index 9d3775b73..60b2a4d4a 100644 --- a/digitalocean/resource_digitalocean_vpc_test.go +++ b/digitalocean/vpc/resource_vpc_test.go @@ -1,26 +1,28 @@ -package digitalocean +package vpc_test import ( "context" "fmt" "testing" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/acceptance" + "github.com/digitalocean/terraform-provider-digitalocean/digitalocean/config" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" ) func TestAccDigitalOceanVPC_Basic(t *testing.T) { - vpcName := randomTestName() + vpcName := acceptance.RandomTestName() vpcDesc := "A description for the VPC" vpcCreateConfig := fmt.Sprintf(testAccCheckDigitalOceanVPCConfig_Basic, vpcName, vpcDesc) - updatedVPCName := randomTestName() + updatedVPCName := acceptance.RandomTestName() updatedVPVDesc := "A brand new updated description for the VPC" vpcUpdateConfig := fmt.Sprintf(testAccCheckDigitalOceanVPCConfig_Basic, updatedVPCName, updatedVPVDesc) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVPCDestroy, Steps: []resource.TestStep{ { @@ -58,12 +60,12 @@ func TestAccDigitalOceanVPC_Basic(t *testing.T) { } func TestAccDigitalOceanVPC_IPRange(t *testing.T) { - vpcName := randomTestName() + vpcName := acceptance.RandomTestName() vpcCreateConfig := fmt.Sprintf(testAccCheckDigitalOceanVPCConfig_IPRange, vpcName) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVPCDestroy, Steps: []resource.TestStep{ { @@ -84,13 +86,13 @@ func TestAccDigitalOceanVPC_IPRange(t *testing.T) { // https://github.com/digitalocean/terraform-provider-digitalocean/issues/551 func TestAccDigitalOceanVPC_IPRangeRace(t *testing.T) { - vpcNameOne := randomTestName() - vpcNameTwo := randomTestName() + vpcNameOne := acceptance.RandomTestName() + vpcNameTwo := acceptance.RandomTestName() vpcCreateConfig := fmt.Sprintf(testAccCheckDigitalOceanVPCConfig_IPRangeRace, vpcNameOne, vpcNameTwo) resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProviderFactories: testAccProviderFactories, + PreCheck: func() { acceptance.TestAccPreCheck(t) }, + ProviderFactories: acceptance.TestAccProviderFactories, CheckDestroy: testAccCheckDigitalOceanVPCDestroy, Steps: []resource.TestStep{ { @@ -113,7 +115,7 @@ func TestAccDigitalOceanVPC_IPRangeRace(t *testing.T) { } func testAccCheckDigitalOceanVPCDestroy(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() for _, rs := range s.RootModule().Resources { @@ -132,7 +134,7 @@ func testAccCheckDigitalOceanVPCDestroy(s *terraform.State) error { func testAccCheckDigitalOceanVPCExists(resource string) resource.TestCheckFunc { return func(s *terraform.State) error { - client := testAccProvider.Meta().(*CombinedConfig).godoClient() + client := acceptance.TestAccProvider.Meta().(*config.CombinedConfig).GodoClient() rs, ok := s.RootModule().Resources[resource]