Compare commits

...

71 Commits

Author SHA1 Message Date
Jose Diaz-Gonzalez
4cffb97b38 Release 1.37.6
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2024-07-18 19:20:47 -04:00
Jose Diaz-Gonzalez
cb8334e8dd Release 1.37.5
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2024-06-30 13:48:03 -04:00
Jose Diaz-Gonzalez
1c291d68d4 Merge pull request #243 from dokku/dependabot/docker/redis-7.2.5
chore(deps): bump redis from 7.2.4 to 7.2.5
2024-06-30 13:47:54 -04:00
dependabot[bot]
0d171fa06e ---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-29 07:50:54 +00:00
Jose Diaz-Gonzalez
38721a896d Merge pull request #246 from dokku/exclude-SC1091
tests: exclude SC1091 from shellcheck rules
2024-06-29 03:49:05 -04:00
Jose Diaz-Gonzalez
c7bce9872a tests: exclude SC1091 from shellcheck rules 2024-06-29 03:45:01 -04:00
Jose Diaz-Gonzalez
61bee552d1 Merge pull request #245 from dokku/fix-tests
fix: use .DNSNames instead of .Aliases in tests
2024-06-29 03:41:16 -04:00
Jose Diaz-Gonzalez
b35f5443f2 fix: use .DNSNames instead of .Aliases in tests
Docker has changed their output in an unclear manner, but this is the correct way to check for what dns records are available for usage by apps.
2024-06-29 03:25:41 -04:00
Jose Diaz-Gonzalez
c3a6e3af3c Release 1.37.4
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2024-01-29 10:10:11 -05:00
Jose Diaz-Gonzalez
14c0a11f3a Merge pull request #221 from nerg4l/fix/make-ubuntu-arm64
fix: use correct repository on arm64 ubuntu image
2024-01-29 10:05:52 -05:00
Jose Diaz-Gonzalez
944329c818 Release 1.37.3
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2024-01-29 08:31:26 -05:00
Jose Diaz-Gonzalez
b942ff35f0 Merge pull request #231 from dokku/dependabot/docker/redis-7.2.4
chore(deps): bump redis from 7.2.3 to 7.2.4
2024-01-29 08:31:08 -05:00
dependabot[bot]
4425dc2f29 chore(deps): bump redis from 7.2.3 to 7.2.4
Bumps redis from 7.2.3 to 7.2.4.

---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-10 15:31:32 +00:00
Jose Diaz-Gonzalez
2295773982 Merge pull request #230 from dokku/dependabot/github_actions/actions/upload-artifact-4
chore(deps): bump actions/upload-artifact from 3 to 4
2023-12-19 00:23:44 -05:00
dependabot[bot]
20c92de6c7 chore(deps): bump actions/upload-artifact from 3 to 4
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-15 15:20:29 +00:00
László GÖRÖG
d90f3bb02a Merge branch 'master' into fix/make-ubuntu-arm64 2023-12-10 10:22:06 +01:00
Jose Diaz-Gonzalez
78a1cb36ed Release 1.37.2
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-12-09 23:56:16 -05:00
Jose Diaz-Gonzalez
a30dd2e727 docs: update docs and generation script 2023-12-09 23:55:46 -05:00
Jose Diaz-Gonzalez
d52e58f623 Merge pull request #229 from dokku/dependabot/github_actions/actions/setup-python-5
chore(deps): bump actions/setup-python from 4 to 5
2023-12-09 13:53:44 -05:00
Jose Diaz-Gonzalez
eb46fc4ae0 Merge pull request #228 from dokku/dependabot/docker/redis-7.2.3
chore(deps): bump redis from 7.2.1 to 7.2.3
2023-12-09 13:53:34 -05:00
Jose Diaz-Gonzalez
99c812fc2f chore: fix typo 2023-12-09 13:51:12 -05:00
Jose Diaz-Gonzalez
0d75a8e46f chore: fix typo 2023-12-09 13:48:37 -05:00
dependabot[bot]
ea92f11ab6 chore(deps): bump actions/setup-python from 4 to 5
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-06 15:16:41 +00:00
dependabot[bot]
61ed70c5df chore(deps): bump redis from 7.2.1 to 7.2.3
Bumps redis from 7.2.1 to 7.2.3.

---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-06 15:06:59 +00:00
Jose Diaz-Gonzalez
2c2042535a Release 1.37.1
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-09-09 22:41:22 -04:00
Jose Diaz-Gonzalez
c5139b9169 Release 1.37.0
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-09-09 22:40:00 -04:00
Jose Diaz-Gonzalez
28dbf6bcd9 Merge pull request #225 from dokku/dependabot/docker/redis-7.2.1
chore(deps): bump redis from 7.2.0 to 7.2.1
2023-09-09 22:35:18 -04:00
dependabot[bot]
c4a7504881 chore(deps): bump redis from 7.2.0 to 7.2.1
Bumps redis from 7.2.0 to 7.2.1.

---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-08 15:38:16 +00:00
Jose Diaz-Gonzalez
5bbbfd1cc9 Merge pull request #223 from dokku/dependabot/github_actions/actions/checkout-4
chore(deps): bump actions/checkout from 3 to 4
2023-09-06 23:45:02 -04:00
dependabot[bot]
1e2125c800 chore(deps): bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-07 02:55:29 +00:00
Jose Diaz-Gonzalez
afe76f799a Merge pull request #224 from dokku/newer-ubuntu
feat: upgrade test suite from ubuntu 20.04 to 22.04
2023-09-06 22:54:43 -04:00
Jose Diaz-Gonzalez
648d137007 feat: upgrade test suite from ubuntu 20.04 to 22.04 2023-09-06 22:37:22 -04:00
Jose Diaz-Gonzalez
9a95ed8299 Release 1.36.0
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-08-17 19:57:06 -04:00
Jose Diaz-Gonzalez
f66c0d945e Merge pull request #222 from dokku/dependabot/docker/redis-7.2.0
chore(deps): bump redis from 7.0.12 to 7.2.0
2023-08-17 19:56:55 -04:00
dependabot[bot]
8a65d7c1cd chore(deps): bump redis from 7.0.12 to 7.2.0
Bumps redis from 7.0.12 to 7.2.0.

---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-17 15:58:01 +00:00
László GÖRÖG
3ad35ef009 fix: use correct repository on arm64 ubuntu image 2023-08-07 17:37:30 +02:00
Jose Diaz-Gonzalez
f8b3c5eb42 Release 1.35.0
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-07-11 16:50:04 -04:00
Jose Diaz-Gonzalez
62e24bdb71 Merge pull request #218 from dokku/dependabot/docker/redis-7.0.12
chore(deps): bump redis from 7.0.11 to 7.0.12
2023-07-11 16:49:48 -04:00
dependabot[bot]
d5a87c21f5 chore(deps): bump redis from 7.0.11 to 7.0.12
Bumps redis from 7.0.11 to 7.0.12.

---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-11 15:38:12 +00:00
Jose Diaz-Gonzalez
9776ebdf6a Release 1.34.0
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-05-28 01:00:06 -04:00
Jose Diaz-Gonzalez
7be49f9bbe Release 1.32.4
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-04-27 21:59:57 -04:00
josegonzalez
5aa50b86e5 Merge pull request #216 from dokku/dependabot/docker/redis-7.0.11
chore(deps): bump redis from 7.0.10 to 7.0.11
2023-04-27 21:59:46 -04:00
dependabot[bot]
6783620cd7 chore(deps): bump redis from 7.0.10 to 7.0.11
Bumps redis from 7.0.10 to 7.0.11.

---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-18 15:57:49 +00:00
Jose Diaz-Gonzalez
38278ab9d9 Release 1.32.3
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-03-21 16:16:27 -04:00
Jose Diaz-Gonzalez
e04200a99c Release 1.32.2
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-03-21 13:28:50 -04:00
josegonzalez
ea3781cd28 Merge pull request #215 from dokku/dependabot/docker/redis-7.0.10
chore(deps): bump redis from 7.0.9 to 7.0.10
2023-03-21 13:28:23 -04:00
dependabot[bot]
cf59cac18a chore(deps): bump redis from 7.0.9 to 7.0.10
Bumps redis from 7.0.9 to 7.0.10.

---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-21 16:02:35 +00:00
Jose Diaz-Gonzalez
e76a457c74 Release 1.32.1
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-03-19 05:30:41 -04:00
josegonzalez
8b653f74b0 Merge pull request #214 from dokku/dependabot/docker/redis-7.0.9
chore(deps): bump redis from 7.0.8 to 7.0.9
2023-03-19 05:30:31 -04:00
dependabot[bot]
57f7b138f4 chore(deps): bump redis from 7.0.8 to 7.0.9
Bumps redis from 7.0.8 to 7.0.9.

