kislerdm / terraform-provider-neon

Terraform provider to manage Neon SaaS resources
https://registry.terraform.io/providers/kislerdm/neon/latest/docs
Mozilla Public License 2.0
34 stars 13 forks source link

neon_project resource creates default branch, role and database #69

Closed ivica3730k closed 8 months ago

ivica3730k commented 8 months ago

Terraform Version

Run terraform -v to show the version. 1.5.7

Provider Version

Please specify the provider version. 0.3.2

Hi! I have a problem where I want to use Terraform to provision my database in the free tier. Hence I want my branch to be called "main", but then my Terraform fails because neon_project already creates branch "main" so I can create it using the neon_branch resource to use other resources in the provider.

This is my terraform code

resource "neon_project" "neon-tech-database-project" {
  name = "${var.PROJECT_COMMON_NAME}-database-${var.ENVIRONMENT}"
}

resource "neon_branch" "neon-tech-database-main-branch" {
  name       = "main"
  project_id = neon_project.neon-tech-database-project.id
}

resource "neon_role" "neon-tech-database-authentication-role" {
  project_id = neon_project.neon-tech-database-project.id
  branch_id  = neon_branch.neon-tech-database-main-branch.id
  name       = "databaseuser"
}

resource "neon_database" "neon-tech-database" {
  project_id = neon_project.neon-tech-database-project.id
  branch_id  = neon_branch.neon-tech-database-main-branch.id
  name       = "${var.PROJECT_COMMON_NAME}-database-${var.ENVIRONMENT}"
  owner_name = neon_role.neon-tech-database-authentication-role.name
}

and this is my errored output

Acquiring state lock. This may take a few moments...

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # neon_branch.neon-tech-database-main-branch will be created
  + resource "neon_branch" "neon-tech-database-main-branch" {
      + id               = (known after apply)
      + logical_size     = (known after apply)
      + name             = "main"
      + parent_id        = (known after apply)
      + parent_lsn       = (known after apply)
      + parent_timestamp = (known after apply)
      + project_id       = (known after apply)
    }

  # neon_database.neon-tech-database will be created
  + resource "neon_database" "neon-tech-database" {
      + branch_id  = (known after apply)
      + id         = (known after apply)
      + name       = "icecloud-database-prod"
      + owner_name = "databaseuser"
      + project_id = (known after apply)
    }

  # neon_project.neon-tech-database-project will be created
  + resource "neon_project" "neon-tech-database-project" {
      + allowed_ips_primary_branch_only = false
      + compute_provisioner             = (known after apply)
      + connection_uri                  = (sensitive value)
      + database_host                   = (known after apply)
      + database_name                   = (known after apply)
      + database_password               = (sensitive value)
      + database_user                   = (known after apply)
      + default_branch_id               = (known after apply)
      + history_retention_seconds       = 604800
      + id                              = (known after apply)
      + name                            = "icecloud-database-prod"
      + pg_version                      = (known after apply)
      + region_id                       = (known after apply)
      + store_password                  = true
    }

  # neon_role.neon-tech-database-authentication-role will be created
  + resource "neon_role" "neon-tech-database-authentication-role" {
      + branch_id  = (known after apply)
      + id         = (known after apply)
      + name       = "databaseuser"
      + password   = (sensitive value)
      + project_id = (known after apply)
      + protected  = (known after apply)
    }

Plan: 4 to add, 0 to change, 0 to destroy.
neon_project.neon-tech-database-project: Creating...
neon_project.neon-tech-database-project: Creation complete after 1s [id=proud-lab-54806707]
neon_branch.neon-tech-database-main-branch: Creating...
neon_branch.neon-tech-database-main-branch: Still creating... [10s elapsed]

Error: [HTTP Code: 409][Error Code: ] branch with the provided name "main" already exists

  with neon_branch.neon-tech-database-main-branch,
  on database.tf line 5, in resource "neon_branch" "neon-tech-database-main-branch":
   5: resource "neon_branch" "neon-tech-database-main-branch" {

Releasing state lock. This may take a few moments...

Perhaps the branch_id parameter on neon_role and neon_database could be an optional parameter, and if not provided, the main branch is used?

Thank you!

Ivica

ivica3730k commented 8 months ago

Ahh I think I've missed this one

https://registry.terraform.io/providers/kislerdm/neon/latest/docs/guides/e2e-example

default_branch_id

ivica3730k commented 8 months ago

In case anyone stumbles upon this

resource "neon_project" "neon-tech-database-project" {
  name       = "${var.PROJECT_COMMON_NAME}-database-project"
  pg_version = 16
}

resource "neon_database" "neon-tech-database" {
  project_id = neon_project.neon-tech-database-project.id
  branch_id  = neon_project.neon-tech-database-project.default_branch_id
  name       = "${var.PROJECT_COMMON_NAME}-database-${var.ENVIRONMENT}"
  owner_name = neon_project.neon-tech-database-project.database_user
}

this is how you make another database in the project