Compare commits
80 commits
debian/2.1
...
master
Author | SHA1 | Date | |
---|---|---|---|
941e358015 | |||
e3e474e941 | |||
a20c84dccc | |||
237a471872 | |||
1696b49173 | |||
6080e04541 | |||
3fa4d74c3d | |||
fc47254fde | |||
8325643e03 | |||
f27a4dcb87 | |||
9a65ac8b54 | |||
2a3aed8b82 | |||
e33cc5df37 | |||
2f75f4a6fe | |||
0528d0d46c | |||
cc4a79a666 | |||
783a564fbd | |||
edaa60c5be | |||
60c9d2c9de | |||
d1ffa2f934 | |||
b4db543273 | |||
46ccaa2b8e | |||
3db79981f8 | |||
8de2bb7462 | |||
769889707d | |||
0a71194a9b | |||
9a33c75cc9 | |||
efd23c9778 | |||
0153ff40e6 | |||
6e267093c7 | |||
c0a458a620 | |||
5681786be3 | |||
cb31e3dce3 | |||
e879c212ea | |||
64a5a762c5 | |||
9761d8f991 | |||
6481cfe02c | |||
80f2dfcc3f | |||
c8548c1499 | |||
d53c5a55b0 | |||
6870df7681 | |||
e15c7c0b60 | |||
bb19fd1462 | |||
cefbea9eb6 | |||
efda13edd9 | |||
894b3d56ab | |||
957b531788 | |||
1e0b3773c6 | |||
245282c90f | |||
673bc4ac18 | |||
538cc5f0f9 | |||
b6238b501a | |||
5d992c2efe | |||
2c599f9c46 | |||
b6215af13a | |||
ae8f30e7bd | |||
9f5c5c6af1 | |||
9c3fa0ce30 | |||
6282052f22 | |||
4956e9786d | |||
65900f0147 | |||
646fff424b | |||
643f00b666 | |||
f5ce504df4 | |||
c7be5fde50 | |||
1a818f3a2d | |||
1c0c9069d4 | |||
b3cede2442 | |||
504752fc12 | |||
eba244cde4 | |||
2d77bd18bc | |||
58f28f4e5a | |||
2e63c66698 | |||
b98c5799f6 | |||
da9c94933a | |||
8e4a470fe9 | |||
8b99f7607a | |||
40bc5f98a5 | |||
a5f859df4a | |||
44b7539063 |
174
debian/changelog
vendored
174
debian/changelog
vendored
|
@ -1,3 +1,151 @@
|
|||
patroni (3.0.1-2) UNRELEASED; urgency=medium
|
||||
|
||||
|
||||
-- Debian PostgreSQL Maintainers <team+postgresql@tracker.debian.org> Fri, 17 Feb 2023 09:34:22 +0100
|
||||
|
||||
patroni (3.0.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* debian/control (Uploaders): Updated.
|
||||
|
||||
-- Michael Banck <mbanck@debian.org> Fri, 17 Feb 2023 09:33:48 +0100
|
||||
|
||||
patroni (3.0.0-1) unstable; urgency=medium
|
||||
|
||||
* New major upstream release.
|
||||
* debian/patches/acceptance_tests_system_patroni.patch: Refreshed.
|
||||
* debian/patches/avoid_overwriting_configuration_during_boostrap.patch:
|
||||
Likewise.
|
||||
* debian/tests/control: Add procps as dependency and skip DCS failsafe mode
|
||||
acceptance tests on zookeeper.
|
||||
* debian/patches/regression_tests_skip_citus_test.patch: New patch, skips
|
||||
the citus unit test for now as it fails on some configurations.
|
||||
* debian/control (Depends): Removed obsolete lsb-base.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Tue, 31 Jan 2023 22:27:24 +0100
|
||||
|
||||
patroni (2.1.7-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* debian/patches/acceptance_tests_reenable_etcdv2.patch: Removed, no longer
|
||||
needed.
|
||||
* debian/patches/compatibility_with_old_modules.patch: Likewise.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Mon, 23 Jan 2023 21:24:46 +0100
|
||||
|
||||
patroni (2.1.6-2) unstable; urgency=medium
|
||||
|
||||
[ Shengjing Zhu ]
|
||||
* debian/tests/acceptance: Ensure no etcd server is running before acceptance
|
||||
tests. Otherwise, acceptance tests can't spin up a new etcd server which
|
||||
uses the same port (Closes: #1027707).
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Sun, 08 Jan 2023 22:06:02 +0100
|
||||
|
||||
patroni (2.1.6-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* debian/patches/acceptance_tests_system_patroni.patch: Refreshed.
|
||||
* debian/patches/acceptance_tests_reenable_etcdv2.patch: New patch,
|
||||
re-enables V2 API on etcd-3.4 and later.
|
||||
* debian/tests/control: Add etcd3 behave test.
|
||||
* debian/patches/compatibility_with_old_modules.patch: New patch, fixes
|
||||
unit test failures with older modules, taken from upstream commit 442bd3f.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Wed, 04 Jan 2023 10:51:02 +0100
|
||||
|
||||
patroni (2.1.5-1) unstable; urgency=medium
|
||||
|
||||
* Team upload.
|
||||
* New upstream release.
|
||||
* Mark Consul test as skip-not-installable (not in testing, see #1017982).
|
||||
|
||||
-- Christoph Berg <myon@debian.org> Mon, 28 Nov 2022 13:07:28 +0100
|
||||
|
||||
patroni (2.1.4-3) unstable; urgency=medium
|
||||
|
||||
* Enable RAFT support and add python3-pysyncobj to dep alternatives.
|
||||
|
||||
-- Christoph Berg <myon@debian.org> Thu, 17 Nov 2022 16:14:33 +0100
|
||||
|
||||
patroni (2.1.4-2) unstable; urgency=medium
|
||||
|
||||
* Team upload.
|
||||
|
||||
[ Michael Banck ]
|
||||
* debian/patches/avoid_overwriting_configuration_during_boostrap.patch: New
|
||||
patch, avoids streaming a backup of the primary's postgresql.conf file
|
||||
during bootstrap, overwriting the standby's postgresql.base.conf and
|
||||
possible preventing PostgreSQL to start up.
|
||||
* debian/patches/acceptance_tests_speedup.patch: New patch, reduces loop_wait
|
||||
to 2 thus speeding up the behave tests, taken from upstream commit ead798.
|
||||
|
||||
[ Christoph Berg ]
|
||||
* Add a test using etcd running basic_replication.feature only, and mark the
|
||||
full tests as flaky. (Closes: #1017527)
|
||||
|
||||
-- Christoph Berg <myon@debian.org> Thu, 08 Sep 2022 17:04:35 +0200
|
||||
|
||||
patroni (2.1.4-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* debian/patches/pg_rewind_fix_get_guc_value.patch: Removed, no longer
|
||||
needed.
|
||||
* debian/control, debian/tests/control: Replaced python3-boto with
|
||||
python3-boto3.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Thu, 02 Jun 2022 16:58:10 +0200
|
||||
|
||||
patroni (2.1.3-3) unstable; urgency=medium
|
||||
|
||||
* debian/patches/regression_tests_disable_raft_tests.py: Drop unrelated
|
||||
etcd3 validator removal, pointed out by Kirill Petrov.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Fri, 29 Apr 2022 19:17:12 +0200
|
||||
|
||||
patroni (2.1.3-2) unstable; urgency=medium
|
||||
|
||||
* debian/patches/pg_rewind_fix_get_guc_value.patch: New patch, changes the
|
||||
pg_rewind calling behaviour so that it can deal with postgresql.conf not
|
||||
being in the data directory; taken from upstream commit 7626b5f by Nick
|
||||
Bluth.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Thu, 24 Mar 2022 22:22:16 +0100
|
||||
|
||||
patroni (2.1.3-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* debian/patches/regression_tests_disable_requirement_download.patch:
|
||||
Removed, no longer needed.
|
||||
* debian/patches/regression_tests_psutil_compat.patch: Likewise.
|
||||
* debian/config.yml.in: Update configuration:
|
||||
- Set use_pg_rewind, use_slots and check_timeline to true.
|
||||
- Update comments and formatting.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Fri, 18 Feb 2022 22:16:13 +0100
|
||||
|
||||
patroni (2.1.2-3) unstable; urgency=medium
|
||||
|
||||
* debian/patches/regression_tests_psutil_compat.patch: New patch, add
|
||||
compatibility for newer psutil in the regression tests (Closes: #1003562).
|
||||
* debian/changelog: Fix whitespace.
|
||||
* debian/tests/acceptance: Skip standby_cluster/logical_slots_in_sync
|
||||
scenario on v10, as it is not supported there.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Tue, 15 Feb 2022 23:06:15 +0100
|
||||
|
||||
patroni (2.1.2-2) unstable; urgency=medium
|
||||
|
||||
* Team upload.
|
||||
* debian/clean: Remove patroni.egg-info/.
|
||||
* debian/py3dist-overrides: Tell dh_python3 to find "ipaddress" in python3
|
||||
>= 3.3.
|
||||
* debian/tests/control: Mark zookeeper test as skip-not-installable.
|
||||
* debian/tests/acceptance: `set -o pipefail` so failures aren't masked by
|
||||
`ts`.
|
||||
|
||||
-- Christoph Berg <myon@debian.org> Wed, 22 Dec 2021 15:22:09 +0100
|
||||
|
||||
patroni (2.1.2-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
|
@ -8,7 +156,7 @@ patroni (2.1.2-1) unstable; urgency=medium
|
|||
* debian/tests/control: Give Test-Commands meaningful names.
|
||||
|
||||
[ Michael Banck ]
|
||||
* debian/patches/acceptance_tests_system_patroni.patch: Refreshed.
|
||||
* debian/patches/acceptance_tests_system_patroni.patch: Refreshed.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Fri, 03 Dec 2021 17:13:13 +0100
|
||||
|
||||
|
@ -71,7 +219,7 @@ patroni (2.0.1-2) unstable; urgency=medium
|
|||
patroni (2.0.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream major release.
|
||||
* debian/README.Debian: Add note about rewind user.
|
||||
* debian/README.Debian: Add note about rewind user.
|
||||
* debian/patches/offline_intersphinx.patch: Refreshed.
|
||||
* debian/patches/requirements_setuptools.patch: Refreshed.
|
||||
* debian/patches/startup_scripts.patch: Refreshed.
|
||||
|
@ -92,7 +240,7 @@ patroni (1.6.5-5) unstable; urgency=medium
|
|||
in $NETWORK.
|
||||
|
||||
[ Michael Banck ]
|
||||
* debian/config.yml.in: Listen to all interfaces by default.
|
||||
* debian/config.yml.in: Listen to all interfaces by default.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Wed, 26 Aug 2020 15:33:04 +0200
|
||||
|
||||
|
@ -131,7 +279,7 @@ patroni (1.6.5-2) unstable; urgency=medium
|
|||
patroni (1.6.5-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* debian/patches/fix_failing_tests.patch: Removed, no longer needed.
|
||||
* debian/patches/fix_failing_tests.patch: Removed, no longer needed.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Mon, 27 Apr 2020 18:24:43 +0200
|
||||
|
||||
|
@ -153,7 +301,7 @@ patroni (1.6.4-2) unstable; urgency=medium
|
|||
patroni (1.6.4-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* debian/patches/check_postmaster.patch: Removed.
|
||||
* debian/patches/check_postmaster.patch: Removed.
|
||||
* debian/patches/acceptance_tests_system_patroni.patch: Refreshed.
|
||||
* debian/patches/v12_fix_recovery.conf_parameters.patch: Removed, no longer
|
||||
needed.
|
||||
|
@ -224,7 +372,7 @@ patroni (1.6.0-4) unstable; urgency=medium
|
|||
|
||||
patroni (1.6.0-3) unstable; urgency=medium
|
||||
|
||||
* debian/control (patroni/Depends): Added python3-distutils.
|
||||
* debian/control (patroni/Depends): Added python3-distutils.
|
||||
* debian/patches/acceptance_tests_timeouts.patch: New patch, increases a
|
||||
timeout of an often failing autopkgtest test.
|
||||
|
||||
|
@ -280,13 +428,13 @@ patroni (1.5.5-1) unstable; urgency=medium
|
|||
* debian/patches/consul_import.patch: Refreshed.
|
||||
* debian/patches/reclone-unable-pg_rewind.patch: Removed, no longer needed.
|
||||
* debian/config.yml.in: Set use_pg_rewind to false again.
|
||||
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Sat, 16 Feb 2019 07:30:02 +0100
|
||||
|
||||
patroni (1.5.4-8) unstable; urgency=medium
|
||||
|
||||
* debian/pg_createconfig_patroni: Remove debugging output and fix premature
|
||||
exit.
|
||||
exit.
|
||||
* debian/patches/acceptance_tests_coverage_binary.patch: Updated according to
|
||||
upstream feedback.
|
||||
* debian/patches/behave_failure_logging.patch: Likewise.
|
||||
|
@ -457,7 +605,7 @@ patroni (1.5.1-1) unstable; urgency=medium
|
|||
* debian/patches/consul_import.patch: Likewise.
|
||||
* debian/patches/coverage_binary.patch: Likewise.
|
||||
* debian/patches/startup_scripts.patch: Likewise.
|
||||
* debian/pg_createconfig_patroni: New script.
|
||||
* debian/pg_createconfig_patroni: New script.
|
||||
* debian/dcs.yml, debian/config.yml.in: New configuration templates.
|
||||
* debian/patroni.install: Install new script to /usr/bin and configuration
|
||||
templates to /etc/patroni.
|
||||
|
@ -466,7 +614,7 @@ patroni (1.5.1-1) unstable; urgency=medium
|
|||
|
||||
patroni (1.5.0-12) unstable; urgency=medium
|
||||
|
||||
* debian/patroni.install: Install binaries as well.
|
||||
* debian/patroni.install: Install binaries as well.
|
||||
* debian/patches/acceptance_tests_system_patroni.patch: New patch, use the
|
||||
system installed patroni for acceptance tests.
|
||||
|
||||
|
@ -486,7 +634,7 @@ patroni (1.5.0-10) unstable; urgency=medium
|
|||
* debian/patroni.install: Move installation of HTML documentation to ...
|
||||
* debian/patroni-doc.install: ... this new file.
|
||||
* debian/rules (override_dh_installinit): Install init scripts in
|
||||
patroni package only.
|
||||
patroni package only.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Fri, 26 Oct 2018 12:43:07 +0100
|
||||
|
||||
|
@ -532,7 +680,7 @@ patroni (1.5.0-6) unstable; urgency=medium
|
|||
|
||||
patroni (1.5.0-5) unstable; urgency=medium
|
||||
|
||||
* debian/patches/check_postmaster.patch: Update unit tests as well.
|
||||
* debian/patches/check_postmaster.patch: Update unit tests as well.
|
||||
|
||||
-- Michael Banck <michael.banck@credativ.de> Wed, 26 Sep 2018 16:08:50 +0200
|
||||
|
||||
|
@ -547,7 +695,7 @@ patroni (1.5.0-4) unstable; urgency=medium
|
|||
|
||||
patroni (1.5.0-3) unstable; urgency=medium
|
||||
|
||||
* debian/gitlab-ci.yml: New file.
|
||||
* debian/gitlab-ci.yml: New file.
|
||||
* debian/patches/behave_failure_logging.patch: New patch, copy over output
|
||||
directory of a failed feature with `_failed' at the end.
|
||||
* debian/tests/acceptance: Dump logs for failed features.
|
||||
|
|
1
debian/clean
vendored
Normal file
1
debian/clean
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
patroni.egg-info/
|
44
debian/config.yml.in
vendored
44
debian/config.yml.in
vendored
|
@ -26,13 +26,15 @@ bootstrap:
|
|||
pg_createcluster:
|
||||
command: /usr/share/patroni/pg_createcluster_patroni
|
||||
|
||||
# this section will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
|
||||
# and all other cluster members will use it as a `global configuration`
|
||||
# This section will be written into /<namespace>/<scope>/config after
|
||||
# initializing a new cluster and all other cluster members will use it as a
|
||||
# `global configuration`
|
||||
dcs:
|
||||
ttl: 30
|
||||
loop_wait: 10
|
||||
retry_timeout: 10
|
||||
maximum_lag_on_failover: 1048576
|
||||
check_timeline: true
|
||||
# master_start_timeout: 300
|
||||
# synchronous_mode: false
|
||||
# standby_cluster:
|
||||
|
@ -40,10 +42,10 @@ bootstrap:
|
|||
# port: 1111
|
||||
# primary_slot_name: patroni
|
||||
postgresql:
|
||||
use_pg_rewind: false
|
||||
use_pg_rewind: true
|
||||
remove_data_directory_on_rewind_failure: true
|
||||
remove_data_directory_on_diverged_timelines: true
|
||||
# use_slots: true
|
||||
use_slots: true
|
||||
# The following parameters are given as command line options
|
||||
# overriding the settings in postgresql.conf.
|
||||
parameters:
|
||||
|
@ -69,10 +71,16 @@ bootstrap:
|
|||
- host replication all 127.0.0.1/32 md5
|
||||
- host replication all ::1/128 md5
|
||||
- host replication all @NETWORK@ md5
|
||||
# # Some possibly desired options for 'initdb'
|
||||
# initdb: # Note: It needs to be a list (some options need values, others are switches)
|
||||
# # Some possibly desired options for 'initdb'. Note: It needs to be a list
|
||||
# # (some options need values, others are # switches)
|
||||
# initdb:
|
||||
# - encoding: UTF8
|
||||
# - data-checksums
|
||||
|
||||
# # Additional script to be launched after initial cluster creation (will be
|
||||
# # passed the connection URL as parameter)
|
||||
# post_init: /usr/local/bin/setup_cluster.sh
|
||||
|
||||
# # Additional users to be created after initializing the cluster
|
||||
# users:
|
||||
# foo:
|
||||
|
@ -93,10 +101,11 @@ postgresql:
|
|||
# Listen to all interfaces by default, this makes vip-manager work
|
||||
# out-of-the-box without having to set net.ipv4.ip_nonlocal_bind or similar.
|
||||
# If you prefer to only listen on some interfaces, edit the below:
|
||||
#listen: "@HOSTIP@@LISTEN_VIP@,127.0.0.1:@PORT@"
|
||||
# listen: "@HOSTIP@@LISTEN_VIP@,127.0.0.1:@PORT@"
|
||||
listen: "*:@PORT@"
|
||||
connect_address: @HOSTIP@:@PORT@
|
||||
use_unix_socket: true
|
||||
# Default Debian/Ubuntu directory layout
|
||||
data_dir: @DATADIR_BASE@/@VERSION@/@CLUSTER@
|
||||
bin_dir: /usr/lib/postgresql/@VERSION@/bin
|
||||
config_dir: /etc/postgresql/@VERSION@/@CLUSTER@
|
||||
|
@ -105,19 +114,20 @@ postgresql:
|
|||
replication:
|
||||
username: "replicator"
|
||||
password: "rep-pass"
|
||||
# A superuser role is required in order for Patroni to manage the local
|
||||
# Postgres instance. If the option `use_unix_socket' is set to `true', then
|
||||
# specifying an empty password results in no md5 password for the superuser
|
||||
# being set and sockets being used for authentication. The `password:' line is
|
||||
# nevertheless required. Note that pg_rewind will not work if no md5 password
|
||||
# is set.
|
||||
# A superuser role is required in order for Patroni to manage the local
|
||||
# Postgres instance. If the option `use_unix_socket' is set to `true',
|
||||
# then specifying an empty password results in no md5 password for the
|
||||
# superuser being set and sockets being used for authentication. The
|
||||
# `password:' line is nevertheless required. Note that pg_rewind will not
|
||||
# work if no md5 password is set unless a rewind user is configured, see
|
||||
# below.
|
||||
superuser:
|
||||
username: "postgres"
|
||||
password:
|
||||
# A rewind role can be specified in order for Patroni to use on PostgreSQL 11
|
||||
# or later for pg_rewind, i.e. rewinding a former primary after failover
|
||||
# without having to re-clone it. Patroni will assign this user the necessary
|
||||
# permissions (that only exist from PostgreSQL)
|
||||
# A rewind role can be specified in order for Patroni to use on PostgreSQL
|
||||
# 11 or later for pg_rewind, i.e. rewinding a former primary after failover
|
||||
# without having to re-clone it. Patroni will assign this user the
|
||||
# necessary permissions (that only exist from PostgreSQL)
|
||||
# rewind:
|
||||
# username: "rewind"
|
||||
# password: "rewind-pass"
|
||||
|
|
8
debian/control
vendored
8
debian/control
vendored
|
@ -2,7 +2,7 @@ Source: patroni
|
|||
Section: database
|
||||
Priority: optional
|
||||
Maintainer: Debian PostgreSQL Maintainers <team+postgresql@tracker.debian.org>
|
||||
Uploaders: Michael Banck <michael.banck@credativ.de>,
|
||||
Uploaders: Michael Banck <mbanck@debian.org>,
|
||||
Adrian Vondendriesch <adrian.vondendriesch@credativ.de>,
|
||||
Build-Depends:
|
||||
debhelper (>= 10),
|
||||
|
@ -12,7 +12,7 @@ Build-Depends:
|
|||
libjs-underscore,
|
||||
pyflakes3,
|
||||
python3,
|
||||
python3-boto,
|
||||
python3-boto3,
|
||||
python3-cdiff,
|
||||
python3-click (>= 4.1),
|
||||
python3-consul (>= 0.7.0),
|
||||
|
@ -46,9 +46,9 @@ Homepage: https://github.com/zalando/patroni
|
|||
|
||||
Package: patroni
|
||||
Architecture: all
|
||||
Depends: ${misc:Depends}, ${python3:Depends}, lsb-base (>= 3.0-6), python3-psycopg2,
|
||||
Depends: ${misc:Depends}, ${python3:Depends}, python3-psycopg2,
|
||||
python3-etcd (>= 0.4.3) | python3-consul (>= 0.7.0) | python3-kazoo |
|
||||
python3-kubernetes, python3-cdiff
|
||||
python3-kubernetes | python3-pysyncobj, python3-cdiff
|
||||
Recommends: iproute2
|
||||
Suggests: postgresql, etcd-server | consul | zookeeperd, vip-manager, haproxy, patroni-doc
|
||||
Description: PostgreSQL High Availability with ZooKeeper, etcd, Consul, or Kubernetes
|
||||
|
|
|
@ -2,13 +2,12 @@ Index: patroni/features/environment.py
|
|||
===================================================================
|
||||
--- patroni.orig/features/environment.py
|
||||
+++ patroni/features/environment.py
|
||||
@@ -141,8 +141,7 @@ class PatroniController(AbstractControll
|
||||
if isinstance(self._context.dcs_ctl, KubernetesController):
|
||||
self._context.dcs_ctl.create_pod(self._name[8:], self._scope)
|
||||
os.environ['PATRONI_KUBERNETES_POD_IP'] = '10.0.0.' + self._name[-1]
|
||||
- return subprocess.Popen([sys.executable, '-m', 'coverage', 'run',
|
||||
- '--source=patroni', '-p', 'patroni.py', self._config],
|
||||
+ return subprocess.Popen([sys.executable, '-m', 'coverage', 'run', '-p', '/usr/bin/patroni', self._config],
|
||||
stdout=self._log, stderr=subprocess.STDOUT, cwd=self._work_directory)
|
||||
|
||||
def stop(self, kill=False, timeout=15, postgres=False):
|
||||
@@ -150,7 +150,7 @@ class PatroniController(AbstractControll
|
||||
if os.name == 'nt':
|
||||
env['BEHAVE_DEBUG'] = 'true'
|
||||
patroni = subprocess.Popen([sys.executable, '-m', 'coverage', 'run',
|
||||
- '--source=patroni', '-p', 'patroni.py', self._config], env=env,
|
||||
+ '-p', '/usr/bin/patroni', self._config], env=env,
|
||||
stdout=self._log, stderr=subprocess.STDOUT, cwd=self._work_directory)
|
||||
if os.name == 'nt':
|
||||
patroni.terminate = self.terminate
|
||||
|
|
41
debian/patches/avoid_overwriting_configuration_during_boostrap.patch
vendored
Normal file
41
debian/patches/avoid_overwriting_configuration_during_boostrap.patch
vendored
Normal file
|
@ -0,0 +1,41 @@
|
|||
commit a3776e0dfb2f0c5a9e5174f948122b8fb33ceebc
|
||||
Author: Michael Banck <michael.banck@credativ.de>
|
||||
Date: Fri Jul 29 14:55:15 2022 +0200
|
||||
|
||||
Make backup copies of configuration files in config_dir.
|
||||
|
||||
Before, the .backup files were always done in the data directory. However, if
|
||||
there is a distinct configuration directory, it seems logical to put them
|
||||
there. If config_dir is not configured, it defaults back to the data directory,
|
||||
so this will not change things for setups where postgresql.conf is in the data
|
||||
directory.
|
||||
|
||||
On the other hand, it will help with setups where postgresql.conf is outside
|
||||
the data directory and has local changes. In this case, those no longer get
|
||||
overwritten on boostrap/clone from the primary's backup configuration file that
|
||||
is streamed to the boostrapped node.
|
||||
|
||||
Close #2370
|
||||
|
||||
Index: patroni/patroni/postgresql/config.py
|
||||
===================================================================
|
||||
--- patroni.orig/patroni/postgresql/config.py
|
||||
+++ patroni/patroni/postgresql/config.py
|
||||
@@ -355,7 +355,7 @@ class ConfigHandler(object):
|
||||
try:
|
||||
for f in self._configuration_to_save:
|
||||
config_file = os.path.join(self._config_dir, f)
|
||||
- backup_file = os.path.join(self._postgresql.data_dir, f + '.backup')
|
||||
+ backup_file = os.path.join(self._config_dir, f + '.backup')
|
||||
if os.path.isfile(config_file):
|
||||
shutil.copy(config_file, backup_file)
|
||||
except IOError:
|
||||
@@ -367,7 +367,7 @@ class ConfigHandler(object):
|
||||
try:
|
||||
for f in self._configuration_to_save:
|
||||
config_file = os.path.join(self._config_dir, f)
|
||||
- backup_file = os.path.join(self._postgresql.data_dir, f + '.backup')
|
||||
+ backup_file = os.path.join(self._config_dir, f + '.backup')
|
||||
if not os.path.isfile(config_file):
|
||||
if os.path.isfile(backup_file):
|
||||
shutil.copy(backup_file, config_file)
|
|
@ -1,163 +0,0 @@
|
|||
Index: patroni/patroni/validator.py
|
||||
===================================================================
|
||||
--- patroni.orig/patroni/validator.py
|
||||
+++ patroni/patroni/validator.py
|
||||
@@ -53,13 +53,9 @@ def validate_host_port(host_port, listen
|
||||
return True
|
||||
|
||||
|
||||
-def validate_host_port_list(value):
|
||||
- assert all([validate_host_port(v) for v in value]), "didn't pass the validation"
|
||||
- return True
|
||||
-
|
||||
-
|
||||
def comma_separated_host_port(string):
|
||||
- return validate_host_port_list([s.strip() for s in string.split(",")])
|
||||
+ assert all([validate_host_port(s.strip()) for s in string.split(",")]), "didn't pass the validation"
|
||||
+ return True
|
||||
|
||||
|
||||
def validate_host_port_listen(host_port):
|
||||
@@ -295,21 +291,11 @@ def assert_(condition, message="Wrong va
|
||||
|
||||
userattributes = {"username": "", Optional("password"): ""}
|
||||
available_dcs = [m.split(".")[-1] for m in dcs_modules()]
|
||||
-validate_host_port_list.expected_type = list
|
||||
comma_separated_host_port.expected_type = string_types
|
||||
validate_connect_address.expected_type = string_types
|
||||
validate_host_port_listen.expected_type = string_types
|
||||
validate_host_port_listen_multiple_hosts.expected_type = string_types
|
||||
validate_data_dir.expected_type = string_types
|
||||
-validate_etcd = {
|
||||
- Or("host", "hosts", "srv", "srv_suffix", "url", "proxy"): Case({
|
||||
- "host": validate_host_port,
|
||||
- "hosts": Or(comma_separated_host_port, [validate_host_port]),
|
||||
- "srv": str,
|
||||
- "srv_suffix": str,
|
||||
- "url": str,
|
||||
- "proxy": str})
|
||||
-}
|
||||
|
||||
schema = Schema({
|
||||
"name": str,
|
||||
@@ -334,20 +320,19 @@ schema = Schema({
|
||||
"host": validate_host_port,
|
||||
"url": str})
|
||||
},
|
||||
- "etcd": validate_etcd,
|
||||
- "etcd3": validate_etcd,
|
||||
+ "etcd": {
|
||||
+ Or("host", "hosts", "srv", "url", "proxy"): Case({
|
||||
+ "host": validate_host_port,
|
||||
+ "hosts": Or(comma_separated_host_port, [validate_host_port]),
|
||||
+ "srv": str,
|
||||
+ "url": str,
|
||||
+ "proxy": str})
|
||||
+ },
|
||||
"exhibitor": {
|
||||
"hosts": [str],
|
||||
"port": lambda i: assert_(int(i) <= 65535),
|
||||
Optional("pool_interval"): int
|
||||
},
|
||||
- "raft": {
|
||||
- "self_addr": validate_connect_address,
|
||||
- Optional("bind_addr"): validate_host_port_listen,
|
||||
- "partner_addrs": validate_host_port_list,
|
||||
- Optional("data_dir"): str,
|
||||
- Optional("password"): str
|
||||
- },
|
||||
"zookeeper": {
|
||||
"hosts": Or(comma_separated_host_port, [validate_host_port]),
|
||||
},
|
||||
Index: patroni/tests/test_validator.py
|
||||
===================================================================
|
||||
--- patroni.orig/tests/test_validator.py
|
||||
+++ patroni/tests/test_validator.py
|
||||
@@ -33,21 +33,11 @@ config = {
|
||||
"etcd": {
|
||||
"hosts": "127.0.0.1:2379,127.0.0.1:2380"
|
||||
},
|
||||
- "etcd3": {
|
||||
- "url": "https://127.0.0.1:2379"
|
||||
- },
|
||||
"exhibitor": {
|
||||
"hosts": ["string"],
|
||||
"port": 4000,
|
||||
"pool_interval": 1000
|
||||
},
|
||||
- "raft": {
|
||||
- "self_addr": "127.0.0.1:2222",
|
||||
- "bind_addr": "0.0.0.0:2222",
|
||||
- "partner_addrs": ["127.0.0.1:2223", "127.0.0.1:2224"],
|
||||
- "data_dir": "/",
|
||||
- "password": "12345"
|
||||
- },
|
||||
"zookeeper": {
|
||||
"hosts": "127.0.0.1:3379,127.0.0.1:3380"
|
||||
},
|
||||
@@ -149,7 +139,7 @@ class TestValidator(unittest.TestCase):
|
||||
def test_complete_config(self, mock_out, mock_err):
|
||||
schema(config)
|
||||
output = mock_out.getvalue()
|
||||
- self.assertEqual(['postgresql.bin_dir', 'raft.bind_addr', 'raft.self_addr'], parse_output(output))
|
||||
+ self.assertEqual(['postgresql.bin_dir'], parse_output(output))
|
||||
|
||||
def test_bin_dir_is_file(self, mock_out, mock_err):
|
||||
files.append(config["postgresql"]["data_dir"])
|
||||
@@ -161,8 +151,7 @@ class TestValidator(unittest.TestCase):
|
||||
schema(c)
|
||||
output = mock_out.getvalue()
|
||||
self.assertEqual(['etcd.hosts.1', 'etcd.hosts.2', 'kubernetes.pod_ip', 'postgresql.bin_dir',
|
||||
- 'postgresql.data_dir', 'raft.bind_addr', 'raft.self_addr',
|
||||
- 'restapi.connect_address'], parse_output(output))
|
||||
+ 'postgresql.data_dir', 'restapi.connect_address'], parse_output(output))
|
||||
|
||||
@patch('socket.inet_pton', Mock(), create=True)
|
||||
def test_bin_dir_is_empty(self, mock_out, mock_err):
|
||||
@@ -178,8 +167,8 @@ class TestValidator(unittest.TestCase):
|
||||
with patch('patroni.validator.open', mock_open(read_data='9')):
|
||||
schema(c)
|
||||
output = mock_out.getvalue()
|
||||
- self.assertEqual(['consul.host', 'etcd.host', 'postgresql.bin_dir', 'postgresql.data_dir', 'postgresql.listen',
|
||||
- 'raft.bind_addr', 'raft.self_addr', 'restapi.connect_address'], parse_output(output))
|
||||
+ self.assertEqual(['consul.host', 'etcd.host', 'postgresql.bin_dir', 'postgresql.data_dir',
|
||||
+ 'postgresql.listen', 'restapi.connect_address'], parse_output(output))
|
||||
|
||||
@patch('subprocess.check_output', Mock(return_value=b"postgres (PostgreSQL) 12.1"))
|
||||
def test_data_dir_contains_pg_version(self, mock_out, mock_err):
|
||||
@@ -197,7 +186,7 @@ class TestValidator(unittest.TestCase):
|
||||
with patch('patroni.validator.open', mock_open(read_data='12')):
|
||||
schema(config)
|
||||
output = mock_out.getvalue()
|
||||
- self.assertEqual(['raft.bind_addr', 'raft.self_addr'], parse_output(output))
|
||||
+ self.assertEqual([], parse_output(output))
|
||||
|
||||
@patch('subprocess.check_output', Mock(return_value=b"postgres (PostgreSQL) 12.1"))
|
||||
def test_pg_version_missmatch(self, mock_out, mock_err):
|
||||
@@ -212,8 +201,7 @@ class TestValidator(unittest.TestCase):
|
||||
with patch('patroni.validator.open', mock_open(read_data='11')):
|
||||
schema(c)
|
||||
output = mock_out.getvalue()
|
||||
- self.assertEqual(['etcd.hosts', 'postgresql.data_dir',
|
||||
- 'raft.bind_addr', 'raft.self_addr'], parse_output(output))
|
||||
+ self.assertEqual(['etcd.hosts', 'postgresql.data_dir'], parse_output(output))
|
||||
|
||||
@patch('subprocess.check_output', Mock(return_value=b"postgres (PostgreSQL) 12.1"))
|
||||
def test_pg_wal_doesnt_exist(self, mock_out, mock_err):
|
||||
@@ -226,7 +214,7 @@ class TestValidator(unittest.TestCase):
|
||||
with patch('patroni.validator.open', mock_open(read_data='11')):
|
||||
schema(c)
|
||||
output = mock_out.getvalue()
|
||||
- self.assertEqual(['postgresql.data_dir', 'raft.bind_addr', 'raft.self_addr'], parse_output(output))
|
||||
+ self.assertEqual(['postgresql.data_dir'], parse_output(output))
|
||||
|
||||
def test_data_dir_is_empty_string(self, mock_out, mock_err):
|
||||
directories.append(config["postgresql"]["data_dir"])
|
||||
@@ -238,5 +226,5 @@ class TestValidator(unittest.TestCase):
|
||||
c["postgresql"]["bin_dir"] = ""
|
||||
schema(c)
|
||||
output = mock_out.getvalue()
|
||||
- self.assertEqual(['kubernetes', 'postgresql.bin_dir', 'postgresql.data_dir',
|
||||
- 'postgresql.pg_hba', 'raft.bind_addr', 'raft.self_addr'], parse_output(output))
|
||||
+ self.assertEqual(['kubernetes', 'postgresql.bin_dir',
|
||||
+ 'postgresql.data_dir', 'postgresql.pg_hba'], parse_output(output))
|
|
@ -1,12 +0,0 @@
|
|||
Index: patroni/setup.py
|
||||
===================================================================
|
||||
--- patroni.orig/setup.py
|
||||
+++ patroni/setup.py
|
||||
@@ -152,7 +152,6 @@ class PyTest(Command):
|
||||
if not k.startswith(':') or evaluate_marker(k[1:]):
|
||||
requirements.update(v)
|
||||
|
||||
- self.distribution.fetch_build_eggs(list(requirements))
|
||||
self.run_tests()
|
||||
|
||||
|
13
debian/patches/regression_tests_skip_citus_test.patch
vendored
Normal file
13
debian/patches/regression_tests_skip_citus_test.patch
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
--- ./tests/test_citus.py.orig 2023-01-31 09:22:20.849730475 +0100
|
||||
+++ ./tests/test_citus.py 2023-01-31 09:22:46.673632646 +0100
|
||||
@@ -4,7 +4,10 @@
|
||||
from . import BaseTestPostgresql, MockCursor, psycopg_connect, SleepException
|
||||
from .test_ha import get_cluster_initialized_with_leader
|
||||
|
||||
+import unittest
|
||||
|
||||
+
|
||||
+@unittest.skipIf(True, "Citus not tested")
|
||||
@patch('patroni.postgresql.citus.Thread', Mock())
|
||||
@patch('patroni.psycopg.connect', psycopg_connect)
|
||||
class TestCitus(BaseTestPostgresql):
|
4
debian/patches/series
vendored
4
debian/patches/series
vendored
|
@ -2,6 +2,6 @@ startup_scripts.patch
|
|||
acceptance_tests_system_patroni.patch
|
||||
requirements_setuptools.patch
|
||||
offline_intersphinx.patch
|
||||
regression_tests_disable_requirement_download.patch
|
||||
requirements_cdiff.patch
|
||||
regression_tests_disable_raft_tests.py
|
||||
avoid_overwriting_configuration_during_boostrap.patch
|
||||
regression_tests_skip_citus_test.patch
|
||||
|
|
14
debian/patches/startup_scripts.patch
vendored
14
debian/patches/startup_scripts.patch
vendored
|
@ -1,7 +1,5 @@
|
|||
Index: patroni/extras/startup-scripts/patroni
|
||||
===================================================================
|
||||
--- patroni.orig/extras/startup-scripts/patroni
|
||||
+++ patroni/extras/startup-scripts/patroni
|
||||
--- a/extras/startup-scripts/patroni
|
||||
+++ b/extras/startup-scripts/patroni
|
||||
@@ -18,7 +18,7 @@ USER="postgres"
|
||||
GROUP="postgres"
|
||||
|
||||
|
@ -33,10 +31,8 @@ Index: patroni/extras/startup-scripts/patroni
|
|||
exit 1
|
||||
;;
|
||||
esac
|
||||
Index: patroni/extras/startup-scripts/patroni.service
|
||||
===================================================================
|
||||
--- patroni.orig/extras/startup-scripts/patroni.service
|
||||
+++ patroni/extras/startup-scripts/patroni.service
|
||||
--- a/extras/startup-scripts/patroni.service
|
||||
+++ b/extras/startup-scripts/patroni.service
|
||||
@@ -1,9 +1,7 @@
|
||||
-# This is an example systemd config file for Patroni
|
||||
-# You can copy it to "/etc/systemd/system/patroni.service",
|
||||
|
@ -50,7 +46,7 @@ Index: patroni/extras/startup-scripts/patroni.service
|
|||
[Service]
|
||||
Type=simple
|
||||
@@ -17,17 +15,13 @@ EnvironmentFile=-/etc/patroni_env.conf
|
||||
# the default is the user's home directory, and if you want to change it, you must provide an absolute path.
|
||||
# The default is the user's home directory, and if you want to change it, you must provide an absolute path.
|
||||
# WorkingDirectory=/home/sameuser
|
||||
|
||||
-# Where to send early-startup messages from the server
|
||||
|
|
1
debian/py3dist-overrides
vendored
Normal file
1
debian/py3dist-overrides
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
ipaddress python3:any (>= 3.3)
|
42
debian/tests/acceptance
vendored
42
debian/tests/acceptance
vendored
|
@ -1,11 +1,12 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
set -eu
|
||||
|
||||
export LC_ALL=C.UTF-8
|
||||
export LANG=C.UTF-8
|
||||
export TZ=UTC # suppress UnknownTimeZoneError('Etc/UTC',)
|
||||
DCS=$1
|
||||
shift
|
||||
|
||||
if [ $(id -u) -eq 0 ]
|
||||
then
|
||||
|
@ -25,7 +26,7 @@ else
|
|||
fi
|
||||
|
||||
# clean up afterwards
|
||||
trap 'rm -f /tmp/pgpass?; if [ $(id -u) -eq 0 ] && [ -x /etc/init.d/zookeeper ]; then /etc/init.d/zookeeper stop; fi' 0 2 3 15
|
||||
trap 'rm -f /tmp/pgpass?; if [ $(id -u) -eq 0 ] && [ -x /etc/init.d/zookeeper ]; then /etc/init.d/zookeeper stop; fi' EXIT
|
||||
|
||||
# set ETCD_ARCH for ETCD_UNSUPPORTED_ARCH
|
||||
# see https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/supported-platform.md#current-support
|
||||
|
@ -35,10 +36,7 @@ case $DEB_HOST_ARCH in
|
|||
arm64)
|
||||
ETCD_ARCH=arm64
|
||||
;;
|
||||
armel)
|
||||
ETCD_ARCH=arm
|
||||
;;
|
||||
armhf)
|
||||
armel|armhf)
|
||||
ETCD_ARCH=arm
|
||||
;;
|
||||
i386)
|
||||
|
@ -46,9 +44,33 @@ case $DEB_HOST_ARCH in
|
|||
;;
|
||||
esac
|
||||
|
||||
# ensure no etcd server is running.
|
||||
if [ $(id -u) -eq 0 ]
|
||||
then
|
||||
if [ "$DCS" = "etcd" -o "$DCS" = "etcd3" ]
|
||||
then
|
||||
service etcd stop
|
||||
service etcd status || true
|
||||
fi
|
||||
fi
|
||||
|
||||
set -x
|
||||
for PG_VERSION in /usr/lib/postgresql/*; do
|
||||
$SU "ETCD_UNSUPPORTED_ARCH=$ETCD_ARCH DCS=$DCS PATH=/usr/lib/postgresql/$(basename \
|
||||
${PG_VERSION})/bin:$PATH behave | ts" || \
|
||||
(for file in $(ls features/output/*_failed/*); do echo "$file:"; cat $file; done && exit 1)
|
||||
for PG_VERSION in $(ls -1r /usr/lib/postgresql/); do
|
||||
echo "### PostgreSQL $PG_VERSION acceptance-$DCS $@ ###"
|
||||
if [ "${PG_VERSION}" == "10" ]; then
|
||||
SKIP=--tags=-skip
|
||||
else
|
||||
SKIP=
|
||||
fi
|
||||
if ! $SU "set -o pipefail; ETCD_UNSUPPORTED_ARCH=$ETCD_ARCH DCS=$DCS \
|
||||
PATH=/usr/lib/postgresql/${PG_VERSION}/bin:$PATH \
|
||||
behave ${SKIP} $@ | ts"; then
|
||||
for file in features/output/*_failed/*; do
|
||||
case $file in *.journal*) continue ;; esac # skip RAFT journal files
|
||||
echo "$file:"
|
||||
cat $file
|
||||
done
|
||||
exit 1
|
||||
fi
|
||||
echo "### End $PG_VERSION acceptance-$DCS $@ ###"
|
||||
done
|
||||
|
|
73
debian/tests/control
vendored
73
debian/tests/control
vendored
|
@ -1,3 +1,41 @@
|
|||
# etc3
|
||||
Features: test-name=acceptance-etcd3
|
||||
Depends:
|
||||
etcd-server,
|
||||
moreutils,
|
||||
postgresql,
|
||||
python3-behave,
|
||||
python3-coverage,
|
||||
python3-etcd,
|
||||
@,
|
||||
Test-Command: debian/tests/acceptance etcd3
|
||||
Restrictions: allow-stderr, flaky
|
||||
|
||||
# etcd
|
||||
Features: test-name=acceptance-etcd-basic
|
||||
Depends:
|
||||
etcd-server,
|
||||
moreutils,
|
||||
postgresql,
|
||||
python3-behave,
|
||||
python3-coverage,
|
||||
python3-etcd (>= 0.4.3),
|
||||
@,
|
||||
Test-Command: debian/tests/acceptance etcd features/basic_replication.feature
|
||||
Restrictions: needs-root, allow-stderr
|
||||
|
||||
Features: test-name=acceptance-etcd
|
||||
Depends:
|
||||
etcd-server,
|
||||
moreutils,
|
||||
postgresql,
|
||||
python3-behave,
|
||||
python3-coverage,
|
||||
python3-etcd (>= 0.4.3),
|
||||
@,
|
||||
Test-Command: debian/tests/acceptance etcd
|
||||
Restrictions: needs-root, allow-stderr, flaky
|
||||
|
||||
# consul
|
||||
Features: test-name=acceptance-consul
|
||||
Depends:
|
||||
|
@ -9,20 +47,7 @@ Depends:
|
|||
python3-coverage,
|
||||
@,
|
||||
Test-Command: debian/tests/acceptance consul
|
||||
Restrictions: allow-stderr
|
||||
|
||||
# etcd
|
||||
Features: test-name=acceptance-etcd
|
||||
Depends:
|
||||
etcd-server,
|
||||
moreutils,
|
||||
postgresql,
|
||||
python3-behave,
|
||||
python3-coverage,
|
||||
python3-etcd (>= 0.4.3),
|
||||
@,
|
||||
Test-Command: debian/tests/acceptance etcd
|
||||
Restrictions: allow-stderr
|
||||
Restrictions: allow-stderr, flaky, skip-not-installable
|
||||
|
||||
# zookeeper
|
||||
Features: test-name=acceptance-zookeeper
|
||||
|
@ -33,19 +58,33 @@ Depends:
|
|||
python3-behave,
|
||||
python3-coverage,
|
||||
python3-kazoo,
|
||||
procps,
|
||||
@,
|
||||
Test-Command: debian/tests/acceptance zookeeper
|
||||
Restrictions: needs-root, allow-stderr
|
||||
Test-Command: debian/tests/acceptance zookeeper "-e dcs_failsafe_mode"
|
||||
Restrictions: needs-root, allow-stderr, flaky, skip-not-installable
|
||||
|
||||
# raft
|
||||
Features: test-name=acceptance-raft
|
||||
Depends:
|
||||
moreutils,
|
||||
postgresql,
|
||||
python3-behave,
|
||||
python3-coverage,
|
||||
python3-pysyncobj,
|
||||
@,
|
||||
Test-Command: debian/tests/acceptance raft
|
||||
Restrictions: allow-stderr, flaky
|
||||
|
||||
# regression tests
|
||||
Depends:
|
||||
python3-boto,
|
||||
python3-boto3,
|
||||
python3-consul (>= 0.7.0),
|
||||
python3-etcd (>= 0.4.3),
|
||||
python3-flake8,
|
||||
python3-kazoo,
|
||||
python3-kubernetes,
|
||||
python3-mock,
|
||||
python3-pysyncobj,
|
||||
python3-pytest-cov,
|
||||
@,
|
||||
Tests: test
|
||||
|
|
4
debian/tests/test
vendored
4
debian/tests/test
vendored
|
@ -9,8 +9,4 @@ export TZ=UTC # suppress UnknownTimeZoneError('Etc/UTC',)
|
|||
# clean up afterwards
|
||||
trap 'rm -f /tmp/pgpass?' 0 2 3 15
|
||||
|
||||
# remove raft tests for now
|
||||
rm -f tests/test_raft*py
|
||||
rm -f patroni/dcs/raft.py patroni/raft_controller.py
|
||||
|
||||
python3 setup.py test
|
||||
|
|
Loading…
Reference in a new issue