flovouin / terraform-provider-metabase

A Terraform provider for the Metabase service. Also provides a utility to import dashboards and cards as Terraform definitions.
21 stars 6 forks source link

metabase_permissions_graph not compatible with Metabase 50 due to breaking API changes #65

Open sbrudz opened 2 weeks ago

sbrudz commented 2 weeks ago

Metabase 50 introduced breaking changes to the permissions graph API, as described here.

After Metabase upgraded our cloud instance from 49 to 50, our metabase_permissions_graph resource started failing when it tries to write permissions to the Metabase API. See below for error message.

In short, the Metabase API no longer accepts the data attribute. Instead, it expects a create-queries attribute and a view-data attribute.

When I tried adding those attributes to the permissions list passed to the resource, they get stripped out.

resource "metabase_permissions_graph" "this" {
  advanced_permissions = var.advanced_permissions

  permissions = [
    {
      group          = var.group_id
      database       = var.database_id
      # Metabase 50 permissions attributes
      create-queries = "query-builder-and-native"
      view-data      = "unrestricted"
    },
    {
      # Remove access for the "All Users" group.
      group    = 1 # ID for the "All Users" group.
      database = var.database_id
      # Cannot be removed but has no impact when using the Starter version of Metabase.
      download = {
        native  = "full"
        schemas = "full"
      }
    }
  ]
}

Running terraform plan results in:

  # module.metabase_permissions[0].metabase_permissions_graph.this will be created
  + resource "metabase_permissions_graph" "this" {
      + advanced_permissions = false
      + permissions          = [
          + {
              + database = 383
              + download = {
                  + native  = "full"
                  + schemas = "full"
                }
              + group    = 1
            },
          + {
              + database = 383
              + group    = 406
            },
        ]
      + revision             = (known after apply)
    }