---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 16:00:16 +00:00
Jose Diaz-Gonzalez
a443bc7912 Release 1.32.0
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-02-25 22:13:23 -05:00
josegonzalez
b1d94ed87a Merge pull request #213 from dokku/error-when-link-exists
Show an error when an ambassador container already exists but we don't have expose configuration
2023-02-25 22:12:05 -05:00
Jose Diaz-Gonzalez
352794aa05 fix: show an error when an ambassador container already exists but we don't have expose configuration
Closes dokku/dokku-redis#200
2023-02-25 20:10:37 -05:00
Jose Diaz-Gonzalez
2369ebf94a Release 1.31.0
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-02-25 02:23:31 -05:00
josegonzalez
ac78cb842c Merge pull request #211 from dokku/no-restart-link
Add ability to skip restarts on link and unlink
2023-02-25 02:13:18 -05:00
Jose Diaz-Gonzalez
a902165547 fix: update link docs to remove erroneous copy-paste 2023-02-25 01:50:30 -05:00
Jose Diaz-Gonzalez
dbaa985fe6 tests: link service before unlinking 2023-02-25 00:47:26 -05:00
Jose Diaz-Gonzalez
5e78f7d1e5 chore: remove extra newline 2023-02-21 00:49:18 -05:00
Jose Diaz-Gonzalez
b3747635b2 fix: update tests to properly handle case where app is not running 2023-02-21 00:48:23 -05:00
Jose Diaz-Gonzalez
3154beb12d fix: move arg-less flags to the front 2023-02-21 00:29:30 -05:00
Jose Diaz-Gonzalez
3cb6d2fe7b tests: add output/status and flesh out restart tests a bit more 2023-02-21 00:08:53 -05:00
Jose Diaz-Gonzalez
577d73e7f0 tests: add test for --no-restart to link tests 2023-02-20 23:51:28 -05:00
Jose Diaz-Gonzalez
6b39dea20e tests: add test for --no-restart to unlink tests 2023-02-20 23:47:03 -05:00
Jose Diaz-Gonzalez
ba0f46a8b5 chore: make all the service names used in the service_unlink tests the same 2023-02-20 23:40:09 -05:00
Jose Diaz-Gonzalez
673fc4c9bb chore: make all the service names used in the service_link tests the same 2023-02-20 23:35:12 -05:00
Jose Diaz-Gonzalez
3c6b6e1c0f feat: add ability to skip restarts on link and unlink
Refs dokku/dokku-redis#192
2023-02-20 23:26:44 -05:00
Jose Diaz-Gonzalez
9fd0ede9f3 Release 1.30.1
Some checks failed
tagged-release / tagged-release (push) Has been cancelled
2023-02-09 03:12:27 -05:00
Jose Diaz-Gonzalez
7fb98d7cfc fix: drop extra files from being included in release 2023-02-09 03:07:31 -05:00
josegonzalez
4da3491a6c Merge pull request #210 from dokku/auto-release-tags
feat: automatically create releases from tags
2023-02-09 03:03:10 -05:00
Jose Diaz-Gonzalez
79d204a682 feat: automatically create releases from tags
This will also include release notes, allowing downstream consumers of plugins to better understand what the release includes.
2023-02-09 03:00:43 -05:00
Jose Diaz-Gonzalez
9a6b80c837 Release 1.30.0 2023-02-09 00:47:48 -05:00
20 changed files with 441 additions and 180 deletions

View File

@@ -17,16 +17,16 @@ concurrency:
jobs: jobs:
unit-tests-master: unit-tests-master:
name: unit-tests name: unit-tests
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
env: env:
DOKKU_VERSION: master DOKKU_VERSION: master
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.7.x' python-version: '3.7.x'
@@ -51,7 +51,7 @@ jobs:
- run: make test - run: make test
- uses: actions/upload-artifact@v3 - uses: actions/upload-artifact@v4
if: failure() if: failure()
with: with:
name: tmp/test-results name: tmp/test-results
@@ -59,16 +59,16 @@ jobs:
unit-tests-0_19_0: unit-tests-0_19_0:
name: unit-tests-0.19.0 name: unit-tests-0.19.0
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
env: env:
DOKKU_TAG: v0.19.0 DOKKU_TAG: v0.19.0
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- uses: actions/setup-python@v4 - uses: actions/setup-python@v5
with: with:
python-version: '3.7.x' python-version: '3.7.x'
@@ -93,7 +93,7 @@ jobs:
- run: make test - run: make test
- uses: actions/upload-artifact@v3 - uses: actions/upload-artifact@v4
if: failure() if: failure()
with: with:
name: tmp/test-results name: tmp/test-results

19
.github/workflows/tagged-release.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
---
name: "tagged-release"
# yamllint disable-line rule:truthy
on:
push:
tags:
- '*'
jobs:
tagged-release:
name: tagged-release
runs-on: ubuntu-22.04
steps:
- uses: "marvinpinto/action-automatic-releases@v1.2.1"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: false

View File

@@ -1 +1 @@
FROM redis:7.0.8 FROM redis:7.2.5

View File

