pulumi / pulumi-confluentcloud

A Confluent Pulumi resource package, providing multi-language access to Confluent
Apache License 2.0
8 stars 3 forks source link

KafkaCluster permadiff #481

Closed VenelinMartinov closed 4 months ago

VenelinMartinov commented 4 months ago

What happened?

Permadiff with the basic parameter of KafkaCluster

Example

import pulumi

import pulumi_confluentcloud as confluent

SANDBOX_ENV_NAME = "sandbox"

sandbox_env = confluent.Environment(SANDBOX_ENV_NAME)

example = confluent.get_schema_registry_region(
    cloud="AWS", region="us-east-2", package="ESSENTIALS"
)
essentials = confluent.SchemaRegistryCluster(
    "essentials",
    package=example.package,
    environment=confluent.SchemaRegistryClusterEnvironmentArgs(
        id=sandbox_env.id,
    ),
    region=confluent.SchemaRegistryClusterRegionArgs(
        id=example.id,
    ),
)

dev_cluster = confluent.KafkaCluster(
    "dev-cluster",
    display_name="Shared Dev Cluster",
    availability="SINGLE_ZONE",
    cloud="AWS",
    region="us-east-1",
    basic=confluent.KafkaClusterBasicArgs(),
    environment=confluent.KafkaClusterEnvironmentArgs(id=sandbox_env.id),
    # opts=pulumi.ResourceOptions(ignore_changes=["basic"]),
)

Output of pulumi about

pulumi about CLI Version 3.117.0 Go Version go1.22.3 Go Compiler gc

Plugins KIND NAME VERSION resource confluentcloud 1.46.0 language python unknown

Host OS darwin Version 14.1.1 Arch arm64

This project is written in python: executable='/Users/vvm/.pyenv/shims/python3' version='3.11.6'

Current Stack: pulumi/confluent/dev4

TYPE URN pulumi:providers:confluentcloud urn:pulumi:dev4::confluent::pulumi:providers:confluentcloud::default_1_46_0 pulumi:pulumi:Stack urn:pulumi:dev4::confluent::pulumi:pulumi:Stack::confluent-dev4 confluentcloud:index/environment:Environment urn:pulumi:dev4::confluent::confluentcloud:index/environment:Environment::sandbox confluentcloud:index/serviceAccount:ServiceAccount urn:pulumi:dev4::confluent::confluentcloud:index/serviceAccount:ServiceAccount::cluster-manager confluentcloud:index/schemaRegistryCluster:SchemaRegistryCluster urn:pulumi:dev4::confluent::confluentcloud:index/schemaRegistryCluster:SchemaRegistryCluster::essentials confluentcloud:index/kafkaCluster:KafkaCluster urn:pulumi:dev4::confluent::confluentcloud:index/kafkaCluster:KafkaCluster::dev-cluster confluentcloud:index/roleBinding:RoleBinding urn:pulumi:dev4::confluent::confluentcloud:index/roleBinding:RoleBinding::cluster-manager-kafka-cluster-admin confluentcloud:index/apiKey:ApiKey urn:pulumi:dev4::confluent::confluentcloud:index/apiKey:ApiKey::cluster-manager-kafka-api-key confluentcloud:index/kafkaTopic:KafkaTopic urn:pulumi:dev4::confluent::confluentcloud:index/kafkaTopic:KafkaTopic::test confluentcloud:index/schema:Schema urn:pulumi:dev4::confluent::confluentcloud:index/schema:Schema::test-value

Found no pending operations associated with dev4

Backend Name pulumi.com URL https://app.pulumi.com/venelin-pulumi-corp User venelin-pulumi-corp Organizations venelin-pulumi-corp, demo, pulumi Token type personal

Dependencies: NAME VERSION pip 24.0 pulumi_confluentcloud 1.46.0 setuptools 70.0.0 wheel 0.43.0

Pulumi locates its logs in /var/folders/82/nqnqw81s1h56l5nv940f9mq00000gn/T/ by default

Additional context

No response

Contributing

