← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~cjwatson/lp-archive:pylibmc into lp-archive:main

 

Colin Watson has proposed merging ~cjwatson/lp-archive:pylibmc into lp-archive:main.

Commit message:
Require pylibmc

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~cjwatson/lp-archive/+git/lp-archive/+merge/436318

Needed so that `Flask-Caching` can talk to `memcached`.

Dependencies MP: https://code.launchpad.net/~cjwatson/lp-archive/+git/dependencies/+merge/436316
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~cjwatson/lp-archive:pylibmc into lp-archive:main.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b3ae251
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,89 @@
+SERVICE_PACKAGE = lp_archive
+ENV = $(CURDIR)/env
+WHEELS = $(CURDIR)/wheels
+PYTHON3 = $(ENV)/bin/python3
+PIP = $(PYTHON3) -m pip
+TMPDIR = $(CURDIR)/tmp
+BIND ?= 0.0.0.0:8000
+GUNICORN = $(ENV)/bin/talisker
+
+# development config
+export SERVICE_CONFIG = $(CURDIR)/service.conf
+
+GITREF ?= $(shell git symbolic-ref HEAD)
+GITHASH ?= $(shell git rev-parse $(or $(TAG),$(GITREF)))
+ifndef GITHASH
+    $(error "There was no reference '$(GITREF)' found.")
+endif
+GITTAGS ?= $(shell git tag)
+
+DEPENDENCY_REPO ?= lp:~launchpad/lp-archive/+git/dependencies
+DEPENDENCY_DIR ?= $(TMPDIR)/dependencies
+
+# Create archives in labelled directories (e.g.
+# <rev-id>/$(PROJECT_NAME).tar.gz)
+TARBALL_BUILD_LABEL ?= $(shell git rev-parse HEAD)
+TARBALL_FILE_NAME = lp-archive.tar.gz
+TARBALL_BUILDS_DIR ?= build
+TARBALL_BUILD_DIR = $(TARBALL_BUILDS_DIR)/$(TARBALL_BUILD_LABEL)
+TARBALL_BUILD_PATH = $(TARBALL_BUILD_DIR)/$(TARBALL_FILE_NAME)
+
+SWIFT_CONTAINER_NAME ?= lp-archive-builds
+# This must match the object path used by fetch_payload in the ols charm
+# layer.
+SWIFT_OBJECT_PATH = \
+	lp-archive-builds/$(TARBALL_BUILD_LABEL)/$(TARBALL_FILE_NAME)
+
+
+$(ENV): | $(DEPENDENCY_DIR)
+	/usr/bin/virtualenv $(ENV) --python=python3
+	$(PIP) install -f $(DEPENDENCY_DIR) --no-index -r requirements.txt -e .
+	git rev-parse HEAD >version-info.txt
+	@touch $@
+
+$(DEPENDENCY_DIR):
+	git clone $(DEPENDENCY_REPO) $(DEPENDENCY_DIR)
+
+.PHONY: update-dependencies
+update-dependencies: $(DEPENDENCY_DIR)
+	cd $(DEPENDENCY_DIR) && git pull $(DEPENDENCY_REPO)
+
+.PHONY: bootstrap
+bootstrap: $(ENV)
+
+.PHONY: clean
+clean:
+	rm -rf $(ENV) $(WHEELS) version-info.txt
+	rm -rf $(TMPDIR)
+	find -name '__pycache__' -print0 | xargs -0 rm -rf
+	find -name '*.~*' -delete
+
+.PHONY: run
+run: $(ENV)
+	DEVEL=1 $(GUNICORN) --reload --log-level debug -b $(BIND) $(SERVICE_PACKAGE)
+
+# XXX cjwatson 2023-01-09: limit to only interesting files
+.PHONY: build-tarball
+build-tarball:
+	@echo "Creating deployment tarball at $(TARBALL_BUILD_PATH)"
+	rm -rf $(ENV)
+	$(MAKE) $(ENV)
+	$(PIP) wheel -f $(DEPENDENCY_DIR) --no-index \
+		-w $(WHEELS) -r requirements.txt
+	mkdir -p $(TARBALL_BUILD_DIR)
+	tar -czf $(TARBALL_BUILD_PATH) \
+		--exclude-vcs \
+		--exclude .tox \
+		--exclude build \
+		--exclude charm \
+		--exclude dist \
+		--exclude env \
+		--exclude tmp \
+		./
+
+.PHONY: publish-tarball
+publish-tarball: build-tarball
+	[ ! -e ~/.config/swift/lp-archive ] || . ~/.config/swift/lp-archive; \
+	./publish-to-swift --debug \
+		$(SWIFT_CONTAINER_NAME) $(SWIFT_OBJECT_PATH) \
+		$(TARBALL_BUILD_PATH)
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..72753c7
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,47 @@
+lp-archive
+==========
+
+A frontend service to serve Launchpad archives (such as the primary Ubuntu
+archive or PPAs) over HTTP without the need for local storage of the archive
+files.
+
+
+Development environment
+-----------------------
+
+To run tests, use ``tox``.
+
+Running a local development server requires some setup and can only be done
+if you have privileged access to a suitable Launchpad environment.
+Launchpad staff can start by setting up an SSH tunnel to the "dogfood"
+environment, in a separate terminal::
+
+    $ ssh -L 8097:xmlrpc.dogfood.lp.internal:8097 labbu.canonical.com
+
+Add ``127.0.0.1 xmlrpc.dogfood.lp.internal`` to ``/etc/hosts`` on your
+development system to fool it into connecting via this tunnel.
+
+You'll then need a ``config.toml`` file telling ``lp-archive`` what URL
+layout to expose.  For example:
+
+.. code-block:: toml
+
+    ARCHIVE_ENDPOINT = "http://xmlrpc.dogfood.lp.internal:8097/archive";
+    CACHE_TYPE = "SimpleCache"
+
+    [[LAYOUTS]]
+    host = "snapshot.ubuntu.test:8000"
+    purpose = "primary"
+
+    [[LAYOUTS]]
+    host = "snapshot.ppa.test:8000"
+    purpose = "ppa"
+
+Start the service::
+
+    $ make run
+
+You should now be able to make HTTP requests.  The host name is significant,
+so the simplest way is to use ``curl --resolve``.  For example::
+
+    $ curl --resolve snapshot.ubuntu.test:8000:127.0.0.1 -L http://snapshot.ubuntu.test:8000/ubuntu/dists/focal/InRelease
diff --git a/requirements.in b/requirements.in
index 6124191..031ffc8 100644
--- a/requirements.in
+++ b/requirements.in
@@ -1,4 +1,5 @@
 Flask
 Flask-Caching
+pylibmc
 talisker[flask,gunicorn]
 tomli; python_version < "3.11"
diff --git a/requirements.txt b/requirements.txt
index 08a238b..36a4f52 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -33,6 +33,8 @@ markupsafe==2.1.1
     # via
     #   jinja2
     #   werkzeug
+pylibmc==1.6.3
+    # via -r requirements.in
 requests==2.28.1
     # via talisker
 statsd==3.3.0
diff --git a/setup.cfg b/setup.cfg
index d9772fe..ff25f38 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -19,6 +19,7 @@ packages = find:
 install_requires =
     Flask
     Flask-Caching
+    pylibmc
     talisker[flask,gunicorn]
     tomli;python_version < "3.11"
 python_requires = >=3.10

References