Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

Code Block
java
java
titleServiceDeploymentContributor.contributeService
linenumberstrue

  public void contributeService( DeploymentContext context, Service service ) throws Exception {
    List<ServiceParamDescriptor> 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/**?**" );
    context.contributeChain( service, resource, params );
  }


The over all context into which the method above fits into the deployment infrastructure is shown in the sequence diagram below.

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
titleWebHdfsDeploymentContributor.contributeService
linenumberstrue

  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();
    resource.role( "WEBHDFS" );
    resource.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 );
  }


This is a sketch of how topology files would need to be extended to support the external chain definitions.
See comments within the XML for detailstable below for details on the new elements introduced.
Note: I don't really like the names for provider-ref and chain-ref but I can't come up with anything better.

Code Block
xml
xml
titleSample Topology Descriptor
linenumberstrue

<topology>

  <gateway>

    <provider>
      <role>...</role>
      <name>...</name>
      <!-- Config for the provider. -->
      <param><name>...</name><value>...</value></param>
    </provider>

    <!-- There can be multiple chain elements. -->
    <!-- NOTE: There will be a "built-in" "default" chain definition. -->
    <chain>
      <name>...</name> <!-- Chains referenced by name by services. -->
      <provider-ref> <!-- References a particular provider. -->
        <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>

...

Path

Description

topology/gateway/chain

This defines a new chain structure and configuration for use by services. There will be a "built-in" chain named "default".

topology/gateway/chain/name

Specifies the name of the chain so that it can be referenced by services.

topology/gateway/chain/provider-ref

References a configured or default provider. May repeat.

topology/gateway/chain/provider-ref/role

A required role of a provider to be included in the chain.

topology/gateway/chain/provider-ref/name

An optional name of a specific provider for the given role.

topology/gateway/chain/provider-ref/param

Optional config parameters to augment the provider's configuration.

topology/service/chain-ref

Selects a specific chain to use for the service. May repeat.

topology/service/chain-ref/name

Specifies the name of the chain to use for the service. Default is "default"

topology/service/chain-ref/param

Optional parameters to augment the chain and provider configuration.

topology/service/chain-ref/param/role

A role name to disambiguate which provider the param is intended.

topology/service/param

Configuration parameters used by the service. May repeat.

...

Code Block
java
java
titleDeploymentContext
linenumberstrue

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
titleServiceDeploymentContributor
linenumberstrue

public interface ServiceDeploymentContributor {
  ...
  // Called per service based on the service's role.
  void contributeService( DeploymentContext context, Service service ) throws Exception;
  ...
}

...

Code Block
java
java
titleProviderDeploymentContributor
linenumberstrue

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 );
  ...
}