This is the Octavia provider driver for F5 BigIP appliances. It communicates with BigIP devices via the declarative AS3 API. The worker uses the driver-agent API, but it hooks more deeply into Octavia (similar to the Octavia Amphora driver) than the Provider Agents concept permits, e. g. by accessing the database directly.
Some naming conventions are a bit different between the F5 provider driver and the BigIP devices it can provision. This is partly due to the fact that naming conventions changed between i-Series BigIP vCMP host devices and the newer r-Series BigIP vCMP host devices. E. g. in the i-Series, the term tenant is used to refer to partitions within vCMP guests (this provider driver maps one Neutron network to one such partition), so we use that term in the code as well. In the r-Series however the term tenant is also used to refer to a whole vCMP guest. To avoid confusion, we keep the old i-Series naming conventions.
There are lots of F5-specific configuration options. They can be found in octavia_f5/common/config.py.
- If
agent_schedulerin the[networking]section of the configuration is set toloadbalancer, new load balancers are scheduled to the device with the least amount of load balancers. This is the default. If it is set tolistener, new load balancers are scheduled to the device with the least amount of listeners.
Mapping happens in octavia_f5/restclient/as3objects/service.py.
| Openstack listener type | AS3 service class | Notes |
|---|---|---|
| TCP | Service_L4 | Uses L4 acceleration |
| UDP | Service_UDP | |
| HTTP | Service_HTTP | |
| HTTPS | Service_L4 | Uses L4 acceleration, since HTTPS simply gets passed through without decryption |
| PROXY | Service_TCP | Does not use L4 acceleration, since it's incompatible with the Proxy Protocol iRule |
| TERMINATED_HTTPS | Service_HTTPS |
Since health monitors have different semantics in Octavia than on the BigIP (and inconsistent naming across API and database), we have to map Octavia health monitor parameters to AS3/BigIP parameters in a specific way. We try to name the parameters on the Elektra web GUI in an explanatory way.
| Elektra web GUI | CLI/API | database | AS3/BigIP |
|---|---|---|---|
| max_retries | rise_threshold | ||
| Max Retries[1] | max_retries_down | fall_threshold | timeout[2] |
| Probe Timeout | timeout | timeout | |
| Interval | delay | delay | interval |
[1] Original Elektra PR superseeded by new Elektra PR which has been merged
[2] Calculated from database parameters like this: fall_threshold * delay + 1 (see code)
This provider driver uses Octavias mariadb database to store some data, but doesn't define any new tables. Instead, otherwise unused tables/columns are used in a specific way:
- The load_balancer table is used like this:
server_group_idholds the name of the device the load balancer is scheduled to. Compare withcompute_flavorin theamphoratable below. Note thatserver_group_idis not shown by the CLI when runningopenstack loadbalancer show.
- The amphora table is used in two ways:
- For each load balancer an amphora entry is created. This is done to prevent problems with Octavias health manager, which makes assumptions about amphora entries.
compute_flavorholds the name of the device the load balancer is scheduled to. Compare withserver_group_idin theload_balancertable above. This can be used to query the device viaopenstack loadbalancer amphora show $LB_ID.- Since an amphora table entry is never updated as long as its respective load balancer lives, the
updated_atfield will always benulluntil the load balancer is being deleted, which will update the amphora entry status toDELETEDas well.
- For each F5 device that is managed by a provider driver worker a special entry is created in the
amphoratable.compute_flavorholds the name of the managed F5 devicecached_zoneholds the hostnameload_balancer_idwill always be nullrole(must contain one of the values defined in theamphora_rolestable) holds information about whether the device is in active status (MASTER) or standby status (BACKUP)status(must contain one of the values defined in theprovisioning_statustable) holds device state.ALLOCATEDmeans the the device is offline (no entry in device status response)READYmeans the device is onlineBOOTINGif it was offline and is now back online. In this case the device receives a full sync and the status is set toREADY.
- If
vrrp_interfaceis set to 'disabled' for a given F5 amphora entry, the scheduler will not take that device into account when scheduling new load balancers. vrrp_priorityholds the amount of listeners on that device
- For each load balancer an amphora entry is created. This is done to prevent problems with Octavias health manager, which makes assumptions about amphora entries.
octavia_f5/api: Driver, running in Octavia main process (extendsAmphoraProviderDriver)octavia_f5/cmd: Entry points for house-keeping and status manager.house_keeping: DB cleanup. Uses Octavia classDatabaseCleanup
octavia_f5/controller: Communication with BigIP devicestatus_manager: Manages table entries representing BigIP devicescontroller_worker: REST endpoints for Octavia, synchronization loopsync_manager: Builds AS3 declarations and sends them to the BigIP device.status: Methods for setting status in database. Used bycontroller_worker.
db: Repository classes (CRUD abstractions over sqlalchemy ORM objects)network: Layer 2 network drivers (Neutron hierarchical port binding driver, no-op driver)restclient: Classes for building AS3 declarations. Used bysync_managerandstatus_manager.