Use uWSGI for trove-api
This migrate trove-api to usage of the uwsgi from native service to align with other service way of deployment and since that's how service is tested in devstack. Change-Id: I83ad3af282942ff9714757e863f393894ac35f45
This commit is contained in:
parent
a260062504
commit
0de33a0243
@ -67,6 +67,10 @@ trove_profiler_enabled: false
|
|||||||
trove_api_workers_max: 16
|
trove_api_workers_max: 16
|
||||||
trove_api_workers: "{{ [[(ansible_facts['processor_vcpus']//ansible_facts['processor_threads_per_core'])|default(1), 1] | max * 2, trove_api_workers_max] | min }}"
|
trove_api_workers: "{{ [[(ansible_facts['processor_vcpus']//ansible_facts['processor_threads_per_core'])|default(1), 1] | max * 2, trove_api_workers_max] | min }}"
|
||||||
|
|
||||||
|
# uWSGI settings
|
||||||
|
trove_wsgi_threads: 1
|
||||||
|
trove_use_uwsgi: True
|
||||||
|
|
||||||
## Cap the maximum number of threads / workers when a user value is unspecified.
|
## Cap the maximum number of threads / workers when a user value is unspecified.
|
||||||
trove_conductor_workers_max: 16
|
trove_conductor_workers_max: 16
|
||||||
trove_conductor_workers: "{{ [[(ansible_facts['processor_vcpus']//ansible_facts['processor_threads_per_core'])|default(1), 1] | max * 2, trove_conductor_workers_max] | min }}"
|
trove_conductor_workers: "{{ [[(ansible_facts['processor_vcpus']//ansible_facts['processor_threads_per_core'])|default(1), 1] | max * 2, trove_conductor_workers_max] | min }}"
|
||||||
@ -235,8 +239,8 @@ trove_conductor_config_overrides: {}
|
|||||||
trove_taskmanager_config_overrides: {}
|
trove_taskmanager_config_overrides: {}
|
||||||
trove_guestagent_config_overrides: {}
|
trove_guestagent_config_overrides: {}
|
||||||
trove_policy_overrides: {}
|
trove_policy_overrides: {}
|
||||||
|
|
||||||
trove_api_init_config_overrides: {}
|
trove_api_init_config_overrides: {}
|
||||||
|
trove_api_uwsgi_ini_overrides: {}
|
||||||
trove_conductor_init_config_overrides: {}
|
trove_conductor_init_config_overrides: {}
|
||||||
trove_taskmanager_init_config_overrides: {}
|
trove_taskmanager_init_config_overrides: {}
|
||||||
|
|
||||||
@ -247,6 +251,11 @@ trove_services:
|
|||||||
service_name: trove-api
|
service_name: trove-api
|
||||||
execstarts: "{{ trove_bin }}/trove-api"
|
execstarts: "{{ trove_bin }}/trove-api"
|
||||||
init_config_overrides: "{{ trove_api_init_config_overrides }}"
|
init_config_overrides: "{{ trove_api_init_config_overrides }}"
|
||||||
|
wsgi_app: "{{ trove_use_uwsgi }}"
|
||||||
|
wsgi_name: trove-api-wsgi
|
||||||
|
uwsgi_overrides: "{{ trove_api_uwsgi_ini_overrides }}"
|
||||||
|
uwsgi_bind_address: "{{ trove_service_host }}"
|
||||||
|
uwsgi_port: "{{ trove_service_port }}"
|
||||||
start_order: 1
|
start_order: 1
|
||||||
trove-conductor:
|
trove-conductor:
|
||||||
group: trove_conductor
|
group: trove_conductor
|
||||||
@ -260,6 +269,3 @@ trove_services:
|
|||||||
execstarts: "{{ trove_bin }}/trove-taskmanager"
|
execstarts: "{{ trove_bin }}/trove-taskmanager"
|
||||||
init_config_overrides: "{{ trove_taskmanager_init_config_overrides }}"
|
init_config_overrides: "{{ trove_taskmanager_init_config_overrides }}"
|
||||||
start_order: 3
|
start_order: 3
|
||||||
|
|
||||||
_trove_is_first_play_host: "{{ (trove_services['trove-api']['group'] in group_names and inventory_hostname == (groups[trove_services['trove-api']['group']] | intersect(ansible_play_hosts)) | first) | bool }}"
|
|
||||||
_trove_conductor_is_first_play_host: "{{ (trove_services['trove-conductor']['group'] in group_names and inventory_hostname == (groups[trove_services['trove-conductor']['group']] | intersect(ansible_play_hosts)) | first) | bool }}"
|
|
||||||
|
@ -109,7 +109,7 @@
|
|||||||
- trove-config
|
- trove-config
|
||||||
|
|
||||||
- name: Run the systemd service role
|
- name: Run the systemd service role
|
||||||
import_role:
|
include_role:
|
||||||
name: systemd_service
|
name: systemd_service
|
||||||
vars:
|
vars:
|
||||||
systemd_user_name: "{{ trove_system_user_name }}"
|
systemd_user_name: "{{ trove_system_user_name }}"
|
||||||
@ -121,28 +121,31 @@
|
|||||||
systemd_BlockIOAccounting: true
|
systemd_BlockIOAccounting: true
|
||||||
systemd_MemoryAccounting: true
|
systemd_MemoryAccounting: true
|
||||||
systemd_TasksAccounting: true
|
systemd_TasksAccounting: true
|
||||||
systemd_services: |-
|
systemd_services:
|
||||||
{% set services = [] %}
|
- service_name: "{{ service_var.service_name }}"
|
||||||
{% for key, value in trove_services.items() %}
|
enabled: yes
|
||||||
{% if (value['group'] in group_names) %}
|
state: started
|
||||||
{% set _ = value.update(
|
execstarts: "{{ service_var.execstarts }}"
|
||||||
{
|
execreloads: "{{ service_var.execreloads | default([]) }}"
|
||||||
'service_key': key,
|
config_overrides: "{{ service_var.init_config_overrides }}"
|
||||||
'enabled': 'yes',
|
with_items: "{{ filtered_trove_services }}"
|
||||||
'state': 'started',
|
loop_control:
|
||||||
'config_overrides': value.init_config_overrides
|
loop_var: service_var
|
||||||
}
|
|
||||||
)
|
|
||||||
%}
|
|
||||||
{% set _ = value.pop('init_config_overrides') -%}
|
|
||||||
{% set _ = services.append(value) %}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{{ services }}
|
|
||||||
tags:
|
tags:
|
||||||
- trove-config
|
- trove-config
|
||||||
- systemd-service
|
- systemd-service
|
||||||
|
|
||||||
|
- name: Import uwsgi role
|
||||||
|
import_role:
|
||||||
|
name: uwsgi
|
||||||
|
vars:
|
||||||
|
uwsgi_services: "{{ uwsgi_trove_services }}"
|
||||||
|
uwsgi_install_method: "source"
|
||||||
|
tags:
|
||||||
|
- trove-install
|
||||||
|
- trove-config
|
||||||
|
- uwsgi
|
||||||
|
|
||||||
- import_tasks: service_setup.yml
|
- import_tasks: service_setup.yml
|
||||||
vars:
|
vars:
|
||||||
_project_name: "{{ trove_service_project_name }}"
|
_project_name: "{{ trove_service_project_name }}"
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
config_type: "ini"
|
config_type: "ini"
|
||||||
notify:
|
notify:
|
||||||
- Restart trove API services
|
- Restart trove API services
|
||||||
|
- Restart uwsgi services
|
||||||
when: inventory_hostname in groups['trove_api']
|
when: inventory_hostname in groups['trove_api']
|
||||||
|
|
||||||
- name: Implement policy.yaml if there are overrides configured
|
- name: Implement policy.yaml if there are overrides configured
|
||||||
@ -59,6 +60,20 @@
|
|||||||
tags:
|
tags:
|
||||||
- trove-policy-override
|
- trove-policy-override
|
||||||
|
|
||||||
|
- name: Drop trove wsgi binary
|
||||||
|
template:
|
||||||
|
src: wsgi.py.j2
|
||||||
|
dest: "{{ trove_bin }}/trove-api-wsgi"
|
||||||
|
owner: "{{ trove_system_user_name }}"
|
||||||
|
group: "{{ trove_system_group_name }}"
|
||||||
|
mode: "0755"
|
||||||
|
when:
|
||||||
|
- trove_use_uwsgi | bool
|
||||||
|
- inventory_hostname in groups['trove_api']
|
||||||
|
notify:
|
||||||
|
- Restart trove API services
|
||||||
|
- Restart uwsgi services
|
||||||
|
|
||||||
- name: Drop trove-conductor Config(s)
|
- name: Drop trove-conductor Config(s)
|
||||||
config_template:
|
config_template:
|
||||||
src: "{{ item.src }}"
|
src: "{{ item.src }}"
|
||||||
|
40
templates/wsgi.py.j2
Normal file
40
templates/wsgi.py.j2
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# Copyright 2021 City Network International AB
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
"""
|
||||||
|
Used for deploying Trove API through mod-wsgi
|
||||||
|
"""
|
||||||
|
|
||||||
|
from oslo_log import log as logging
|
||||||
|
from trove.cmd.common import with_initialize
|
||||||
|
from trove.common import pastedeploy
|
||||||
|
from trove.common import profile
|
||||||
|
|
||||||
|
LOG = logging.getLogger('trove.cmd.app')
|
||||||
|
|
||||||
|
|
||||||
|
@with_initialize
|
||||||
|
def wsgimain(CONF):
|
||||||
|
from trove.common import cfg
|
||||||
|
from trove.common import notification
|
||||||
|
from trove.instance import models as inst_models
|
||||||
|
|
||||||
|
notification.DBaaSAPINotification.register_notify_callback(
|
||||||
|
inst_models.persist_instance_fault)
|
||||||
|
cfg.set_api_config_defaults()
|
||||||
|
profile.setup_profiler('api', CONF.host)
|
||||||
|
conf_file = CONF.find_file(CONF.api_paste_config)
|
||||||
|
LOG.debug("Trove started on %s", CONF.host)
|
||||||
|
return pastedeploy.paste_deploy_app(conf_file, 'trove', {})
|
||||||
|
|
||||||
|
application = wsgimain()
|
@ -55,3 +55,7 @@
|
|||||||
src: https://opendev.org/openstack/ansible-role-python_venv_build
|
src: https://opendev.org/openstack/ansible-role-python_venv_build
|
||||||
scm: git
|
scm: git
|
||||||
version: master
|
version: master
|
||||||
|
- name: uwsgi
|
||||||
|
src: https://opendev.org/openstack/ansible-role-uwsgi
|
||||||
|
scm: git
|
||||||
|
version: master
|
||||||
|
51
vars/main.yml
Normal file
51
vars/main.yml
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
# Copyright 2021 City Network International AB
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
_trove_is_first_play_host: "{{ (trove_services['trove-api']['group'] in group_names and inventory_hostname == (groups[trove_services['trove-api']['group']] | intersect(ansible_play_hosts)) | first) | bool }}"
|
||||||
|
_trove_conductor_is_first_play_host: "{{ (trove_services['trove-conductor']['group'] in group_names and inventory_hostname == (groups[trove_services['trove-conductor']['group']] | intersect(ansible_play_hosts)) | first) | bool }}"
|
||||||
|
|
||||||
|
filtered_trove_services: |-
|
||||||
|
{% set services = [] %}
|
||||||
|
{% for key, value in trove_services.items() %}
|
||||||
|
{% if (value['group'] in group_names) and
|
||||||
|
(('condition' not in value) or
|
||||||
|
('condition' in value and value['condition'])) and
|
||||||
|
not ('wsgi_app' in value and value['wsgi_app']) %}
|
||||||
|
{% set _ = value.update({'service_key': key}) %}
|
||||||
|
{% set _ = services.append(value) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{{ services | sort(attribute='start_order') }}
|
||||||
|
|
||||||
|
uwsgi_trove_services: |-
|
||||||
|
{% set services = {} %}
|
||||||
|
{% for key, value in trove_services.items() %}
|
||||||
|
{% if (value['group'] in group_names) and
|
||||||
|
(('condition' not in value) or ('condition' in value and value['condition']))
|
||||||
|
and ('wsgi_app' in value and value['wsgi_app']) %}
|
||||||
|
{% set _ = value.update(
|
||||||
|
{
|
||||||
|
'wsgi_path': trove_bin ~ '/' ~ value.wsgi_name,
|
||||||
|
'wsgi_venv': trove_bin | dirname,
|
||||||
|
'uwsgi_uid': trove_system_user_name,
|
||||||
|
'uwsgi_guid': trove_system_group_name,
|
||||||
|
'uwsgi_processes': trove_api_workers,
|
||||||
|
'uwsgi_threads': trove_wsgi_threads,
|
||||||
|
}
|
||||||
|
) %}
|
||||||
|
{% set _ = services.update({key: value}) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{{ services }}
|
Loading…
Reference in New Issue
Block a user