This design is intended to address the following issues:
KNOX-177@jira: Simplify service deployment contributor implementation
This issue stems from what is currently expected of a ServiceDeploymentContributor
in its contributeService
method.
Basically each service deployment contributor is expected to build its own filter chain.
This is currently done by making calls to Deploymentcontext.contributeFilter
.
While this provides a great deal of flexibility for each service to define a custom chain we have found that this isn't commonly necessary.
Furthermore it makes if very difficult if not impossible to introduce new filters in a chain without impacting all services.
This design will provide an abstraction to the service deployment contributors that can create either a default or specifically configured chain of filters.
The goal is to support a pattern in service deployment contributors that looks like this:
Code Block |
---|
| java |
---|
| java |
---|
title | ServiceDeploymentContributor.contributeService |
---|
linenumbers | true |
---|
|
public void contributeService( DeploymentContext context, Service service ) throws Exception {
String chain = null; // Default if null, otherwise specific chain name defined in topoloy.xml
Map<String,Map<String,String>> params = null; // Default if null, otherwise map of per provider role map of name/value pairs.
ResourceDescriptor resource = context.addResource()
resource.role( "WEBHDFS" );
resource.pattern( "webhdfs/v1/?**" );
resource.pattern( "webhdfs/v1/**?**" );
context.contributeChain( service, resource, chain, params );
}
|
PlantUML |
---|
@startuml
title Contribute Chain
hide footbox
autonumber
participant "Deployment\nFactory\n(df)" as df
participant "Deployment\nContext\n(dc)" as dc
participant "Service\nDeployment\nContributor\n(sdc)" as sdc
participant "Provider\nDeployment\nContributor\n(pdc)" as pdc
activate df
create dc
df -> dc: new
df -> sdc: contributeService(dc)
activate sdc
sdc -> dc: contributeChain()
activate dc
dc -> pdc: contributeFilter()
deactivate dc
sdc --> df
deactivate sdc
deactivate df
@endup
|
Code Block |
---|
| java |
---|
| java |
---|
title | WebHdfsDeploymentContributor.contributeService |
---|
linenumbers | true |
---|
|
public void contributeService( DeploymentContext context, Service service ) throws Exception {
UrlRewriteRulesDescriptor serviceRules = loadRulesFromClassPath();
UrlRewriteRulesDescriptor clusterRules = context.getDescriptor( "rewrite" );
clusterRules.addRules( serviceRules );
ResourceDescriptor resource;
List<ServiceParamDescriptor> params;
resource = context.getGatewayDescriptor().addResource();
resource.role( "WEBHDFS" );
resource.pattern( "webhdfs/v1/?**" );
resource.pattern( "webhdfs/v1/**?**" );
params = new ArrayList<ServiceParamDescriptor>();
params.add( resource.createParam().role( "rewrite", "request.url", "/webhdfs/namenode/inbound/path" );
params.add( resource.createParam().role( "rewrite", "response.headers", "/webhdfs/namenode/outbound/headers" );
context.contributeChain( service, resource, params );
resource = context.getGatewayDescriptor().addResource();
nameNode.role( "WEBHDFS" );
nameNode.pattern( "webhdfs/data/v1/**?**" );
params = new ArrayList<ServiceParamDescriptor>();
params.add( resource.createParam().role( "rewrite", "request.url", "/webhdfs/datanode/inbound/path" );
context.contributeChain( service, resource, params );
}
|
Code Block |
---|
| xml |
---|
| xml |
---|
title | Sample Topology Descriptor |
---|
linenumbers | true |
---|
|
<topology>
<gateway>
<provider>
<role>...</role>
<name>...</name>
<!-- Config for the provider. -->
<param><name>...</name><value>...</value></param>
</provider>
<!-- NOTE: There will be a "built-in" "default" chain definition. -->
<chain>
<name>...</name>
<provider-ref>
<role>...</role>
<name>...</name>
<!-- Config for the provider to override those in the provider. -->
<param><name>...</name><value>...</value></param>
</provider-ref>
<provider-ref>...</provider-ref>
</chain>
<chain>...</chain>
</gateway>
<service>
<role>...</role>
<url>...</url>
<chain-ref>
<name>...</name>
<!-- Config for the provider to override those in the chain. -->
<param><role></role><name></name><value></value></param>
</chain-ref>
<!-- Config for the service. -->
<param><name></name><value></value></param>
</service>
</topology>
|
Code Block |
---|
| java |
---|
| java |
---|
title | DeploymentContext |
---|
linenumbers | true |
---|
|
public interface DeploymentContext {
...
@Deprecated
void contributeFilter(
Service service,
ResourceDescriptor resource,
String role,
String name,
List<FilterParamDescriptor> params );
void contributeChain(
Service service,
ResourceDescriptor resource,
List<ServiceParamDescriptor> params );
...
}
|
Code Block |
---|
| java |
---|
| java |
---|
title | ServiceDeploymentContributor |
---|
linenumbers | true |
---|
|
public interface ServiceDeploymentContributor {
...
// Called per service based on the service's role.
void contributeService( DeploymentContext context, Service service ) throws Exception;
...
}
|
Code Block |
---|
| java |
---|
| java |
---|
title | ProviderDeploymentContributor |
---|
linenumbers | true |
---|
|
public interface ProviderDeploymentContributor {
...
// This will be called indirectly by a ServiceDeploymentContributor when it asks
// for a chain to be contributed via DeploymentContext.contributeChain.
void contributeFilter(
DeploymentContext context,
Provider provider,
Service service,
ResourceDescriptor resource,
List<FilterParamDescriptor> params );
...
}
|