Full error response ``` Status code: 500, body: {"via":[{"type":"clojure.lang.ExceptionInfo","message":"No matching clause: :data","data":{"toucan2/context-trace":[["resolve connection",{"toucan2.connection/connectable":"class org.h2.jdbc.JdbcConnection"}],["resolve connection",{"toucan2.connection/connectable":null}],["resolve connection",{"toucan2.connection/connectable":"class metabase.db.connection.ApplicationDB"}],["resolve connection",{"toucan2.connection/connectable":"default"}],["resolve connection",{"toucan2.connection/connectable":null}]]},"at":["metabase.models.data_permissions.graph$update_data_perms_graph_BANG__STAR_","invokeStatic","graph.clj",381]},{"type":"java.lang.IllegalArgumentException","message":"No matching clause: :data","at":["metabase.models.data_permissions.graph$update_data_perms_graph_BANG__STAR_","invokeStatic","graph.clj",381]}],"trace":[["metabase.models.data_permissions.graph$update_data_perms_graph_BANG__STAR_","invokeStatic","graph.clj",381],["metabase.models.data_permissions.graph$update_data_perms_graph_BANG__STAR_","invoke","graph.clj",375],["metabase.models.data_permissions.graph$update_data_perms_graph_BANG_$with_connection_STAR___87890$with_transaction_STAR___87891","invoke","graph.clj",400],["toucan2.connection$bind_current_connectable_fn$fn__21211","invoke","connection.clj",104],["metabase.db.connection$do_transaction$thunk__42356","invoke","connection.clj",140],["metabase.db.connection$do_transaction","invokeStatic","connection.clj",155],["metabase.db.connection$do_transaction","invoke","connection.clj",136],["metabase.db.connection$do_with_transaction_primary_method_java_sql_Connection","invokeStatic","connection.clj",189],["metabase.db.connection$do_with_transaction_primary_method_java_sql_Connection","invoke","connection.clj",162],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",13],["methodical.util.FnWithMeta","invoke","util.clj",46],["toucan2.connection$do_with_transaction_around_method_toucan2_connection_default","invokeStatic","connection.clj",249],["toucan2.connection$do_with_transaction_around_method_toucan2_connection_default","invoke","connection.clj",245],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",13],["methodical.util.FnWithMeta","invoke","util.clj",46],["methodical.impl.standard$invoke_multifn","invokeStatic","standard.clj",58],["methodical.impl.standard$invoke_multifn","invoke","standard.clj",47],["methodical.impl.standard.StandardMultiFn","invoke","standard.clj",212],["metabase.models.data_permissions.graph$update_data_perms_graph_BANG_$with_connection_STAR___87890","invoke","graph.clj",399],["toucan2.connection$bind_current_connectable_fn$fn__21211","invoke","connection.clj",104],["toucan2.connection$bind_current_connectable_fn$fn__21211","invoke","connection.clj",104],["toucan2.jdbc.connection$do_with_connection_primary_method_java_sql_Connection","invokeStatic","connection.clj",13],["toucan2.jdbc.connection$do_with_connection_primary_method_java_sql_Connection","invoke","connection.clj",11],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",12],["methodical.util.FnWithMeta","invoke","util.clj",46],["toucan2.connection$do_with_connection_around_method_toucan2_connection_default","invokeStatic","connection.clj",118],["toucan2.connection$do_with_connection_around_method_toucan2_connection_default","invoke","connection.clj",106],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",12],["methodical.util.FnWithMeta","invoke","util.clj",46],["methodical.impl.standard$invoke_multifn","invokeStatic","standard.clj",55],["methodical.impl.standard$invoke_multifn","invoke","standard.clj",47],["methodical.impl.standard.StandardMultiFn","invoke","standard.clj",210],["toucan2.connection$do_with_connection_primary_method_","invokeStatic","connection.clj",204],["toucan2.connection$do_with_connection_primary_method_","invoke","connection.clj",194],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",12],["methodical.util.FnWithMeta","invoke","util.clj",46],["toucan2.connection$do_with_connection_around_method_toucan2_connection_default","invokeStatic","connection.clj",118],["toucan2.connection$do_with_connection_around_method_toucan2_connection_default","invoke","connection.clj",106],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",12],["methodical.util.FnWithMeta","invoke","util.clj",46],["methodical.impl.standard$invoke_multifn","invokeStatic","standard.clj",55],["methodical.impl.standard$invoke_multifn","invoke","standard.clj",47],["methodical.impl.standard.StandardMultiFn","invoke","standard.clj",210],["metabase.models.data_permissions.graph$update_data_perms_graph_BANG_","invokeStatic","graph.clj",399],["metabase.models.data_permissions.graph$update_data_perms_graph_BANG_","invoke","graph.clj",392],["metabase.api.permissions$fn__87939$with_connection_STAR___87942$with_transaction_STAR___87943","invoke","permissions.clj",152],["toucan2.connection$bind_current_connectable_fn$fn__21211","invoke","connection.clj",104],["metabase.db.connection$do_transaction$thunk__42356","invoke","connection.clj",140],["metabase.db.connection$do_transaction","invokeStatic","connection.clj",152],["metabase.db.connection$do_transaction","invoke","connection.clj",136],["metabase.db.connection$do_with_transaction_primary_method_java_sql_Connection","invokeStatic","connection.clj",189],["metabase.db.connection$do_with_transaction_primary_method_java_sql_Connection","invoke","connection.clj",162],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",13],["methodical.util.FnWithMeta","invoke","util.clj",46],["toucan2.connection$do_with_transaction_around_method_toucan2_connection_default","invokeStatic","connection.clj",249],["toucan2.connection$do_with_transaction_around_method_toucan2_connection_default","invoke","connection.clj",245],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",13],["methodical.util.FnWithMeta","invoke","util.clj",46],["methodical.impl.standard$invoke_multifn","invokeStatic","standard.clj",58],["methodical.impl.standard$invoke_multifn","invoke","standard.clj",47],["methodical.impl.standard.StandardMultiFn","invoke","standard.clj",212],["metabase.api.permissions$fn__87939$with_connection_STAR___87942","invoke","permissions.clj",143],["toucan2.connection$bind_current_connectable_fn$fn__21211","invoke","connection.clj",104],["toucan2.connection$bind_current_connectable_fn$fn__21211","invoke","connection.clj",104],["toucan2.connection$bind_current_connectable_fn$fn__21211","invoke","connection.clj",104],["toucan2.jdbc.connection$do_with_connection_primary_method_javax_sql_DataSource","invokeStatic","connection.clj",18],["toucan2.jdbc.connection$do_with_connection_primary_method_javax_sql_DataSource","invoke","connection.clj",15],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",12],["methodical.util.FnWithMeta","invoke","util.clj",46],["toucan2.connection$do_with_connection_around_method_toucan2_connection_default","invokeStatic","connection.clj",118],["toucan2.connection$do_with_connection_around_method_toucan2_connection_default","invoke","connection.clj",106],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",12],["methodical.util.FnWithMeta","invoke","util.clj",46],["methodical.impl.standard$invoke_multifn","invokeStatic","standard.clj",55],["methodical.impl.standard$invoke_multifn","invoke","standard.clj",47],["methodical.impl.standard.StandardMultiFn","invoke","standard.clj",210],["metabase.db.connection$do_with_connection_primary_method_default","invokeStatic","connection.clj",132],["metabase.db.connection$do_with_connection_primary_method_default","invoke","connection.clj",130],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",12],["methodical.util.FnWithMeta","invoke","util.clj",46],["toucan2.connection$do_with_connection_around_method_toucan2_connection_default","invokeStatic","connection.clj",118],["toucan2.connection$do_with_connection_around_method_toucan2_connection_default","invoke","connection.clj",106],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",12],["methodical.util.FnWithMeta","invoke","util.clj",46],["methodical.impl.standard$invoke_multifn","invokeStatic","standard.clj",55],["methodical.impl.standard$invoke_multifn","invoke","standard.clj",47],["methodical.impl.standard.StandardMultiFn","invoke","standard.clj",210],["toucan2.connection$do_with_connection_primary_method_","invokeStatic","connection.clj",204],["toucan2.connection$do_with_connection_primary_method_","invoke","connection.clj",194],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",12],["methodical.util.FnWithMeta","invoke","util.clj",46],["toucan2.connection$do_with_connection_around_method_toucan2_connection_default","invokeStatic","connection.clj",118],["toucan2.connection$do_with_connection_around_method_toucan2_connection_default","invoke","connection.clj",106],["methodical.impl.combo.common$partial_STAR_$fn__18116","invoke","common.clj",12],["methodical.util.FnWithMeta","invoke","util.clj",46],["methodical.impl.standard$invoke_multifn","invokeStatic","standard.clj",55],["methodical.impl.standard$invoke_multifn","invoke","standard.clj",47],["methodical.impl.standard.StandardMultiFn","invoke","standard.clj",210],["metabase.api.permissions$fn__87939","invokeStatic","permissions.clj",143],["metabase.api.permissions$fn__87939","invoke","permissions.clj",113],["compojure.core$wrap_response$fn__52699","invoke","core.clj",160],["compojure.core$wrap_route_middleware$fn__52683","invoke","core.clj",132],["compojure.core$wrap_route_info$fn__52688","invoke","core.clj",139],["compojure.core$wrap_route_matches$fn__52692","invoke","core.clj",151],["clojure.lang.Var","invoke","Var.java",393],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$wrap_route_matches$fn__52692","invoke","core.clj",153],["clojure.lang.Var","invoke","Var.java",393],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$wrap_route_matches$fn__52692","invoke","core.clj",153],["clojure.lang.Var","invoke","Var.java",393],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$wrap_route_matches$fn__52692","invoke","core.clj",153],["clojure.lang.Var","invoke","Var.java",393],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711","invoke","core.clj",200],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["metabase.server.middleware.auth$enforce_authentication$fn__97346","invoke","auth.clj",18],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711","invoke","core.clj",200],["compojure.core$make_context$handler__52739","invoke","core.clj",290],["compojure.core$make_context$fn__52743","invoke","core.clj",300],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$make_context$fn__52743","invoke","core.clj",301],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.lang.AFunction$1","doInvoke","AFunction.java",31],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$wrap_route_matches$fn__52692","invoke","core.clj",153],["clojure.lang.Var","invoke","Var.java",393],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["metabase.api.routes$fn__104939$fn__104942","invoke","routes.clj",73],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711","invoke","core.clj",200],["clojure.lang.AFn","applyToHelper","AFn.java",160],["clojure.lang.AFn","applyTo","AFn.java",144],["clojure.core$apply","invokeStatic","core.clj",667],["clojure.core$apply","invoke","core.clj",662],["metabase.server.routes$fn__105219$fn__105220","doInvoke","routes.clj",73],["clojure.lang.RestFn","invoke","RestFn.java",436],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711","invoke","core.clj",200],["compojure.core$make_context$handler__52739","invoke","core.clj",290],["compojure.core$make_context$fn__52743","invoke","core.clj",300],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$wrap_route_matches$fn__52692","invoke","core.clj",153],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$wrap_route_matches$fn__52692","invoke","core.clj",153],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$wrap_route_matches$fn__52692","invoke","core.clj",153],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["compojure.core$wrap_route_matches$fn__52692","invoke","core.clj",153],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711$f__52712$respond_SINGLEQUOTE___52713","invoke","core.clj",197],["metabase.server.routes$fn__105202$fn__105204","invoke","routes.clj",47],["compojure.core$routes$fn__52711$f__52712","invoke","core.clj",198],["compojure.core$routes$fn__52711","invoke","core.clj",200],["metabase.server.middleware.exceptions$catch_uncaught_exceptions$fn__101319","invoke","exceptions.clj",107],["metabase.server.middleware.exceptions$catch_api_exceptions$fn__101316","invoke","exceptions.clj",96],["metabase.server.middleware.log$log_api_call$fn__105506$fn__105507$fn__105508","invoke","log.clj",233],["metabase.driver.sql_jdbc.execute.diagnostic$do_with_diagnostic_info","invokeStatic","diagnostic.clj",18],["metabase.driver.sql_jdbc.execute.diagnostic$do_with_diagnostic_info","invoke","diagnostic.clj",12],["metabase.server.middleware.log$log_api_call$fn__105506$fn__105507","invoke","log.clj",224],["toucan2.execute$do_with_call_counts","invokeStatic","execute.clj",112],["toucan2.execute$do_with_call_counts","invoke","execute.clj",103],["metabase.server.middleware.log$log_api_call$fn__105506","invoke","log.clj",223],["metabase.server.middleware.browser_cookie$ensure_browser_id_cookie$fn__108779","invoke","browser_cookie.clj",42],["metabase.server.middleware.security$add_security_headers$fn__101275","invoke","security.clj",240],["ring.middleware.json$wrap_json_body$fn__109038","invoke","json.clj",64],["metabase.server.middleware.offset_paging$handle_paging$fn__87518","invoke","offset_paging.clj",43],["metabase.server.middleware.json$wrap_streamed_json_response$fn__54320","invoke","json.clj",83],["ring.middleware.keyword_params$wrap_keyword_params$fn__109127","invoke","keyword_params.clj",55],["ring.middleware.params$wrap_params$fn__109146","invoke","params.clj",77],["metabase.server.middleware.misc$maybe_set_site_url$fn__70876","invoke","misc.clj",59],["metabase.server.middleware.session$reset_session_timeout$fn__77884","invoke","session.clj",548],["metabase.server.middleware.session$bind_current_user$fn__77850$fn__77851","invoke","session.clj",443],["metabase.server.middleware.session$do_with_current_user","invokeStatic","session.clj",422],["metabase.server.middleware.session$do_with_current_user","invoke","session.clj",405],["metabase.server.middleware.session$bind_current_user$fn__77850","invoke","session.clj",442],["metabase.server.middleware.session$wrap_current_user_info$fn__77831","invoke","session.clj",381],["metabase.server.middleware.session$wrap_session_id$fn__77803","invoke","session.clj",259],["metabase.server.middleware.auth$wrap_static_api_key$fn__97354","invoke","auth.clj",32],["ring.middleware.cookies$wrap_cookies$fn__108966","invoke","cookies.clj",200],["metabase.server.middleware.misc$add_content_type$fn__70858","invoke","misc.clj",28],["metabase.server.middleware.misc$disable_streaming_buffering$fn__70884","invoke","misc.clj",75],["ring.middleware.gzip$wrap_gzip$fn__109008","invoke","gzip.clj",86],["metabase.server.middleware.misc$bind_request$fn__70887","invoke","misc.clj",91],["metabase.server.middleware.ssl$redirect_to_https_middleware$fn__108795","invoke","ssl.clj",41],["metabase.server$async_proxy_handler$fn__71222","invoke","server.clj",77],["metabase.server.proxy$org.eclipse.jetty.server.handler.AbstractHandler$ff19274a","handle",null,-1],["org.eclipse.jetty.server.handler.StatisticsHandler","handle","StatisticsHandler.java",173],["org.eclipse.jetty.server.handler.HandlerWrapper","handle","HandlerWrapper.java",122],["org.eclipse.jetty.server.Server","handle","Server.java",563],["org.eclipse.jetty.server.HttpChannel$RequestDispatchable","dispatch","HttpChannel.java",1598],["org.eclipse.jetty.server.HttpChannel","dispatch","HttpChannel.java",753],["org.eclipse.jetty.server.HttpChannel","handle","HttpChannel.java",501],["org.eclipse.jetty.server.HttpConnection","onFillable","HttpConnection.java",287],["org.eclipse.jetty.io.AbstractConnection$ReadCallback","succeeded","AbstractConnection.java",314],["org.eclipse.jetty.io.FillInterest","fillable","FillInterest.java",100],["org.eclipse.jetty.io.SelectableChannelEndPoint$1","run","SelectableChannelEndPoint.java",53],["org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy","runTask","AdaptiveExecutionStrategy.java",421],["org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy","consumeTask","AdaptiveExecutionStrategy.java",390],["org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy","tryProduce","AdaptiveExecutionStrategy.java",277],["org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy","run","AdaptiveExecutionStrategy.java",199],["org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread","run","ReservedThreadExecutor.java",411],["org.eclipse.jetty.util.thread.QueuedThreadPool","runJob","QueuedThreadPool.java",969],["org.eclipse.jetty.util.thread.QueuedThreadPool$Runner","doRunJob","QueuedThreadPool.java",1194],["org.eclipse.jetty.util.thread.QueuedThreadPool$Runner","run","QueuedThreadPool.java",1149],["java.lang.Thread","run",null,-1]],"cause":"No matching clause: :data","message":"No matching clause: :data"} ```
flovouin commented 2 weeks ago

