This is a partially fix since it doesn't fully address the dev-side documentation of all GBP related resources. More work needs to be done on top of this to have a full DevRef. Change-Id: I135a3d23a5a1df136c04a7114f94274bd4921cb6 Partial-Bug: #1571385
		
			
				
	
	
		
			199 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
..
 | 
						|
 This work is licensed under a Creative Commons Attribution 3.0 Unported
 | 
						|
 License.
 | 
						|
 | 
						|
 http://creativecommons.org/licenses/by/3.0/legalcode
 | 
						|
 | 
						|
Service Chaining
 | 
						|
================
 | 
						|
 | 
						|
Group Based Policy provides the intent based application-oriented
 | 
						|
abstractions for the specification of networking requirements to
 | 
						|
deploy applications. Network Services are an essential component for
 | 
						|
the deployment of applications.
 | 
						|
 | 
						|
One common use-case for using multiple services can be described as a
 | 
						|
"service-chain" - that is, application of specific services in a specific
 | 
						|
order for every packet on a specific datapath. This API provides an
 | 
						|
abstraction to specify that behavior with clear definition of the expected
 | 
						|
semantics.
 | 
						|
 | 
						|
The goal of this specification is to provide the user with a tool that
 | 
						|
captures their high level intent without getting coupled with incidental
 | 
						|
details of their specific deployment. This then provides a path for migrating
 | 
						|
such services across technology changes or for hybrid deployments. By design,
 | 
						|
this specification does not mandate the technology used to providethat service.
 | 
						|
 | 
						|
Typical scenarios for combining services can usually be specified quite
 | 
						|
succinctly (as traffic on this interface must first inspected by a firewall
 | 
						|
and then processed by a load balancer). Unfortunately specifying that can many
 | 
						|
times get mired in incidental complexity around service insertion and traffic
 | 
						|
steering issues. If the user is able to describe that intent, we can
 | 
						|
orchestrate the required service lifecycle events and steer the traffic as
 | 
						|
required without exposing that complexity (and the resulting coupling)
 | 
						|
outside the specific implementation details.
 | 
						|
 | 
						|
This has the added benefits that:
 | 
						|
 | 
						|
1. As we are only specifying the intent, it is back-end technology agnostic
 | 
						|
2. The additional information allows us to provide technology upgrade without
 | 
						|
   breaking service usage from a user perspective
 | 
						|
3. It can support hybrid deployments, or migrations across vendors, even
 | 
						|
   when the underlying technology used by those vendors is different.
 | 
						|
 | 
						|
Also, when specifying abstractions that are required to be implemented across
 | 
						|
technologies, it is critical that the semantics that are expected by the API
 | 
						|
(or implied) be clearly defined so that the usage can actually be portable
 | 
						|
across those technologies.
 | 
						|
 | 
						|
Database models
 | 
						|
---------------
 | 
						|
 | 
						|
1. ServiceChainNode
 | 
						|
 | 
						|
+-------------------+--------+---------+----------+-------------+---------------+
 | 
						|
|Attribute          |Type    |Access   |Default   |Validation/  |Description    |
 | 
						|
|Name               |        |         |Value     |Conversion   |               |
 | 
						|
+===================+========+=========+==========+=============+===============+
 | 
						|
|id                 |string  |RO, all  |generated |N/A          |identity       |
 | 
						|
|                   |(UUID)  |         |          |             |               |
 | 
						|
+-------------------+--------+---------+----------+-------------+---------------+
 | 
						|
|name               |string  |RW, all  |''        |string       |human-readable |
 | 
						|
|                   |        |         |          |             |name           |
 | 
						|
+-------------------+--------+---------+----------+-------------+---------------+
 | 
						|
|type               |string  |RW, all  |required  |foreign-key  |service-type   |
 | 
						|
|(flavor?)          |        |         |          |             |               |
 | 
						|
|                   |        |         |          |             |               |
 | 
						|
+-------------------+--------+---------+----------+-------------+---------------+
 | 
						|
|config             |string  |RW, all  |''        |string       | service       |
 | 
						|
|                   |        |         |          |             | configuration |
 | 
						|
|                   |        |         |          |             | (as a HEAT    |
 | 
						|
|                   |        |         |          |             | template)     |
 | 
						|
