nevzheng commented on code in PR #12489:
URL: https://github.com/apache/gravitino/pull/12489#discussion_r3803783606


##########
docs/gravitino-server-config.md:
##########
@@ -486,6 +488,53 @@ server, are documented with those services. See
 | `gravitino.job.stagingDirKeepTimeInMs` | How long in milliseconds a finished 
job's staging files are kept. Use at least 10 minutes outside testing. | 
`604800000` (7 days)          |
 | `gravitino.job.statusPullIntervalInMs` | Interval in milliseconds between 
job status polls. Use at least 1 minute outside testing.                  | 
`300000` (5 minutes)          |
 
+### Key Management
+
+The server talks to KMS instances you name in `gravitino.conf`. Each name is 
one configured
+instance. Each instance declares the KMS API it speaks. That API selects the 
`KmsClientFactory`
+implementation on the classpath. Two names may share one API, which is how you 
run more than one
+AWS or Azure vault.
+
+The list is empty by default, and then the server has no KMS clients. Naming a 
provider without a
+factory for its API, or without a valid API, fails startup. Client 
construction validates local
+configuration only; the first call to the provider is a later key inspection, 
not startup.
+
+| Configuration Item                      | Description                        
                                                                                
                                                         | Default Value |
+|-----------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|
+| `gravitino.kms.providers`               | Comma-separated KMS instance 
names. Each name must match `[A-Za-z0-9][A-Za-z0-9_-]*` and cannot contain `.`. 
Duplicates fail startup.                                       | (empty)       |
+| `gravitino.kms.provider.<name>.api`     | Required KMS API identifier for 
that instance. Lowercase kebab-case with no surrounding whitespace, matched 
exactly, for example `aws-kms`. Values are never normalized.    | (none)        
|
+| `gravitino.kms.provider.<name>.<key>`   | Any other property under that name 
is passed to the factory for that API. Nested dots in `<key>` are allowed, as 
in `endpoint.region`.                                      | (none)        |
+
+Every name in `providers` needs a matching `.api`. A 
`gravitino.kms.provider.<name>.*` key for a
+name that is not in the list, or any other `gravitino.kms.*` key, fails 
startup.
+
+`api` is the protocol, not the instance. Set it to the identifier the factory 
reports from
+`KmsClientFactory.api()`. Identifiers already used by factories include 
`aws-kms`,
+`google-cloud-kms`, and `azure-key-vault`. A custom factory may use any other 
lowercase kebab-case
+value. The server does not ship a factory for every identifier; put the 
matching implementation on
+the classpath or startup fails with no factory for that API.
+
+Callers name the instance and the key. They do not send `api`. The server 
already bound
+`aws-prod` to `aws-kms` at startup.
+
+```text
+# conf/gravitino.conf
+gravitino.kms.providers = aws-prod, aws-dr, azure-eu
+
+gravitino.kms.provider.aws-prod.api = aws-kms
+gravitino.kms.provider.aws-prod.endpoint.region = us-west-2
+

Review Comment:
   @lasdf1234 here's what I'm trying to do. Tell me if this is a good approach 
or if className is better.
   
   I want named KMS instances so one server can run two AWS vaults and one 
Azure. Callers only send the instance name plus the key id 
(`KmsReference{provider, keyId}`). They should not send a protocol or a class.
   
   `gravitino.kms.provider.aws-dr.api=aws-kms` is only the binding from that 
instance to a protocol. At startup the server picks the `KmsClientFactory` 
whose `api()` is `aws-kms` and passes the rest of 
`gravitino.kms.provider.aws-dr.*` into `create`. Two names can share one 
factory.
   
   I used a short `api` id rather than `className` so `gravitino.conf` stays on 
identifiers like `aws-kms`, the same way catalogs use `provider` and aux 
services use a short name. `class` / `className` is the other Gravitino 
convention (listeners, audit). That would work too:
   
   ```
   
gravitino.kms.provider.aws-dr.className=org.apache.gravitino.encryption.kms.aws.AwsKmsClientFactory
   ```
   
   Same named-instance model; it would just load the factory by FQCN and skip 
the SPI match on `api()`.
   
   Do you want className here, or is a short `api` id OK because catalogs 
already work that way?
   
   Nevin
   Sent from my 🤖 (Cursor)



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to