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

Reply via email to