[PKG-Openstack-devel] Bug#900904: magnum: Updates from Ubuntu (python2, autopkgtests)

Corey Bryant corey.bryant at canonical.com
Wed Jun 6 15:38:28 BST 2018


Package: magnum
Version: 6.0.1-2
Severity: normal
Tags: patch
User: ubuntu-devel at lists.ubuntu.com
Usertags: origin-ubuntu cosmic ubuntu-patch

Dear Maintainer,

In Ubuntu, the attached patch was applied to achieve the following:

  * Merge from Debian unstable.  Remaining changes:
    - d/control, d/rules: Add Python 2.7 support and python-magnum package.
    - d/control: Support Python 2.7 first and Python 3.x as alternative.
      magnum-common depends on python-magnum by default and python3-magnum
      as alternative. magnum-api does the same for python-openstackclient.
    - d/control: Drop ${python3:Depends} from magnum-* binary packages
      as it's covered in python3-magnum.
    - d/control: move python(3)-openstackclient dependency from magnum-api
      Depends to python(3)-magnum Depends.
    - d/control: Enable autopkgtest-pkg-python testsuite.
    - d/rules: Add Python 2.7 support.
    - d/rules: Install to package build directories rather than debian/tmp.
    - d/rules: Use pkgos-dh_auto_install instead of python setup.py install.
      This helps name binaries for update-alternatives.
    - d/python(3)-magnum.post*, d/python(3)-magnum.prerm: update-alternatives
      is used to enable correct shebangs for Python binaries.
    - d/python3-magnum.install: Dropped. Not needed.
    - d/tests/*: Add autopkgtests for magnum daemons and shebangs.
    - d/watch: Get tarball from tarballs.openstack.org.

Thanks for considering the patch.


-- System Information:
Debian Release: buster/sid
  APT prefers cosmic
  APT policy: (500, 'cosmic'), (500, 'bionic-security')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.15.0-22-generic (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
-------------- next part --------------
diff -Nru magnum-6.0.1/debian/control magnum-6.0.1/debian/control
--- magnum-6.0.1/debian/control	2018-03-06 17:28:24.000000000 -0500
+++ magnum-6.0.1/debian/control	2018-06-06 10:32:46.000000000 -0400
@@ -9,6 +9,9 @@
  dh-python,
  openstack-pkg-tools (>= 70~),
  po-debconf,
+ python-all,
+ python-pbr (>= 2.0.0),
+ python-setuptools (>= 24.0.0),
  python3-all,
  python3-pbr (>= 2.0.0),
  python3-setuptools (>= 24.0.0),
@@ -16,6 +19,64 @@
 Build-Depends-Indep:
  alembic (>= 0.8.10),
  bandit,
+ python-babel,
+ python-barbicanclient (>= 4.0.0),
+ python-cliff (>= 2.8.0),
+ python-coverage,
+ python-cryptography (>= 1.9),
+ python-decorator (>= 3.4.0),
+ python-doc8,
+ python-docker (>= 2.4.2),
+ python-eventlet,
+ python-fixtures,
+ python-glanceclient (>= 1:2.8.0),
+ python-hacking (>= 0.10.0),
+ python-heatclient (>= 1.10.0),
+ python-iso8601 (>= 0.1.11),
+ python-jsonpatch (>= 1.19+really1.16),
+ python-keystoneauth1 (>= 3.3.0),
+ python-keystoneclient (>= 3.8.0),
+ python-keystonemiddleware (>= 4.17.0),
+ python-kubernetes (>= 4.0.0),
+ python-marathon (>= 0.8.6),
+ python-mock,
+ python-netaddr (>= 0.7.13),
+ python-neutronclient (>= 1:6.3.0),
+ python-novaclient (>= 2:9.1.0),
+ python-openstackdocstheme (>= 1.17.0),
+ python-os-api-ref (>= 1.4.0),
+ python-os-testr (>= 1.0.0),
+ python-oslo.concurrency (>= 3.20.0),
+ python-oslo.config (>= 1:5.1.0),
+ python-oslo.context (>= 2.19.2),
+ python-oslo.db (>= 4.27.0),
+ python-oslo.i18n (>= 3.15.3),
+ python-oslo.log (>= 3.30.0),
+ python-oslo.messaging (>= 5.29.0),
+ python-oslo.middleware (>= 3.31.0),
+ python-oslo.policy (>= 1.30.0),
+ python-oslo.reports (>= 1.18.0),
+ python-oslo.serialization (>= 2.18.0),
+ python-oslo.service (>= 1.24.0),
+ python-oslo.utils (>= 3.33.0),
+ python-oslo.versionedobjects (>= 1.28.0),
+ python-oslotest (>= 1:1.10.0),
+ python-osprofiler (>= 1.4.0),
+ python-pecan,
+ python-pep8,
+ python-pycadf (>= 1.1.0),
+ python-requests (>= 2.14.2),
+ python-six,
+ python-sqlalchemy,
+ python-stevedore (>= 1.20.0),
+ python-taskflow (>= 2.7.0),
+ python-testscenarios,
+ python-testtools (>= 2.2.0),
+ python-tz,
+ python-webob (>= 1.7.1),
+ python-werkzeug,
+ python-wsme (>= 0.8),
+ python-yaml,
  python3-babel,
  python3-barbicanclient (>= 4.0.0),
  python3-cliff (>= 2.8.0),
@@ -77,20 +138,19 @@
  subunit,
  testrepository,
 Standards-Version: 4.1.3
 Vcs-Browser: https://salsa.debian.org/openstack-team/services/magnum
 Vcs-Git: https://salsa.debian.org/openstack-team/services/magnum.git
 Homepage: https://github.com/openstack/magnum
+Testsuite: autopkgtest-pkg-python
 
 Package: magnum-api
 Architecture: all
 Depends:
  adduser,
  magnum-common (= ${binary:Version}),
- python3-openstackclient,
  q-text-as-data,
  ${misc:Depends},
  ${ostack-lsb-base},
- ${python3:Depends},
 Description: OpenStack containers as a service
  Magnum is an OpenStack project which offers container orchestration engines
  for deploying and managing containers as first class resources in OpenStack.
@@ -109,9 +169,8 @@
  adduser,
  dbconfig-common,
  debconf,
- python3-magnum (= ${binary:Version}),
+ python-magnum (= ${binary:Version}) | python3-magnum (= ${binary:Version}),
  ${misc:Depends},
- ${python3:Depends},
 Description: OpenStack containers as a service - API server
  Magnum is an OpenStack project which offers container orchestration engines
  for deploying and managing containers as first class resources in OpenStack.
@@ -131,7 +190,6 @@
  magnum-common (= ${binary:Version}),
  ${misc:Depends},
  ${ostack-lsb-base},
- ${python3:Depends},
 Description: OpenStack containers as a service - conductor
  Magnum is an OpenStack project which offers container orchestration engines
  for deploying and managing containers as first class resources in OpenStack.
@@ -144,6 +202,74 @@
  .
  This package contains the conductor server.
 
+Package: python-magnum
+Section: python
+Architecture: all
+Depends:
+ alembic (>= 0.8.10),
+ python-babel,
+ python-barbicanclient (>= 4.0.0),
+ python-cliff (>= 2.8.0),
+ python-cryptography (>= 1.9),
+ python-decorator (>= 3.4.0),
+ python-docker (>= 2.4.2),
+ python-eventlet,
+ python-glanceclient (>= 1:2.8.0),
+ python-heatclient (>= 1.10.0),
+ python-iso8601 (>= 0.1.11),
+ python-jsonpatch (>= 1.19+really1.16),
+ python-keystoneauth1 (>= 3.3.0),
+ python-keystoneclient (>= 3.8.0),
+ python-keystonemiddleware (>= 4.17.0),
+ python-kubernetes (>= 4.0.0),
+ python-marathon (>= 0.8.6),
+ python-netaddr (>= 0.7.13),
+ python-neutronclient (>= 1:6.3.0),
+ python-novaclient (>= 2:9.1.0),
+ python-openstackclient,
+ python-oslo.concurrency (>= 3.20.0),
+ python-oslo.config (>= 1:5.1.0),
+ python-oslo.context (>= 2.19.2),
+ python-oslo.db (>= 4.27.0),
+ python-oslo.i18n (>= 3.15.3),
+ python-oslo.log (>= 3.30.0),
+ python-oslo.messaging (>= 5.29.0),
+ python-oslo.middleware (>= 3.31.0),
+ python-oslo.policy (>= 1.30.0),
+ python-oslo.reports (>= 1.18.0),
+ python-oslo.serialization (>= 2.18.0),
+ python-oslo.service (>= 1.24.0),
+ python-oslo.utils (>= 3.33.0),
+ python-oslo.versionedobjects (>= 1.28.0),
+ python-pbr (>= 2.0.0),
+ python-pecan,
+ python-pycadf (>= 1.1.0),
+ python-requests (>= 2.14.2),
+ python-setuptools (>= 24.0.0),
+ python-six,
+ python-sqlalchemy,
+ python-stevedore (>= 1.20.0),
+ python-taskflow (>= 2.7.0),
+ python-webob (>= 1.7.1),
+ python-werkzeug,
+ python-wsme (>= 0.8),
+ python-yaml,
+ ${misc:Depends},
+ ${python:Depends},
+Conflicts:
+ python3-magnum,
+Description: OpenStack containers as a service - Python 2.7 library
+ Magnum is an OpenStack project which offers container orchestration engines
+ for deploying and managing containers as first class resources in OpenStack.
+ It features:
+  * Abstractions for bays, containers, nodes, pods, replication controllers,
+    and services
+  * Integration with Kubernetes and Docker for backend container technology
+  * Integration with Keystone for multi-tenant security
+  * Integration with Neutron for Kubernetes multi-tenancy network security
+ .
+ This package contains the Python 2.7 code.
+
 Package: python3-magnum
 Section: python
 Architecture: all
@@ -168,6 +294,7 @@
  python3-netaddr (>= 0.7.13),
  python3-neutronclient (>= 1:6.3.0),
  python3-novaclient (>= 2:9.1.0),
+ python3-openstackclient,
  python3-oslo.concurrency (>= 3.20.0),
  python3-oslo.config (>= 1:5.1.0),
  python3-oslo.context (>= 2.19.2),
@@ -199,7 +326,7 @@
  ${python3:Depends},
 Conflicts:
  python-magnum,
-Description: OpenStack containers as a service - Python library
+Description: OpenStack containers as a service - Python 3.x library
  Magnum is an OpenStack project which offers container orchestration engines
  for deploying and managing containers as first class resources in OpenStack.
  It features:
@@ -209,4 +336,4 @@
   * Integration with Keystone for multi-tenant security
   * Integration with Neutron for Kubernetes multi-tenancy network security
  .
- This package contains the Python code.
+ This package contains the Python 3.x code.
diff -Nru magnum-6.0.1/debian/python3-magnum.postinst magnum-6.0.1/debian/python3-magnum.postinst
--- magnum-6.0.1/debian/python3-magnum.postinst	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/python3-magnum.postinst	2018-06-02 05:52:18.000000000 -0400
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "configure" ] ; then
+	update-alternatives --install /usr/bin/magnum-api magnum-api /usr/bin/python3-magnum-api 200
+	update-alternatives --install /usr/bin/magnum-conductor magnum-conductor /usr/bin/python3-magnum-conductor 200
+	update-alternatives --install /usr/bin/magnum-db-manage magnum-db-manage /usr/bin/python3-magnum-db-manage 200
+	update-alternatives --install /usr/bin/magnum-driver-manage magnum-driver-manage /usr/bin/python3-magnum-driver-manage 200
+fi
+
+#DEBHELPER#
+
+exit 0
diff -Nru magnum-6.0.1/debian/python3-magnum.postrm magnum-6.0.1/debian/python3-magnum.postrm
--- magnum-6.0.1/debian/python3-magnum.postrm	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/python3-magnum.postrm	2018-05-31 20:36:52.000000000 -0400
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "remove" ] || [ "$1" = "disappear" ] ; then
+	update-alternatives --remove magnum-api /usr/bin/python3-magnum-api
+	update-alternatives --remove magnum-conductor /usr/bin/python3-magnum-conductor
+	update-alternatives --remove magnum-db-manage /usr/bin/python3-magnum-db-manage
+	update-alternatives --remove magnum-driver-manage /usr/bin/python3-magnum-driver-manage
+fi
+
+#DEBHELPER#
+
+exit 0
diff -Nru magnum-6.0.1/debian/python3-magnum.prerm magnum-6.0.1/debian/python3-magnum.prerm
--- magnum-6.0.1/debian/python3-magnum.prerm	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/python3-magnum.prerm	2018-05-31 20:38:18.000000000 -0400
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "remove" ] ; then
+	update-alternatives --remove magnum-api /usr/bin/python3-magnum-api
+	update-alternatives --remove magnum-conductor /usr/bin/python3-magnum-conductor
+	update-alternatives --remove magnum-db-manage /usr/bin/python3-magnum-db-manage
+	update-alternatives --remove magnum-driver-manage /usr/bin/python3-magnum-driver-manage
+fi
+
+#DEBHELPER#
+
+exit 0
diff -Nru magnum-6.0.1/debian/python-magnum.postinst magnum-6.0.1/debian/python-magnum.postinst
--- magnum-6.0.1/debian/python-magnum.postinst	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/python-magnum.postinst	2018-06-02 05:52:08.000000000 -0400
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "configure" ] ; then
+	update-alternatives --install /usr/bin/magnum-api magnum-api /usr/bin/python2-magnum-api 200
+	update-alternatives --install /usr/bin/magnum-conductor magnum-conductor /usr/bin/python2-magnum-conductor 200
+	update-alternatives --install /usr/bin/magnum-db-manage magnum-db-manage /usr/bin/python2-magnum-db-manage 200
+	update-alternatives --install /usr/bin/magnum-driver-manage magnum-driver-manage /usr/bin/python2-magnum-driver-manage 200
+fi
+
+#DEBHELPER#
+
+exit 0
diff -Nru magnum-6.0.1/debian/python-magnum.postrm magnum-6.0.1/debian/python-magnum.postrm
--- magnum-6.0.1/debian/python-magnum.postrm	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/python-magnum.postrm	2018-05-31 20:36:26.000000000 -0400
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "remove" ] || [ "$1" = "disappear" ] ; then
+	update-alternatives --remove magnum-api /usr/bin/python2-magnum-api
+	update-alternatives --remove magnum-conductor /usr/bin/python2-magnum-conductor
+	update-alternatives --remove magnum-db-manage /usr/bin/python2-magnum-db-manage
+	update-alternatives --remove magnum-driver-manage /usr/bin/python2-magnum-driver-manage
+fi
+
+#DEBHELPER#
+
+exit 0
diff -Nru magnum-6.0.1/debian/python-magnum.prerm magnum-6.0.1/debian/python-magnum.prerm
--- magnum-6.0.1/debian/python-magnum.prerm	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/python-magnum.prerm	2018-05-31 20:37:55.000000000 -0400
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "remove" ] ; then
+	update-alternatives --remove magnum-api /usr/bin/python2-magnum-api
+	update-alternatives --remove magnum-conductor /usr/bin/python2-magnum-conductor
+	update-alternatives --remove magnum-db-manage /usr/bin/python2-magnum-db-manage
+	update-alternatives --remove magnum-driver-manage /usr/bin/python2-magnum-driver-manage
+fi
+
+#DEBHELPER#
+
+exit 0
diff -Nru magnum-6.0.1/debian/rules magnum-6.0.1/debian/rules
--- magnum-6.0.1/debian/rules	2018-03-06 17:28:24.000000000 -0500
+++ magnum-6.0.1/debian/rules	2018-06-06 10:02:41.000000000 -0400
@@ -3,7 +3,7 @@
 include /usr/share/openstack-pkg-tools/pkgos.make
 
 %:
-	dh $@ --buildsystem=python_distutils --with python3,systemd,sphinxdoc
+	dh $@ --buildsystem=python_distutils --with python2,python3,systemd,sphinxdoc
 
 override_dh_clean:
 	rm -f debian/magnum-common.config debian/magnum-common.postinst debian/magnum-api.config debian/magnum-api.postinst
@@ -13,6 +13,7 @@
 	echo "Do nothing..."
 
 override_dh_auto_clean:
+	python2 setup.py clean
 	python3 setup.py clean
 
 override_dh_auto_test:
@@ -27,18 +28,17 @@
 	pkgos-merge-templates magnum-common magnum db rabbit ksat
 
 override_dh_install:
-	for i in $(PYTHON3S) ; do \
-		python$$i setup.py install --install-layout=deb --root=$(CURDIR)/debian/tmp ; \
-	done
-	rm -rf $(CURDIR)/debian/tmp/usr/etc
+	pkgos-dh_auto_install
+	rm -rf $(CURDIR)/debian/python-magnum/usr/etc
+	rm -rf $(CURDIR)/debian/python3-magnum/usr/etc
 
 ifeq (,$(findstring nocheck, $(DEB_BUILD_OPTIONS)))
-	pkgos-dh_auto_test --no-py2
+	pkgos-dh_auto_test
 endif
 
 	dh_install --fail-missing
 	mkdir -p $(CURDIR)/debian/magnum-common/usr/share/magnum-common
-	PYTHONPATH=$(CURDIR)/debian/tmp/usr/lib/python3/dist-packages python3-oslo-config-generator \
+	PYTHONPATH=$(CURDIR)/debian/python3-magnum/usr/lib/python3/dist-packages python3-oslo-config-generator \
 		--output-file $(CURDIR)/debian/magnum-common/usr/share/magnum-common/magnum.conf \
 		--namespace magnum.conf \
 		--namespace oslo.concurrency \
@@ -61,7 +61,7 @@
 
 	pkgos-fix-config-default $(CURDIR)/debian/magnum-common/usr/share/magnum-common/magnum.conf api host 0.0.0.0
 
-	PYTHONPATH=$(CURDIR)/debian/tmp/usr/lib/python3/dist-packages python3-oslopolicy-sample-generator \
+	PYTHONPATH=$(CURDIR)/debian/python3-magnum/usr/lib/python3/dist-packages python3-oslopolicy-sample-generator \
 		--output-file $(CURDIR)/debian/magnum-common/usr/share/magnum-common/policy.json \
 		--format json \
 		--namespace magnum
diff -Nru magnum-6.0.1/debian/tests/control magnum-6.0.1/debian/tests/control
--- magnum-6.0.1/debian/tests/control	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/tests/control	2018-06-04 22:19:48.000000000 -0400
@@ -0,0 +1,7 @@
+Tests: magnum-daemons, magnum-shebangs-py2
+Depends: magnum-common, magnum-api, magnum-conductor
+Restrictions: needs-root
+
+Tests: magnum-daemons, magnum-shebangs-py3
+Depends: python3-magnum, magnum-common, magnum-api, magnum-conductor
+Restrictions: needs-root
diff -Nru magnum-6.0.1/debian/tests/magnum-daemons magnum-6.0.1/debian/tests/magnum-daemons
--- magnum-6.0.1/debian/tests/magnum-daemons	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/tests/magnum-daemons	2018-06-05 09:45:06.000000000 -0400
@@ -0,0 +1,29 @@
+#!/bin/bash
+#---------------------
+# Testing magnum-daemons
+#---------------------
+set -e
+
+DAEMONS=('magnum-api' 'magnum-conductor')
+
+ret=0
+
+for daemon in "${DAEMONS[@]}"; do
+    TIMEOUT=50
+    while [ "$TIMEOUT" -gt 0 ]; do
+        if systemctl is-active $daemon > /dev/null; then
+            echo "OK"
+            break
+        fi
+        TIMEOUT=$((TIMEOUT - 1))
+        sleep 0.1
+    done
+
+    if [ "$TIMEOUT" -le 0 ]; then
+        echo "ERROR: ${daemon} IS NOT RUNNING"
+        ret=1
+    fi
+done
+
+exit $ret
+
diff -Nru magnum-6.0.1/debian/tests/magnum-shebangs-py2 magnum-6.0.1/debian/tests/magnum-shebangs-py2
--- magnum-6.0.1/debian/tests/magnum-shebangs-py2	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/tests/magnum-shebangs-py2	2018-06-06 09:34:51.000000000 -0400
@@ -0,0 +1,17 @@
+#!/bin/bash
+#---------------------
+# Testing /usr/bin/magnum-* shebangs
+#---------------------
+set -e
+
+BINARIES=('magnum-api' 'magnum-conductor' 'magnum-db-manage' 'magnum-driver-manage')
+
+ret=0
+
+for binary in "${BINARIES[@]}"; do
+    if ! `dirname $0`/test-shebang.py $binary python2.7; then
+        ret=1
+    fi
+done
+
+exit $ret
diff -Nru magnum-6.0.1/debian/tests/magnum-shebangs-py3 magnum-6.0.1/debian/tests/magnum-shebangs-py3
--- magnum-6.0.1/debian/tests/magnum-shebangs-py3	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/tests/magnum-shebangs-py3	2018-06-06 09:34:44.000000000 -0400
@@ -0,0 +1,17 @@
+#!/bin/bash
+#---------------------
+# Testing /usr/bin/magnum-* shebangs
+#---------------------
+set -e
+
+BINARIES=('magnum-api' 'magnum-conductor' 'magnum-db-manage' 'magnum-driver-manage')
+
+ret=0
+
+for binary in "${BINARIES[@]}"; do
+    if ! `dirname $0`/test-shebang.py $binary python3; then
+        ret=1
+    fi
+done
+
+exit $ret
diff -Nru magnum-6.0.1/debian/tests/test-shebang.py magnum-6.0.1/debian/tests/test-shebang.py
--- magnum-6.0.1/debian/tests/test-shebang.py	1969-12-31 19:00:00.000000000 -0500
+++ magnum-6.0.1/debian/tests/test-shebang.py	2018-06-06 08:46:36.000000000 -0400
@@ -0,0 +1,19 @@
+#!/usr/bin/env python3
+"""
+Test Python shebang in /usr/bin/ binary
+"""
+import sys
+
+ret = 0
+bin_path = "/usr/bin/{}".format(sys.argv[1])
+shebang = "#!/usr/bin/{}".format(sys.argv[2])
+
+with open(bin_path) as f:
+    first_line = f.readline().rstrip().replace(" ", "")
+    if first_line != shebang:
+        print("ERROR: shebang '{}' not found in {}".format(shebang, bin_path))
+        ret = 1
+    else:
+        print("OK")
+
+sys.exit(ret)
diff -Nru magnum-6.0.1/debian/watch magnum-6.0.1/debian/watch
--- magnum-6.0.1/debian/watch	2018-03-06 17:28:24.000000000 -0500
+++ magnum-6.0.1/debian/watch	2018-05-31 16:55:48.000000000 -0400
@@ -1,3 +1,3 @@
 version=3
 opts="uversionmangle=s/\.(b|rc)/~$1/" \
-https://github.com/openstack/magnum/tags .*/(\d[\d\.]+)\.tar\.gz
+http://tarballs.openstack.org/magnum magnum-(\d.*)\.tar\.gz


More information about the Openstack-devel mailing list