Remove XenAPI integration
Change-Id: Iea3f4f3d2e5c6040c1e0bc7bfae8719cc7d8ac55
This commit is contained in:
parent
522bc17981
commit
60e03d7bf3
@ -925,7 +925,7 @@ neutron_ovn_distributed_fip: "no"
|
||||
#######################
|
||||
nova_backend_ceph: "no"
|
||||
nova_backend: "{{ 'rbd' if nova_backend_ceph | bool else 'default' }}"
|
||||
# Valid options are [ kvm, qemu, vmware, xenapi ]
|
||||
# Valid options are [ kvm, qemu, vmware ]
|
||||
nova_compute_virt_type: "kvm"
|
||||
nova_instance_datadir_volume: "nova_compute"
|
||||
nova_safety_upgrade: "no"
|
||||
@ -1009,18 +1009,6 @@ vmware_vcenter_host_username: "username"
|
||||
vmware_vcenter_cluster_name: "cluster-1"
|
||||
vmware_vcenter_insecure: "True"
|
||||
|
||||
#######################################
|
||||
# XenAPI - Support XenAPI for XenServer
|
||||
#######################################
|
||||
# XenAPI driver use HIMN(Host Internal Management Network)
|
||||
# to communicate with XenServer host.
|
||||
xenserver_himn_ip: "169.254.0.1"
|
||||
xenserver_username: "root"
|
||||
xenserver_connect_protocol: "https"
|
||||
# File used to save XenAPI's facts variables formatted as json.
|
||||
xenapi_facts_root: "/etc/kolla/xenapi/"
|
||||
xenapi_facts_file: "facts.json"
|
||||
|
||||
#############################################
|
||||
# MariaDB component-specific database details
|
||||
#############################################
|
||||
|
@ -7,8 +7,6 @@ transport_url = {{ rpc_transport_url }}
|
||||
|
||||
{% if nova_compute_virt_type == 'vmware' %}
|
||||
hypervisor_inspector = vsphere
|
||||
{% elif nova_compute_virt_type == 'xenapi' %}
|
||||
hypervisor_inspector = xenapi
|
||||
{% endif %}
|
||||
|
||||
[service_credentials]
|
||||
@ -42,13 +40,6 @@ transport_url = {{ notify_transport_url }}
|
||||
policy_file = {{ ceilometer_policy_file }}
|
||||
{% endif %}
|
||||
|
||||
{% if nova_compute_virt_type == 'xenapi' %}
|
||||
[xenapi]
|
||||
connection_url = {{ xenserver_connect_protocol }}://{{ xenserver_himn_ip }}
|
||||
connection_username = {{ xenserver_username }}
|
||||
connection_password = {{ xenserver_password }}
|
||||
{% endif %}
|
||||
|
||||
[cache]
|
||||
backend = oslo_cache.memcache_pool
|
||||
enabled = True
|
||||
|
@ -34,7 +34,7 @@ neutron_services:
|
||||
KOLLA_LEGACY_IPTABLES: "{{ neutron_legacy_iptables | bool | lower }}"
|
||||
host_in_groups: >-
|
||||
{{
|
||||
( (inventory_hostname in groups['compute'] and nova_compute_virt_type != 'xenapi')
|
||||
( inventory_hostname in groups['compute']
|
||||
or (enable_manila | bool and inventory_hostname in groups['manila-share'])
|
||||
or inventory_hostname in groups['neutron-dhcp-agent']
|
||||
or inventory_hostname in groups['neutron-l3-agent']
|
||||
@ -49,17 +49,6 @@ neutron_services:
|
||||
}}
|
||||
volumes: "{{ neutron_openvswitch_agent_default_volumes + neutron_openvswitch_agent_extra_volumes }}"
|
||||
dimensions: "{{ neutron_openvswitch_agent_dimensions }}"
|
||||
neutron-openvswitch-agent-xenapi:
|
||||
container_name: "neutron_openvswitch_agent_xenapi"
|
||||
image: "{{ neutron_openvswitch_agent_image_full }}"
|
||||
enabled: "{{ neutron_plugin_agent == 'openvswitch' and nova_compute_virt_type == 'xenapi' }}"
|
||||
privileged: True
|
||||
host_in_groups: >-
|
||||
{{
|
||||
inventory_hostname in groups['compute']
|
||||
}}
|
||||
volumes: "{{ neutron_openvswitch_agent_xenapi_default_volumes + neutron_openvswitch_agent_xenapi_extra_volumes }}"
|
||||
dimensions: "{{ neutron_openvswitch_agent_xenapi_dimensions }}"
|
||||
neutron-linuxbridge-agent:
|
||||
container_name: "neutron_linuxbridge_agent"
|
||||
image: "{{ neutron_linuxbridge_agent_image_full }}"
|
||||
@ -239,7 +228,6 @@ neutron_openvswitch_agent_dimensions: "{{ neutron_agent_dimensions }}"
|
||||
neutron_server_dimensions: "{{ default_container_dimensions }}"
|
||||
neutron_bgp_dragent_dimensions: "{{ default_container_dimensions }}"
|
||||
neutron_infoblox_ipam_agent_dimensions: "{{ default_container_dimensions }}"
|
||||
neutron_openvswitch_agent_xenapi_dimensions: "{{ neutron_agent_dimensions }}"
|
||||
neutron_metering_agent_dimensions: "{{ neutron_agent_dimensions }}"
|
||||
ironic_neutron_agent_dimensions: "{{ default_container_dimensions }}"
|
||||
|
||||
@ -313,14 +301,6 @@ neutron_infoblox_ipam_agent_default_volumes:
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
- "{{ '/etc/timezone:/etc/timezone:ro' if kolla_base_distro in ['debian', 'ubuntu'] else '' }}"
|
||||
- "kolla_logs:/var/log/kolla/"
|
||||
neutron_openvswitch_agent_xenapi_default_volumes:
|
||||
- "{{ node_config_directory }}/neutron-openvswitch-agent-xenapi/:{{ container_config_directory }}/:ro"
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
- "{{ '/etc/timezone:/etc/timezone:ro' if kolla_base_distro in ['debian', 'ubuntu'] else '' }}"
|
||||
- "/lib/modules:/lib/modules:ro"
|
||||
- "/run/openvswitch:/run/openvswitch:shared"
|
||||
- "kolla_logs:/var/log/kolla/"
|
||||
- "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python' ~ distro_python_version ~ '/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
|
||||
neutron_metering_agent_default_volumes:
|
||||
- "{{ node_config_directory }}/neutron-metering-agent/:{{ container_config_directory }}/:ro"
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
@ -344,7 +324,6 @@ neutron_openvswitch_agent_extra_volumes: "{{ neutron_extra_volumes }}"
|
||||
neutron_server_extra_volumes: "{{ neutron_extra_volumes }}"
|
||||
neutron_bgp_dragent_extra_volumes: "{{ neutron_extra_volumes }}"
|
||||
neutron_infoblox_ipam_agent_extra_volumes: "{{ neutron_extra_volumes }}"
|
||||
neutron_openvswitch_agent_xenapi_extra_volumes: "{{ neutron_extra_volumes }}"
|
||||
neutron_metering_agent_extra_volumes: "{{ neutron_extra_volumes }}"
|
||||
ironic_neutron_agent_extra_volumes: "{{ neutron_extra_volumes }}"
|
||||
|
||||
|
@ -32,22 +32,6 @@
|
||||
when:
|
||||
- kolla_action != "config"
|
||||
|
||||
- name: Restart neutron-openvswitch-agent-xenapi container
|
||||
vars:
|
||||
service_name: "neutron-openvswitch-agent-xenapi"
|
||||
service: "{{ neutron_services[service_name] }}"
|
||||
become: true
|
||||
kolla_docker:
|
||||
action: "recreate_or_restart_container"
|
||||
common_options: "{{ docker_common_options }}"
|
||||
name: "{{ service.container_name }}"
|
||||
image: "{{ service.image }}"
|
||||
volumes: "{{ service.volumes|reject('equalto', '')|list }}"
|
||||
dimensions: "{{ service.dimensions }}"
|
||||
privileged: "{{ service.privileged | default(False) }}"
|
||||
when:
|
||||
- kolla_action != "config"
|
||||
|
||||
- name: Restart fake neutron-openvswitch-agent container
|
||||
vars:
|
||||
service_name: "neutron-openvswitch-agent"
|
||||
|
@ -83,7 +83,6 @@
|
||||
- "neutron-ovn-metadata-agent"
|
||||
- "neutron-metering-agent"
|
||||
- "neutron-openvswitch-agent"
|
||||
- "neutron-openvswitch-agent-xenapi"
|
||||
- "neutron-server"
|
||||
- "neutron-bgp-dragent"
|
||||
- "neutron-infoblox-ipam-agent"
|
||||
@ -189,28 +188,6 @@
|
||||
notify:
|
||||
- "Restart {{ service_name }} container"
|
||||
|
||||
- name: Copying over openvswitch_agent.ini for XenAPI
|
||||
become: true
|
||||
vars:
|
||||
service_name: "neutron-openvswitch-agent-xenapi"
|
||||
os_xenapi_variables: "{{ lookup('file', xenapi_facts_root + '/' + inventory_hostname + '/' + xenapi_facts_file) | from_json }}"
|
||||
merge_configs:
|
||||
sources:
|
||||
- "{{ role_path }}/templates/openvswitch_agent_xenapi.ini.j2"
|
||||
- "{{ node_custom_config }}/neutron/openvswitch_agent_xenapi.ini"
|
||||
- "{{ node_custom_config }}/neutron/{{ inventory_hostname }}/openvswitch_agent_xenapi.ini"
|
||||
- "{{ node_custom_config }}/neutron/{{ service_name }}/openvswitch_agent_xenapi.ini"
|
||||
# TODO(mnasiadka): Remove in V - left to not break existing deployments
|
||||
- "{{ node_custom_config }}/neutron/ml2_conf.ini"
|
||||
- "{{ node_custom_config }}/neutron/{{ inventory_hostname }}/ml2_conf.ini"
|
||||
dest: "{{ node_config_directory }}/{{ service_name }}/openvswitch_agent.ini"
|
||||
mode: "0660"
|
||||
when:
|
||||
- neutron_services[service_name].enabled | bool
|
||||
- neutron_services[service_name].host_in_groups | bool
|
||||
notify:
|
||||
- "Restart {{ service_name }} container"
|
||||
|
||||
- name: Copying over sriov_agent.ini
|
||||
vars:
|
||||
service_name: "neutron-sriov-agent"
|
||||
|
@ -1,25 +0,0 @@
|
||||
[DEFAULT]
|
||||
# Use service_name as the log file name for neutron-openvswitch-agent-xenapi,
|
||||
# so that it will use a different log file from neutron-openvswitch-agent.
|
||||
log_file = {{ service_name }}.log
|
||||
host = {{ os_xenapi_variables.dom0_hostname }}
|
||||
|
||||
[agent]
|
||||
root_helper_daemon = xenapi_root_helper
|
||||
root_helper =
|
||||
|
||||
[ovs]
|
||||
of_listen_address = {{ os_xenapi_variables.domu_himn_ip }}
|
||||
ovsdb_connection = tcp:{{ xenserver_himn_ip }}:{{ ovsdb_port }}
|
||||
{% if computes_need_external_bridge | bool %}
|
||||
bridge_mappings = {% for interface in neutron_external_interface.split(',') %}physnet{{ loop.index0 + 1 }}:{{ os_xenapi_variables.domu_vifs[interface]["bridge"] }}{% if not loop.last %},{% endif %}{% endfor %}
|
||||
{% else %}
|
||||
bridge_mappings =
|
||||
{% endif %}
|
||||
|
||||
local_ip = {% for ip in os_xenapi_variables.dom0_ipv4s %}{% if ip.bridge == os_xenapi_variables.domu_vifs[tunnel_interface]['bridge'] %}{{ ip.address }}{% endif %} {% endfor %}
|
||||
|
||||
[xenapi]
|
||||
connection_password = {{ xenserver_password }}
|
||||
connection_username = {{ xenserver_username }}
|
||||
connection_url = {{ xenserver_connect_protocol }}://{{ xenserver_himn_ip }}
|
@ -1,26 +0,0 @@
|
||||
---
|
||||
- name: Install package python-os-xenapi
|
||||
package:
|
||||
name: python-os-xenapi
|
||||
state: present
|
||||
become: True
|
||||
|
||||
- name: Ensure XenAPI root path
|
||||
file:
|
||||
path: "{{ xenapi_facts_root }}"
|
||||
state: directory
|
||||
mode: "0770"
|
||||
become: True
|
||||
|
||||
- name: Bootstrap XenAPI compute node
|
||||
vars:
|
||||
xenapi_facts_path: "{{ xenapi_facts_root + '/' + xenapi_facts_file }}"
|
||||
command: xenapi_bootstrap -i {{ xenserver_himn_ip }} -u {{ xenserver_username }} -p {{ xenserver_password }} -f {{ xenapi_facts_path }}
|
||||
become: True
|
||||
|
||||
- name: Fetching XenAPI facts file
|
||||
fetch:
|
||||
src: "{{ xenapi_facts_root + '/' + xenapi_facts_file }}"
|
||||
dest: "{{ xenapi_facts_root + '/' + inventory_hostname + '/' }}"
|
||||
flat: yes
|
||||
become: True
|
@ -53,13 +53,6 @@
|
||||
notify:
|
||||
- "Restart {{ item.key }} container"
|
||||
|
||||
- name: Set XenAPI facts
|
||||
set_fact:
|
||||
xenapi_facts: "{{ lookup('file', xenapi_facts_root + '/' + inventory_hostname + '/' + xenapi_facts_file) | from_json }}"
|
||||
when:
|
||||
- nova_compute_virt_type == 'xenapi'
|
||||
- inventory_hostname in groups[nova_cell_compute_group]
|
||||
|
||||
- name: Copying over nova.conf
|
||||
become: true
|
||||
vars:
|
||||
|
@ -1,9 +1,4 @@
|
||||
---
|
||||
- include_tasks: bootstrap_xenapi.yml
|
||||
when:
|
||||
- inventory_hostname in groups[nova_cell_compute_group]
|
||||
- nova_compute_virt_type == "xenapi"
|
||||
|
||||
- include_tasks: clone.yml
|
||||
when: nova_dev_mode | bool
|
||||
|
||||
|
@ -19,11 +19,6 @@ host = {{ ansible_hostname }}_{{ service_name }}
|
||||
compute_driver = fake.FakeDriver
|
||||
{% elif nova_compute_virt_type == 'vmware' %}
|
||||
compute_driver = vmwareapi.VMwareVCDriver
|
||||
{% elif nova_compute_virt_type == 'xenapi' %}
|
||||
compute_driver = xenapi.XenAPIDriver
|
||||
{% if service_name == 'nova-compute' %}
|
||||
host = xenapi_facts['dom0_hostname']
|
||||
{% endif %}
|
||||
{% else %}
|
||||
compute_driver = libvirt.LibvirtDriver
|
||||
{% endif %}
|
||||
@ -230,14 +225,6 @@ auth_endpoint = {{ keystone_internal_url }}
|
||||
cafile = {{ openstack_cacert }}
|
||||
{% endif %}
|
||||
|
||||
{% if nova_compute_virt_type == "xenapi" %}
|
||||
[xenserver]
|
||||
ovs_integration_bridge = br-int
|
||||
connection_password = {{ xenserver_password }}
|
||||
connection_username = {{ xenserver_username }}
|
||||
connection_url = {{ xenserver_connect_protocol }}://{{ xenserver_himn_ip }}
|
||||
{% endif %}
|
||||
|
||||
# Cell specific settings from DevStack:
|
||||
# https://opendev.org/openstack/devstack/src/branch/master/lib/nova#L874
|
||||
{% if service_name.startswith("nova-compute") and enable_cells | bool %}
|
||||
|
@ -3,11 +3,11 @@ Compute
|
||||
=======
|
||||
|
||||
This section describes configuring nova hypervisors and
|
||||
compute services like HyperV, XenServer and so on.
|
||||
compute services like HyperV and so on.
|
||||
|
||||
.. note::
|
||||
|
||||
Hyper-V, VMware, and XenAPI support have been deprecated and will
|
||||
Hyper-V and VMware support have been deprecated and will
|
||||
be removed in the Victoria cycle.
|
||||
|
||||
.. toctree::
|
||||
@ -21,5 +21,4 @@ compute services like HyperV, XenServer and so on.
|
||||
nova-guide
|
||||
qinling-guide
|
||||
vmware-guide
|
||||
xenserver-guide
|
||||
zun-guide
|
||||
|
@ -16,19 +16,3 @@ provides an API service to manage and control the automated rescue mechanism.
|
||||
Kolla deploys Masakari API, Masakari Engine and Masakari Instance Monitor
|
||||
containers which are the main Masakari components only if ``enable_masakari``
|
||||
is set in ``/etc/kolla/globals.yml``.
|
||||
|
||||
|
||||
Connection URI to libvirtd
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
By default ``masakari-instancemonitor`` will connect to ``libvirt`` daemon
|
||||
using ``qemu+tcp://`` connection URI to get events of KVM-based virtual
|
||||
machines.
|
||||
|
||||
The setting is overridable using custom config, put the content in
|
||||
``/etc/kolla/config/masakari/masakari-monitors.conf``.
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[libvirt]
|
||||
connection_uri = "xen://{{ migration_interface_address | put_address_in_context('url') }}/system"
|
||||
|
@ -13,8 +13,8 @@ Virtualisation Drivers
|
||||
======================
|
||||
|
||||
The virtualisation driver may be selected via ``nova_compute_virt_type`` in
|
||||
``globals.yml``. Supported options are ``qemu``, ``kvm``, ``vmware``, and
|
||||
``xenapi``. The default is ``kvm``.
|
||||
``globals.yml``. Supported options are ``qemu``, ``kvm``, and ``vmware``.
|
||||
The default is ``kvm``.
|
||||
|
||||
HyperV
|
||||
------
|
||||
@ -41,16 +41,6 @@ VMware
|
||||
Information on the VMware-based driver ``vmware`` can be found in
|
||||
:doc:`vmware-guide`.
|
||||
|
||||
XenServer
|
||||
---------
|
||||
|
||||
.. note::
|
||||
|
||||
XenAPI support has been deprecated and will be removed in the Victoria cycle.
|
||||
|
||||
Information on the XenServer-based driver ``xenapi`` can be found in
|
||||
:doc:`xenserver-guide`.
|
||||
|
||||
Bare Metal
|
||||
----------
|
||||
|
||||
|
@ -1,103 +0,0 @@
|
||||
.. _XenServer-guide:
|
||||
|
||||
======================================
|
||||
XenServer - Nova Virtualisation Driver
|
||||
======================================
|
||||
|
||||
.. note::
|
||||
|
||||
XenAPI support has been deprecated and will be removed in the Victoria cycle.
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
Kolla can deploy the OpenStack services on XenServer hosts by choosing
|
||||
``xenapi`` as the compute virt driver.
|
||||
|
||||
In XenServer, there is a privileged domain which is known as dom0;
|
||||
and it can run a number of un-privileged domains which are known as
|
||||
domUs or VMs.
|
||||
|
||||
Most OpenStack services (e.g. Keystone, Glance, Horizon) can run either
|
||||
in the XenServer VMs or in separate baremetal hosts, but some services
|
||||
(which make direct use of the hypervisor) must run in the XenServer VMs.
|
||||
These services will interact with the XenServer host via XenAPI to perform
|
||||
privileged operations. See the following list for such kind of services:
|
||||
|
||||
* ``nova-compute``
|
||||
|
||||
* ``neutron-openvswitch-agent-xenapi``
|
||||
|
||||
* ``ceilometer-compute``
|
||||
|
||||
|
||||
.. note::
|
||||
|
||||
At the moment, only CentOS 7.x has been tested.
|
||||
|
||||
Preparation for compute node on XenServer hosts
|
||||
===============================================
|
||||
|
||||
We need some bootstrap tasks particularly for XenAPI compute nodes. The
|
||||
tasks are implemented in the package of ``python-os-xenapi`` and exposed
|
||||
to kolla-ansible via a single command - ``xenapi_bootstrap``. This package
|
||||
is contained in the ``RDO CloudSIG repository`` [`RDO repos`_] and will be
|
||||
installed on compute nodes at nova deployment. So we need ensure this
|
||||
repository is reachable from the compute nodes or cache the repository
|
||||
locally.
|
||||
|
||||
Create a compute VM on each XenServer host which will be used to boot
|
||||
instances on. The VM must meet the common requirements declared by
|
||||
kolla-ansible for KVM/QEMU deployment.
|
||||
|
||||
Additionally you should install PV driver in the VM [`XenServer documents`_];
|
||||
and create the HIMN(Host Internal Management Network) for each compute VM
|
||||
by following these steps:
|
||||
|
||||
1. In XenCenter, from the menu choose "View -> Hidden Objects";
|
||||
|
||||
2. You will see HIMN in the host's 'Networking' page;
|
||||
|
||||
3. Create an interface on HIMN for the compute VM.
|
||||
|
||||
The remaining instructions are just the same as the preparations for
|
||||
KVM/QEMU deployment.
|
||||
|
||||
Deployment
|
||||
----------
|
||||
|
||||
Enable the virt type ``xenapi`` and configure connection options in
|
||||
``/etc/kolla/globals.yml``:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
nova_compute_virt_type: "xenapi"
|
||||
xenserver_username: "root"
|
||||
xenserver_connect_protocol: "https"
|
||||
|
||||
.. note::
|
||||
|
||||
When using ``https`` as the connection protocol, please refer XenServer
|
||||
user document to setup the signed SSL certificates to allow the secure
|
||||
communications between dom0 and domU. Otherwise, please use ``http`` for
|
||||
self-signed certificates.
|
||||
|
||||
You also need set the password for xenserver_username in
|
||||
``/etc/kolla/passwords.yml``:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
xenserver_password: "root_password"
|
||||
|
||||
Then you can start kolla-ansible deployment just following the
|
||||
:doc:`/user/quickstart`.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
For more information on XenAPI OpenStack, see
|
||||
:nova-doc:`XenAPI OpenStack <admin/configuration/hypervisor-xen-api.html>`
|
||||
|
||||
.. _RDO repos: https://www.rdoproject.org/what/repos/
|
||||
|
||||
.. _XenServer documents: https://docs.citrix.com/en-us/xenserver/current-release.html
|
@ -510,7 +510,7 @@
|
||||
########################
|
||||
#nova_backend_ceph: "no"
|
||||
|
||||
# Valid options are [ qemu, kvm, vmware, xenapi ]
|
||||
# Valid options are [ qemu, kvm, vmware ]
|
||||
#nova_compute_virt_type: "kvm"
|
||||
|
||||
# The number of fake driver per compute node
|
||||
@ -635,18 +635,6 @@
|
||||
#vmware_vcenter_name:
|
||||
#vmware_vcenter_cluster_name:
|
||||
|
||||
#######################################
|
||||
# XenAPI - Support XenAPI for XenServer
|
||||
#######################################
|
||||
|
||||
# NOTE: XenAPI support has been deprecated and will be removed in the Victoria cycle.
|
||||
|
||||
# XenAPI driver use HIMN(Host Internal Management Network)
|
||||
# to communicate with XenServer host.
|
||||
#xenserver_himn_ip:
|
||||
#xenserver_username:
|
||||
#xenserver_connect_protocol:
|
||||
|
||||
############
|
||||
# Prometheus
|
||||
############
|
||||
|
@ -254,11 +254,6 @@ etcd_cluster_token:
|
||||
####################
|
||||
redis_master_password:
|
||||
|
||||
################
|
||||
# XenAPI options
|
||||
################
|
||||
xenserver_password:
|
||||
|
||||
####################
|
||||
# Prometheus options
|
||||
####################
|
||||
|
4
releasenotes/notes/remove-xenapi-94ea90ffd61bae20.yaml
Normal file
4
releasenotes/notes/remove-xenapi-94ea90ffd61bae20.yaml
Normal file
@ -0,0 +1,4 @@
|
||||
---
|
||||
upgrade:
|
||||
- |
|
||||
Support for deploying with XenAPI integrations has been removed.
|
Loading…
Reference in New Issue
Block a user