diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml index 748d21dd6b1d0dba899e57bc1ea24f84588da56f..30508643cc8157a37946ed6977e4561b0d5d89ff 100644 --- a/ansible/group_vars/all.yml +++ b/ansible/group_vars/all.yml @@ -868,6 +868,7 @@ enable_nova_serialconsole_proxy: "no" enable_nova_ssh: "yes" enable_octavia: "no" enable_octavia_driver_agent: "{{ enable_octavia | bool and neutron_plugin_agent == 'ovn' }}" +enable_octavia_jobboard: "{{ enable_octavia | bool and 'amphora' in octavia_provider_drivers }}" enable_openvswitch: "{{ enable_neutron | bool and neutron_plugin_agent != 'linuxbridge' }}" enable_ovn: "{{ enable_neutron | bool and neutron_plugin_agent == 'ovn' }}" enable_ovs_dpdk: "no" diff --git a/ansible/roles/octavia/defaults/main.yml b/ansible/roles/octavia/defaults/main.yml index a170389d9b42dbea2efee8dfe7640c3c49bca273..73b3f2859aceeae95868fd95eac5ea0580f747d0 100644 --- a/ansible/roles/octavia/defaults/main.yml +++ b/ansible/roles/octavia/defaults/main.yml @@ -77,6 +77,10 @@ octavia_database_name: "octavia" octavia_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}octavia{% endif %}" octavia_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}" +octavia_persistence_database_name: "octavia_persistence" +octavia_persistence_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}octavia_persistence{% endif %}" +octavia_persistence_database_address: "{{ octavia_database_address }}" + #################### # Database sharding #################### @@ -90,6 +94,16 @@ octavia_database_shard: - schema: "{{ octavia_database_name }}" shard_id: "{{ octavia_database_shard_id }}" +octavia_persistence_database_shard_root_user: "{{ octavia_database_shard_root_user }}" +octavia_persistence_database_shard_id: "{{ octavia_database_shard_id }}" +octavia_persistence_database_shard: + users: + - user: "{{ octavia_persistence_database_user }}" + password: "{{ octavia_persistence_database_password }}" + rules: + - schema: "{{ octavia_persistence_database_name }}" + shard_id: "{{ octavia_persistence_database_shard_id }}" + #################### # Docker diff --git a/ansible/roles/octavia/tasks/bootstrap.yml b/ansible/roles/octavia/tasks/bootstrap.yml index 01352ecd99aa313c74311461ea6ec715cb643287..1d6667b95162f9124827f95b18055348b4812965 100644 --- a/ansible/roles/octavia/tasks/bootstrap.yml +++ b/ansible/roles/octavia/tasks/bootstrap.yml @@ -15,6 +15,22 @@ when: - not use_preconfigured_databases | bool +- name: Creating Octavia persistence database + become: true + kolla_toolbox: + container_engine: "{{ kolla_container_engine }}" + module_name: mysql_db + module_args: + login_host: "{{ database_address }}" + login_port: "{{ database_port }}" + login_user: "{{ octavia_persistence_database_shard_root_user }}" + login_password: "{{ database_password }}" + name: "{{ octavia_persistence_database_name }}" + run_once: True + delegate_to: "{{ groups['octavia-api'][0] }}" + when: + - not use_preconfigured_databases | bool + - name: Creating Octavia database user and setting permissions become: true kolla_toolbox: @@ -35,4 +51,24 @@ when: - not use_preconfigured_databases | bool +- name: Creating Octavia persistence database user and setting permissions + become: true + kolla_toolbox: + container_engine: "{{ kolla_container_engine }}" + module_name: mysql_user + module_args: + login_host: "{{ database_address }}" + login_port: "{{ database_port }}" + login_user: "{{ octavia_persistence_database_shard_root_user }}" + login_password: "{{ database_password }}" + name: "{{ octavia_persistence_database_user }}" + password: "{{ octavia_persistence_database_password }}" + host: "%" + priv: "{{ octavia_persistence_database_name }}.*:ALL" + append_privs: "yes" + run_once: True + delegate_to: "{{ groups['octavia-api'][0] }}" + when: + - not use_preconfigured_databases | bool + - import_tasks: bootstrap_service.yml diff --git a/ansible/roles/octavia/tasks/precheck.yml b/ansible/roles/octavia/tasks/precheck.yml index f3335b6c7cd790abff3955d95581e3ae60d00dca..c05be8073209ca93a474605b373ec777d2e52d27 100644 --- a/ansible/roles/octavia/tasks/precheck.yml +++ b/ansible/roles/octavia/tasks/precheck.yml @@ -63,3 +63,11 @@ - octavia_auto_configure | bool - octavia_network_type == "tenant" - neutron_plugin_agent != 'openvswitch' + +- name: Checking whether Redis is enabled for octavia jobboard + assert: + that: enable_redis | bool + fail_msg: "Redis must be enabled when using octavia jobboard" + run_once: True + when: + - enable_octavia_jobboard | bool diff --git a/ansible/roles/octavia/templates/octavia.conf.j2 b/ansible/roles/octavia/templates/octavia.conf.j2 index 9d1fbc7cf36cfade808159dfd3dc99a9a61e9d6c..243c274eaa37acb236736e3002c867bb4133b820 100644 --- a/ansible/roles/octavia/templates/octavia.conf.j2 +++ b/ansible/roles/octavia/templates/octavia.conf.j2 @@ -151,3 +151,12 @@ ca_certificates_file = {{ openstack_cacert }} region_name = {{ openstack_region_name }} endpoint_type = internal ca_certificates_file = {{ openstack_cacert }} +{% if enable_octavia_jobboard %} + +[task_flow] +persistence_connection = mysql+pymysql://{{ octavia_persistence_database_user }}:{{ octavia_persistence_database_password }}@{{ octavia_persistence_database_address }}/{{ octavia_persistence_database_name }} +jobboard_enabled = true +jobboard_backend_password = "{{ redis_master_password }}" +jobboard_backend_port = "{{ redis_port }}" +jobboard_backend_hosts = {% for host in groups['redis'] %}{{ 'api' | kolla_address(host) | put_address_in_context('url') }}{% if not loop.last %},{% endif %}{% endfor %} +{% endif %} diff --git a/etc/kolla/globals.yml b/etc/kolla/globals.yml index 4b3424fce30b46eace26ba76782ff925154a31b3..ca90c96f6bdabd1aa51ed15cf4840a411c6c9c2a 100644 --- a/etc/kolla/globals.yml +++ b/etc/kolla/globals.yml @@ -395,6 +395,7 @@ workaround_ansible_issue_8743: yes #enable_nova_ssh: "yes" #enable_octavia: "no" #enable_octavia_driver_agent: "{{ enable_octavia | bool and neutron_plugin_agent == 'ovn' }}" +#enable_octavia_jobboard: "{{ enable_octavia | bool and 'amphora' in octavia_provider_drivers }}" #enable_opensearch: "{{ enable_central_logging | bool or enable_osprofiler | bool or (enable_cloudkitty | bool and cloudkitty_storage_backend == 'elasticsearch') }}" #enable_opensearch_dashboards: "{{ enable_opensearch | bool }}" #enable_opensearch_dashboards_external: "{{ enable_opensearch_dashboards | bool }}" diff --git a/etc/kolla/passwords.yml b/etc/kolla/passwords.yml index 8d0e7343a1e760382aff88d6ab6a6ca7580dc476..9b5871a8f5d9e3863da0cd4fc30ba8f875aebd0b 100644 --- a/etc/kolla/passwords.yml +++ b/etc/kolla/passwords.yml @@ -153,6 +153,7 @@ manila_database_password: manila_keystone_password: octavia_database_password: +octavia_persistence_database_password: octavia_keystone_password: octavia_ca_password: octavia_client_ca_password: diff --git a/releasenotes/notes/octavia_jobboard-823f44393f3e109e.yaml b/releasenotes/notes/octavia_jobboard-823f44393f3e109e.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b2156e04c23553193ae666db18e6b39cde8f977c --- /dev/null +++ b/releasenotes/notes/octavia_jobboard-823f44393f3e109e.yaml @@ -0,0 +1,19 @@ +--- +features: + - | + The Octavia amphora provider driver improves control plane resiliency. + Should a control plane host go down during a load balancer provisioning + operation, an alternate controller can resume the in-process provisioning + and complete the request. This solves the issue with resources stuck in + PENDING_* states by writing info about task states in persistent backend + and monitoring job claims via jobboard. The jobboard feature is now + enabled by default. It requires the Redis service to be enabled as a + dependency. Use the ``enable_octavia_jobboard`` variable to override + if needed. +upgrade: + - | + The Octavia amphora provider by default is now deployed with the jobboard + feature enabled. This requires the Redis service to be enabled as a + dependency, please update your configuration accordingly if needed. + For futher information see + `Amphorav2 docs <https://docs.openstack.org/octavia/latest/install/install-amphorav2.html>`_ diff --git a/tests/templates/globals-default.j2 b/tests/templates/globals-default.j2 index 52d32f219829eaab5eb63d4a162d585f6e43a288..09f3806d9a2b15a7613d21a6bb51a164cabbb9dd 100644 --- a/tests/templates/globals-default.j2 +++ b/tests/templates/globals-default.j2 @@ -165,6 +165,7 @@ neutron_enable_ovn_agent: "yes" enable_octavia: "yes" octavia_provider_drivers: "ovn:OVN provider" octavia_provider_agents: "ovn" +enable_redis: "yes" {% endif %} {% if scenario == "prometheus-opensearch" %} @@ -191,6 +192,7 @@ octavia_amp_flavor: ram: 1024 disk: 5 octavia_network_type: "tenant" +enable_redis: "yes" {% endif %} {% if scenario == "venus" %}