Hi All,
Following the Flavors discussion that was held on last Thursday, as promised,
here is a description of use cases and CLI commands to demonstrate Flavor usage.
I would appreciate your feedback and thoughts about it.
I prefer to do it on a mailing list first, since if we agree on this, it may
change the RST.
Attached, please find:
1. TXT document, specifying a fuller description of the data model, meta
structure, CLI commands, bootstrap process and validations.
2. PNG file showing the data model.
Follows a summary:
Terms:
*Provider:
LBaaS service provider. Life cycle managed by Octavia
*Provider_Meta_Spec:
A certain version of a Provider's meta data specification. Life cycle
managed by Octavia.
The meta data specification is a formal description of the meta data,
defining structure and data types.
The meta spec, is versioned and each Provider may have several versions of
a meta spec.
*Provider_Flavor_Profile:
An instance of a provider's meta data modeled by a specific
Provider_Meta_Spec.
Provider may have several flavor profiles of the same Meta Spec with
Different parameter values.
*Flavor:
LBaaS service flavor. While no scheduling exists - just a logical entity
with 1:1 relation to the Provider_Flavor_Profile
CLI examples:
Please Copy/Paste it to some editor in order to see the output tables normally
> lbaas provider-list
+--------------------------------------+---------------+----------------------------------+--------------------------+---------+---------+
| id | name | description
| driver | enabled | default |
+--------------------------------------+---------------|----------------------------------+--------------------------+---------+---------+
| ad8102ae-2ae0-4038-a98e-f7f721c8eec8 | octavia |
| octavia.drivers.octavia. | true | true |
| | |
| driver.OctaviaDriver | | |
| 7953d045-92cc-4d2c-a3b1-35175c1f06c4 | radware |
| octavia.drivers.radware. | true | false |
| | |
| v2_driver. | | |
| | |
| RadwareLBaaSV2Driver | | |
+--------------------------------------+---------------+----------------------------------+--------------------------+---------+---------+
> lbaas provider-meta-spec-list --provider octavia
+--------------------------------------+---------------+---------------------------------------+---------+---------+
| id | name | provider_id
| version | enabled |
+--------------------------------------+---------------|---------------------------------------+---------+---------+
| 1696eb95-8c9e-4cb4-bd6e-ccf49b1fad23 | octavia_1.0 |
f56ac751-f890-440e-8786-999a7ab8ec2f | 1.0 | false |
| 8ju7eb94-7c9y-2cb4-bd4e-gcf49b1fki91 | octavia_2.0 |
f56ac751-f890-440e-8786-999a7ab8ec2f | 2.0 | true |
+--------------------------------------+---------------+---------------------------------------+---------+---------+
> lbaas provider-meta-spec-show octavia_2.0
+---------------------+------------------------------------------------------------------------------+
| Field | Value
|
+---------------------+------------------------------------------------------------------------------+
| id | 8ju7eb94-7c9y-2cb4-bd4e-gcf49b1fki91
|
| name | octavia_2.0
|
| provider_id | f56ac751-f890-440e-8786-999a7ab8ec2f
|
| meta_spec | [{name: "any_string", type: string, default: ""},
|
| | {name: "one_of_string", type: string, default: "A",
values: "A,B,C"}, |
| | {name: "range_int", type: integer, default: 1000,
values: "1000:10000"}, |
| | {name: "one_of_int", type: integer, default: 50,
values: "10,25,50,75,100"}, |
| | {name: "any_int", type: integer, default: 0},
|
| | {name: "bool", type: boolean, default: "false"},
|
| |{name: "list", type: list, default: []},
|
| |{name: "map", type: map, default: {}}]
|
| version | "2.0"
|
| enabled | true
|
+---------------------+------------------------------------------------------------------------------+
> lbaas flavor-profile-create --name octavia_default --meta-spec octavia_2.0
> --meta-file /tmp/meta_params.yaml
Created a new flavor profile:
+-----------------------+-----------------------------------------+
| Field | Value |
+-----------------------+-----------------------------------------+
| id | cf1ac751-f890-440e-8786-999a7ab8egy7 |
| name | actavia_default |
| description | |
| provider_meta_spec_id | 8ju7eb94-7c9y-2cb4-bd4e-gcf49b1fki91 |
| | |
| meta_data | {"any_string", "", "one_of_string": |
| | "A", "range_int": 1000, "one_of_int":|
| | 75, "any_int": 0, "bool": "false", |
| | "list": [], "map": {}} |
| enabled | true |
+-----------------------+-----------------------------------------+
> lbaas flavor-create --name default --provider-profile octavia_default
Created a new flavor:
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| id | f56ac751-f890-440e-8786-999a7ab8ec2f |
| name | default |
| description | |
| flavor_profile_id | cf1ac751-f890-440e-8786-999a7ab8egy7 |
| enabled | True |
+---------------------+--------------------------------------+
> lbaas loadbalancer-create --flavor default tenant-subnet
Created a new loadbalancer:
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| admin_state_up | True |
| description | |
| id | f56ac751-f890-440e-8786-999a7ab8ec2f |
| listeners | |
| name | |
| operating_status | ONLINE |
| provider | octavia |
| provider_profile | octavia_default |
| flavor | default |
| provisioning_status | ACTIVE |
| tenant_id | 1081145e96684447b0a35bc81c5b9433 |
| vip_address | 192.168.33.178 |
| vip_port_id | 48fc5824-e7ec-4d11-af2b-d3a190ce7d9a |
| vip_subnet_id | 1966c9a5-174d-4b39-b1e3-ff19a6621bef |
+---------------------+--------------------------------------+
Bootstrap:
* Providers are loaded into the Octavia providers DB table
from configuration file on each startup
Format: service_provider = <Name>:<Desc>:<Driver_FQN>:<enabled
true/false>:[default]
* For each provider, new driver API get_meta_spec() is called for getting the
meta specification.
It returns a list of meta data specifications which then get persisted in
the database.
* Meta specs are immutable, otherwise - startup error will be issued.
Regards,
Evgeny
====================================
Data Model:
* Four data models are presented:
Provider
Provider_Meta_Info
Provider_Flavor_Profile
Flavor
* Loadbalancer model gets new parameters -
provider_id
flavor_id
====================================
-------------------------------------------
Provider:
Id (PK)
Name (UK)
Desc
driver (UK)
enabled
default
-------------------------------------------
* Represents LBaaS service provider.
* Used as a parameter for loadbalancer creation
* May be default provider of the LBaaS service
* The name and driver FQN are unique.
* Referenced by load balancers created
with specific profider
-------------------------------------------
Provider_Meta_Spec:
Id (PK)
name
provider_id (FK,UK)
meta_spec
version (UK)
enabled
-------------------------------------------
* Represents a certain version of
Provider's meta data specification.
* References to Provider.
Provider_id and version are the unique key.
* May reference same Provider more than once
with different versions
* The entity is immutable except the enabled/disabled, any other change will
cause an erro.
* Provider_Flavor_Profile references it.
-------------------------------------------
Provider_Flavor_Profile:
Id (PK)
Name
Desc
provider_meta_spec_id (FK)
meta_data
enabled
-------------------------------------------
* Represents provider's meta data of a certain Provider_Meta_Spec
* Referencing Provider_Meta_Spec (N-1)
* Meta parameters may be loaded from a yaml file
-------------------------------------------
Flavor:
Id (PK)
Name
Desc
Profile_flavor_profile_id (FK)
enabled
-------------------------------------------
* Represents LBaaS service flavor.
* Used as a parameter for loadbalancer creation
* Referenced by just one Provider_Flavor_Profile
as long as scheduling mechanism is missing
-------------------------------------------
Loadbalancer
....
provider_id (FK)
flavor_id (FK)
-------------------------------------------
* May be associated to Provider
or to both: Flavor and Provider
====================
Bootstrap
====================
* Providers are loaded into the Octavia providers DB table
from configuration file on each startup
Format: service_provider = <Name>:<Desc>:<Driver_FQN>:<enabled
true/false>:[default]
- New providers are added only if driver_fqn and a name are unique,
otherwise, startup error will occure.
- Already existing providers may be different for default/non default and
enabled/disabled only.
Any other change will cause a startup error.
- Providers and all its Provider_Meta_Specs which were removed from
configuration file,
will be deleted from a DB only if no Provider_Flavor_Profile reference it,
otherwise, all Provider's Provider_Meta_Specs and referencing them
Provider_Flavor_Profiles
and referencing them Flavors will become disabled.
* For each provider, new driver API get_meta_spec() is called for getting the
meta specification.
It returns a list of meta data specifications.
New meta spec versions are added after validation.
Removed meta spec version are deleted if no Provider_Flavor_Profile are
referencing it.
For removed meta spec version which are referenced by
Provider_Flavor_Profile, WARNING message will be issued.
* Meta specs are immutable, otherwise - startup error will be issued.
====================
Data Integrity
====================
* Flavor can't be deleted if loadbalancer(s) references it. Loadbalancer must
be deleted first.
* Provider_Flavor_Profile can't be deleted if a Flavor references it. Flavor
must be deleted first
* Provider and its Provider_Meta_Specs will be deleted automatically on startup
if its provider was
removed from configuration file and no Provider_Flavor_Profile referencing it.
* Flavor's Provider_Flavor_Profile is immutable.
* LB's provider_id and/or flavor_id are immutable.
======================================================================================
New Driver API:
======================================================================================
The base driver will get two new APIs for the flavors support
-------------------
def get_meta_spec()
-------------------
returns: list of meta data specifications and its versions
We might choose any approach to the meta spec structure
and its validation level.
First example is for a fully stricted structure
It has a section for predefined types and
the meta spec using these predefined types :
[{
"types" : [
{"name": "int_range", "type": "integer", "values": "1000:10000"},
{"name": "string_selector", "type": "string", "values": "VA,VX"},
{"name": "int_selector", "type": "string", "values":
"10,25,50,75,100"},
{"name": "resource_pool",
"type": "dict[
{"name": "name", "type": "string"},
{"name": "capacity", "type": "int_range"}
]"
}
{"name": "resource_pools", "type": "list[resource_pool]}
]
"meta": [
{name: "resource_pools", type: "resource_pools", "default":
[{"name": "rp1", "capacity": 1000}]},
{name: "service_adc_type", type: "string_selector", "default":
"VA"},
{name: "service_ha_pair", type: "boolean", "default": "false"}
],
"version": "1.0",
"enabled": "false"
},
{
"types" : [
{"name": "int_range", "type": "integer", "values": "1000:10000"},
{"name": "string_selector", "type": "string", "values": "VA,VX"},
{"name": "int_selector", "type": "string", "values":
"10,25,50,75,100"},
{"name": "resource_pool",
"type": "dict[
{"name": "name", "type": "string"},
{"name": "capacity", "type": "int_range"}
]"
}
{"name": "resource_pools", "type": "list[resource_pool]}
]
"meta": [
{name: "resource_pools", type: "resource_pools", "default":
[{"name": "rp1", "capacity": 2000}]},
{name: "service_adc_type", type: "string_selector", "default":
"VA"},
{name: "service_ha_pair", type: "boolean", "default": "true"}
],
"version": "2.0",
"enabled": "true"
}]
Second example with less stricted structure:
[
{"meta": [
{name: "any_string", type: string, default: ""},
{name: "one_of_string", type: string, default: "A", values:
"A,B,C"},
{name: "range_int", type: integer, default: 1000, values:
"1000:10000"},
{name: "one_of_int", type: integer, default: 50, values:
"10,25,50,75,100"},
{name: "any_int", type: integer, default: 0},
{name: "bool", type: boolean, default: "false"},
{name: "list", type: list, default: []},
{name: "map", type: map, default: {}}
],
"version": "1.0",
"enabled": "true"
}
]
-----------------------------------------------
def get_default_profile_meta(meta_spec_version)
-----------------------------------------------
returns: default meta data for specific meta data specification version
First example, for version 2.0 of the fully stricted meta-spec:
{
"resource_pools", [{"name": "rp1", "capacity": 2000}],
"service_adc_type": "VA",
"service_ha_pair": "true"
}
Second example for version 1.0 of the less stricted meta-spec:
{
"any_string", "",
"one_of_string": "A",
"range_int": 1000,
"one_of_int": 50,
"any_int": 0,
"bool": "false",
"list": [],
"map": {}
}
======================================================================================
Loadbalancer create use case using flavors - CLI commands
======================================================================================
> lbaas provider-list
+--------------------------------------+---------------+----------------------------------+--------------------------+---------+---------+
| id | name | description
| driver | enabled | default |
+--------------------------------------+---------------|----------------------------------+--------------------------+---------+---------+
| ad8102ae-2ae0-4038-a98e-f7f721c8eec8 | octavia |
| octavia.drivers.octavia. | true | true |
| | |
| driver.OctaviaDriver | | |
| 7953d045-92cc-4d2c-a3b1-35175c1f06c4 | radware |
| octavia.drivers.radware. | true | false |
| | |
| v2_driver. | | |
| | |
| RadwareLBaaSV2Driver | | |
+--------------------------------------+---------------+----------------------------------+--------------------------+---------+---------+
> lbaas provider-meta-spec-list --provider octavia
+--------------------------------------+---------------+---------------------------------------+---------+---------+
| id | name | provider_id
| version | enabled |
+--------------------------------------+---------------|---------------------------------------+---------+---------+
| 1696eb95-8c9e-4cb4-bd6e-ccf49b1fad23 | octavia_1.0 |
f56ac751-f890-440e-8786-999a7ab8ec2f | 1.0 | false |
| 8ju7eb94-7c9y-2cb4-bd4e-gcf49b1fki91 | octavia_2.0 |
f56ac751-f890-440e-8786-999a7ab8ec2f | 2.0 | true |
+--------------------------------------+---------------+---------------------------------------+---------+---------+
> lbaas provider-meta-spec-show octavia_2.0
+---------------------+------------------------------------------------------------------------------+
| Field | Value
|
+---------------------+------------------------------------------------------------------------------+
| id | 8ju7eb94-7c9y-2cb4-bd4e-gcf49b1fki91
|
| name | octavia_2.0
|
| provider_id | f56ac751-f890-440e-8786-999a7ab8ec2f
|
| meta_spec | [{name: "any_string", type: string, default: ""},
|
| | {name: "one_of_string", type: string, default: "A",
values: "A,B,C"}, |
| | {name: "range_int", type: integer, default: 1000,
values: "1000:10000"}, |
| | {name: "one_of_int", type: integer, default: 50,
values: "10,25,50,75,100"}, |
| | {name: "any_int", type: integer, default: 0},
|
| | {name: "bool", type: boolean, default: "false"},
|
| |{name: "list", type: list, default: []},
|
| |{name: "map", type: map, default: {}}]
|
| version | "2.0"
|
| enabled | true
|
+---------------------+------------------------------------------------------------------------------+
> lbaas flavor-profile-create --name octavia_default --meta-spec octavia_2.0
> --meta-params type=dict one_of_int=75
OR
> lbaas flavor-profile-create --name octavia_default --meta-spec octavia_2.0
> --meta-file /tmp/meta_params.yaml
Created a new flavor profile:
+-----------------------+-----------------------------------------+
| Field | Value |
+-----------------------+-----------------------------------------+
| id | cf1ac751-f890-440e-8786-999a7ab8egy7 |
| name | actavia_default |
| description | |
| provider_meta_spec_id | 8ju7eb94-7c9y-2cb4-bd4e-gcf49b1fki91 |
| | |
| meta_data | {"any_string", "", "one_of_string": |
| | "A", "range_int": 1000, "one_of_int":|
| | 75, "any_int": 0, "bool": "false", |
| | "list": [], "map": {}} |
| enabled | true |
+-----------------------+-----------------------------------------+
> lbaas flavor-create --name default --provider-profile octavia_default
Created a new flavor:
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| id | f56ac751-f890-440e-8786-999a7ab8ec2f |
| name | default |
| description | |
| flavor_profile_id | cf1ac751-f890-440e-8786-999a7ab8egy7 |
| enabled | True |
+---------------------+--------------------------------------+
> lbaas loadbalancer-create --flavor default tenant-subnet
Created a new loadbalancer:
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| admin_state_up | True |
| description | |
| id | f56ac751-f890-440e-8786-999a7ab8ec2f |
| listeners | |
| name | |
| operating_status | ONLINE |
| provider | octavia |
| provider_profile | octavia_default |
| flavor | default |
| provisioning_status | ACTIVE |
| tenant_id | 1081145e96684447b0a35bc81c5b9433 |
| vip_address | 192.168.33.178 |
| vip_port_id | 48fc5824-e7ec-4d11-af2b-d3a190ce7d9a |
| vip_subnet_id | 1966c9a5-174d-4b39-b1e3-ff19a6621bef |
+---------------------+--------------------------------------+
======================================================================================
Loadbalancer create use case using providers - CLI commands
======================================================================================
> lbaas loadbalancer-create --provider octavia tenant-subnet
Created a new loadbalancer:
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| admin_state_up | True |
| description | |
| id | f56ac751-f890-440e-8786-999a7ab8ec2f |
| listeners | |
| name | |
| operating_status | ONLINE |
| provider | octavia |
| provider_profile | |
| flavor | |
| provisioning_status | ACTIVE |
| tenant_id | 1081145e96684447b0a35bc81c5b9433 |
| vip_address | 192.168.33.178 |
| vip_port_id | 48fc5824-e7ec-4d11-af2b-d3a190ce7d9a |
| vip_subnet_id | 1966c9a5-174d-4b39-b1e3-ff19a6621bef |
+---------------------+--------------------------------------+
======================================================================================
CLI commands:
======================================================================================
> lbaas provider-list
> lbaas provider-show <provider name/id>
> lbaas provider-metaspec-list [--provider <provider name/id>]
> lbaas provider-metaspec show <provider meta spec name/id>
> lbaas provider-profile-create [--name <name>] [--description <description>]
> [--disabled]
--provider-metaspec <provider meta spec name/id>
[--meta-params type=dict <param-name>=<param-value>,]
[--meta-file <filename.yaml>]
> lbaas provider-profile-update [--name <name>] [--description <description>]
> [--enabled] [--disabled] <provider profile name/id>
> lbaas provider-profile-delete <provider profile name/id>
> lbaas provider-profile-list [--provider <provider name/id>]
> lbaas provider-profile-show <provider profile name/id>
> lbaas flavor-create [--name <name>] [--description <description>]
> [--disabled] --provider-profile <provider profile name/id>
> lbaas flavor-update [--name <name>] [--description <description>] [--enabled]
> [--disabled] <flavor name/id>
> lbaas flavor-delete <flavor name/id>
> lbaas flavor-list
> lbaas flavor-show <flavor name/id>
__________________________________________________________________________
OpenStack Development Mailing List (not for usage questions)
Unsubscribe: [email protected]?subject:unsubscribe
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev