The KIP-4 Delete Topic Schema vote has passed and the patch
<https://github.com/apache/kafka/pull/1616> is available for review. Now I
would like to start the discussion for the Acls request/response and server
side implementations. This includes the ListAclsRequest/Response and the
AlterAclsRequest/Response.

Details for this implementation can be read here:
*https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations#KIP-4-Commandlineandcentralizedadministrativeoperations-ACLAdminSchema(KAFKA-3266)
<https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations#KIP-4-Commandlineandcentralizedadministrativeoperations-ACLAdminSchema(KAFKA-3266)>*

I have included the exact content below for clarity:

> ACL Admin Schema (KAFKA-3266
> <https://issues.apache.org/jira/browse/KAFKA-3266>)
>
> *Note*: Some of this work/code overlaps with "KIP-50 - Move Authorizer to
> o.a.k.common package
> <https://cwiki.apache.org/confluence/display/KAFKA/KIP-50+-+Move+Authorizer+to+o.a.k.common+package>".
> KIP-4 does not change the Authorizer interface at all, but does provide
> java objects in "org.apache.kafka.common.security.auth" to be used in the
> protocol request/response classes. It also provides translations between
> the Java and Scala versions for server side compatibility with
> the Authorizer interface.
>
> List ACLs Request
>
>
>
> ListAcls Request (Version: 0) => principal resource
>   principal => NULLABLE_STRING
>   resource => resource_type resource_name
>     resource_type => INT8
>     resource_name => STRING
>
> Request semantics:
>
>    1. Can be sent to any broker
>    2. If a non-null principal is provided the returned ACLs will be
>    filtered by that principle, otherwise ACLs for all principals will be
>    listed.
>    3. If a resource with a resource_type != -1 is provided ACLs will be
>    filtered by that resource, otherwise ACLs for all resources will be listed.
>    4. Any principle can list their own ACLs where the permission type is
>    "Allow", Otherwise the principle must be authorized to the "All" Operation
>    on the "Cluster" resource to list ACLs.
>    - Unauthorized requests will receive a ClusterAuthorizationException
>       - This avoids adding a new operation that an existing authorizer
>       implementation may not be aware of.
>       - This can be reviewed and further refined/restricted as a follow
>       up ACLs review after this KIP. See Follow Up Changes
>       
> <https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations#KIP-4-Commandlineandcentralizedadministrativeoperations-follow-up-changes>
>       .
>    5. Requesting a resource or principle that does not have any ACLs will
>    not result in an error, instead empty response list is returned
>
> List ACLs Response
>
>
>
> ListAcls Response (Version: 0) => [responses] error_code
>   responses => resource [acls]
>     resource => resource_type resource_name
>       resource_type => INT8
>       resource_name => STRING
>     acls => acl_principle acl_permission_type acl_host acl_operation
>       acl_principle => STRING
>       acl_permission_type => INT8
>       acl_host => STRING
>       acl_operation => INT8
>   error_code => INT16
>
> Alter ACLs Request
>
>
>
> AlterAcls Request (Version: 0) => [requests]
>   requests => resource [actions]
>     resource => resource_type resource_name
>       resource_type => INT8
>       resource_name => STRING
>     actions => action acl
>       action => INT8
>       acl => acl_principle acl_permission_type acl_host acl_operation
>         acl_principle => STRING
>         acl_permission_type => INT8
>         acl_host => STRING
>         acl_operation => INT8
>
> Request semantics:
>
>    1. Must be sent to the controller broker
>    2. If there are multiple instructions for the same resource in one
>    request an InvalidRequestException will be logged on the broker and a
>    single error code for that resource will be returned to the client
>       - This is because the list of requests is modeled server side as a
>       map with resource as the key
>    3. ACLs with a delete action will be processed first and the add
>    action second.
>    1. This is to prevent confusion about sort order and final state when
>       a batch message is sent.
>       2. If an add request was processed first, it could be deleted right
>       after.
>       3. Grouping ACLs by their action allows batching requests to the
>       authorizer via the Authorizer.addAcls and Authorizer.removeAcls calls.
>    4. The request is not transactional. One failure wont stop others from
>    running.
>       1. If an error occurs on one action, the others could still be run.
>       2. Errors are reported independently.
>       5. The principle must be authorized to the "All" Operation on the
>    "Cluster" resource to alter ACLs.
>       - Unauthorized requests will receive a ClusterAuthorizationException
>       - This avoids adding a new operation that an existing authorizer
>       implementation may not be aware of.
>       - This can be reviewed and further refined/restricted as a follow
>       up ACLs review after this KIP. See Follow Up Changes
>       
> <https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations#KIP-4-Commandlineandcentralizedadministrativeoperations-follow-up-changes>
>       .
>
> QA:
>
>    - Why doesn't this request have a timeout and implement any blocking
>    like the CreateTopicsRequest?
>       - The Authorizer implementation is synchronous and exposes no
>       details about propagating the ACLs to other nodes.
>       - The best we can do in the existing implementation is
>       call Authorizer.addAcls and Authorizer.removeAcls and hope the 
> underlying
>       implementation handles the rest.
>    - What happens if there is an error in the Authorizer?
>       - Currently the best we can do is log the error broker side and
>       return a generic exception because there are no "standard" exceptions
>       defined in the Authorizer interface to provide a more clear code
>       - KIP-50
>       
> <https://cwiki.apache.org/confluence/display/KAFKA/KIP-50+-+Move+Authorizer+to+o.a.k.common+package#KIP-50-MoveAuthorizertoo.a.k.commonpackage-AddexceptionsrelatedtoAuthorizer.>
>  is
>       tracking adding the standard exceptions
>       - The Authorizer interface also provides no feedback about
>       individual ACLs when added or deleted in a group
>       - Authorizer.addAcls is a void function, the best we can do is
>          return an error for all ACLs and let the user check the current 
> state by
>          listing the ACLs
>          - Autohrizer.removeAcls is a boolean function,  the best we can
>          do is return an error for all ACLs and let the user check the 
> current state
>          by listing the ACLs
>          - Behavior here could vary drastically between implementations
>          - I suggest this be addressed in KIP-50 as well, though it has
>          some compatibility concerns.
>       - Why require the request to go to the controller?
>       - The controller is responsible for the cluster metadata and its
>       propagation
>       - This ensures one instance of the Authorizer sees all the changes
>       and reduces concurrency issues, especially because the Authorizer 
> interface
>       exposes no details about propagating the ACLs to other nodes.
>       - See Request Forwarding
>       
> <https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations#KIP-4-Commandlineandcentralizedadministrativeoperations-request>
>        below
>
> Alter ACLs Response
>
>
>
> AlterAcls Response (Version: 0) => [responses]
>   responses => resource [results]
>     resource => resource_type resource_name
>       resource_type => INT8
>       resource_name => STRING
>     results => action acl error_code
>       action => INT8
>       acl => acl_principle acl_permission_type acl_host acl_operation
>         acl_principle => STRING
>         acl_permission_type => INT8
>         acl_host => STRING
>         acl_operation => INT8
>       error_code => INT16
>
>
>

Thank you,
Grant
-- 
Grant Henke
Software Engineer | Cloudera
gr...@cloudera.com | twitter.com/gchenke | linkedin.com/in/granthenke

Reply via email to