@@ -1,5 +1,6 @@
HARDWARE = $(shell uname -m) HARDWARE = $(shell uname -m)
SYSTEM_NAME = $(shell uname -s | tr '[:upper:]' '[:lower:]') SYSTEM_NAME = $(shell uname -s | tr '[:upper:]' '[:lower:]')
ARCH = $(shell dpkg --print-architecture)
SHFMT_VERSION = 3.0.2 SHFMT_VERSION = 3.0.2
XUNIT_TO_GITHUB_VERSION = 0.3.0 XUNIT_TO_GITHUB_VERSION = 0.3.0
XUNIT_READER_VERSION = 0.1.0 XUNIT_READER_VERSION = 0.1.0
@@ -21,7 +22,11 @@ ifneq ($(shell shellcheck --version >/dev/null 2>&1 ; echo $$?),0)
ifeq ($(SYSTEM_NAME),darwin) ifeq ($(SYSTEM_NAME),darwin)
brew install shellcheck brew install shellcheck
else else
sudo add-apt-repository 'deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse' ifeq ($(ARCH),arm64)
sudo add-apt-repository 'deb http://ports.ubuntu.com/ubuntu-ports jammy-backports main restricted universe multiverse'
else
sudo add-apt-repository 'deb http://archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse'
endif
sudo rm -rf /var/lib/apt/lists/* && sudo apt-get clean sudo rm -rf /var/lib/apt/lists/* && sudo apt-get clean
sudo apt-get update -qq && sudo apt-get install -qq -y shellcheck sudo apt-get update -qq && sudo apt-get install -qq -y shellcheck
endif endif

View File

@@ -1,6 +1,6 @@
# dokku redis [![Build Status](https://img.shields.io/github/actions/workflow/status/dokku/dokku-redis/ci.yml?branch=master&style=flat-square "Build Status")](https://github.com/dokku/dokku-redis/actions/workflows/ci.yml?query=branch%3Amaster) [![IRC Network](https://img.shields.io/badge/irc-libera-blue.svg?style=flat-square "IRC Libera")](https://webchat.libera.chat/?channels=dokku) # dokku redis [![Build Status](https://img.shields.io/github/actions/workflow/status/dokku/dokku-redis/ci.yml?branch=master&style=flat-square "Build Status")](https://github.com/dokku/dokku-redis/actions/workflows/ci.yml?query=branch%3Amaster) [![IRC Network](https://img.shields.io/badge/irc-libera-blue.svg?style=flat-square "IRC Libera")](https://webchat.libera.chat/?channels=dokku)
Official redis plugin for dokku. Currently defaults to installing [redis 7.0.8](https://hub.docker.com/_/redis/). Official redis plugin for dokku. Currently defaults to installing [redis 7.2.5](https://hub.docker.com/_/redis/).
## Requirements ## Requirements
@@ -74,9 +74,9 @@ flags:
- `-m|--memory MEMORY`: container memory limit in megabytes (default: unlimited) - `-m|--memory MEMORY`: container memory limit in megabytes (default: unlimited)
- `-N|--initial-network INITIAL_NETWORK`: the initial network to attach the service to - `-N|--initial-network INITIAL_NETWORK`: the initial network to attach the service to
- `-p|--password PASSWORD`: override the user-level service password - `-p|--password PASSWORD`: override the user-level service password
- `-P|--post-create-network NETWORKS`: a comman-separated list of networks to attach the service container to after service creation - `-P|--post-create-network NETWORKS`: a comma-separated list of networks to attach the service container to after service creation
- `-r|--root-password PASSWORD`: override the root-level service password - `-r|--root-password PASSWORD`: override the root-level service password
- `-S|--post-start-network NETWORKS`: a comman-separated list of networks to attach the service container to after service start - `-S|--post-start-network NETWORKS`: a comma-separated list of networks to attach the service container to after service start
- `-s|--shm-size SHM_SIZE`: override shared memory size for redis docker container - `-s|--shm-size SHM_SIZE`: override shared memory size for redis docker container
Create a redis service named lollipop: Create a redis service named lollipop:
@@ -93,7 +93,7 @@ export REDIS_IMAGE_VERSION="${PLUGIN_IMAGE_VERSION}"
dokku redis:create lollipop dokku redis:create lollipop
``` ```
You can also specify custom environment variables to start the redis service in semi-colon separated form. You can also specify custom environment variables to start the redis service in semicolon-separated form.
```shell ```shell
export REDIS_CUSTOM_ENV="USER=alpha;HOST=beta" export REDIS_CUSTOM_ENV="USER=alpha;HOST=beta"
@@ -151,7 +151,7 @@ dokku redis:info lollipop --version
```shell ```shell
# usage # usage
dokku redis:list dokku redis:list
``` ```
List all services: List all services:
@@ -200,6 +200,7 @@ flags:
- `-a|--alias "BLUE_DATABASE"`: an alternative alias to use for linking to an app via environment variable - `-a|--alias "BLUE_DATABASE"`: an alternative alias to use for linking to an app via environment variable
- `-q|--querystring "pool=5"`: ampersand delimited querystring arguments to append to the service link - `-q|--querystring "pool=5"`: ampersand delimited querystring arguments to append to the service link
- `-n|--no-restart "false"`: whether or not to restart the app on link (default: true)
A redis service can be linked to a container. This will use native docker links via the docker-options plugin. Here we link it to our `playground` app. A redis service can be linked to a container. This will use native docker links via the docker-options plugin. Here we link it to our `playground` app.
@@ -252,6 +253,10 @@ redis2://:SOME_PASSWORD@dokku-redis-lollipop:6379
dokku redis:unlink <service> <app> dokku redis:unlink <service> <app>
``` ```
flags:
- `-n|--no-restart "false"`: whether or not to restart the app on unlink (default: true)
You can unlink a redis service: You can unlink a redis service:
> NOTE: this will restart your app and unset related environment variables > NOTE: this will restart your app and unset related environment variables
@@ -452,9 +457,9 @@ flags:
- `-i|--image IMAGE`: the image name to start the service with - `-i|--image IMAGE`: the image name to start the service with
- `-I|--image-version IMAGE_VERSION`: the image version to start the service with - `-I|--image-version IMAGE_VERSION`: the image version to start the service with
- `-N|--initial-network INITIAL_NETWORK`: the initial network to attach the service to - `-N|--initial-network INITIAL_NETWORK`: the initial network to attach the service to
- `-P|--post-create-network NETWORKS`: a comman-separated list of networks to attach the service container to after service creation - `-P|--post-create-network NETWORKS`: a comma-separated list of networks to attach the service container to after service creation
- `-R|--restart-apps "true"`: whether to force an app restart - `-R|--restart-apps "true"`: whether or not to force an app restart (default: false)
- `-S|--post-start-network NETWORKS`: a comman-separated list of networks to attach the service container to after service start - `-S|--post-start-network NETWORKS`: a comma-separated list of networks to attach the service container to after service start
- `-s|--shm-size SHM_SIZE`: override shared memory size for redis docker container - `-s|--shm-size SHM_SIZE`: override shared memory size for redis docker container
You can upgrade an existing service to a new image or image-version: You can upgrade an existing service to a new image or image-version:
@@ -496,9 +501,9 @@ flags:
- `-m|--memory MEMORY`: container memory limit in megabytes (default: unlimited) - `-m|--memory MEMORY`: container memory limit in megabytes (default: unlimited)
- `-N|--initial-network INITIAL_NETWORK`: the initial network to attach the service to - `-N|--initial-network INITIAL_NETWORK`: the initial network to attach the service to
- `-p|--password PASSWORD`: override the user-level service password - `-p|--password PASSWORD`: override the user-level service password
- `-P|--post-create-network NETWORKS`: a comman-separated list of networks to attach the service container to after service creation - `-P|--post-create-network NETWORKS`: a comma-separated list of networks to attach the service container to after service creation
- `-r|--root-password PASSWORD`: override the root-level service password - `-r|--root-password PASSWORD`: override the root-level service password
- `-S|--post-start-network NETWORKS`: a comman-separated list of networks to attach the service container to after service start - `-S|--post-start-network NETWORKS`: a comma-separated list of networks to attach the service container to after service start
- `-s|--shm-size SHM_SIZE`: override shared memory size for redis docker container - `-s|--shm-size SHM_SIZE`: override shared memory size for redis docker container
You can clone an existing service to a new one: You can clone an existing service to a new one:

2
Vagrantfile vendored
View File

@@ -1,7 +1,7 @@
# -*- mode: ruby -*- # -*- mode: ruby -*-
# vi: set ft=ruby : # vi: set ft=ruby :
BOX_NAME = ENV["BOX_NAME"] || "bento/ubuntu-20.04" BOX_NAME = ENV["BOX_NAME"] || "bento/ubuntu-22.04"
BOX_MEMORY = ENV["BOX_MEMORY"] || "2048" BOX_MEMORY = ENV["BOX_MEMORY"] || "2048"
DOKKU_VERSION = "master" DOKKU_VERSION = "master"

View File

@@ -1,15 +1,30 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import print_function from __future__ import print_function
import os import os
import re import re
def compile(service, version, variable, alias, image, scheme, ports, sponsors, options, unimplemented, dokku_version): def compile(
prefix = "\n\n".join([ service,
header(service), version,
description(service, image, version), variable,
]) alias,
image,
scheme,
ports,
sponsors,
options,
unimplemented,
dokku_version,
):
prefix = "\n\n".join(
[
header(service),
description(service, image, version),
]
)
if len(sponsors) > 0: if len(sponsors) > 0:
prefix += "\n\n" prefix += "\n\n"
@@ -21,8 +36,19 @@ def compile(service, version, variable, alias, image, scheme, ports, sponsors, o
prefix, prefix,
requirements_section(dokku_version), requirements_section(dokku_version),
installation_section(service, dokku_version), installation_section(service, dokku_version),
commands_section(service, variable, alias, image, scheme, ports, unimplemented), commands_section(
usage_section(service, variable, alias, image, scheme, ports, options, unimplemented), service, variable, alias, image, scheme, ports, unimplemented
),
usage_section(
service,
variable,
alias,
image,
scheme,
ports,
options,
unimplemented,
),
] ]
) )
.replace("\n\n\n\n\n", "\n") .replace("\n\n\n\n\n", "\n")
@@ -55,17 +81,25 @@ def sponsors_section(service, sponsors):
if len(sponsors) == 0: if len(sponsors) == 0:
return "" return ""
sponsor_data = ["## Sponsors", "", f"The {service} plugin was generously sponsored by the following:", ""] sponsor_data = [
"## Sponsors",
"",
f"The {service} plugin was generously sponsored by the following:",
"",
]
sponsor_data.extend([f"- [{s}](https://github.com/{s})" for s in sponsors]) sponsor_data.extend([f"- [{s}](https://github.com/{s})" for s in sponsors])
return "\n".join( return "\n".join(sponsor_data)
sponsor_data
)
def requirements_section(dokku_version): def requirements_section(dokku_version):
return "\n".join( return "\n".join(
["## Requirements", "", f"- dokku {dokku_version}", "- docker 1.8.x",] [
"## Requirements",
"",
f"- dokku {dokku_version}",
"- docker 1.8.x",
]
) )
@@ -115,17 +149,31 @@ def commands_section(service, variable, alias, image, scheme, ports, unimplement
return "\n".join(content) return "\n".join(content)
def usage_section(service, variable, alias, image, scheme, ports, options, unimplemented): def usage_section(
service, variable, alias, image, scheme, ports, options, unimplemented
):
return "\n\n".join( return "\n\n".join(
[ [
"## Usage", "## Usage",
f"Help for any commands can be displayed by specifying the command as an argument to {service}:help. Plugin help output in conjunction with any files in the `docs/` folder is used to generate the plugin documentation. Please consult the `{service}:help` command for any undocumented commands.", f"Help for any commands can be displayed by specifying the command as an argument to {service}:help. Plugin help output in conjunction with any files in the `docs/` folder is used to generate the plugin documentation. Please consult the `{service}:help` command for any undocumented commands.",
usage_intro(service, variable, alias, image, scheme, ports, options, unimplemented), usage_intro(
usage_lifecycle(service, variable, alias, image, scheme, ports, options, unimplemented), service, variable, alias, image, scheme, ports, options, unimplemented
usage_automation(service, variable, alias, image, scheme, ports, options, unimplemented), ),
usage_data_management(service, variable, alias, image, scheme, ports, options, unimplemented), usage_lifecycle(
usage_backup(service, variable, alias, image, scheme, ports, options, unimplemented), service, variable, alias, image, scheme, ports, options, unimplemented
usage_docker_pull(service, variable, alias, image, scheme, ports, options, unimplemented), ),
usage_automation(
service, variable, alias, image, scheme, ports, options, unimplemented
),
usage_data_management(
service, variable, alias, image, scheme, ports, options, unimplemented
),
usage_backup(
service, variable, alias, image, scheme, ports, options, unimplemented
),
usage_docker_pull(
service, variable, alias, image, scheme, ports, options, unimplemented
),
] ]
) )
@@ -135,11 +183,22 @@ def usage_intro(service, variable, alias, image, scheme, ports, options, unimple
content = ["### Basic Usage"] content = ["### Basic Usage"]
return fetch_commands_content( return fetch_commands_content(
service, variable, alias, image, scheme, ports, options, unimplemented, commands, content service,
variable,
alias,
image,
scheme,
ports,
options,
unimplemented,
commands,
content,
) )
def usage_lifecycle(service, variable, alias, image, scheme, ports, options, unimplemented): def usage_lifecycle(
service, variable, alias, image, scheme, ports, options, unimplemented
):
commands = [ commands = [
"connect", "connect",
"enter", "enter",
@@ -160,11 +219,22 @@ def usage_lifecycle(service, variable, alias, image, scheme, ports, options, uni
] ]
return fetch_commands_content( return fetch_commands_content(
service, variable, alias, image, scheme, ports, options, unimplemented, commands, content service,
variable,
alias,
image,
scheme,
ports,
options,
unimplemented,
commands,
content,
) )
def usage_automation(service, variable, alias, image, scheme, ports, options, unimplemented): def usage_automation(
service, variable, alias, image, scheme, ports, options, unimplemented
):
commands = ["app-links", "clone", "exists", "linked", "links"] commands = ["app-links", "clone", "exists", "linked", "links"]
content = [ content = [
"### Service Automation", "### Service Automation",
@@ -174,11 +244,22 @@ def usage_automation(service, variable, alias, image, scheme, ports, options, un
] ]
return fetch_commands_content( return fetch_commands_content(
service, variable, alias, image, scheme, ports, options, unimplemented, commands, content service,
variable,
alias,
image,
scheme,
ports,
options,
unimplemented,
commands,
content,
) )
def usage_data_management(service, variable, alias, image, scheme, ports, options, unimplemented): def usage_data_management(
service, variable, alias, image, scheme, ports, options, unimplemented
):
commands = ["import", "export"] commands = ["import", "export"]
content = [ content = [
"### Data Management", "### Data Management",
@@ -188,11 +269,22 @@ def usage_data_management(service, variable, alias, image, scheme, ports, option
] ]
return fetch_commands_content( return fetch_commands_content(
service, variable, alias, image, scheme, ports, options, unimplemented, commands, content service,
variable,
alias,
image,
scheme,
ports,
options,
unimplemented,
commands,
content,
) )
def usage_backup(service, variable, alias, image, scheme, ports, options, unimplemented): def usage_backup(
service, variable, alias, image, scheme, ports, options, unimplemented
):
commands = [ commands = [
"backup-auth", "backup-auth",
"backup-deauth", "backup-deauth",
@@ -215,11 +307,22 @@ def usage_backup(service, variable, alias, image, scheme, ports, options, unimpl
] ]
return fetch_commands_content( return fetch_commands_content(
service, variable, alias, image, scheme, ports, options, unimplemented, commands, content service,
variable,
alias,
image,
scheme,
ports,
options,
unimplemented,
commands,
content,
) )
def usage_docker_pull(service, variable, alias, image, scheme, ports, options, unimplemented): def usage_docker_pull(
service, variable, alias, image, scheme, ports, options, unimplemented
):
service_prefix = service.upper() service_prefix = service.upper()
return "\n".join( return "\n".join(
[ [
@@ -233,11 +336,30 @@ def usage_docker_pull(service, variable, alias, image, scheme, ports, options, u
def fetch_commands_content( def fetch_commands_content(
service, variable, alias, image, scheme, ports, options, unimplemented, commands, content service,
variable,
alias,
image,
scheme,
ports,
options,
unimplemented,
commands,
content,
): ):
i = 0 i = 0
for command in commands: for command in commands:
output = command_help(command, service, variable, alias, image, scheme, ports, options, unimplemented) output = command_help(
command,
service,
variable,
alias,
image,
scheme,
ports,
options,
unimplemented,
)
if output == "": if output == "":
continue continue
content.append(output) content.append(output)
@@ -275,7 +397,9 @@ def parse_args(line):
return " ".join(arguments) return " ".join(arguments)
def command_help(command, service, variable, alias, image, scheme, ports, options, unimplemented): def command_help(
command, service, variable, alias, image, scheme, ports, options, unimplemented
):
if command in unimplemented: if command in unimplemented:
return "" return ""
@@ -285,7 +409,7 @@ def command_help(command, service, variable, alias, image, scheme, ports, option
"", "",
"```shell", "```shell",
"# usage", "# usage",
f"dokku {service}:{command} {data['arguments_string']}", f"dokku {service}:{command} {data['arguments_string']}".strip(),
"```", "```",
] ]
@@ -442,11 +566,11 @@ def process_sentence(sentence_lines):
parts = [] parts = []
for word in sentence.strip().split(" "): for word in sentence.strip().split(" "):
if word.isupper() and len(word) > 1: if word.isupper() and len(word) > 1:
for ending in [':', '.']: for ending in [":", "."]:
if word.endswith(ending): if word.endswith(ending):
word = '`{0}`{1}'.format(word[:-1], ending) word = "`{0}`{1}".format(word[:-1], ending)
else: else:
word = '`{0}`'.format(word) word = "`{0}`".format(word)
parts.append(word) parts.append(word)
text.append(" ".join(parts)) text.append(" ".join(parts))
@@ -491,10 +615,10 @@ def main():
with open("Dockerfile") as f: with open("Dockerfile") as f:
for line in f.readlines(): for line in f.readlines():
if "FROM " in line: if "FROM " in line:
image, version = line.split(" ")[1].split(":") image, version = line.split(" ")[1].split(":")
image = image.strip() image = image.strip()
version = version.strip() version = version.strip()
with open("config") as f: with open("config") as f:
for line in f.readlines(): for line in f.readlines():
@@ -524,10 +648,22 @@ def main():
with open("plugin.toml") as f: with open("plugin.toml") as f:
for line in f.readlines(): for line in f.readlines():
if line.startswith("sponsors"): if line.startswith("sponsors"):
sponsors = re.search("\[([\"\w\s,_-]+)\]", line).group(1) sponsors = re.search('\[(["\w\s,_-]+)\]', line).group(1)
sponsors = [s.strip("\"") for s in sponsors.split(",")] sponsors = [s.strip('"') for s in sponsors.split(",")]
text = compile(service, version, variable, alias, image, scheme, ports, sponsors, options, unimplemented, "0.19.x+") text = compile(
service,
version,
variable,
alias,
image,
scheme,
ports,
sponsors,
options,
unimplemented,
"0.19.x+",
)
base_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) base_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
readme_file = os.path.join(base_path, "README.md") readme_file = os.path.join(base_path, "README.md")

View File

@@ -62,7 +62,7 @@ fn-services-list() {
[[ -d $f ]] || continue [[ -d $f ]] || continue
services+=("$f") services+=("$f")
done done
popd &>/dev/null || pushd "/tmp" >/dev/null popd >/dev/null 2>&1 || pushd "/tmp" >/dev/null
if [[ "${#services[@]}" -eq 0 ]]; then if [[ "${#services[@]}" -eq 0 ]]; then
return return
@@ -282,7 +282,7 @@ service_backup() {
BACKUP_TMPDIR=$(mktemp -d --tmpdir) BACKUP_TMPDIR=$(mktemp -d --tmpdir)
trap 'rm -rf "$BACKUP_TMPDIR" > /dev/null' RETURN INT TERM EXIT trap 'rm -rf "$BACKUP_TMPDIR" > /dev/null' RETURN INT TERM EXIT
"$DOCKER_BIN" container inspect "$ID" &>/dev/null || dokku_log_fail "Service container does not exist" "$DOCKER_BIN" container inspect "$ID" >/dev/null 2>&1 || dokku_log_fail "Service container does not exist"
is_container_status "$ID" "Running" || dokku_log_fail "Service container is not running" is_container_status "$ID" "Running" || dokku_log_fail "Service container is not running"
(service_export "$SERVICE" >"${BACKUP_TMPDIR}/export") (service_export "$SERVICE" >"${BACKUP_TMPDIR}/export")
@@ -457,7 +457,7 @@ service_container_rm() {
local ID local ID
service_pause "$SERVICE" service_pause "$SERVICE"
ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "name=^/$SERVICE_NAME$") || true
# this may be 'true' in tests... # this may be 'true' in tests...
if [[ -z "$ID" ]] || [[ "$ID" == "true" ]]; then if [[ -z "$ID" ]] || [[ "$ID" == "true" ]]; then
return 0 return 0
@@ -483,7 +483,7 @@ service_enter() {
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ID="$(cat "$SERVICE_ROOT/ID")" local ID="$(cat "$SERVICE_ROOT/ID")"
"$DOCKER_BIN" container inspect "$ID" &>/dev/null || dokku_log_fail "Service container does not exist" "$DOCKER_BIN" container inspect "$ID" >/dev/null 2>&1 || dokku_log_fail "Service container does not exist"
is_container_status "$ID" "Running" || dokku_log_fail "Service container is not running" is_container_status "$ID" "Running" || dokku_log_fail "Service container is not running"
local EXEC_CMD="" local EXEC_CMD=""
@@ -631,8 +631,9 @@ service_link() {
fi fi
[[ -n "$SERVICE_QUERYSTRING" ]] && SERVICE_URL="${SERVICE_URL}?${SERVICE_QUERYSTRING}" [[ -n "$SERVICE_QUERYSTRING" ]] && SERVICE_URL="${SERVICE_URL}?${SERVICE_QUERYSTRING}"
plugn trigger service-action post-link "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$APP" plugn trigger service-action post-link "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$APP"
if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]]; then if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]] || [[ "$SERVICE_RESTART_APPS" == "false" ]]; then
config_set --no-restart "$APP" "${ALIAS}_URL=$SERVICE_URL" config_set --no-restart "$APP" "${ALIAS}_URL=$SERVICE_URL"
dokku_log_verbose "Skipping restart of linked app"
else else
config_set "$APP" "${ALIAS}_URL=$SERVICE_URL" config_set "$APP" "${ALIAS}_URL=$SERVICE_URL"
fi fi
@@ -690,7 +691,7 @@ service_logs() {
DOKKU_LOGS_ARGS+=" --follow" DOKKU_LOGS_ARGS+=" --follow"
fi fi
"$DOCKER_BIN" container inspect "$ID" &>/dev/null || dokku_log_fail "Service container does not exist" "$DOCKER_BIN" container inspect "$ID" >/dev/null 2>&1 || dokku_log_fail "Service container does not exist"
is_container_status "$ID" "Running" || dokku_log_warn "Service logs may not be output as service is not running" is_container_status "$ID" "Running" || dokku_log_warn "Service logs may not be output as service is not running"
# shellcheck disable=SC2086 # shellcheck disable=SC2086
@@ -714,6 +715,7 @@ service_parse_args() {
"--initial-network") set -- "$@" "-N" ;; "--initial-network") set -- "$@" "-N" ;;
"--image") set -- "$@" "-i" ;; "--image") set -- "$@" "-i" ;;
"--memory") set -- "$@" "-m" ;; "--memory") set -- "$@" "-m" ;;
"--no-restart") set -- "$@" "-n" ;;
"--password") set -- "$@" "-p" ;; "--password") set -- "$@" "-p" ;;
"--post-create-network") set -- "$@" "-P" ;; "--post-create-network") set -- "$@" "-P" ;;
"--post-start-network") set -- "$@" "-S" ;; "--post-start-network") set -- "$@" "-S" ;;
@@ -727,7 +729,7 @@ service_parse_args() {
done done
OPTIND=1 OPTIND=1
while getopts "a:c:C:d:i:I:m:n:N:p:P:q:R:r:s:S:u:" opt; do while getopts "na:c:C:d:i:I:m:n:N:p:P:q:R:r:s:S:u:" opt; do
case "$opt" in case "$opt" in
a) a)
SERVICE_ALIAS="${OPTARG^^}" SERVICE_ALIAS="${OPTARG^^}"
@@ -751,6 +753,9 @@ service_parse_args() {
m) m)
export SERVICE_MEMORY=$OPTARG export SERVICE_MEMORY=$OPTARG
;; ;;
n)
export SERVICE_RESTART_APPS=false
;;
N) N)
export SERVICE_INITIAL_NETWORK=$OPTARG export SERVICE_INITIAL_NETWORK=$OPTARG
;; ;;
@@ -805,39 +810,36 @@ service_root_password() {
service_port_expose() { service_port_expose() {
declare desc="wrapper for exposing service ports" declare desc="wrapper for exposing service ports"
declare SERVICE="$1" declare SERVICE="$1" PORTS=(${@:2})
service_start "$SERVICE" "true"
service_port_unpause "$SERVICE" "true" "${@:2}"
}
service_port_pause() {
declare desc="pause service exposure"
declare SERVICE="$1" LOG_FAIL="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local EXPOSED_NAME="$(get_service_name "$SERVICE").ambassador"
local PORT_FILE="$SERVICE_ROOT/PORT" local PORT_FILE="$SERVICE_ROOT/PORT"
local SERVICE_NAME="$(get_service_name "$SERVICE")"
local EXPOSED_NAME="$SERVICE_NAME.ambassador"
if [[ "$LOG_FAIL" == "true" ]]; then if [[ ${#PORTS[@]} -eq 0 ]]; then
[[ ! -f "$PORT_FILE" ]] && dokku_log_fail "Service not exposed" # shellcheck disable=SC2206
else PORTS=(${PORTS[@]:-$(get_random_ports ${#PLUGIN_DATASTORE_PORTS[@]})})
[[ ! -f "$PORT_FILE" ]] && return 0
fi fi
local GREP_NAME="^/${EXPOSED_NAME}$" [[ "${#PORTS[@]}" != "${#PLUGIN_DATASTORE_PORTS[@]}" ]] && dokku_log_fail "${#PLUGIN_DATASTORE_PORTS[@]} ports to be exposed need to be provided in the following order: ${PLUGIN_DATASTORE_PORTS[*]}"
local CONTAINER_NAME="$("$DOCKER_BIN" container ps -f name="$GREP_NAME" --format "{{.Names}}")"
if [[ -z "$CONTAINER_NAME" ]]; then
if [[ "$LOG_FAIL" == "true" ]]; then
dokku_log_info1 "Service $SERVICE unexposed"
fi
return if [[ -s "$PORT_FILE" ]]; then
# shellcheck disable=SC2207
PORTS=($(cat "$PORT_FILE"))
dokku_log_fail "Service $SERVICE already exposed on port(s) ${PORTS[*]}"
fi fi
"$DOCKER_BIN" container stop "$EXPOSED_NAME" >/dev/null 2>&1 || true if "$DOCKER_BIN" container inspect "$EXPOSED_NAME" >/dev/null 2>&1; then
"$DOCKER_BIN" container rm "$EXPOSED_NAME" >/dev/null 2>&1 || true dokku_log_warn "Service $SERVICE has an untracked expose container, removing"
if [[ "$LOG_FAIL" == "true" ]]; then "$DOCKER_BIN" container stop "$EXPOSED_NAME" >/dev/null 2>&1 || true
dokku_log_info1 "Service $SERVICE unexposed" suppress_output "$DOCKER_BIN" container rm "$EXPOSED_NAME"
fi fi
echo "${PORTS[@]}" >"$PORT_FILE"
service_start "$SERVICE" "true"
service_port_reconcile_status "$SERVICE"
dokku_log_info1 "Service $SERVICE exposed on port(s) [container->host]: $(service_exposed_ports "$SERVICE")"
} }
service_port_unexpose() { service_port_unexpose() {
@@ -845,39 +847,41 @@ service_port_unexpose() {
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local PORT_FILE="$SERVICE_ROOT/PORT" local PORT_FILE="$SERVICE_ROOT/PORT"
service_port_pause "$SERVICE" "true"
rm -rf "$PORT_FILE" rm -rf "$PORT_FILE"
service_port_reconcile_status "$SERVICE"
dokku_log_info1 "Service $SERVICE unexposed"
} }
service_port_unpause() { service_port_reconcile_status() {
declare desc="start service exposure" declare SERVICE="$1"
declare SERVICE="$1" LOG_FAIL="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")"
local EXPOSED_NAME="${SERVICE_NAME}.ambassador"
local PORT_FILE="$SERVICE_ROOT/PORT" local PORT_FILE="$SERVICE_ROOT/PORT"
# shellcheck disable=SC2068 local SERVICE_NAME="$(get_service_name "$SERVICE")"
local PORTS=(${@:3}) local EXPOSED_NAME="$SERVICE_NAME.ambassador"
# shellcheck disable=SC2068
PORTS=(${PORTS[@]:-$(get_random_ports ${#PLUGIN_DATASTORE_PORTS[@]})})
local ID=$(cat "$SERVICE_ROOT/ID")
[[ "${#PORTS[@]}" != "${#PLUGIN_DATASTORE_PORTS[@]}" ]] && dokku_log_fail "${#PLUGIN_DATASTORE_PORTS[@]} ports to be exposed need to be provided in the following order: ${PLUGIN_DATASTORE_PORTS[*]}" if [[ ! -s "$PORT_FILE" ]]; then
if "$DOCKER_BIN" container inspect "$EXPOSED_NAME" >/dev/null 2>&1; then
if [[ "$LOG_FAIL" == "true" ]]; then "$DOCKER_BIN" container stop "$EXPOSED_NAME" >/dev/null 2>&1 || true
[[ -f "$PORT_FILE" ]] && PORTS=($(cat "$PORT_FILE")) && dokku_log_fail "Service $SERVICE already exposed on port(s) ${PORTS[*]}" suppress_output "$DOCKER_BIN" container rm "$EXPOSED_NAME"
else return $?
[[ ! -f "$PORT_FILE" ]] && return 0 fi
PORTS=($(cat "$PORT_FILE")) return
fi fi
echo "${PORTS[@]}" >"$PORT_FILE" if is_container_status "$EXPOSED_NAME" "Running"; then
return
fi
if "$DOCKER_BIN" container inspect "$EXPOSED_NAME" >/dev/null 2>&1; then
suppress_output "$DOCKER_BIN" container start "$EXPOSED_NAME"
return $?
fi
# shellcheck disable=SC2207
PORTS=($(cat "$PORT_FILE"))
# shellcheck disable=SC2046 # shellcheck disable=SC2046
"$DOCKER_BIN" container run -d --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" --name "$EXPOSED_NAME" $(docker_ports_options "${PORTS[@]}") --restart always --label dokku=ambassador --label "dokku.ambassador=$PLUGIN_COMMAND_PREFIX" "$PLUGIN_AMBASSADOR_IMAGE" >/dev/null "$DOCKER_BIN" container run -d --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" --name "$EXPOSED_NAME" $(docker_ports_options "${PORTS[@]}") --restart always --label dokku=ambassador --label "dokku.ambassador=$PLUGIN_COMMAND_PREFIX" "$PLUGIN_AMBASSADOR_IMAGE" >/dev/null
if [[ "$LOG_FAIL" == "true" ]]; then
dokku_log_info1 "Service $SERVICE exposed on port(s) [container->host]: $(service_exposed_ports "$SERVICE")"
fi
} }
service_promote() { service_promote() {
@@ -935,13 +939,15 @@ service_pause() {
declare SERVICE="$1" declare SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
local ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true local ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "name=^/$SERVICE_NAME$") || true
[[ -z $ID ]] && dokku_log_warn "Service is already paused" && return 0 [[ -z $ID ]] && dokku_log_warn "Service is already paused" && return 0
if [[ -n $ID ]]; then if [[ -n $ID ]]; then
dokku_log_info2_quiet "Pausing container" dokku_log_info2_quiet "Pausing container"
"$DOCKER_BIN" container stop "$SERVICE_NAME" >/dev/null "$DOCKER_BIN" container stop "$SERVICE_NAME" >/dev/null
service_port_pause "$SERVICE" if "$DOCKER_BIN" container inspect "$ID" >/dev/null 2>&1; then
"$DOCKER_BIN" container stop "$SERVICE_NAME.ambassador" >/dev/null 2>&1 || true
fi
dokku_log_verbose_quiet "Container paused" dokku_log_verbose_quiet "Container paused"
else else
dokku_log_verbose_quiet "No container exists for $SERVICE" dokku_log_verbose_quiet "No container exists for $SERVICE"
@@ -971,8 +977,9 @@ service_unlink() {
[[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP" [[ -z ${LINK[*]} ]] && dokku_log_fail "Not linked to app $APP"
plugn trigger service-action post-unlink "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$APP" plugn trigger service-action post-unlink "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$APP"
if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]]; then if [[ "$DOKKU_GLOBAL_FLAGS" == *"--no-restart"* ]] || [[ "$SERVICE_RESTART_APPS" == "false" ]]; then
config_unset --no-restart "$APP" "${LINK[@]}" config_unset --no-restart "$APP" "${LINK[@]}"
dokku_log_verbose "Skipping restart of linked app"
else else
config_unset "$APP" "${LINK[@]}" config_unset "$APP" "${LINK[@]}"
fi fi

View File

@@ -130,6 +130,8 @@ service_create_container() {
done < <(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-create-network" | tr "," "\n") done < <(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-create-network" | tr "," "\n")
fi fi
suppress_output "$DOCKER_BIN" container start "$(cat "$SERVICE_ROOT/ID")" suppress_output "$DOCKER_BIN" container start "$(cat "$SERVICE_ROOT/ID")"
service_port_reconcile_status "$SERVICE"
if [[ -n "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-start-network")" ]]; then if [[ -n "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-start-network")" ]]; then
dokku_log_verbose_quiet "Connecting to networks after container start" dokku_log_verbose_quiet "Connecting to networks after container start"
while read -r line || [[ -n "$line" ]]; do while read -r line || [[ -n "$line" ]]; do
@@ -182,7 +184,7 @@ service_import() {
fi fi
suppress_output service_container_rm "$SERVICE" suppress_output service_container_rm "$SERVICE"
"$DOCKER_BIN" container run --rm -v "$SERVICE_HOST_ROOT/data:/data" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" bash -c "rm -f /data/dump.rdb" "$DOCKER_BIN" container run --rm -v "$SERVICE_HOST_ROOT/data:/data" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" bash -c "rm -f /data/dump.rdb"
cat > "$SERVICE_HOST_ROOT/data/dump.rdb" cat >"$SERVICE_HOST_ROOT/data/dump.rdb"
"$DOCKER_BIN" container run --rm -v "$SERVICE_HOST_ROOT/data:/data" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" bash -c "chown redis: /data/dump.rdb" "$DOCKER_BIN" container run --rm -v "$SERVICE_HOST_ROOT/data:/data" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" bash -c "chown redis: /data/dump.rdb"
suppress_output service_start "$SERVICE" suppress_output service_start "$SERVICE"
} }
@@ -192,7 +194,7 @@ service_start() {
local QUIET="$2" local QUIET="$2"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local SERVICE_NAME="$(get_service_name "$SERVICE")" local SERVICE_NAME="$(get_service_name "$SERVICE")"
local ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "status=running" --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true local ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "status=running" --filter "name=^/$SERVICE_NAME$") || true
if [[ -n $ID ]]; then if [[ -n $ID ]]; then
[[ -z $QUIET ]] && dokku_log_warn "Service is already started" [[ -z $QUIET ]] && dokku_log_warn "Service is already started"
if [[ ! -f "$SERVICE_ROOT/ID" ]] || [[ "$(cat "$SERVICE_ROOT/ID")" != "$ID" ]]; then if [[ ! -f "$SERVICE_ROOT/ID" ]] || [[ "$(cat "$SERVICE_ROOT/ID")" != "$ID" ]]; then
@@ -203,11 +205,11 @@ service_start() {
fi fi
dokku_log_info2_quiet "Starting container" dokku_log_info2_quiet "Starting container"
local PREVIOUS_ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "status=exited" --filter "name=^/$SERVICE_NAME$" --format '{{ .ID }}') || true local PREVIOUS_ID=$("$DOCKER_BIN" container ps -aq --no-trunc --filter "status=exited" --filter "name=^/$SERVICE_NAME$") || true
if [[ -n $PREVIOUS_ID ]]; then if [[ -n $PREVIOUS_ID ]]; then
"$DOCKER_BIN" container start "$PREVIOUS_ID" >/dev/null "$DOCKER_BIN" container start "$PREVIOUS_ID" >/dev/null
service_port_unpause "$SERVICE" service_port_reconcile_status "$SERVICE"
dokku_log_info2 "Container started" dokku_log_info2 "Container started"
elif service_image_exists "$SERVICE"; then elif service_image_exists "$SERVICE"; then
service_create_container "$SERVICE" service_create_container "$SERVICE"

View File

@@ -1,4 +1,4 @@
[plugin] [plugin]
description = "dokku redis service plugin" description = "dokku redis service plugin"
version = "1.29.0" version = "1.37.6"
[plugin.config] [plugin.config]

View File

@@ -17,9 +17,9 @@ service-clone-cmd() {
#F -m|--memory MEMORY, container memory limit in megabytes (default: unlimited) #F -m|--memory MEMORY, container memory limit in megabytes (default: unlimited)
#F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to #F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to
#F -p|--password PASSWORD, override the user-level service password #F -p|--password PASSWORD, override the user-level service password
#F -P|--post-create-network NETWORKS, a comman-separated list of networks to attach the service container to after service creation #F -P|--post-create-network NETWORKS, a comma-separated list of networks to attach the service container to after service creation
#F -r|--root-password PASSWORD, override the root-level service password #F -r|--root-password PASSWORD, override the root-level service password
#F -S|--post-start-network NETWORKS, a comman-separated list of networks to attach the service container to after service start #F -S|--post-start-network NETWORKS, a comma-separated list of networks to attach the service container to after service start
#F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container #F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container
declare desc="create container <new-name> then copy data from <name> into <new-name>" declare desc="create container <new-name> then copy data from <name> into <new-name>"
local cmd="$PLUGIN_COMMAND_PREFIX:clone" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:clone" argv=("$@")

View File

@@ -14,7 +14,7 @@ service-create-cmd() {
#E export ${PLUGIN_VARIABLE}_IMAGE_VERSION="${PLUGIN_IMAGE_VERSION}" #E export ${PLUGIN_VARIABLE}_IMAGE_VERSION="${PLUGIN_IMAGE_VERSION}"
#E dokku $PLUGIN_COMMAND_PREFIX:create lollipop #E dokku $PLUGIN_COMMAND_PREFIX:create lollipop
#E you can also specify custom environment variables to start #E you can also specify custom environment variables to start
#E the ${PLUGIN_COMMAND_PREFIX} service in semi-colon separated form. #E the ${PLUGIN_COMMAND_PREFIX} service in semicolon-separated form.
#E export ${PLUGIN_VARIABLE}_CUSTOM_ENV="USER=alpha;HOST=beta" #E export ${PLUGIN_VARIABLE}_CUSTOM_ENV="USER=alpha;HOST=beta"
#E dokku $PLUGIN_COMMAND_PREFIX:create lollipop #E dokku $PLUGIN_COMMAND_PREFIX:create lollipop
#A service, service to run command against #A service, service to run command against
@@ -25,9 +25,9 @@ service-create-cmd() {
#F -m|--memory MEMORY, container memory limit in megabytes (default: unlimited) #F -m|--memory MEMORY, container memory limit in megabytes (default: unlimited)
#F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to #F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to
#F -p|--password PASSWORD, override the user-level service password #F -p|--password PASSWORD, override the user-level service password
#F -P|--post-create-network NETWORKS, a comman-separated list of networks to attach the service container to after service creation #F -P|--post-create-network NETWORKS, a comma-separated list of networks to attach the service container to after service creation
#F -r|--root-password PASSWORD, override the root-level service password #F -r|--root-password PASSWORD, override the root-level service password
#F -S|--post-start-network NETWORKS, a comman-separated list of networks to attach the service container to after service start #F -S|--post-start-network NETWORKS, a comma-separated list of networks to attach the service container to after service start
#F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container #F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container
declare desc="create a $PLUGIN_SERVICE service" declare desc="create a $PLUGIN_SERVICE service"
local cmd="$PLUGIN_COMMAND_PREFIX:create" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:create" argv=("$@")

View File

@@ -42,6 +42,7 @@ service-link-cmd() {
#A app, app to run command against #A app, app to run command against
#F -a|--alias "BLUE_DATABASE", an alternative alias to use for linking to an app via environment variable #F -a|--alias "BLUE_DATABASE", an alternative alias to use for linking to an app via environment variable
#F -q|--querystring "pool=5", ampersand delimited querystring arguments to append to the service link #F -q|--querystring "pool=5", ampersand delimited querystring arguments to append to the service link
#F -n|--no-restart "false", whether or not to restart the app on link (default: true)
declare desc="link the $PLUGIN_SERVICE service to the app" declare desc="link the $PLUGIN_SERVICE service to the app"
local cmd="$PLUGIN_COMMAND_PREFIX:link" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:link" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1 [[ ${argv[0]} == "$cmd" ]] && shift 1

View File

@@ -11,6 +11,7 @@ service-unlink-cmd() {
#E dokku $PLUGIN_COMMAND_PREFIX:unlink lollipop playground #E dokku $PLUGIN_COMMAND_PREFIX:unlink lollipop playground
#A service, service to run command against #A service, service to run command against
#A app, app to run command against #A app, app to run command against
#F -n|--no-restart "false", whether or not to restart the app on unlink (default: true)
declare desc="unlink the $PLUGIN_SERVICE service from the app" declare desc="unlink the $PLUGIN_SERVICE service from the app"
local cmd="$PLUGIN_COMMAND_PREFIX:unlink" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:unlink" argv=("$@")
[[ ${argv[0]} == "$cmd" ]] && shift 1 [[ ${argv[0]} == "$cmd" ]] && shift 1

View File

@@ -15,9 +15,9 @@ service-upgrade-cmd() {
#F -i|--image IMAGE, the image name to start the service with #F -i|--image IMAGE, the image name to start the service with
#F -I|--image-version IMAGE_VERSION, the image version to start the service with #F -I|--image-version IMAGE_VERSION, the image version to start the service with
#F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to #F -N|--initial-network INITIAL_NETWORK, the initial network to attach the service to
#F -P|--post-create-network NETWORKS, a comman-separated list of networks to attach the service container to after service creation #F -P|--post-create-network NETWORKS, a comma-separated list of networks to attach the service container to after service creation
#F -R|--restart-apps "true", whether to force an app restart #F -R|--restart-apps "true", whether or not to force an app restart (default: false)
#F -S|--post-start-network NETWORKS, a comman-separated list of networks to attach the service container to after service start #F -S|--post-start-network NETWORKS, a comma-separated list of networks to attach the service container to after service start
#F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container #F -s|--shm-size SHM_SIZE, override shared memory size for $PLUGIN_COMMAND_PREFIX docker container
declare desc="upgrade service <service> to the specified versions" declare desc="upgrade service <service> to the specified versions"
local cmd="$PLUGIN_COMMAND_PREFIX:upgrade" argv=("$@") local cmd="$PLUGIN_COMMAND_PREFIX:upgrade" argv=("$@")

View File

@@ -48,7 +48,7 @@ teardown() {
assert_output_contains bridge 0 assert_output_contains bridge 0
assert_output_contains custom-network assert_output_contains custom-network
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.Aliases}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}' run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.DNSNames}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}'
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -120,7 +120,7 @@ teardown() {
assert_output_contains custom-network assert_output_contains custom-network
assert_output_contains bridge assert_output_contains bridge
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.Aliases}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}' run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.DNSNames}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}'
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -192,7 +192,7 @@ teardown() {
assert_output_contains bridge assert_output_contains bridge
assert_output_contains custom-network assert_output_contains custom-network
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.Aliases}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}' run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.ls -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.DNSNames}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}'
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success
@@ -258,7 +258,7 @@ teardown() {
assert_output_contains bridge assert_output_contains bridge
assert_output_contains custom-network assert_output_contains custom-network
run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.lsa -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.Aliases}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}' run docker inspect dokku.$PLUGIN_COMMAND_PREFIX.lsa -f '{{range $net,$v := .NetworkSettings.Networks}}{{range $k,$alias := $v.DNSNames}}{{printf "alias:%s\n" $alias}}{{end}}{{end}}'
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_success assert_success

View File

@@ -2,29 +2,65 @@
load test_helper load test_helper
setup() { setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" l dokku "$PLUGIN_COMMAND_PREFIX:create" ls
} }
teardown() { teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls
} }
@test "($PLUGIN_COMMAND_PREFIX:expose) error when there are no arguments" { @test "($PLUGIN_COMMAND_PREFIX:expose) error when there are no arguments" {
run dokku "$PLUGIN_COMMAND_PREFIX:expose" run dokku "$PLUGIN_COMMAND_PREFIX:expose"
echo "output: $output"
echo "status: $status"
assert_failure
assert_contains "${lines[*]}" "Please specify a valid name for the service" assert_contains "${lines[*]}" "Please specify a valid name for the service"
} }
@test "($PLUGIN_COMMAND_PREFIX:expose) error when service does not exist" { @test "($PLUGIN_COMMAND_PREFIX:expose) error when service does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:expose" not_existing_service run dokku "$PLUGIN_COMMAND_PREFIX:expose" not_existing_service
echo "output: $output"
echo "status: $status"
assert_failure
assert_contains "${lines[*]}" "service not_existing_service does not exist" assert_contains "${lines[*]}" "service not_existing_service does not exist"
} }
@test "($PLUGIN_COMMAND_PREFIX:expose) error when already exposed" {
run dokku "$PLUGIN_COMMAND_PREFIX:expose" ls
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:expose" ls
echo "output: $output"
echo "status: $status"
assert_failure
assert_contains "${lines[*]}" "Service ls already exposed on port(s)"
run sudo rm "$PLUGIN_DATA_ROOT/ls/PORT"
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:expose" ls
echo "output: $output"
echo "status: $status"
assert_success
assert_contains "${lines[*]}" "Service ls has an untracked expose container, removing"
}
@test "($PLUGIN_COMMAND_PREFIX:expose) success when not providing custom ports" { @test "($PLUGIN_COMMAND_PREFIX:expose) success when not providing custom ports" {
run dokku "$PLUGIN_COMMAND_PREFIX:expose" l run dokku "$PLUGIN_COMMAND_PREFIX:expose" ls
echo "output: $output"
echo "status: $status"
assert_success
[[ "${lines[*]}" =~ exposed\ on\ port\(s\)\ \[container\-\>host\]\:\ [[:digit:]]+ ]] [[ "${lines[*]}" =~ exposed\ on\ port\(s\)\ \[container\-\>host\]\:\ [[:digit:]]+ ]]
} }
@test "($PLUGIN_COMMAND_PREFIX:expose) success when providing custom ports" { @test "($PLUGIN_COMMAND_PREFIX:expose) success when providing custom ports" {
run dokku "$PLUGIN_COMMAND_PREFIX:expose" l 4242 run dokku "$PLUGIN_COMMAND_PREFIX:expose" ls 4242
echo "output: $output"
echo "status: $status"
assert_success
assert_contains "${lines[*]}" "exposed on port(s) [container->host]: 6379->4242" assert_contains "${lines[*]}" "exposed on port(s) [container->host]: 6379->4242"
} }

View File

@@ -2,14 +2,14 @@
load test_helper load test_helper
setup() { setup() {
dokku "$PLUGIN_COMMAND_PREFIX:create" l dokku "$PLUGIN_COMMAND_PREFIX:create" ls
dokku "$PLUGIN_COMMAND_PREFIX:create" m dokku "$PLUGIN_COMMAND_PREFIX:create" ms
dokku apps:create my-app dokku apps:create my-app
} }
teardown() { teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" m dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ms
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls
dokku --force apps:destroy my-app dokku --force apps:destroy my-app
} }
@@ -22,7 +22,7 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:link) error when the app argument is missing" { @test "($PLUGIN_COMMAND_PREFIX:link) error when the app argument is missing" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" l run dokku "$PLUGIN_COMMAND_PREFIX:link" ls
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_contains "${lines[*]}" "Please specify an app to run the command on" assert_contains "${lines[*]}" "Please specify an app to run the command on"
@@ -30,7 +30,7 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:link) error when the app does not exist" { @test "($PLUGIN_COMMAND_PREFIX:link) error when the app does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" l not_existing_app run dokku "$PLUGIN_COMMAND_PREFIX:link" ls not_existing_app
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_contains "${lines[*]}" "App not_existing_app does not exist" assert_contains "${lines[*]}" "App not_existing_app does not exist"
@@ -46,73 +46,97 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:link) error when the service is already linked to app" { @test "($PLUGIN_COMMAND_PREFIX:link) error when the service is already linked to app" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
run dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
assert_contains "${lines[*]}" "Already linked as REDIS_URL" assert_contains "${lines[*]}" "Already linked as REDIS_URL"
assert_failure assert_failure
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) exports REDIS_URL to app" { @test "($PLUGIN_COMMAND_PREFIX:link) exports REDIS_URL to app" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output" echo "output: $output"
echo "status: $status" echo "status: $status"
url=$(dokku config:get my-app REDIS_URL) url=$(dokku config:get my-app REDIS_URL)
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" password="$(sudo cat "$PLUGIN_DATA_ROOT/ls/PASSWORD")"
assert_contains "$url" "redis://:$password@dokku-redis-l:6379" assert_contains "$url" "redis://:$password@dokku-redis-ls:6379"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) generates an alternate config url when REDIS_URL already in use" { @test "($PLUGIN_COMMAND_PREFIX:link) generates an alternate config url when REDIS_URL already in use" {
dokku config:set my-app REDIS_URL=redis://host:6379 dokku config:set my-app REDIS_URL=redis://host:6379
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
run dokku config my-app run dokku config my-app
assert_contains "${lines[*]}" "DOKKU_REDIS_AQUA_URL" assert_contains "${lines[*]}" "DOKKU_REDIS_AQUA_URL"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:link" m my-app dokku "$PLUGIN_COMMAND_PREFIX:link" ms my-app
run dokku config my-app run dokku config my-app
assert_contains "${lines[*]}" "DOKKU_REDIS_BLACK_URL" assert_contains "${lines[*]}" "DOKKU_REDIS_BLACK_URL"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" m my-app dokku "$PLUGIN_COMMAND_PREFIX:unlink" ms my-app
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) links to app with docker-options" { @test "($PLUGIN_COMMAND_PREFIX:link) links to app with docker-options" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
run dokku docker-options:report my-app run dokku docker-options:report my-app
assert_contains "${lines[*]}" "--link dokku.redis.l:dokku-redis-l" assert_contains "${lines[*]}" "--link dokku.redis.ls:dokku-redis-ls"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) uses apps REDIS_DATABASE_SCHEME variable" { @test "($PLUGIN_COMMAND_PREFIX:link) uses apps REDIS_DATABASE_SCHEME variable" {
dokku config:set my-app REDIS_DATABASE_SCHEME=redis2 dokku config:set my-app REDIS_DATABASE_SCHEME=redis2
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
url=$(dokku config:get my-app REDIS_URL) url=$(dokku config:get my-app REDIS_URL)
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" password="$(sudo cat "$PLUGIN_DATA_ROOT/ls/PASSWORD")"
assert_contains "$url" "redis2://:$password@dokku-redis-l:6379" assert_contains "$url" "redis2://:$password@dokku-redis-ls:6379"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) adds a querystring" { @test "($PLUGIN_COMMAND_PREFIX:link) adds a querystring" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app --querystring "pool=5" dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app --querystring "pool=5"
url=$(dokku config:get my-app REDIS_URL) url=$(dokku config:get my-app REDIS_URL)
assert_contains "$url" "?pool=5" assert_contains "$url" "?pool=5"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
} }
@test "($PLUGIN_COMMAND_PREFIX:link) uses a specified config url when alias is specified" { @test "($PLUGIN_COMMAND_PREFIX:link) uses a specified config url when alias is specified" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app --alias "ALIAS" dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app --alias "ALIAS"
url=$(dokku config:get my-app ALIAS_URL) url=$(dokku config:get my-app ALIAS_URL)
password="$(sudo cat "$PLUGIN_DATA_ROOT/l/PASSWORD")" password="$(sudo cat "$PLUGIN_DATA_ROOT/ls/PASSWORD")"
assert_contains "$url" "redis://:$password@dokku-redis-l:6379" assert_contains "$url" "redis://:$password@dokku-redis-ls:6379"
assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
}
@test "($PLUGIN_COMMAND_PREFIX:link) respects --no-restart" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app" 0
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app --no-restart
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
echo "output: $output"
echo "status: $status"
assert_success assert_success
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app
} }

View File

@@ -3,11 +3,11 @@ load test_helper
setup() { setup() {
dokku apps:create my-app dokku apps:create my-app
dokku "$PLUGIN_COMMAND_PREFIX:create" l dokku "$PLUGIN_COMMAND_PREFIX:create" ls
} }
teardown() { teardown() {
dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" l dokku --force "$PLUGIN_COMMAND_PREFIX:destroy" ls
dokku --force apps:destroy my-app dokku --force apps:destroy my-app
} }
@@ -17,12 +17,12 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) error when the app argument is missing" { @test "($PLUGIN_COMMAND_PREFIX:unlink) error when the app argument is missing" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls
assert_contains "${lines[*]}" "Please specify an app to run the command on" assert_contains "${lines[*]}" "Please specify an app to run the command on"
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) error when the app does not exist" { @test "($PLUGIN_COMMAND_PREFIX:unlink) error when the app does not exist" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l not_existing_app run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls not_existing_app
assert_contains "${lines[*]}" "App not_existing_app does not exist" assert_contains "${lines[*]}" "App not_existing_app does not exist"
} }
@@ -32,13 +32,13 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) error when service not linked to app" { @test "($PLUGIN_COMMAND_PREFIX:unlink) error when service not linked to app" {
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
assert_contains "${lines[*]}" "Not linked to app my-app" assert_contains "${lines[*]}" "Not linked to app my-app"
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) removes link from docker-options" { @test "($PLUGIN_COMMAND_PREFIX:unlink) removes link from docker-options" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app >&2 dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
check_value="Docker options build: Docker options deploy: --restart=on-failure:10 Docker options run:" check_value="Docker options build: Docker options deploy: --restart=on-failure:10 Docker options run:"
options=$(dokku --quiet docker-options:report my-app | xargs) options=$(dokku --quiet docker-options:report my-app | xargs)
@@ -46,8 +46,32 @@ teardown() {
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) unsets config url from app" { @test "($PLUGIN_COMMAND_PREFIX:unlink) unsets config url from app" {
dokku "$PLUGIN_COMMAND_PREFIX:link" l my-app >&2 dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app >&2
dokku "$PLUGIN_COMMAND_PREFIX:unlink" l my-app dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
config=$(dokku config:get my-app REDIS_URL || true) config=$(dokku config:get my-app REDIS_URL || true)
assert_equal "$config" "" assert_equal "$config" ""
} }
@test "($PLUGIN_COMMAND_PREFIX:unlink) respects --no-restart" {
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app" 0
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:link" ls my-app
echo "output: $output"
echo "status: $status"
assert_success
run dokku "$PLUGIN_COMMAND_PREFIX:unlink" ls my-app --no-restart
echo "output: $output"
echo "status: $status"
assert_output_contains "Skipping restart of linked app"
assert_success
}

View File

@@ -1,4 +1,5 @@
# SC1090 - Can't follow non-constant source. Use a directive to specify location - https://github.com/koalaman/shellcheck/wiki/SC1090 # SC1090 - Can't follow non-constant source. Use a directive to specify location - https://github.com/koalaman/shellcheck/wiki/SC1090
# SC1091 - Not following - <https://github.com/koalaman/shellcheck/wiki/SC1091>
# SC2034 - Variable appears unused. Verify it or export it - https://github.com/koalaman/shellcheck/wiki/SC2034 # SC2034 - Variable appears unused. Verify it or export it - https://github.com/koalaman/shellcheck/wiki/SC2034
# SC2155 - Declare and assign separately to avoid masking return values - https://github.com/koalaman/shellcheck/wiki/SC2155 # SC2155 - Declare and assign separately to avoid masking return values - https://github.com/koalaman/shellcheck/wiki/SC2155
# SC2206 - Quote to prevent word splitting/globbing, or split robustly with mapfile or read -a - https://github.com/koalaman/shellcheck/wiki/SC2206 # SC2206 - Quote to prevent word splitting/globbing, or split robustly with mapfile or read -a - https://github.com/koalaman/shellcheck/wiki/SC2206