|                   |        |         |          |             | [1]_          |
 | 
						|
+-------------------+--------+---------+----------+-------------+---------------+
 | 
						|
|service_params     |list of |RW, all  |''        |list of      |list of        |
 | 
						|
|                   |strings |         |          |strings      |required       |
 | 
						|
|                   |        |         |          |             |service config |
 | 
						|
|                   |        |         |          |             |param names    |
 | 
						|
+-------------------+--------+---------+----------+-------------+---------------+
 | 
						|
 | 
						|
2. ServiceChainSpec
 | 
						|
 | 
						|
+-------------------+--------+---------+----------+-------------+-----------------+
 | 
						|
|Attribute          |Type    |Access   |Default   |Validation/  |Description      |
 | 
						|
|Name               |        |         |Value     |Conversion   |                 |
 | 
						|
+===================+========+=========+==========+=============+=================+
 | 
						|
|id                 |string  |RO, all  |generated |N/A          |identity         |
 | 
						|
|                   |(UUID)  |         |          |             |                 |
 | 
						|
+-------------------+--------+---------+----------+-------------+-----------------+
 | 
						|
|name               |string  |RW, all  |''        |string       |human-readable   |
 | 
						|
|                   |        |         |          |             |name             |
 | 
						|
+-------------------+--------+---------+----------+-------------+-----------------+
 | 
						|
|nodes              |string  |RW, all  |required  |list of      |list of          |
 | 
						|
|                   |        |         |          |strings      |ServiceChainNode |
 | 
						|
|                   |        |         |          |(UUIDs)      |                 |
 | 
						|
+-------------------+--------+---------+----------+-------------+-----------------+
 | 
						|
|service_params     |list of |RO, all  |generated |N/A          |list of required |
 | 
						|
|                   |strings |         |          |             |service config   |
 | 
						|
|                   |        |         |          |             |parameter names  |
 | 
						|
+-------------------+--------+---------+----------+-------------+-----------------+
 | 
						|
 | 
						|
service_params is generated by aggregating the service_params of each of
 | 
						|
the ServiceChainNodes in the ServiceChainSpec. The parameter is not specified
 | 
						|
in the API to create the ServiceChainSpec resource.
 | 
						|
 | 
						|
3. ServiceChainInstance
 | 
						|
 | 
						|
+--------------------+-------+---------+---------+-----------------+-----------------+
 | 
						|
|Attribute           |Type   |Access   |Default  |Validation/      |Description      |
 | 
						|
|Name                |       |         |Value    |Conversion       |                 |
 | 
						|
+====================+=======+=========+=========+=================+=================+
 | 
						|
|id                  |string |RO, all  |generated|N/A              |identity         |
 | 
						|
|                    |(UUID) |         |         |                 |                 |
 | 
						|
+--------------------+-------+---------+---------+-----------------+-----------------+
 | 
						|
|name                |string |RW, all  |''       |string           |human-readable   |
 | 
						|
|                    |       |         |         |                 |name             |
 | 
						|
+--------------------+-------+---------+---------+-----------------+-----------------+
 | 
						|
|service-chain-spec  |string |RW, all  |required |foreign-key for  |service-chain    |
 | 
						|
|                    |       |         |         |ServiceChainSpec |spec for this    |
 | 
						|
|                    |       |         |         |                 |instance         |
 | 
						|
+--------------------+-------+---------+---------+-----------------+-----------------+
 | 
						|
|provider_ptg        |string |RW, all  |required |foreign-key      |Destination      |
 | 
						|
|                    |(UUID) |         |         |                 |PolicyTargetGroup|
 | 
						|
|                    |       |         |         |                 |                 |
 | 
						|
+--------------------+-------+---------+---------+-----------------+-----------------+
 | 
						|
|consumer_ptg        |string |RW, all  |required |foreign-key      |Source           |
 | 
						|
|                    |(UUID) |         |         |                 |PolicyTargetGroup|
 | 
						|
|                    |       |         |         |                 |                 |
 | 
						|
+--------------------+-------+---------+---------+-----------------+-----------------+
 | 
						|
|classifier          |string |RW, all  |required |foreign-key      |Classifier       |
 | 
						|