Vote on this issue by adding a 👍 reaction. To contribute a fix for this issue, leave a comment (and link to your pull request, if you've opened one already).

VenelinMartinov commented 4 months ago

This doesn't repro in tf:

terraform {
  required_providers {
    confluent = {
      source  = "confluentinc/confluent"
    }
  }
}

provider "confluent" {
  # Configuration details for the Confluent provider
}

resource "confluent_environment" "sandbox" {
  display_name = "sandbox"
}

data "confluent_schema_registry_region" "example" {
  cloud   = "AWS"
  region  = "us-east-2"
  package = "ESSENTIALS"
}

resource "confluent_schema_registry_cluster" "essentials" {
  package = data.confluent_schema_registry_region.example.package
  environment {
    id = confluent_environment.sandbox.id
  }
  region {
    id = data.confluent_schema_registry_region.example.id
  }
}

resource "confluent_kafka_cluster" "dev_cluster" {
  display_name = "Shared Dev Cluster"
  availability = "SINGLE_ZONE"
  cloud        = "AWS"
  region       = "us-east-1"
  basic {}
  environment {
    id = confluent_environment.sandbox.id
  }
}
VenelinMartinov commented 4 months ago

The schema is interesting: https://github.com/confluentinc/terraform-provider-confluent/blob/9e2123f41856d23edcf28aa0def959912818b8a0/internal/provider/resource_kafka_cluster.go#L503

~MaxItems: 0~ - irrelevant, since this is equivalent to no max items

VenelinMartinov commented 4 months ago

we have an override: https://github.com/pulumi/pulumi-confluentcloud/blob/e4da290bb5f35a26c98cb50469130a4b855daee0/provider/resources.go#L95

VenelinMartinov commented 4 months ago

The MaxItemOne overrides were introduced in https://github.com/pulumi/pulumi-confluentcloud/pull/49

VenelinMartinov commented 4 months ago

And it seems wrong as the parameter can be specified multiple times fine in TF:

resource "confluent_kafka_cluster" "dev_cluster" {
  display_name = "Shared Dev Cluster"
  availability = "SINGLE_ZONE"
  cloud        = "AWS"
  region       = "us-east-1"
  basic{}
  basic{}
  environment {
    id = confluent_environment.sandbox.id
  }
}
VenelinMartinov commented 4 months ago

potentially related to https://github.com/pulumi/pulumi-terraform-bridge/issues/1767

Seems like we get the wrong thing in the Create/Update response:

```json { "method": "/pulumirpc.ResourceProvider/Update", "request": { "id": "lkc-wyw1y9", "urn": "urn:pulumi:dev5::confluent::confluentcloud:index/kafkaCluster:KafkaCluster::dev-cluster", "olds": { "__meta": "{\"e2bfb730-ecaa-11e6-8f88-34363bc7c4c0\":{\"create\":259200000000000,\"update\":259200000000000},\"schema_version\":\"1\"}", "apiVersion": "cmk/v2", "availability": "SINGLE_ZONE", "basic": null, "bootstrapEndpoint": "SASL_SSL://pkc-p11xm.us-east-1.aws.confluent.cloud:9092", "byokKey": { "id": "" }, "cloud": "AWS", "dedicated": null, "displayName": "Shared Dev Cluster", "enterprises": [], "environment": { "id": "env-kk6jxp" }, "id": "lkc-wyw1y9", "kind": "Cluster", "network": { "id": "" }, "rbacCrn": "crn://confluent.cloud/organization=c096050a-9eaa-498b-beaf-c2db308d0eef/environment=env-kk6jxp/cloud-cluster=lkc-wyw1y9", "region": "us-east-1", "restEndpoint": "https://pkc-p11xm.us-east-1.aws.confluent.cloud:443", "standard": null }, "news": { "__defaults": [], "availability": "SINGLE_ZONE", "basic": { "__defaults": [] }, "cloud": "AWS", "displayName": "Shared Dev Cluster", "environment": { "__defaults": [], "id": "env-kk6jxp" }, "region": "us-east-1" }, "oldInputs": { "__defaults": [], "availability": "SINGLE_ZONE", "basic": { "__defaults": [] }, "cloud": "AWS", "displayName": "Shared Dev Cluster", "environment": { "__defaults": [], "id": "env-kk6jxp" }, "region": "us-east-1" } }, "response": { "properties": { "__meta": "{\"e2bfb730-ecaa-11e6-8f88-34363bc7c4c0\":{\"create\":259200000000000,\"update\":259200000000000},\"schema_version\":\"1\"}", "apiVersion": "cmk/v2", "availability": "SINGLE_ZONE", "basic": null, "bootstrapEndpoint": "SASL_SSL://pkc-p11xm.us-east-1.aws.confluent.cloud:9092", "byokKey": { "id": "" }, "cloud": "AWS", "dedicated": null, "displayName": "Shared Dev Cluster", "enterprises": [], "environment": { "id": "env-kk6jxp" }, "id": "lkc-wyw1y9", "kind": "Cluster", "network": { "id": "" }, "rbacCrn": "crn://confluent.cloud/organization=c096050a-9eaa-498b-beaf-c2db308d0eef/environment=env-kk6jxp/cloud-cluster=lkc-wyw1y9", "region": "us-east-1", "restEndpoint": "https://pkc-p11xm.us-east-1.aws.confluent.cloud:443", "standard": null } }, "metadata": { "kind": "resource", "mode": "client", "name": "confluentcloud" } } ```