Hi @sbrudz, Thanks for the report.

I've just released v0.8.0, hoping it will fix you problem. Unfortunately I'm not using Metabase at the moment, and not only am I not aware of its most recent features, I have no access to the entreprise version. I've made create_queries and view_data mandatory for ease of implementation. I don't know if view_data = "no" is a legitimate configuration (maybe it's just the free version of Metabase that doesn't support it). If it is, there could be an issue in the current implementation, as no will probably make the view-data property disappear in the API's responses. If you encounter any problem, feel free to reopen this issue.

Cheers,

sbrudz commented 2 weeks ago

Thank you! I'll test it out and will let you know if I hit any issues.

sbrudz commented 6 days ago

v0.8.0 of the provider is working for us. Thank you for fixing it so quickly!

sbrudz commented 6 days ago

I spoke too soon. I'm seeing this error sometimes:

Error: Provider produced inconsistent result after apply When applying changes to module.metabase_permissions[0].metabase_permissions_graph.write, provider "provider[\"registry.terraform.io/flovouin/metabase\"]" produced an unexpected new value: .permissions: planned set element cty.ObjectVal(map[string]cty.Value{"create_queries":cty.StringVal("query-builder-and-native"), "data_model":cty.NullVal(cty.Object(map[string]cty.Type{"schemas":cty.String})), "database":cty.NumberIntVal(418), "details":cty.NullVal(cty.String), "download":cty.NullVal(cty.Object(map[string]cty.Type{"schemas":cty.String})), "group":cty.NumberIntVal(441), "view_data":cty.StringVal("unrestricted")}) does not correlate with any element in actual.

This is a bug in the provider, which should be reported in the provider's own issue tracker.

Not sure why it's not happening consistently. I'll see if I can narrow down what's going on.

flovouin commented 6 days ago

If you could provide a reproductible example that'd be awesome. While the error message makes it clear what was the planned value, we don't know what's the actual, nor the Metabase API response.

Do plans always correctly detect changes? Is the problem "just" about applying them?

sbrudz commented 5 days ago

The plans seem to be fine. I'll try to reproduce it later this week and will include some debug logs, too.