|                    |(UUID) |         |         |                 |                 |
 | 
						|
|                    |       |         |         |                 |                 |
 | 
						|
+--------------------+-------+---------+---------+-----------------+-----------------+
 | 
						|
|service_param_values|string |RW, all  |required |dictionary       |configuration    |
 | 
						|
|                    |       |         |         |                 |parameter names  |
 | 
						|
|                    |       |         |         |                 |and values       |
 | 
						|
+--------------------+-------+---------+---------+-----------------+-----------------+
 | 
						|
 | 
						|
SEMANTICS:
 | 
						|
 | 
						|
The expected semantics would be equivalent of:
 | 
						|
 | 
						|
1. As if the services were created to process traffic from consumer_ptg
 | 
						|
   to provider_ptg that matches the classifier
 | 
						|
   NOTE: This is just specifying that the service chain needs to be
 | 
						|
   applied to all traffic that is traversing between the PolicyTargetGroups.
 | 
						|
   The provider may implement it using any valid insertion strategy.
 | 
						|
2. In the order of ServiceChainNodes in the ServiceChainSpec for
 | 
						|
   inbound traffic to the Destination PolicyTargetGroup, and in opposite order
 | 
						|
   for outbound traffic from the Destination PolicyTargetGroup
 | 
						|
3. Not all providers will honor arbitrary ordering of services
 | 
						|
   for application of the service.
 | 
						|
   In that case, the provider will raise a "NotImplemented"
 | 
						|
   exception.
 | 
						|
 | 
						|
USAGE WORKFLOW:
 | 
						|
 | 
						|
1. Assume a application policy that defines connectivity between
 | 
						|
   a provider PolicyTargetGroup (ptg1) and a consumer PolicyTargetGroup (ptg2)
 | 
						|
2. Assume that the semantics that I want to provide are of having
 | 
						|
   all traffic from ptg1 to/from ptg2 needs to be (a) first inspected
 | 
						|
   by a firewall, and then (b) load balanced by a load balancer.
 | 
						|
3. Then I would create a ServiceChainSpec with 2 ServiceChainNodes.
 | 
						|
   The first node would be of type FW and the second one LB.
 | 
						|
   The FW node would have config string as the HEAT template for
 | 
						|
   FWaaS configuration and the LB would have the config string as
 | 
						|
   the HEAT template for the LBaaS configuration. CLI for that
 | 
						|
   would look like::
 | 
						|
 | 
						|
       gbp servicechain-node-create --type flavor_id --config_file fw_heat_template fw_node
 | 
						|
       gbp servicechain-node-create --type flavor_id --config_file lb_heat_template lb_node
 | 
						|
 | 
						|
       gbp servicechain-spec-create --nodes "fw_node;lb_node" fwlb_spec
 | 
						|
 | 
						|
   This creates the ordered-list ["FW", "LB"] as the list of services in the
 | 
						|
   chain.
 | 
						|
4. The spec fwlb_spec created in step 3 would be used as the target of a
 | 
						|
   policy-rule in the application policy
 | 
						|
5. Finally the GBP provider would create a ServiceChainInstance from
 | 
						|
   this ServiceChainSpec. A equivalent CLI command for that would look
 | 
						|
   like::
 | 
						|
 | 
						|
       gbp servicechain-instance-create --servicechain_spec_id fwlb_spec --provider_ptg ptg1 --consumer_ptg ptg2 --classifier classifier-all --config_param_values "vip=IP1" service-chain
 | 
						|
 | 
						|
   This creates a chain that applies services in the order:
 | 
						|
 | 
						|
   * FW->LB->ptg1 for ingress traffic, and
 | 
						|
   * ptg1->LB->FW for egress traffic.
 | 
						|
 | 
						|
Notifications
 | 
						|
-------------
 | 
						|
 | 
						|
1. All updates to service-chain-spec resources are relayed to the
 | 
						|
configured service-chain-providers
 | 
						|
 | 
						|
2. Updates to ServiceChainNode or ServiceChainSpec generate notifications
 | 
						|
to backend to "fixup" the ServiceChainInstances as required.
 | 
						|
 | 
						|
3. It is assumed that the existing notifications exception handling
 | 
						|
meets the needs for this API and no new constructs are specified. |