==================================== 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 = ::::[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 > lbaas provider-metaspec-list [--provider ] > lbaas provider-metaspec show > lbaas provider-profile-create [--name ] [--description ] [--disabled] --provider-metaspec [--meta-params type=dict =,] [--meta-file ] > lbaas provider-profile-update [--name ] [--description ] [--enabled] [--disabled] > lbaas provider-profile-delete > lbaas provider-profile-list [--provider ] > lbaas provider-profile-show > lbaas flavor-create [--name ] [--description ] [--disabled] --provider-profile > lbaas flavor-update [--name ] [--description ] [--enabled] [--disabled] > lbaas flavor-delete > lbaas flavor-list > lbaas flavor-show