From 3de9611d4d63a200af174446cd6118391734d94f Mon Sep 17 00:00:00 2001 From: duanhongyi Date: Fri, 20 Oct 2023 05:13:01 +0000 Subject: [PATCH] init repo --- CNAME | 2 + README.md | 3 + _includes/install-workflow/index.html | 897 +++++ applications/deploying-apps/index.html | 946 +++++ applications/domains-and-routing/index.html | 888 +++++ .../inter-app-communication/index.html | 860 ++++ .../managing-app-configuration/index.html | 1043 +++++ applications/managing-app-gateway/index.html | 864 ++++ .../managing-app-lifecycle/index.html | 952 +++++ .../managing-app-processes/index.html | 1088 ++++++ .../managing-app-resources/index.html | 968 +++++ applications/managing-app-volumes/index.html | 907 +++++ .../managing-resource-limits/index.html | 1021 +++++ applications/ssl-certificates/index.html | 1014 +++++ applications/using-buildpacks/index.html | 1001 +++++ .../using-container-images/index.html | 933 +++++ applications/using-dockerfiles/index.html | 981 +++++ bower.json | 8 + changelogs/v1.0.1/index.html | 875 +++++ changelogs/v1.1.0/index.html | 906 +++++ changelogs/v1.2.0/index.html | 896 +++++ changelogs/v1.3.0/index.html | 896 +++++ changelogs/v1.4.0/index.html | 1101 ++++++ changelogs/v1.5.0/index.html | 1169 ++++++ changelogs/v1.6.0/index.html | 1313 +++++++ contributing/community/index.html | 863 ++++ contributing/conduct/index.html | 879 +++++ contributing/design-documents/index.html | 881 +++++ .../development-environment/index.html | 999 +++++ contributing/maintainers/index.html | 922 +++++ contributing/overview/index.html | 874 +++++ .../submitting-a-pull-request/index.html | 931 +++++ contributing/testing/index.html | 882 +++++ contributing/triaging-issues/index.html | 946 +++++ dependency_update.py | 27 + diagrams/Application_Layout.png | Bin 0 -> 49623 bytes diagrams/Diagrams.graffle | Bin 0 -> 373823 bytes diagrams/Document_Overview.png | Bin 0 -> 24472 bytes diagrams/Ecosystem_Basic.png | Bin 0 -> 43825 bytes diagrams/Ecosystem_Complex.png | Bin 0 -> 113108 bytes diagrams/Git_Push_Flow.png | Bin 0 -> 41453 bytes diagrams/Workflow_Detail.png | Bin 0 -> 45357 bytes diagrams/Workflow_Overview.png | Bin 0 -> 36630 bytes diagrams/index.html | 871 +++++ favicon.ico | Bin 0 -> 32038 bytes generate_cache.sh | 38 + gutenbuild | 23 + index.html | 872 +++++ install-cli.sh | 73 + install.sh | 656 ++++ .../configuring-object-storage/index.html | 892 +++++ .../configuring-postgres/index.html | 892 +++++ .../configuring-registry/index.html | 913 +++++ .../download-linux-brightgreen.svg | 1 + .../download-osx-brightgreen.svg | 1 + installing-workflow/gateway/index.html | 945 +++++ installing-workflow/index.html | 970 +++++ .../system-requirements/index.html | 887 +++++ managing-workflow/configuring-dns/index.html | 948 +++++ managing-workflow/deploy-hooks/index.html | 896 +++++ managing-workflow/platform-logging/index.html | 896 +++++ .../platform-monitoring/index.html | 931 +++++ .../production-deployments/index.html | 896 +++++ .../tuning-component-settings/index.html | 1186 ++++++ .../upgrading-workflow/index.html | 914 +++++ quickstart/deploy-an-app/index.html | 948 +++++ quickstart/index.html | 870 +++++ quickstart/install-cli-tools/index.html | 887 +++++ quickstart/install-workflow/index.html | 1242 ++++++ .../controller-api/v2.0/index.html | 2009 ++++++++++ .../controller-api/v2.1/index.html | 2008 ++++++++++ .../controller-api/v2.2/index.html | 2035 ++++++++++ .../controller-api/v2.3/index.html | 2086 ++++++++++ .../index.html | 909 +++++ reference-guide/terms/index.html | 901 +++++ roadmap/planning-process/index.html | 872 +++++ roadmap/releases/index.html | 1052 +++++ roadmap/roadmap/index.html | 900 +++++ search/lunr.js | 3475 +++++++++++++++++ search/main.js | 109 + search/search_index.json | 1 + search/worker.js | 133 + security/1d6a97d0.txt | 92 + sitemap.xml | 310 ++ sitemap.xml.gz | Bin 0 -> 813 bytes static/css/styles.css | 16 + static/css/styles.css.map | 7 + static/favicon.ico | Bin 0 -> 1406 bytes static/fonts/FontAwesome.otf | Bin 0 -> 109688 bytes .../glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../glyphicons-halflings-regular.svg | 288 ++ .../glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes static/fonts/fontawesome-webfont.eot | Bin 0 -> 70807 bytes static/fonts/fontawesome-webfont.svg | 655 ++++ static/fonts/fontawesome-webfont.ttf | Bin 0 -> 142072 bytes static/fonts/fontawesome-webfont.woff | Bin 0 -> 83588 bytes static/fonts/fontawesome-webfont.woff2 | Bin 0 -> 66624 bytes static/fonts/klinicslabbook-webfont.eot | Bin 0 -> 30048 bytes static/fonts/klinicslabbook-webfont.svg | 1900 +++++++++ static/fonts/klinicslabbook-webfont.ttf | Bin 0 -> 78120 bytes static/fonts/klinicslabbook-webfont.woff | Bin 0 -> 33376 bytes static/fonts/klinicslabbook-webfont.woff2 | Bin 0 -> 26420 bytes static/fonts/klinicslabmedium-webfont.eot | Bin 0 -> 30383 bytes static/fonts/klinicslabmedium-webfont.svg | 1884 +++++++++ static/fonts/klinicslabmedium-webfont.ttf | Bin 0 -> 78180 bytes static/fonts/klinicslabmedium-webfont.woff | Bin 0 -> 33780 bytes static/fonts/klinicslabmedium-webfont.woff2 | Bin 0 -> 26804 bytes static/img/404.png | Bin 0 -> 5170 bytes static/img/aws-ec2.png | Bin 0 -> 14401 bytes static/img/blog-social.png | Bin 0 -> 3106 bytes static/img/cover-image.png | Bin 0 -> 23015 bytes static/img/drycc-graphic.png | Bin 0 -> 29035 bytes static/img/drycc-logo.png | Bin 0 -> 12800 bytes static/img/drycc_builder.png | Bin 0 -> 28223 bytes static/img/drycc_logo.png | Bin 0 -> 10104 bytes static/img/favicon.ico | Bin 0 -> 32038 bytes static/img/favicon.png | Bin 0 -> 2725 bytes static/img/footer-engine-yard.png | Bin 0 -> 1356 bytes static/img/footer-logo.png | Bin 0 -> 2619 bytes static/img/fork.png | Bin 0 -> 1731 bytes static/img/glyphs.png | Bin 0 -> 3854 bytes static/img/large-social.png | Bin 0 -> 18518 bytes static/img/logo.png | Bin 0 -> 617 bytes static/img/mag_glass.png | Bin 0 -> 307 bytes static/img/menu-logo.png | Bin 0 -> 4609 bytes static/img/social.png | Bin 0 -> 3606 bytes static/img/svg/circle.svg | 10 + static/img/svg/footer-engine-yard.svg | 27 + static/img/svg/footer-logo.svg | 20 + static/img/svg/helm-logo.svg | 1 + static/img/svg/logo.svg | 26 + static/img/svg/square.svg | 10 + static/img/svg/svc-cat-logo.svg | 11 + static/img/svg/triangle.svg | 10 + static/img/svg/workflow-logo.svg | 1 + static/js/adjustments.js | 54 + static/js/foundation.dropdown.js | 468 +++ static/js/foundation.js | 732 ++++ static/js/foundation.offcanvas.js | 225 ++ static/js/headroom.min.js | 7 + static/js/jquery-1.12.4.min.js | 5 + static/js/mc-validate.js | 369 ++ static/scss/_buttons.scss | 76 + static/scss/_custom-foundation-settings.scss | 1523 ++++++++ static/scss/_doc-content.scss | 278 ++ static/scss/_doc-layout.scss | 86 + static/scss/_doc-responsive.scss | 31 + static/scss/_doc-sidebar.scss | 109 + static/scss/_footer.scss | 213 + static/scss/_header.scss | 226 ++ static/scss/_media.scss | 76 + static/scss/_mixins.scss | 181 + static/scss/_offcanvas.scss | 43 + static/scss/_shapes.scss | 130 + static/scss/_typography.scss | 36 + static/scss/app.css | 5 + static/scss/app.css.map | 7 + static/scss/app.scss | 369 ++ static/scss/fontawesome/_animated.scss | 66 + static/scss/fontawesome/_bordered-pulled.scss | 25 + static/scss/fontawesome/_core.scss | 12 + static/scss/fontawesome/_fixed-width.scss | 6 + static/scss/fontawesome/_icons.scss | 697 ++++ static/scss/fontawesome/_larger.scss | 13 + static/scss/fontawesome/_list.scss | 19 + static/scss/fontawesome/_mixins.scss | 26 + static/scss/fontawesome/_path.scss | 15 + static/scss/fontawesome/_rotated-flipped.scss | 20 + static/scss/fontawesome/_stacked.scss | 20 + static/scss/fontawesome/_variables.scss | 708 ++++ static/scss/fontawesome/font-awesome.scss | 17 + theme.conf | 6 + troubleshooting/applications/index.html | 896 +++++ troubleshooting/index.html | 874 +++++ troubleshooting/kubectl/index.html | 931 +++++ .../architecture/index.html | 901 +++++ understanding-workflow/components/index.html | 965 +++++ understanding-workflow/concepts/index.html | 944 +++++ uninstall.sh | 25 + users/cli/index.html | 958 +++++ users/registration/index.html | 882 +++++ users/ssh-keys/index.html | 903 +++++ 184 files changed, 85320 insertions(+) create mode 100644 CNAME create mode 100644 README.md create mode 100644 _includes/install-workflow/index.html create mode 100644 applications/deploying-apps/index.html create mode 100644 applications/domains-and-routing/index.html create mode 100644 applications/inter-app-communication/index.html create mode 100644 applications/managing-app-configuration/index.html create mode 100644 applications/managing-app-gateway/index.html create mode 100644 applications/managing-app-lifecycle/index.html create mode 100644 applications/managing-app-processes/index.html create mode 100644 applications/managing-app-resources/index.html create mode 100644 applications/managing-app-volumes/index.html create mode 100644 applications/managing-resource-limits/index.html create mode 100644 applications/ssl-certificates/index.html create mode 100644 applications/using-buildpacks/index.html create mode 100644 applications/using-container-images/index.html create mode 100644 applications/using-dockerfiles/index.html create mode 100644 bower.json create mode 100644 changelogs/v1.0.1/index.html create mode 100644 changelogs/v1.1.0/index.html create mode 100644 changelogs/v1.2.0/index.html create mode 100644 changelogs/v1.3.0/index.html create mode 100644 changelogs/v1.4.0/index.html create mode 100644 changelogs/v1.5.0/index.html create mode 100644 changelogs/v1.6.0/index.html create mode 100644 contributing/community/index.html create mode 100644 contributing/conduct/index.html create mode 100644 contributing/design-documents/index.html create mode 100644 contributing/development-environment/index.html create mode 100644 contributing/maintainers/index.html create mode 100644 contributing/overview/index.html create mode 100644 contributing/submitting-a-pull-request/index.html create mode 100644 contributing/testing/index.html create mode 100644 contributing/triaging-issues/index.html create mode 100644 dependency_update.py create mode 100644 diagrams/Application_Layout.png create mode 100644 diagrams/Diagrams.graffle create mode 100644 diagrams/Document_Overview.png create mode 100644 diagrams/Ecosystem_Basic.png create mode 100644 diagrams/Ecosystem_Complex.png create mode 100644 diagrams/Git_Push_Flow.png create mode 100644 diagrams/Workflow_Detail.png create mode 100644 diagrams/Workflow_Overview.png create mode 100644 diagrams/index.html create mode 100644 favicon.ico create mode 100755 generate_cache.sh create mode 100755 gutenbuild create mode 100644 index.html create mode 100755 install-cli.sh create mode 100755 install.sh create mode 100644 installing-workflow/configuring-object-storage/index.html create mode 100644 installing-workflow/configuring-postgres/index.html create mode 100644 installing-workflow/configuring-registry/index.html create mode 100644 installing-workflow/download-linux-brightgreen.svg create mode 100644 installing-workflow/download-osx-brightgreen.svg create mode 100644 installing-workflow/gateway/index.html create mode 100644 installing-workflow/index.html create mode 100644 installing-workflow/system-requirements/index.html create mode 100644 managing-workflow/configuring-dns/index.html create mode 100644 managing-workflow/deploy-hooks/index.html create mode 100644 managing-workflow/platform-logging/index.html create mode 100644 managing-workflow/platform-monitoring/index.html create mode 100644 managing-workflow/production-deployments/index.html create mode 100644 managing-workflow/tuning-component-settings/index.html create mode 100644 managing-workflow/upgrading-workflow/index.html create mode 100644 quickstart/deploy-an-app/index.html create mode 100644 quickstart/index.html create mode 100644 quickstart/install-cli-tools/index.html create mode 100644 quickstart/install-workflow/index.html create mode 100644 reference-guide/controller-api/v2.0/index.html create mode 100644 reference-guide/controller-api/v2.1/index.html create mode 100644 reference-guide/controller-api/v2.2/index.html create mode 100644 reference-guide/controller-api/v2.3/index.html create mode 100644 reference-guide/creating-a-self-signed-ssl-certificate/index.html create mode 100644 reference-guide/terms/index.html create mode 100644 roadmap/planning-process/index.html create mode 100644 roadmap/releases/index.html create mode 100644 roadmap/roadmap/index.html create mode 100644 search/lunr.js create mode 100644 search/main.js create mode 100644 search/search_index.json create mode 100644 search/worker.js create mode 100644 security/1d6a97d0.txt create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 static/css/styles.css create mode 100644 static/css/styles.css.map create mode 100644 static/favicon.ico create mode 100644 static/fonts/FontAwesome.otf create mode 100644 static/fonts/bootstrap/glyphicons-halflings-regular.eot create mode 100644 static/fonts/bootstrap/glyphicons-halflings-regular.svg create mode 100644 static/fonts/bootstrap/glyphicons-halflings-regular.ttf create mode 100644 static/fonts/bootstrap/glyphicons-halflings-regular.woff create mode 100644 static/fonts/bootstrap/glyphicons-halflings-regular.woff2 create mode 100644 static/fonts/fontawesome-webfont.eot create mode 100644 static/fonts/fontawesome-webfont.svg create mode 100644 static/fonts/fontawesome-webfont.ttf create mode 100644 static/fonts/fontawesome-webfont.woff create mode 100644 static/fonts/fontawesome-webfont.woff2 create mode 100644 static/fonts/klinicslabbook-webfont.eot create mode 100644 static/fonts/klinicslabbook-webfont.svg create mode 100644 static/fonts/klinicslabbook-webfont.ttf create mode 100644 static/fonts/klinicslabbook-webfont.woff create mode 100644 static/fonts/klinicslabbook-webfont.woff2 create mode 100644 static/fonts/klinicslabmedium-webfont.eot create mode 100644 static/fonts/klinicslabmedium-webfont.svg create mode 100644 static/fonts/klinicslabmedium-webfont.ttf create mode 100644 static/fonts/klinicslabmedium-webfont.woff create mode 100644 static/fonts/klinicslabmedium-webfont.woff2 create mode 100644 static/img/404.png create mode 100644 static/img/aws-ec2.png create mode 100644 static/img/blog-social.png create mode 100644 static/img/cover-image.png create mode 100644 static/img/drycc-graphic.png create mode 100644 static/img/drycc-logo.png create mode 100644 static/img/drycc_builder.png create mode 100644 static/img/drycc_logo.png create mode 100644 static/img/favicon.ico create mode 100644 static/img/favicon.png create mode 100644 static/img/footer-engine-yard.png create mode 100644 static/img/footer-logo.png create mode 100644 static/img/fork.png create mode 100644 static/img/glyphs.png create mode 100644 static/img/large-social.png create mode 100644 static/img/logo.png create mode 100644 static/img/mag_glass.png create mode 100644 static/img/menu-logo.png create mode 100644 static/img/social.png create mode 100644 static/img/svg/circle.svg create mode 100644 static/img/svg/footer-engine-yard.svg create mode 100644 static/img/svg/footer-logo.svg create mode 100644 static/img/svg/helm-logo.svg create mode 100644 static/img/svg/logo.svg create mode 100644 static/img/svg/square.svg create mode 100644 static/img/svg/svc-cat-logo.svg create mode 100644 static/img/svg/triangle.svg create mode 100644 static/img/svg/workflow-logo.svg create mode 100644 static/js/adjustments.js create mode 100644 static/js/foundation.dropdown.js create mode 100644 static/js/foundation.js create mode 100644 static/js/foundation.offcanvas.js create mode 100644 static/js/headroom.min.js create mode 100644 static/js/jquery-1.12.4.min.js create mode 100644 static/js/mc-validate.js create mode 100644 static/scss/_buttons.scss create mode 100644 static/scss/_custom-foundation-settings.scss create mode 100644 static/scss/_doc-content.scss create mode 100644 static/scss/_doc-layout.scss create mode 100644 static/scss/_doc-responsive.scss create mode 100644 static/scss/_doc-sidebar.scss create mode 100644 static/scss/_footer.scss create mode 100644 static/scss/_header.scss create mode 100644 static/scss/_media.scss create mode 100644 static/scss/_mixins.scss create mode 100644 static/scss/_offcanvas.scss create mode 100644 static/scss/_shapes.scss create mode 100644 static/scss/_typography.scss create mode 100644 static/scss/app.css create mode 100644 static/scss/app.css.map create mode 100644 static/scss/app.scss create mode 100644 static/scss/fontawesome/_animated.scss create mode 100644 static/scss/fontawesome/_bordered-pulled.scss create mode 100644 static/scss/fontawesome/_core.scss create mode 100644 static/scss/fontawesome/_fixed-width.scss create mode 100644 static/scss/fontawesome/_icons.scss create mode 100644 static/scss/fontawesome/_larger.scss create mode 100644 static/scss/fontawesome/_list.scss create mode 100644 static/scss/fontawesome/_mixins.scss create mode 100644 static/scss/fontawesome/_path.scss create mode 100644 static/scss/fontawesome/_rotated-flipped.scss create mode 100644 static/scss/fontawesome/_stacked.scss create mode 100644 static/scss/fontawesome/_variables.scss create mode 100644 static/scss/fontawesome/font-awesome.scss create mode 100644 theme.conf create mode 100644 troubleshooting/applications/index.html create mode 100644 troubleshooting/index.html create mode 100644 troubleshooting/kubectl/index.html create mode 100644 understanding-workflow/architecture/index.html create mode 100644 understanding-workflow/components/index.html create mode 100644 understanding-workflow/concepts/index.html create mode 100755 uninstall.sh create mode 100644 users/cli/index.html create mode 100644 users/registration/index.html create mode 100644 users/ssh-keys/index.html diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..0da558c57 --- /dev/null +++ b/CNAME @@ -0,0 +1,2 @@ +www.drycc.cc +drycc.cc diff --git a/README.md b/README.md new file mode 100644 index 000000000..bbb184163 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Workflow Contrib + +Scripts and tools that are not a core part of Drycc Workflow v2. diff --git a/_includes/install-workflow/index.html b/_includes/install-workflow/index.html new file mode 100644 index 000000000..b9ca82617 --- /dev/null +++ b/_includes/install-workflow/index.html @@ -0,0 +1,897 @@ + + + + + + + + + + + + + + + + + + Install workflow - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Check Your Setup

+

First check that the helm command is available and the version is v2.5.0 or newer.

+
$ helm version
+Client: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
+Server: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
+ + +

Ensure the kubectl client is installed and can connect to your Kubernetes cluster.

+

Install Drycc Workflow

+

Now that Helm is installed and the repository has been added, install Workflow by running:

+
$ helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc
+ + +

Helm will install a variety of Kubernetes resources in the drycc namespace. +Wait for the pods that Helm launched to be ready. Monitor their status by running:

+
$ kubectl --namespace=drycc get pods
+ + +

If it's preferred to have kubectl automatically update as the pod states change, run (type Ctrl-C to stop the watch):

+
$ kubectl --namespace=drycc get pods -w
+ + +

Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.

+

Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start:

+
$ kubectl --namespace=drycc get pods
+NAME                          READY     STATUS    RESTARTS   AGE
+drycc-builder-hy3xv            1/1       Running   5          5m
+drycc-controller-g3cu8         1/1       Running   5          5m
+drycc-controller-celery-cmxxn  3/3       Running   0          5m
+drycc-database-rad1o           1/1       Running   0          5m
+drycc-logger-fluentbit-1v8uk   1/1       Running   0          5m
+drycc-logger-fluentbit-esm60   1/1       Running   0          5m
+drycc-logger-sm8b3             1/1       Running   0          5m
+drycc-storage-4ww3t            1/1       Running   0          5m
+drycc-registry-asozo           1/1       Running   1          5m
+drycc-rabbitmq-0               1/1       Running   0          5m
+ + +

Once all of the pods are in the READY state, Drycc Workflow is up and running!

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/deploying-apps/index.html b/applications/deploying-apps/index.html new file mode 100644 index 000000000..80954b55f --- /dev/null +++ b/applications/deploying-apps/index.html @@ -0,0 +1,946 @@ + + + + + + + + + + + + + + + + + + Deploying Apps - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Deploying an Application

+

An Application is deployed to Drycc using git push or the drycc client.

+

Supported Applications

+

Drycc Workflow can deploy any application or service that can run inside a container. In order to be scaled +horizontally, applications must follow the Twelve-Factor App methodology and store any application state in external +backing services.

+

For example, if your application persists state to the local filesystem -- common with content management systems like +Wordpress and Drupal -- it cannot be scaled horizontally using drycc scale.

+

Fortunately, most modern applications feature a stateless application tier that can scale horizontally inside Drycc.

+

Login to the Controller

+
+

Important

+

if you haven't yet, now is a good time to install the client and register.

+
+

Before deploying an application, users must first authenticate against the Drycc Controller +using the URL supplied by their Drycc administrator.

+
$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as admin
+Configuration file written to /root/.drycc/client.json
+ + +

Select a Build Process

+

Drycc Workflow supports three different ways of building applications:

+

Buildpacks

+

Cloud Native Buildpacks are useful if you want to follow cnb's docs for building applications.

+

Learn how to deploy applications using Buildpacks.

+

Dockerfiles

+

Dockerfiles are a powerful way to define a portable execution environment built on a base OS of your choosing.

+

Learn how to deploy applications using Dockerfiles.

+

Container Image

+

Deploying a Container image onto Drycc allows you to take a Container image from either a public +or a private registry and copy it over bit-for-bit, ensuring that you are running the same +image in development or in your CI pipeline as you are in production.

+

Learn how to deploy applications using Container images.

+

Tuning Application Settings

+

It is possible to configure a few of the globally tunable settings on per application basis using config:set.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
DRYCC_DISABLE_CACHEif set, this will disable the [imagebuilder cache][] (default: not set)
DRYCC_DEPLOY_BATCHESthe number of pods to bring up and take down sequentially during a scale (default: number of available nodes)
DRYCC_DEPLOY_TIMEOUTdeploy timeout in seconds per deploy batch (default: 120)
IMAGE_PULL_POLICYthe kubernetes [image pull policy][pull-policy] for application images (default: "IfNotPresent") (allowed values: "Always", "IfNotPresent")
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIThow many revisions Kubernetes keeps around of a given Deployment (default: all revisions)
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDShow many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30)
+

Deploy Timeout

+

Deploy timeout in seconds - There are 2 deploy methods, Deployments (see below) and RC (versions prior to 2.4) and this setting affects those a bit differently.

+

Deployments

+

Deployments behave a little bit differently from the RC based deployment strategy.

+

Kubernetes takes care of the entire deploy, doing rolling updates in the background. As a result, there is only an overall deployment timeout instead of a configurable per-batch timeout.

+

The base timeout is multiplied with DRYCC_DEPLOY_BATCHES to create an overall timeout. This would be 240 (timeout) * 4 (batches) = 960 second overall timeout.

+

RC deploy

+

This deploy timeout defines how long to wait for each batch to complete in DRYCC_DEPLOY_BATCHES.

+

Additions to the base timeout

+

The base timeout is extended as well with healthchecks using initialDelaySeconds on liveness and readiness where the bigger of those two is applied. +Additionally the timeout system accounts for slow image pulls by adding an additional 10 minutes when it has seen an image pull take over 1 minute. This allows the timeout values to be reasonable without having to account for image pull slowness in the base deploy timeout.

+

Deployments

+

Workflow uses Deployments for deploys. In prior versions ReplicationControllers were used with the ability to turn on Deployments via DRYCC_KUBERNETES_DEPLOYMENTS=1.

+

The advantage of Deployments is that rolling-updates will happen server-side in Kubernetes instead of in Drycc Workflow Controller, +along with a few other Pod management related functionality. This allows a deploy to continue even when the CLI connection is interrupted.

+

Behind the scenes your application deploy will be built up of a Deployment object per process type, +each having multiple ReplicaSets (one per release) which in turn manage the Pods running your application.

+

Drycc Workflow will behave the same way with DRYCC_KUBERNETES_DEPLOYMENTS enabled or disabled (only applicable to versions prior to 2.4). +The changes are behind the scenes. Where you will see differences while using the CLI is drycc ps:list will output Pod names differently.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/domains-and-routing/index.html b/applications/domains-and-routing/index.html new file mode 100644 index 000000000..b829e8de7 --- /dev/null +++ b/applications/domains-and-routing/index.html @@ -0,0 +1,888 @@ + + + + + + + + + + + + + + + + + + Domains and Routing - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Domains and Routing

+

You can use drycc domains to add or remove custom domains to the application:

+
$ drycc domains:add hello.bacongobbler.com
+Adding hello.bacongobbler.com to finest-woodshed... done
+ + +

Once that's done, you can go into a DNS registrar and set up a CNAME from the new +appname to the old one:

+
$ dig hello.dryccapp.com
+[...]
+;; ANSWER SECTION:
+hello.bacongobbler.com.         1759    IN    CNAME    finest-woodshed.dryccapp.com.
+finest-woodshed.dryccapp.com.    270     IN    A        172.17.8.100
+ + +
+

Note

+

Setting a CNAME for a root domain can cause issues. Setting an @ record +to be a CNAME causes all traffic to go to the other domain, including mail and the SOA +("start-of-authority") records. It is highly recommended that you bind a subdomain to +an application, however you can work around this by pointing the @ record to the +address of the load balancer (if any).

+
+

To add or remove the application from the routing mesh, use drycc routing:

+
$ drycc routing:disable
+Disabling routing for finest-woodshed... done
+ + +

This will make the application unreachable through the Router, but the application is still +reachable internally through its Kubernetes Service. To re-enable routing:

+
$ drycc routing:enable
+Enabling routing for finest-woodshed... done
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/inter-app-communication/index.html b/applications/inter-app-communication/index.html new file mode 100644 index 000000000..bf9406b32 --- /dev/null +++ b/applications/inter-app-communication/index.html @@ -0,0 +1,860 @@ + + + + + + + + + + + + + + + + + + Inter-app Communication - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Inter-app Communication

+

A common architecture pattern of multi-process applications is to have one process serve public requests while having multiple other processes supporting the public one to, for example, perform actions on a schedule or process work items from a queue. To implement this system of apps in Drycc Workflow, set up the apps to communicate using DNS resolution, as shown above, and hide the supporting processes from public view by removing them from the Drycc Workflow router.

+

DNS Service Discovery

+

Drycc Workflow supports deploying a single app composed of a system of processes. Each Drycc Workflow app communicates on a single port, so communicating with another Workflow app means finding that app's address and port. All Workflow apps are mapped to port 80 externally, so finding its IP address is the only challenge. Workflow creates a Kubernetes Service for each app, which effectively assigns a name and one cluster-internal IP address to an app. The DNS service running in the cluster adds and removes DNS records which point from the app name to its IP address as services are added and removed. Drycc Workflow apps, then, can simply send requests to the domain name given to the service, which is "app-name.app-namespace".

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/managing-app-configuration/index.html b/applications/managing-app-configuration/index.html new file mode 100644 index 000000000..4b6f68c55 --- /dev/null +++ b/applications/managing-app-configuration/index.html @@ -0,0 +1,1043 @@ + + + + + + + + + + + + + + + + + + Managing App Configuration - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Configuring an Application

+

A Drycc application stores config in environment variables.

+

Setting Environment Variables

+

Use drycc config to modify environment variables for a deployed application.

+
$ drycc help config
+Valid commands for config:
+
+config:list        list environment variables for an app
+config:set         set environment variables for an app
+config:unset       unset environment variables for an app
+config:pull        extract environment variables to .env
+config:push        set environment variables from .env
+
+Use `drycc help [command]` to learn more.
+ + +

When config is changed, a new release is created and deployed automatically.

+

You can set multiple environment variables with one drycc config:set command, +or with drycc config:push and a local .env file.

+
$ drycc config:set FOO=1 BAR=baz && drycc config:pull
+$ cat .env
+FOO=1
+BAR=baz
+$ echo "TIDE=high" >> .env
+$ drycc config:push
+Creating config... done, v4
+
+=== yuppie-earthman
+DRYCC_APP: yuppie-earthman
+FOO: 1
+BAR: baz
+TIDE: high
+ + +

Attach to Backing Services

+

Drycc treats backing services like databases, caches and queues as attached resources. +Attachments are performed using environment variables.

+

For example, use drycc config to set a DATABASE_URL that attaches +the application to an external PostgreSQL database.

+
$ drycc config:set DATABASE_URL=postgres://user:pass@example.com:5432/db
+=== peachy-waxworks
+DATABASE_URL: postgres://user:pass@example.com:5432/db
+ + +

Detachments can be performed with drycc config:unset.

+

Buildpacks Cache

+

By default, apps using the [Imagebuilder][] will reuse the latest image data. +When deploying applications that depend on third-party libraries that have to be fetched, +this could speed up deployments a lot. In order to make use of this, the buildpack must implement +the cache by writing to the cache directory. Most buildpacks already implement this, but when using +custom buildpacks, it might need to be changed to make full use of the cache.

+

Disabling and re-enabling the cache

+

In some cases, cache might not speed up your application. To disable caching, you can set the +DRYCC_DISABLE_CACHE variable with drycc config:set DRYCC_DISABLE_CACHE=1. When you disable the +cache, Drycc will clear up files it created to store the cache. After having it turned off, run +drycc config:unset DRYCC_DISABLE_CACHE to re-enable the cache.

+

Clearing the cache

+

Use the following procedure to clear the cache:

+
$ drycc config:set DRYCC_DISABLE_CACHE=1
+$ git commit --allow-empty -m "Clearing Drycc cache"
+$ git push drycc # (if you use a different remote, you should use your remote name)
+$ drycc config:unset DRYCC_DISABLE_CACHE
+ + +

Custom Health Checks

+

By default, Workflow only checks that the application starts in their Container. If it is preferred +to have Kubernetes respond to application health, a health check may be added by configuring a +health check probe for the application.

+

The health checks are implemented as Kubernetes container probes. A liveness +and a readiness probe can be configured, and each probe can be of type httpGet, exec, or +tcpSocket depending on the type of probe the container requires.

+

A liveness probe is useful for applications running for long periods of time, eventually +transitioning to broken states and cannot recover except by restarting them.

+

Other times, a readiness probe is useful when the container is only temporarily unable to serve, +and will recover on its own. In this case, if a container fails its readiness probe, the container +will not be shut down, but rather the container will stop receiving incoming requests.

+

httpGet probes are just as it sounds: it performs a HTTP GET operation on the Container. A +response code inside the 200-399 range is considered a pass.

+

exec probes run a command inside the Container to determine its health, such as +cat /var/run/myapp.pid or a script that determines when the application is ready. An exit code of +zero is considered a pass, while a non-zero status code is considered a fail.

+

tcpSocket probes attempt to open a socket in the Container. The Container is only considered +healthy if the check can establish a connection. tcpSocket probes accept a port number to perform +the socket connection on the Container.

+

Health checks can be configured on a per-proctype basis for each application using drycc healthchecks:set. If no type is mentioned then the health checks are applied to default proc types, web or cmd, whichever is present. To +configure a httpGet liveness probe:

+
$ drycc healthchecks:set liveness httpGet 80 --type cmd
+=== peachy-waxworks Healthchecks
+
+cmd:
+Liveness
+--------
+Initial Delay (seconds): 50
+Timeout (seconds): 50
+Period (seconds): 10
+Success Threshold: 1
+Failure Threshold: 3
+Exec Probe: N/A
+HTTP GET Probe: Path="/" Port=80 HTTPHeaders=[]
+TCP Socket Probe: N/A
+
+Readiness
+---------
+No readiness probe configured.
+ + +

If the application relies on certain headers being set (such as the Host header) or a specific +URL path relative to the root, you can also send specific HTTP headers:

+
$ drycc healthchecks:set liveness httpGet 80 \
+    --path /welcome/index.html \
+    --headers "X-Client-Version:v1.0,X-Foo:bar"
+=== peachy-waxworks Healthchecks
+
+web/cmd:
+Liveness
+--------
+Initial Delay (seconds): 50
+Timeout (seconds): 50
+Period (seconds): 10
+Success Threshold: 1
+Failure Threshold: 3
+Exec Probe: N/A
+HTTP GET Probe: Path="/welcome/index.html" Port=80 HTTPHeaders=[X-Client-Version=v1.0]
+TCP Socket Probe: N/A
+
+Readiness
+---------
+No readiness probe configured.
+ + +

To configure an exec readiness probe:

+
$ drycc healthchecks:set readiness exec -- /bin/echo -n hello --type cmd
+=== peachy-waxworks Healthchecks
+
+cmd:
+Liveness
+--------
+No liveness probe configured.
+
+Readiness
+---------
+Initial Delay (seconds): 50
+Timeout (seconds): 50
+Period (seconds): 10
+Success Threshold: 1
+Failure Threshold: 3
+Exec Probe: Command=[/bin/echo -n hello]
+HTTP GET Probe: N/A
+TCP Socket Probe: N/A
+ + +

You can overwrite a probe by running drycc healthchecks:set again:

+
$ drycc healthchecks:set readiness httpGet 80 --type cmd
+=== peachy-waxworks Healthchecks
+
+cmd:
+Liveness
+--------
+No liveness probe configured.
+
+Readiness
+---------
+Initial Delay (seconds): 50
+Timeout (seconds): 50
+Period (seconds): 10
+Success Threshold: 1
+Failure Threshold: 3
+Exec Probe: N/A
+HTTP GET Probe: Path="/" Port=80 HTTPHeaders=[]
+TCP Socket Probe: N/A
+ + +

Configured health checks also modify the default application deploy behavior. When starting a new +Pod, Workflow will wait for the health check to pass before moving onto the next Pod.

+

Isolate the Application

+

Workflow supports isolating applications onto a set of nodes using drycc tags.

+
+

Note

+

In order to use tags, you must first launch your cluster with the proper node labels. If you do +not, tag commands will fail. Learn more by reading "Assigning Pods to Nodes".

+
+

Once your nodes are configured with appropriate label selectors, use drycc tags:set to restrict +the application to those nodes:

+
$ drycc tags:set environ=prod
+Applying tags...  done, v4
+
+environ  prod
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/managing-app-gateway/index.html b/applications/managing-app-gateway/index.html new file mode 100644 index 000000000..5147f8d6f --- /dev/null +++ b/applications/managing-app-gateway/index.html @@ -0,0 +1,864 @@ + + + + + + + + + + + + + + + + + + Managing App Gateway - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

About gateway for an Application

+

A Gateway describes how traffic can be translated to Services within the cluster. That is, it defines a request for a way to translate traffic from somewhere that does not know about Kubernetes to somewhere that does. For example, traffic sent to a Kubernetes Service by a cloud load balancer, an in-cluster proxy, or an external hardware load balancer. While many use cases have client traffic originating “outside” the cluster, this is not a requirement.

+

Create Gateway for an Application

+

Gateway is a way of exposing services externally, which generates an external IP address to connect route and service.

+

Create service for an Application

+

Service is a way of exposing services internally, creating a service generates an internal DNS that can access procfile_type.

+

Create Route for an Application

+

A Gateway may be attached to one or more Route references which serve to direct traffic for a subset of traffic to a specific service.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/managing-app-lifecycle/index.html b/applications/managing-app-lifecycle/index.html new file mode 100644 index 000000000..c97f98682 --- /dev/null +++ b/applications/managing-app-lifecycle/index.html @@ -0,0 +1,952 @@ + + + + + + + + + + + + + + + + + + Managing App Lifecycle - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Managing an Application

+

Track Application Changes

+

Drycc Workflow tracks all changes to your application. Application changes are the result of either new application code +pushed to the platform (via git push drycc master), or an update to application configuration (via drycc config:set KEY=VAL).

+

Each time a build or config change is made to your application a new release is created. These release numbers +increase monotonically.

+

You can see a record of changes to your application using drycc releases:

+
$ drycc releases
+=== peachy-waxworks Releases
+v4      3 minutes ago                     gabrtv deployed d3ccc05
+v3      1 hour 17 minutes ago             gabrtv added DATABASE_URL
+v2      6 hours 2 minutes ago             gabrtv deployed 7cb3321
+v1      6 hours 2 minutes ago             gabrtv deployed drycc/helloworld
+ + +

Rollback a Release

+

Drycc Workflow also supports rolling back go previous releases. If buggy code or an errant configuration change is pushed +to your application, you may rollback to a previously known, good release.

+
+

Note

+

All rollbacks create a new, numbered release. But will reference the build/code and configuration from the desired rollback point.

+
+

In this example, the application is currently running release v4. Using drycc rollback v2 tells Workflow to deploy the +build and configuration that was used for release v2. This creates a new release named v5 whose contents are the source +and configuration from release v2:

+
$ drycc releases
+=== folksy-offshoot Releases
+v4      4 minutes ago                     gabrtv deployed d3ccc05
+v3      1 hour 18 minutes ago             gabrtv added DATABASE_URL
+v2      6 hours 2 minutes ago             gabrtv deployed 7cb3321
+v1      6 hours 3 minutes ago             gabrtv deployed drycc/helloworld
+
+$ drycc rollback v2
+Rolled back to v2
+
+$ drycc releases
+=== folksy-offshoot Releases
+v5      Just now                          gabrtv rolled back to v2
+v4      4 minutes ago                     gabrtv deployed d3ccc05
+v3      1 hour 18 minutes ago             gabrtv added DATABASE_URL
+v2      6 hours 2 minutes ago             gabrtv deployed 7cb3321
+v1      6 hours 3 minutes ago             gabrtv deployed drycc/helloworld
+ + +

Run One-off Administration Tasks

+

Drycc applications use one-off processes for admin tasks like database migrations and other commands that must run against the live application.

+

Use drycc run to execute commands on the deployed application.

+
$ drycc run 'ls -l'
+Running `ls -l`...
+
+total 28
+-rw-r--r-- 1 root root  553 Dec  2 23:59 LICENSE
+-rw-r--r-- 1 root root   60 Dec  2 23:59 Procfile
+-rw-r--r-- 1 root root   33 Dec  2 23:59 README.md
+-rw-r--r-- 1 root root 1622 Dec  2 23:59 pom.xml
+drwxr-xr-x 3 root root 4096 Dec  2 23:59 src
+-rw-r--r-- 1 root root   25 Dec  2 23:59 system.properties
+drwxr-xr-x 6 root root 4096 Dec  3 00:00 target
+ + +

Share an Application

+

Use drycc perms:create to allow another Drycc user to collaborate on your application.

+
$ drycc perms:create otheruser
+Adding otheruser to peachy-waxworks collaborators... done
+ + +

Use drycc perms to see who an application is currently shared with, and drycc perms:delete to remove a collaborator.

+
+

Note

+

Collaborators can do anything with an application that its owner can do, except delete the application.

+
+

When working with an application that has been shared with you, clone the original repository and add Drycc' git remote +entry before attempting to git push any changes to Drycc.

+
$ git clone https://github.com/drycc/example-java-jetty.git
+Cloning into 'example-java-jetty'... done
+$ cd example-java-jetty
+$ git remote add -f drycc ssh://git@local3.dryccapp.com:2222/peachy-waxworks.git
+Updating drycc
+From drycc-controller.local:peachy-waxworks
+ * [new branch]      master     -> drycc/master
+ + +

Application Troubleshooting

+

Applications deployed on Drycc Workflow treat logs as event streams. Drycc Workflow aggregates stdout and stderr +from every Container making it easy to troubleshoot problems with your application.

+

Use drycc logs to view the log output from your deployed application.

+
$ drycc logs -f
+Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.Server:jetty-7.6.0.v20120127
+Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10005
+Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10006
+Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10007
+Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10008
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/managing-app-processes/index.html b/applications/managing-app-processes/index.html new file mode 100644 index 000000000..84916b361 --- /dev/null +++ b/applications/managing-app-processes/index.html @@ -0,0 +1,1088 @@ + + + + + + + + + + + + + + + + + + Managing App Processes - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Managing Application Processes

+

Drycc Workflow manages your application as a set of processes that can be named, scaled and configured according to their +role. This gives you the flexibility to easily manage the different facets of your application. For example, you may have +web-facing processes that handle HTTP traffic, background worker processes that do async work, and a helper process that +streams from the Twitter API.

+

By using a Procfile, either checked in to your application or provided via the CLI you can specify the name of the type +and the application command that should run. To spawn other process types, use drycc scale <type>=<n> to scale those +types accordingly.

+

Default Process Types

+

In the absence of a Procfile, a single, default process type is assumed for each application.

+

Applications built using Buildpacks via git push implicitly receive a web process type, which starts +the application server. Rails 4, for example, has the following process type:

+
web: bundle exec rails server -p $PORT
+ + +

All applications utilizing Dockerfiles have an implied cmd process type, which runs the +Dockerfile's CMD directive unmodified:

+
$ cat Dockerfile
+FROM centos:latest
+COPY . /app
+WORKDIR /app
+CMD python -m SimpleHTTPServer 5000
+EXPOSE 5000
+ + +

For the above Dockerfile-based application, the cmd process type would run the Container CMD of python -m SimpleHTTPServer 5000.

+

Applications utilizing remote Container images, a cmd process type is also implied, and runs the CMD +specified in the Container image.

+
+

Note

+

The web and cmd process types are special as they’re the only process types that will +receive HTTP traffic from Workflow’s routers. Other process types can be named arbitrarily.

+
+

Declaring Process Types

+

If you use Buildpack or Dockerfile builds and want to override or specify additional process +types, simply include a file named Procfile in the root of your application's source tree.

+

The format of a Procfile is one process type per line, with each line containing the command to invoke:

+
<process type>: <command>
+ + +

The syntax is defined as:

+
    +
  • <process type> – a lowercase alphanumeric string, is a name for your command, such as web, worker, urgentworker, clock, etc.
  • +
  • <command> – a command line to launch the process, such as rake jobs:work.
  • +
+

This example Procfile specifies two types, web and sleeper. The web process launches a web server on port 5000 and +a simple process which sleeps for 900 seconds and exits.

+
$ cat Procfile
+web: bundle exec ruby web.rb -p ${PORT:-5000}
+sleeper: sleep 900
+ + +

If you are using remote Container images, you may define process types by either running drycc pull with a +Procfile in your working directory, or by passing a stringified Procfile to the --procfile CLI option.

+

For example, passing process types inline:

+
$ drycc pull drycc/example-go:latest --procfile="cmd: /app/bin/boot"
+ + +

Read a Procfile in another directory:

+
$ drycc pull drycc/example-go:latest --procfile="$(cat deploy/Procfile)"
+ + +

Or via a Procfile located in your current, working directory:

+
$ cat Procfile
+cmd: /bin/boot
+sleeper: echo "sleeping"; sleep 900
+
+
+$ drycc pull -a steely-mainsail drycc/example-go
+Creating build... done
+
+$ drycc scale sleeper=1 -a steely-mainsail
+Scaling processes... but first, coffee!
+done in 0s
+=== steely-mainsail Processes
+--- cmd (started): 1
+steely-mainsail-cmd-3291896318-nyrim up (v3)
+--- sleeper (started): 1
+steely-mainsail-sleeper-3291896318-oq1jr up (v3)
+ + +
+

Note

+

Only process types of web and cmd will be scaled to 1 automatically. If you have additional process types +remember to scale the process counts after creation.

+
+

To remove a process type simply scale it to 0:

+
$ drycc scale sleeper=0 -a steely-mainsail
+Scaling processes... but first, coffee!
+done in 3s
+=== steely-mainsail Processes
+--- cmd (started): 1
+steely-mainsail-cmd-3291896318-nyrim up (v3)
+--- sleeper (started): 0
+ + +

Scaling Processes

+

Applications deployed on Drycc Workflow scale out via the process model. Use drycc scale to control the number of +containers that power your app.

+
$ drycc scale cmd=5 -a iciest-waggoner
+Scaling processes... but first, coffee!
+done in 3s
+=== iciest-waggoner Processes
+--- cmd (started): 5
+iciest-waggoner-web-3291896318-09j0o up (v2)
+iciest-waggoner-web-3291896318-3r7kp up (v2)
+iciest-waggoner-web-3291896318-gc4xv up (v2)
+iciest-waggoner-web-3291896318-lviwo up (v2)
+iciest-waggoner-web-3291896318-kt7vu up (v2)
+ + +

If you have multiple process types for your application you may scale the process count for each type separately. For +example, this allows you to manage web process independently from background workers. For more information on process +types see our documentation for Managing App Processes.

+

In this example, we are scaling the process type web to 5 but leaving the process type background with one worker.

+
$ drycc scale web=5
+Scaling processes... but first, coffee!
+done in 4s
+=== scenic-icehouse Processes
+--- web (started): 5
+scenic-icehouse-web-3291896318-7lord up (v2)
+scenic-icehouse-web-3291896318-jn957 up (v2)
+scenic-icehouse-web-3291896318-rsekj up (v2)
+scenic-icehouse-web-3291896318-vwhnh up (v2)
+scenic-icehouse-web-3291896318-vokg7 up (v2)
+--- background (started): 1
+scenic-icehouse-web-3291896318-background-yf8kh up (v2)
+ + +
+

Note

+

The default process type for Dockerfile and Container Image applications is 'cmd' rather than 'web'.

+
+

Scaling a process down, by reducing the process count, sends a TERM signal to the processes, followed by a SIGKILL +if they have not exited within 30 seconds. Depending on your application, scaling down may interrupt long-running HTTP +client connections.

+

For example, scaling from 5 processes to 3:

+
$ drycc scale web=3
+Scaling processes... but first, coffee!
+done in 1s
+=== scenic-icehouse Processes
+--- background (started): 1
+scenic-icehouse-web-3291896318-background-yf8kh up (v2)
+--- web (started): 3
+scenic-icehouse-web-3291896318-7lord up (v2)
+scenic-icehouse-web-3291896318-rsekj up (v2)
+scenic-icehouse-web-3291896318-vokg7 up (v2)
+ + +

Get a Shell to a Running Container

+

Verify that the container is running:

+
# drycc ps
+=== python-getting-started Processes
+--- web:
+python-getting-started-web-69b7d4bfdc-kl4xf up (v2)
+ + +

Get a shell to the running container:

+
# drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -it -- bash
+ + +

In your shell, list the root directory:

+
# Run this inside the container
+ls /
+ + +

Running individual commands in a container

+
# drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -- date
+ + +

Use "drycc ps --help" for a list of global command-line (applies to all commands).

+

Autoscale

+

Autoscale allows adding a minimum and maximum number of pods on a per process type basis. This is accomplished by specifying a target CPU usage across all available pods.

+

This feature is built on top of Horizontal Pod Autoscaling in Kubernetes or HPA for short.

+
+

Note

+

This is an alpha feature. It is recommended to be on the latest Kubernetes when using this feature.

+
+
$ drycc autoscale:set web --min=3 --max=8 --cpu-percent=75
+Applying autoscale settings for process type web on scenic-icehouse... done
+ + +

And then review the scaling rule that was created for web

+
$ drycc autoscale:list
+=== scenic-icehouse Autoscale
+
+--- web:
+Min Replicas: 3
+Max Replicas: 8
+CPU: 75%
+ + +

Remove scaling rule

+
$ drycc autoscale:unset web
+Removing autoscale for process type web on scenic-icehouse... done
+ + +

For autoscaling to work CPU requests have to be specified on each application Pod (can be done via drycc limits --cpu). This allows the autoscale policies to do the appropriate calculations and make decisions on when to scale up and down.

+

Scale up can only happen if there was no rescaling within the last 3 minutes. Scale down will wait for 5 minutes from the last rescaling. That information and more can be found at HPA algorithm page.

+

Web vs Cmd Process Types

+

When deploying to Drycc Workflow using a Heroku Buildpack, Workflow boots the web process type to +boot the application server. When you deploy an application that has a Dockerfile or uses Container +images, Workflow boots the cmd process type. Both act similarly in that +they are exposed to the router as web applications. However, the cmd process type is special +because, if left undefined, it is equivalent to running the container without any additional +arguments. (i.e. The process specified by the Dockerfile or Container image's CMD directive will +be used.)

+

If migrating an application from Heroku Buildpacks to a Container-based deployment, Workflow will not +automatically convert the web process type to cmd. To do this, you'll have to manually scale +down the old process type and scale the new process type up.

+

Restarting an Application Processes

+

If you need to restart an application process, you may use drycc ps:restart. Behind the scenes, Drycc Workflow instructs +Kubernetes to terminate the old process and launch a new one in its place.

+
$ drycc ps
+=== scenic-icehouse Processes
+--- web (started): 3
+scenic-icehouse-web-3291896318-7lord up (v2)
+scenic-icehouse-web-3291896318-rsekj up (v2)
+scenic-icehouse-web-3291896318-vokg7 up (v2)
+--- background (started): 1
+scenic-icehouse-background-3291896318-yf8kh up (v2)
+$ drycc ps:restart scenic-icehouse-background-3291896318-yf8kh
+Restarting processes... but first, coffee!
+done in 6s
+=== scenic-icehouse Processes
+--- background (started): 1
+scenic-icehouse-background-3291896318-yd87g up (v2)
+ + +

Notice that the process name has changed from scenic-icehouse-background-3291896318-yf8kh to +scenic-icehouse-background-3291896318-yd87g. In a multi-node Kubernetes cluster, this may also have the effect of scheduling +the Pod to a new node.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/managing-app-resources/index.html b/applications/managing-app-resources/index.html new file mode 100644 index 000000000..d57506e0f --- /dev/null +++ b/applications/managing-app-resources/index.html @@ -0,0 +1,968 @@ + + + + + + + + + + + + + + + + + + Managing App Resources - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Managing resources for an Application

+

We can use blow command to create resources and bind which resource is created. +This command depend on service-catalog.

+

Use drycc resources to create and bind a resource for a deployed application.

+
$ drycc help resources
+Valid commands for resources:
+
+resources:services         list all available resource services
+resources:plans            list all available plans for an resource services
+resources:create           create a resource for the application
+resources:list             list resources in the application
+resources:describe         get a resource detail info in the application
+resources:update           update a resource from the application
+resources:destroy          delete a resource from the applicationa
+resources:bind             bind a resource to servicebroker
+resources:unbind           unbind a resource from servicebroker
+
+Use 'drycc help [command]' to learn more.
+ + +

List all available resource services

+

You can list available resource services with one drycc resources:services command

+
$ drycc resources:services
++------------+------------+
+|    NAME    | UPDATEABLE |
++------------+------------+
+| mysql      | true       |
+| postgresql | true       |
+| memcached  | true       |
+| redis      | true       |
++------------+------------+
+ + +

List all available plans for an resource services

+

You can list all available plans for an resource services with one drycc resources:plans command

+
$ drycc resources:plans redis
++-------+--------------------------------+
+| NAME  |          DESCRIPTION           |
++-------+--------------------------------+
+| 40000 | Redis 40000 plan which limit   |
+|       | resources memory size 40Gi.    |
+|   250 | Redis 250 plan which limit     |
+|       | resources memory size 250Mi.   |
+| 20000 | Redis 20000 plan which limit   |
+|       | resources memory size 20Gi.    |
+|  5000 | Redis 5000 plan which limit    |
+|       | resources memory size 5Gi.     |
+|   500 | Redis 500 plan which limit     |
+|       | resources memory size 500Mi.   |
+|   128 | Redis 128 plan which limit     |
+|       | resources memory size 128Mi.   |
+| 50000 | Redis 50000 plan which limit   |
+|       | resources memory size 50Gi.    |
+|  2500 | Redis 2500 plan which limit    |
+|       | resources memory size 2.5Gi.   |
+| 30000 | Redis 30000 plan which limit   |
+|       | resources memory size 30Gi.    |
+| 10000 | Redis 10000 plan which limit   |
+|       | resources memory size 10Gi.    |
+|  1000 | Redis 1000 plan which limit    |
+|       | resources memory size 1Gi.     |
++-------+--------------------------------+
+ + +

Create resource in application

+

You can create a resource with one drycc resources:create command

+
$ drycc resources:create redis:1000 redis
+Creating redis to scenic-icehouse... done
+ + +

After resources are created, you can list the resources in this application.

+
$ drycc resources:list
+=== scenic-icehouse resources
+redis      redis:1000
+ + +

Bind resources

+

The resource which is named redis is created, you can bind the redis to the application, +use the command of drycc resources:bind redis.

+
$ drycc resources:bind redis
+Binding resource... done
+ + +

Describe resources

+

And use drycc resources:describe show the binding detail. If the binding is successful, this command will show the information of connect to the resource.

+
$ drycc resources:describe redis
+=== scenic-icehouse resource redis
+plan:               redis:1000
+status:             Ready
+binding:            Ready
+
+REDISPORT:          6379
+REDIS_PASSWORD:     RzG87SJWG1
+SENTINELHOST:       172.16.0.2
+SENTINELPORT:       26379
+ + +

Update resources

+

You can use the drycc resources:update command to upgrade a new plan. +An example of how to upgrade the plan's capacity to 100MB:

+
$ drycc resources:update redis:10000 redis
+Updating redis to scenic-icehouse... done
+ + +

Remove the resource

+

If you don't need resources, use drycc resources:unbind to unbind the resource and then use drycc resources:destroy to delete the resource from the application. +Before deleting the resource, the resource must be unbinded.

+
$ drycc resources:unbind redis
+Unbinding resource... done
+
+$ drycc resources:destroy redis
+Deleting redis from scenic-icehouse... done
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/managing-app-volumes/index.html b/applications/managing-app-volumes/index.html new file mode 100644 index 000000000..c14385eb2 --- /dev/null +++ b/applications/managing-app-volumes/index.html @@ -0,0 +1,907 @@ + + + + + + + + + + + + + + + + + + Managing App Volumes - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Mounting volumes for an Application

+

We can use the blow command to create volumes and mount the created volumes. +Drycc create volume support ReadWriteMany, so before deploying drycc, you need to have a StorageClass ready which can support ReadWriteMany. +Deploying drycc, set controller.appStorageClass to this StorageClass.

+

Use drycc volumes to mount a volume for a deployed application's processes.

+
$ drycc help volumes
+Valid commands for volumes:
+
+volumes:create           create a volume for the application
+volumes:list             list volumes in the application
+volumes:delete           delete a volume from the application
+volumes:mount            mount a volume to process of the application
+volumes:unmount          unmount a volume from process of the application
+
+Use 'drycc help [command]' to learn more.
+ + +

Create a volume for the application

+

You can create a volume with the drycc volumes:create command

+
$ drycc volumes:create myvolume 200M
+Creating myvolumes to scenic-icehouse... done
+ + +

List volumes in the application

+

After volume is created, you can list the volumes in this application.

+
$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes     200M
+ + +

Mount a volume

+

The volume which is named myvolumes is created, you can mount the volume with process of the application, +use the command of drycc volumes:mount. When volume is mounted, a new release will be created and deployed automatically.

+
$ drycc volumes:mount myvolumes web=/data/web
+Mounting volume... done
+ + +

And use drycc volumes:list show mount detail.

+
$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes     200M
+web               /data/web
+ + +

If you don't need the volume, use drycc volumes:unmount to unmount the volume and then use drycc volumes:delete to delete the volume from the application. +Before deleting volume, the volume has to be unmounted.

+
$ drycc volumes:unmount myvolumes web
+Unmounting volume... done
+
+$ drycc volumes:delete myvolumes
+Deleting myvolumes from scenic-icehouse... done
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/managing-resource-limits/index.html b/applications/managing-resource-limits/index.html new file mode 100644 index 000000000..de8aec4b7 --- /dev/null +++ b/applications/managing-resource-limits/index.html @@ -0,0 +1,1021 @@ + + + + + + + + + + + + + + + + + + Resource Limits - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Managing Application Resource Limits

+

Drycc Workflow supports restricting memory and CPU shares of each process. Requests/Limits set on a per-process type are given to +Kubernetes as a requests and limits. Which means you guarantee <requests> amount of resource for a process as well as limit +the process from using more than <limits>. +By default, Kubernetes will set <requests> equal to <limit> if we don't explicitly set <requests> value. Please keep in mind that 0 <= requests <= limits.

+

Limiting Memory

+

If you set a requests/limits that is out of range for your cluster, Kubernetes will be unable to schedule your application +processes into the cluster!

+

Available units for memory are:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
UnitAmount
BBytes
KKiB (Power of 2)
MMiB (Power of 2)
GGiB (Power of 2)
+
+

Important

+

The minimum memory limit allowed is 4MiB.

+
+

Use drycc limits:set <type>=<value> to restrict memory by process type, where value can be <limit> or <request>/<limit> format :

+
$ drycc limits:set web=64M
+Applying limits... done
+
+=== indoor-whitecap Limits
+
+--- Memory
+web     64M
+
+--- CPU
+Unlimited
+
+$ drycc limits:set cmd=32M/64M
+Applying limits... done
+
+=== outdoor-whitecap Limits
+
+--- Memory
+cmd     32M/64M
+
+--- CPU
+Unlimited
+ + +

If you would like to remove any configured memory limits use drycc limits:unset web:

+
$ drycc limits:unset web
+Applying limits... done
+
+=== indoor-whitecap Limits
+
+--- Memory
+Unlimited
+
+--- CPU
+Unlimited
+ + +

Limiting CPU

+

You can also use drycc limits:set <type>=<value> --cpu to restrict CPU shares, where value can be <limit> or +<request>/<limit> format. CPU shares are tracked in milli-cores. One CPU core is equivalent to 1000 milli-cores. +To dedicate half a core to your process, you would need 500 milli-cores or 500m.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
UnitAmount
1000m1000 milli-cores == 100% CPU core
500m500 milli-cores == 50% CPU core
250m250 milli-cores == 25% CPU core
100m100 milli-cores == 10% CPU core
+
$ drycc limits:set web=250m --cpu
+Applying limits... done
+
+=== indoor-whitecap Limits
+
+--- Memory
+web     64M
+
+--- CPU
+web     250m
+
+$ drycc limits:set web=1500m/2000m --cpu
+Applying limits... done
+
+=== indoor-whitecap Limits
+
+--- Memory
+web     64M
+
+--- CPU
+web     1500m/2000m
+ + +

You can verify the CPU and memory limits by inspecting the application process Pod with kubectl:

+
$ drycc ps
+=== indoor-whitecap Processes
+--- web (started): 1
+indoor-whitecap-v14-web-8slcj up (v14)
+$ kubectl --namespace=indoor-whitecap describe po indoor-whitecap-v14-web-8slcj
+Name:       indoor-whitecap-v14-web-8slcj
+Containers:
+    QoS Tier:
+      cpu:     Guaranteed
+      memory:  Guaranteed
+    Limits:
+      cpu:     2000m
+      memory:  64Mi
+    Requests:
+      memory:  64Mi
+      cpu:     1500m
+ + +
+

Important

+

If you restrict resources to the point where containers do not start, +the limits:set command will hang. If this happens, use CTRL-C +to break out of limits:set and use limits:unset to revert.

+
+

To unset a CPU limit use drycc limits:unset web --cpu:

+
$ drycc limits:unset web --cpu
+Applying limits... done
+
+=== indoor-whitecap Limits
+
+--- Memory
+Unlimited
+
+--- CPU
+Unlimited
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/ssl-certificates/index.html b/applications/ssl-certificates/index.html new file mode 100644 index 000000000..f346efd2f --- /dev/null +++ b/applications/ssl-certificates/index.html @@ -0,0 +1,1014 @@ + + + + + + + + + + + + + + + + + + SSL Certificates - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Application SSL Certificates

+

SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web +requests. Apps that transmit sensitive data should enable SSL to ensure all information is +transmitted securely.

+

To enable SSL on a custom domain, e.g., www.example.com, use the SSL endpoint.

+
+

Note

+

drycc certs is only useful for custom domains. Default application domains are +SSL-enabled already and can be accessed simply by using https, +e.g. https://foo.dryccapp.com (provided that you have installed your wildcard +certificate on the routers or on the load balancer).

+
+

Overview

+

Because of the unique nature of SSL validation, provisioning SSL for your domain is a multi-step +process that involves several third-parties. You will need to:

+
    +
  1. Purchase an SSL certificate from your SSL provider
  2. +
  3. Upload the cert to Drycc
  4. +
+

Acquire SSL Certificate

+

Purchasing an SSL cert varies in cost and process depending on the vendor. RapidSSL offers a +simple way to purchase a certificate and is a recommended solution. If you’re able to use this +provider, see buy an SSL certificate with RapidSSL for instructions.

+

DNS and Domain Configuration

+

Once the SSL certificate is provisioned and your cert is confirmed, you must route requests for +your domain through Drycc. Unless you've already done so, add the domain specified when generating +the CSR to your app with:

+
$ drycc domains:add www.example.com -a foo
+Adding www.example.com to foo... done
+ + +

Add a Certificate

+

Add your certificate, any intermediate certificates, and private key to the endpoint with the +certs:add command.

+
$ drycc certs:add example-com server.crt server.key
+Adding SSL endpoint... done
+www.example.com
+ + +
+

Note

+

The name given to the certificate can only contain a-z (lowercase), 0-9 and hyphens

+
+

The Drycc platform will investigate the certificate and extract any relevant information from it +such as the Common Name, Subject Alt Names (SAN), fingerprint and more.

+

This allows for wildcard certificates and multiple domains in the SAN without uploading duplicates.

+

Add a Certificate Chain

+

Sometimes, your certificates (such as a self-signed or a cheap certificate) need additional +certificates to establish the chain of trust. What you need to do is bundle all the certificates +into one file and give that to Drycc. Importantly, your site’s certificate must be the first one:

+
$ cat server.crt server.ca > server.bundle
+ + +

After that, you can add them to Drycc with the certs:add command:

+
$ drycc certs:add example-com server.bundle server.key
+Adding SSL endpoint... done
+www.example.com
+ + +

Attach SSL certificate to a domain

+

Certificates are not automagically connected up to domains, instead you will have to attach a +certificate to a domain

+
$ drycc certs:attach example-com example.com
+ + +

Each certificate can be connected to many domains. There is no need to upload duplicates.

+

To remove an association

+
$ drycc certs:detach example-com example.com
+ + +

Endpoint overview

+

You can verify the details of your domain's SSL configuration with drycc certs.

+
$ drycc certs
+
+     Name     |    Common Name    | SubjectAltName    |         Expires         |   Fingerprint   |   Domains    |   Updated   |   Created
++-------------+-------------------+-------------------+-------------------------+-----------------+--------------+-------------+-------------+
+  example-com |     example.com   | blog.example.com  | 31 Dec 2017 (in 1 year) | 8F:8E[...]CD:EB |  example.com | 30 Jan 2016 | 29 Jan 2016
+ + +

or by looking at at each certificates detailed information

+
$ drycc certs:info example-com
+
+=== bar-com Certificate
+Common Name(s):     example.com
+Expires At:         2017-01-14 23:57:57 +0000 UTC
+Starts At:          2016-01-15 23:57:57 +0000 UTC
+Fingerprint:        7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0
+Subject Alt Name:   blog.example.com
+Issuer:             /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc
+Subject:            /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc
+
+Connected Domains:  example.com
+Owner:              admin-user
+Created:            2016-01-28 19:07:41 +0000 UTC
+Updated:            2016-01-30 00:10:02 +0000 UTC
+ + +

Testing SSL

+

Use a command line utility like curl to test that everything is configured correctly for your +secure domain.

+
+

Note

+

The -k option flag tells curl to ignore untrusted certificates.

+
+

Pay attention to the output. It should print SSL certificate verify ok. If it prints something +like common name: www.example.com (does not match 'www.somedomain.com') then something is not +configured correctly.

+

Enforcing SSL at the Router

+

To enforce all HTTP requests be redirected to HTTPS, TLS can be enforced at the router level by +running

+
$ drycc tls:force:enable -a foo
+Enabling https-only requests for foo... done
+ + +

Users hitting the HTTP endpoint for the application will now receive a 301 redirect to the HTTPS +endpoint.

+

To disable enforced TLS, run

+
$ drycc tls:force:disable -a foo
+Disabling https-only requests for foo... done
+ + +

Automated Certificate Management

+

With Automated Certificate Management (ACM), Drycc automatically manages TLS certificates for apps with Hobby and Professional dynos on the Common Runtime, and for apps in Private Spaces that enable the feature. +Certificates handled by ACM automatically renew one month before they expire, and new certificates are created automatically whenever you add or remove a custom domain. All applications with paid dynos include ACM for free. +Automated Certificate Management uses Let’s Encrypt, the free, automated, and open certificate authority for managing your application’s TLS certificates. Let’s Encrypt is run for the public benefit by the Internet Security Research Group (ISRG).

+

To enable ACM with the following command: + $ drycc tls:auto:enable -a foo

+

To disable ACM with the following command: + $ drycc tls:auto:disable -a foo

+

Remove Certificate

+

You can remove a certificate using the certs:remove command:

+
$ drycc certs:remove my-cert
+Removing www.example.com... Done.
+ + +

Swapping out certificates

+

Over the lifetime of an application an operator will have to acquire certificates with new expire +dates and apply it to all relevant applications, below is the recommended way to swap out certificates.

+

Be intentional with certificate names, name them example-com-2017 when possible, where the year +signifies the expiry year. This allows for example-com-2018 when a new certificate is purchased.

+

Assuming all applications are already using example-com-2017 the following commands can be ran, +chained together or otherwise:

+
$ drycc certs:detach example-com-2017 example.com
+$ drycc certs:attach example-com-2018 example.com
+ + +

This will take care of a singular domain which allows the operator to verify everything went +as planned and slowly roll it out to any other application using the same method.

+

Troubleshooting

+

Here are some steps you can follow if your SSL endpoint is not working as you'd expect.

+

Untrusted Certificate

+

In some cases when accessing the SSL endpoint, it may list your certificate as untrusted.

+

If this occurs, it may be because it is not trusted by Mozilla’s list of root CAs. If this is +the case, your certificate may be considered untrusted for many browsers.

+

If you have uploaded a certificate that was signed by a root authority but you get the message that +it is not trusted, then something is wrong with the certificate. For example, it may be missing +intermediary certificates. If so, download the intermediary certificates from your SSL provider, +remove the certificate from Drycc and re-run the certs:add command.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/using-buildpacks/index.html b/applications/using-buildpacks/index.html new file mode 100644 index 000000000..3549a5adc --- /dev/null +++ b/applications/using-buildpacks/index.html @@ -0,0 +1,1001 @@ + + + + + + + + + + + + + + + + + + Buildpacks - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Using Buildpacks

+

Drycc supports deploying applications via Cloud Native Buildpacks. Cloud Native Buildpacks are useful if you want to follow cnb's docs for building applications.

+

Add SSH Key

+

For Buildpack based application deploys via git push, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.

+
    +
  • +

    See this document for instructions on how to generate an SSH key.

    +
  • +
  • +

    Run drycc keys:add to upload your SSH key to Drycc Workflow.

    +
  • +
+
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+ + +

Read more about adding/removing SSH Keys here.

+

Prepare an Application

+

If you do not have an existing application, you can clone an example application that demonstrates the Heroku Buildpack workflow.

+
$ git clone https://github.com/drycc/example-go.git
+$ cd example-go
+ + +

Create an Application

+

Use drycc create to create an application on the Controller.

+
$ drycc create
+Creating application... done, created skiing-keypunch
+Git remote drycc added
+ + +

Push to Deploy

+

Use git push drycc master to deploy your application.

+
$ git push drycc master
+Counting objects: 75, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (48/48), done.
+Writing objects: 100% (75/75), 18.28 KiB | 0 bytes/s, done.
+Total 75 (delta 30), reused 58 (delta 22)
+remote: --->
+Starting build... but first, coffee!
+---> Waiting podman running.
+---> Process podman started.
+---> Waiting caddy running.
+---> Process caddy started.
+---> Building pack
+---> Using builder registry.drycc.cc/drycc/buildpacks:bookworm
+Builder 'registry.drycc.cc/drycc/buildpacks:bookworm' is trusted
+Pulling image 'registry.drycc.cc/drycc/buildpacks:bookworm'
+Resolving "drycc/buildpacks" using unqualified-search registries (/etc/containers/registries.conf)
+Trying to pull registry.drycc.cc/drycc/buildpacks:bookworm...
+Getting image source signatures
+...
+---> Skip generate base layer
+---> Python Buildpack
+---> Downloading and extracting Python 3.10.0
+---> Installing requirements with pip
+Collecting Django==3.2.8
+Downloading Django-3.2.8-py3-none-any.whl (7.9 MB)
+Collecting gunicorn==20.1.0
+Downloading gunicorn-20.1.0-py3-none-any.whl (79 kB)
+Collecting sqlparse>=0.2.2
+Downloading sqlparse-0.4.2-py3-none-any.whl (42 kB)
+Collecting pytz
+Downloading pytz-2021.3-py2.py3-none-any.whl (503 kB)
+Collecting asgiref<4,>=3.3.2
+Downloading asgiref-3.4.1-py3-none-any.whl (25 kB)
+Requirement already satisfied: setuptools>=3.0 in /layers/drycc_python/python/lib/python3.10/site-packages (from gunicorn==20.1.0->-r requirements.txt (line 2)) (57.5.0)
+Installing collected packages: sqlparse, pytz, asgiref, gunicorn, Django
+Successfully installed Django-3.2.8 asgiref-3.4.1 gunicorn-20.1.0 pytz-2021.3 sqlparse-0.4.2
+---> Generate Launcher
+...
+Build complete.
+Launching App...
+...
+Done, skiing-keypunch:v2 deployed to Workflow
+
+Use 'drycc open' to view this application in your browser
+
+To learn more, use 'drycc help' or visit https://www.drycc.cc
+
+To ssh://git@drycc.staging-2.drycc.cc:2222/skiing-keypunch.git
+ * [new branch]      master -> master
+
+$ curl -s http://skiing-keypunch.example.com
+Powered by Drycc
+Release v2 on skiing-keypunch-v2-web-02zb9
+ + +

Because a Buildpacks-style application is detected, the web process type is automatically scaled to 1 on first deploy.

+

Use drycc scale web=3 to increase web processes to 3, for example. Scaling a +process type directly changes the number of pods running that process.

+

Included Buildpacks

+

For convenience, a number of buildpacks come bundled with Drycc:

+ +

Drycc will cycle through the bin/detect script of each buildpack to match the code you +are pushing.

+
+

Note

+

If you're testing against the [Scala Buildpack][], the Builder requires at least +512MB of free memory to execute the Scala Build Tool.

+
+

Using a Custom Buildpack

+

To use a custom buildpack, you need create a .pack_builder file in your root path app.

+
$  tee > .pack_builder << EOF
+   > registry.drycc.cc/drycc/buildpacks:bookworm
+   > EOF
+ + +

On your next git push, the custom buildpack will be used.

+

Using Private Repositories

+

To pull code from private repositories, set the SSH_KEY environment variable to a private key +which has access. Use either the path of a private key file or the raw key material:

+
$ drycc config:set SSH_KEY=/home/user/.ssh/id_rsa
+$ drycc config:set SSH_KEY="""-----BEGIN RSA PRIVATE KEY-----
+(...)
+-----END RSA PRIVATE KEY-----"""
+ + +

For example, to use a custom buildpack hosted at a private GitHub URL, ensure that an SSH public +key exists in your GitHub settings. Then set SSH_KEY to the corresponding SSH private key +and set .pack_builder to the builder image:

+
$  tee > .pack_builder << EOF
+   > registry.drycc.cc/drycc/buildpacks:bookworm
+   > EOF
+$ git add .buildpack
+$ git commit -m "chore(buildpack): modify the pack_builder"
+$ git push drycc master
+ + +

Builder selector

+

Which way to build a project conforms to the following principles:

+
    +
  • If Dockerfile exists in the project, the stack uses container
  • +
  • If Procfile exists in the project, the stack uses buildpack
  • +
  • If both exist, container is used by default
  • +
  • You can also set the DRYCC_STACK to container or buildpack determine which stack to use.
  • +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/using-container-images/index.html b/applications/using-container-images/index.html new file mode 100644 index 000000000..5d8e88513 --- /dev/null +++ b/applications/using-container-images/index.html @@ -0,0 +1,933 @@ + + + + + + + + + + + + + + + + + + Container Images - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Using Docker Images

+

Drycc supports deploying applications via an existing Docker Image. +This is useful for integrating Drycc into Docker-based CI/CD pipelines.

+

Prepare an Application

+

Start by cloning an example application:

+
$ git clone https://github.com/drycc/example-dockerfile-http.git
+$ cd example-dockerfile-http
+ + +

Next use your local docker client to build the image and push +it to DockerHub.

+
$ docker build -t <username>/example-dockerfile-http .
+$ docker push <username>/example-dockerfile-http
+ + +

Docker Image Requirements

+

In order to deploy Docker images, they must conform to the following requirements:

+
    +
  • The Dockerfile must use the EXPOSE directive to expose exactly one port.
  • +
  • That port must be listening for an HTTP connection.
  • +
  • The Dockerfile must use the CMD directive to define the default process that will run within the container.
  • +
  • The Docker image must contain bash to run processes.
  • +
+
+

Note

+

Note that if you are using a private registry of any kind (gcr or other) the application environment must include a $PORT config variable that matches the EXPOSE'd port, example: drycc config:set PORT=5000. See Configuring Registry for more info.

+
+

Create an Application

+

Use drycc create to create an application on the controller.

+
$ mkdir -p /tmp/example-dockerfile-http && cd /tmp/example-dockerfile-http
+$ drycc create example-dockerfile-http --no-remote
+Creating application... done, created example-dockerfile-http
+ + +
+

Note

+

For all commands except for drycc create, the drycc client uses the name of the current directory +as the app name if you don't specify it explicitly with --app.

+
+

Deploy the Application

+

Use drycc pull to deploy your application from DockerHub or +a public registry.

+
$ drycc pull <username>/example-dockerfile-http:latest
+Creating build...  done, v2
+
+$ curl -s http://example-dockerfile-http.local3.dryccapp.com
+Powered by Drycc
+ + +

Because you are deploying a Docker image, the cmd process type is automatically scaled to 1 on first deploy.

+

Use drycc scale cmd=3 to increase cmd processes to 3, for example. Scaling a +process type directly changes the number of Containers +running that process.

+

Private Registry

+

To deploy Docker images from a private registry or from a private repository, use drycc registry +to attach credentials to your application. These credentials are the same as you'd use when running +docker login at your private registry.

+

To deploy private Docker images, take the following steps:

+
    +
  • Gather the username and password for the registry, such as a Quay.io Robot Account or a GCR.io Long Lived Token
  • +
  • Run drycc registry:set username=<the-user> password=<secret> -a <application-name>
  • +
  • Now perform drycc pull as normal, against an image in the private registry
  • +
+

When using a GCR.io Long Lived Token, the JSON blob will have to be compacted first using a +tool like jq and then used in the password field in drycc registry:set. For the username, use +_json_key. For example:

+
drycc registry:set username=_json_key password="$(cat google_cloud_cred.json | jq -c .)"
+ + +

When using a private registry the docker images are no longer pulled into the Drycc Internal Registry via +the Drycc Workflow Controller but rather is managed by Kubernetes. This will increase security and overall speed, +however the application port information can no longer be discovered. Instead the application port information can be set via +drycc config:set PORT=80 prior to setting the registry information.

+
+

Note

+

Currently GCR.io and ECR in short lived auth token mode are not supported.

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/applications/using-dockerfiles/index.html b/applications/using-dockerfiles/index.html new file mode 100644 index 000000000..0891fc4bd --- /dev/null +++ b/applications/using-dockerfiles/index.html @@ -0,0 +1,981 @@ + + + + + + + + + + + + + + + + + + Dockerfiles - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Using Dockerfiles

+

Drycc supports deploying applications via Dockerfiles. A Dockerfile automates the steps for crafting a [Container Image][]. +Dockerfiles are incredibly powerful but require some extra work to define your exact application runtime environment.

+

Add SSH Key

+

For Dockerfile based application deploys via git push, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.

+
    +
  • +

    See this document for instructions on how to generate an SSH key.

    +
  • +
  • +

    Run drycc keys:add to upload your SSH key to Drycc Workflow.

    +
  • +
+
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+ + +

Read more about adding/removing SSH Keys here.

+

Prepare an Application

+

If you do not have an existing application, you can clone an example application that demonstrates the Dockerfile workflow.

+
$ git clone https://github.com/drycc/helloworld.git
+$ cd helloworld
+ + +

Dockerfile Requirements

+

In order to deploy Dockerfile applications, they must conform to the following requirements:

+
    +
  • The Dockerfile must use the EXPOSE directive to expose exactly one port.
  • +
  • That port must be listening for an HTTP connection.
  • +
  • The Dockerfile must use the CMD directive to define the default process that will run within the container.
  • +
  • The Container image must contain bash to run processes.
  • +
+
+

Note

+

Note that if you are using a private registry of any kind (gcr or other) the application environment must include a $PORT config variable that matches the EXPOSE'd port, example: drycc config:set PORT=5000. See Configuring Registry for more info.

+
+

Create an Application

+

Use drycc create to create an application on the Controller.

+
$ drycc create
+Creating application... done, created folksy-offshoot
+Git remote drycc added
+ + +

Push to Deploy

+

Use git push drycc master to deploy your application.

+
$ git push drycc master
+Counting objects: 13, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (13/13), done.
+Writing objects: 100% (13/13), 1.99 KiB | 0 bytes/s, done.
+Total 13 (delta 2), reused 0 (delta 0)
+-----> Building Docker image
+Uploading context 4.096 kB
+Uploading context
+Step 0 : FROM drycc/base:latest
+ ---> 60024338bc63
+Step 1 : RUN wget -O /tmp/go1.2.1.linux-amd64.tar.gz -q https://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz
+ ---> Using cache
+ ---> cf9ef8c5caa7
+Step 2 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz
+ ---> Using cache
+ ---> 515b1faf3bd8
+Step 3 : RUN mkdir -p /go
+ ---> Using cache
+ ---> ebf4927a00e9
+Step 4 : ENV GOPATH /go
+ ---> Using cache
+ ---> c6a276eded37
+Step 5 : ENV PATH /usr/local/go/bin:/go/bin:$PATH
+ ---> Using cache
+ ---> 2ba6f6c9f108
+Step 6 : ADD . /go/src/github.com/drycc/helloworld
+ ---> 94ab7f4b977b
+Removing intermediate container 171b7d9fdb34
+Step 7 : RUN cd /go/src/github.com/drycc/helloworld && go install -v .
+ ---> Running in 0c8fbb2d2812
+github.com/drycc/helloworld
+ ---> 13b5af931393
+Removing intermediate container 0c8fbb2d2812
+Step 8 : ENV PORT 80
+ ---> Running in 9b07da36a272
+ ---> 2dce83167874
+Removing intermediate container 9b07da36a272
+Step 9 : CMD ["/go/bin/helloworld"]
+ ---> Running in f7b215199940
+ ---> b1e55ce5195a
+Removing intermediate container f7b215199940
+Step 10 : EXPOSE 80
+ ---> Running in 7eb8ec45dcb0
+ ---> ea1a8cc93ca3
+Removing intermediate container 7eb8ec45dcb0
+Successfully built ea1a8cc93ca3
+-----> Pushing image to private registry
+
+       Launching... done, v2
+
+-----> folksy-offshoot deployed to Drycc
+       http://folksy-offshoot.local3.dryccapp.com
+
+       To learn more, use `drycc help` or visit https://www.drycc.cc
+
+To ssh://git@local3.dryccapp.com:2222/folksy-offshoot.git
+ * [new branch]      master -> master
+
+$ curl -s http://folksy-offshoot.local3.dryccapp.com
+Welcome to Drycc!
+See the documentation at http://docs.drycc.cc/ for more information.
+ + +

Because a Dockerfile application is detected, the cmd process type is automatically scaled to 1 on first deploy.

+

Use drycc scale cmd=3 to increase cmd processes to 3, for example. Scaling a +process type directly changes the number of containers +running that process.

+

Container Build Arguments

+

As of Workflow v2.13.0, users can inject their application config into the Container image using +Container build arguments. To opt into this, users must add a new environment variable +to their application:

+
$ drycc config:set DRYCC_DOCKER_BUILD_ARGS_ENABLED=1
+ + +

Every environment variable set with drycc config:set will then be available for use inside the +user's Dockerfile. For example, if a user runs drycc config:set POWERED_BY=Workflow, +the user can utilize that build argument in their Dockerfile:

+
ARG POWERED_BY
+RUN echo "Powered by $POWERED_BY" > /etc/motd
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bower.json b/bower.json new file mode 100644 index 000000000..1400e29fb --- /dev/null +++ b/bower.json @@ -0,0 +1,8 @@ +{ + "name": "drycc workflow docs", + "dependencies": { + "headroom.js": "^0.9.3", + "font-awesome": "^4.6.3", + "foundation": "^5.5.3" + } +} diff --git a/changelogs/v1.0.1/index.html b/changelogs/v1.0.1/index.html new file mode 100644 index 000000000..d28b67e8a --- /dev/null +++ b/changelogs/v1.0.1/index.html @@ -0,0 +1,875 @@ + + + + + + + + + + + + + + + + + + v1.0.1 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

The time has come for major release! We are proud to present Drycc Workflow 1.0.1 to the world. In this release, we've added a lot of new features.

+

You can download one of our pre-built binaries from our downloads page - make sure to select the correct platform! For further details on how to install, follow our installation guide.

+

We’d like to thank all of our backers on Open Collective, who are helping us deliver a better piece of software.

+

With that out of the way, here’s what’s new in Drycc version 1.0.1:

+
    +
  • substituting minio-mc for object-storage
  • +
  • using wal-g instead of wal-e
  • +
  • some scenarios use dep instead of glide
  • +
  • minio adds gateway mode
  • +
  • adding aliyun oss support
  • +
+

In the future, we have many exciting plans, for example:

+
    +
  • Use kubernetes ingress instead of drycc-router
  • +
  • Automatic certificate generation using cert-manager
  • +
  • Replace golang's package management glide with dep
  • +
  • Support for the latest version of the kubernetes API
  • +
+

Coming soon...

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/changelogs/v1.1.0/index.html b/changelogs/v1.1.0/index.html new file mode 100644 index 000000000..9557e0c98 --- /dev/null +++ b/changelogs/v1.1.0/index.html @@ -0,0 +1,906 @@ + + + + + + + + + + + + + + + + + + v1.1.0 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Workflow ## v1.0.0 -> v1.1.0

+

Releases

+
    +
  • builder v1.0.0 -> v1.0.1
  • +
  • controller v1.0.0 -> v1.1.0
  • +
  • database v1.0.0 -> v1.0.1
  • +
  • monitor v1.0.0 -> v1.0.1
  • +
  • registry-proxy v1.0.0 -> v1.0.1
  • +
+

Features

+
    +
  • 69c8e12 (controller) - docker: use python:3.7-alpine replace drycc/base
  • +
  • 6a3e70c (controller) - gunicorn: use process replace threads
  • +
  • e63cbb5 (controller) - ingress: Improving the configuration of ingress
  • +
  • 76f75dc (controller) - charts: add rbac to cert-manager
  • +
  • 6807b2c (controller) - certificate: add cert-manager certificate api
  • +
+

Fixes

+
    +
  • f53d89e (controller) - controller: check_image_access only when using docker
  • +
  • 896775a (controller) - docker: multiprocess should not be used in docker
  • +
  • ecdaf9f (controller) - app: can't create app
  • +
  • e00af7e (controller) - tls: add migrations for certs_auto_enabled
  • +
+

Style

+
    +
  • bdbb7e6 (controller) - pep8: Use pep8-compliant code style
  • +
+

Test case

+
    +
  • c5b5a9d (controller) - ingress: add tests to ingress
  • +
+

Maintenance

+
    +
  • 62a9b7d (builder) - workflow: change experimental_native_ingress to use_native_ingress
  • +
  • 39e9cec (builder) - ingress: renmae use_native_ingress to use_ingress
  • +
  • 7fa8134 (builder) - ingress: change global.use_ingress to ingress.enabled
  • +
  • e245c31 (builder) - ingress: use ingressClass
  • +
  • 18b330d (builder) - service: no longer dependent on ingress switches
  • +
  • 95f4d3d (controller) - django: upgrade to django version 1.11.20 latest patch
  • +
  • 6bcd79b (controller) - workflow: change experimental_native_ingress to use_native_ingress
  • +
  • 781229a (controller) - ingress: renmae use_native_ingress to use_ingress
  • +
  • b96b4db (controller) - ingress: change global.use_ingress to ingress.enabled
  • +
  • e1b124f (controller) - ingress: use ingressClass
  • +
  • fee0554 (controller) - ingress: delete ingress judgment
  • +
  • 5cd10f3 (controller) - ingress: Ingress_class can be empty
  • +
  • fa312bb (database) - postgres: set max_connections = 1024
  • +
  • c1ee2a4 (monitor) - monitor: remove copyrights.tar.gz
  • +
  • e088da3 (registry-proxy) - ingress: renmae use_native_ingress to use_ingress
  • +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/changelogs/v1.2.0/index.html b/changelogs/v1.2.0/index.html new file mode 100644 index 000000000..7176d1573 --- /dev/null +++ b/changelogs/v1.2.0/index.html @@ -0,0 +1,896 @@ + + + + + + + + + + + + + + + + + + v1.2.0 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Workflow ## v1.1.0 -> v1.2.0

+

Releases

+
    +
  • builder v1.0.1 -> v1.0.2
  • +
  • slugbuilder v1.0.0 -> v1.1.0
  • +
  • imagebuilder v1.0.0 -> v1.1.0
  • +
  • controller v1.1.0 -> v1.2.0
  • +
  • slugrunner v1.0.0 -> v1.1.0
  • +
  • registry v1.0.0 -> v1.0.1
  • +
  • registry-proxy v1.0.1 -> v1.0.2
  • +
+

Features

+
    +
  • e5584e3 (controller) - controller: add STACK support
  • +
  • ad34dc1 (imagebuilder) - kaniko: use kaniko replace docker-py
  • +
  • b81430e (imagebuilder) - imagebuilder: change image to image.json format
  • +
  • 60dde96 (slugbuilder) - slugbuilder: add STACK support
  • +
  • fe8b6e5 (slugrunner) - slugrunner: add STACK support
  • +
+

Maintenance

+
    +
  • 942f050 (builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORT
  • +
  • ff7a16f (builder) - registry: remove ecr and gcr registry
  • +
  • ad13683 (builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK
  • +
  • 6def637 (builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 5044e22 (builder) - registry: remove registrySecretPrefix
  • +
  • 2ea39cc (builder) - controller-go-sdk: upgrade controller-go-sdk
  • +
  • 6aee0d7 (builder) - registry: optimizing variable naming
  • +
  • f9c62d9 (controller) - domain: added reserved domain check
  • +
  • f5a135b (controller) - migrations: clean old migrations
  • +
  • 4369b2c (controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 1057ca5 (controller) - registry: remove registrySecretPrefix
  • +
  • d114b3e (controller) - docker: update docker client
  • +
  • edbe963 (imagebuilder) - dockerfile: change base image to alpine
  • +
  • fb35baf (imagebuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY
  • +
  • 946dbf6 (imagebuilder) - docker: remove insecure support
  • +
  • 628d853 (imagebuilder) - proxy: add registry proxy
  • +
  • ff27cbd (registry) - env: remove unused env
  • +
  • 7204d72 (registry-proxy) - registry: optimizing variable naming
  • +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/changelogs/v1.3.0/index.html b/changelogs/v1.3.0/index.html new file mode 100644 index 000000000..5fe5802cd --- /dev/null +++ b/changelogs/v1.3.0/index.html @@ -0,0 +1,896 @@ + + + + + + + + + + + + + + + + + + v1.3.0 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Workflow ## v1.2.0 -> v1.3.0

+

Releases

+
    +
  • builder v1.0.2 -> v1.1.0
  • +
  • slugbuilder v1.1.0 -> v1.1.1
  • +
  • imagebuilder v1.1.0 -> v1.1.1
  • +
  • controller v1.2.0 -> v1.2.1
  • +
  • slugrunner v1.1.0 -> v1.1.1
  • +
  • database v1.0.0 -> v1.0.1
  • +
  • fluentd v1.0.0 -> v1.0.1
  • +
  • minio v1.0.0 -> v1.0.1
  • +
  • monitor v1.0.0 -> v1.0.1
  • +
  • registry v1.0.1 -> v1.0.2
  • +
+

Features

+
    +
  • 9c7cceb (builder) - builder: add app config to env
  • +
+

Fixes

+
    +
  • 7fe44fa (controller) - docker: docker timeout must be an int, float or None
  • +
  • b196550 (controller) - controller: revert release.check_image_access for now
  • +
+

Maintenance

+
    +
  • ef932c4 (builder) - controller-sdk-go: upgrade controller-sdk-go
  • +
  • 4654cf6 (controller) - django-rest-framework: upgrade to 3.9.3
  • +
  • 14121f1 (controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs
  • +
  • 385acdc (controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfs
  • +
  • fa312bb (database) - postgres: set max_connections = 1024
  • +
  • 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b8878f6 (imagebuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b097451 (fluentd) - fluent: upgrade fluent to v1.4
  • +
  • 4341f9a (minio) - mc: upgrade mc and minio
  • +
  • c1ee2a4 (monitor) - monitor: remove copyrights.tar.gz
  • +
  • 9854260 (registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • acc5627 (slugbuilder) - slugbuilder: internal support for multi buildpack
  • +
  • d58907e (slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • b39a0c2 (slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/changelogs/v1.4.0/index.html b/changelogs/v1.4.0/index.html new file mode 100644 index 000000000..7e6aa6fcb --- /dev/null +++ b/changelogs/v1.4.0/index.html @@ -0,0 +1,1101 @@ + + + + + + + + + + + + + + + + + + v1.4.0 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Workflow ## v1.3.0 -> v1.4.0

+

Releases

+
    +
  • builder v1.1.0 -> v1.2.0
  • +
  • slugbuilder v1.1.1 -> v1.2.0
  • +
  • imagebuilder v1.1.1 -> v1.1.2
  • +
  • controller v1.2.1 -> v1.3.0
  • +
  • slugrunner v1.1.1 -> v1.1.2
  • +
  • database v1.0.1 -> v1.0.2
  • +
  • fluentd v1.0.1 -> v1.1.0
  • +
  • redis v1.0.0 -> v1.1.0
  • +
  • logger v1.0.0 -> v1.1.0
  • +
  • minio v1.0.1 -> v1.1.0
  • +
  • monitor v1.0.1 -> v1.1.0
  • +
  • nsqd v1.0.0 -> v1.1.0
  • +
  • registry v1.0.2 -> v1.0.3
  • +
  • registry-proxy v1.0.0 -> v1.0.1
  • +
+

Features

+
    +
  • fc7d93f (builder) - builder: use go-dev
  • +
  • 0c2159e (builder) - builder: fmt code and add create_bucket script
  • +
  • 1b88340 (controller) - controller: remove deprecated api
  • +
  • a92fdeb (controller) - routable: ingress support routable
  • +
  • 1e3eab3 (controller) - maintenance: add maintenance support for ingress
  • +
  • 56b9dd0 (controller) - crt: support containerd-ctr
  • +
  • 5fc3b46 (controller) - controller: add ephemeral-storage restriction
  • +
  • d677e52 (controller) - controller: add a volume command
  • +
  • 5f1323a (controller) - controller:drycc run cmd add --mount para
  • +
  • 74c36a5 (controller) - tasks: add distributed async task
  • +
  • 139c3ca (controller) - tasks: change nsq reader to async
  • +
  • f237d74 (controller) - controller:add drycc resource cmd
  • +
  • 41b46d0 (controller) - controller:add drycc resource cmd improvement
  • +
  • c26f7d8 (controller) - controller: add LimitRanges support
  • +
  • 45b5d1b (controller) - users: add users status api
  • +
  • 4e16f9b (controller) - ps:add ps:stop/start command
  • +
  • c659fa9 (controller) - k8s: add k8s cluster domain
  • +
  • 31a625d (controller) - ps:add ps:stop/start command
  • +
  • 00a779a (fluentd) - fluentd: support containerd log format
  • +
  • f3f1bd4 (fluentd) - nsqd: add stateless nsqd cluster support
  • +
  • db7147c (fluentd) - mirrors: delete aliyun mirrors
  • +
  • 689c12e (logger) - nsqd: add stateless nsqd cluster support
  • +
  • 78ccc5d (logger) - redis: add redis client cluster support
  • +
  • 9843f2c (logger) - k8s: add k8s cluster domain
  • +
  • 6ba122e (minio) - minio: add pvc support
  • +
  • 6973550 (monitor) - monitor: add ingress for monitor
  • +
  • cd73305 (monitor) - charts: add volumeName support
  • +
  • 4769fe9 (monitor) - nsqd: add stateless nsqd cluster support
  • +
  • 87806df (monitor) - k8s: add k8s cluster domain
  • +
  • 4db40c4 (nsqd) - nsqd: add stateless nsqd cluster support
  • +
  • b6f3d4f (nsqd) - nsqd: add stateless nsqd cluster support
  • +
  • 74b85bb (redis) - redis: change redis to statefulset
  • +
  • ff98b50 (slugbuilder) - slugbuilder: delete build hook
  • +
  • b201c2f (slugbuilder) - buildpacks: use drycc buildpacks
  • +
+

Fixes

+
    +
  • 0ec042d (builder) - test: fix test case error
  • +
  • 4fb113b (builder) - build: base image replace by alpine
  • +
  • 443df48 (builder) - minio: fix not bucket error
  • +
  • 3dab5b0 (builder) - minio: create bucket error
  • +
  • 734fca6 (controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scaling
  • +
  • a7dcd10 (controller) - controller: test pass
  • +
  • 93f0f2e (controller) - controller: fix migrations error
  • +
  • 4724375 (controller) - controller: fix test error
  • +
  • 7bacf29 (controller) - charts: fix clusterrole
  • +
  • 90957f7 (controller) - pod: sort events error
  • +
  • 440b13e (controller) - controller: review table structure
  • +
  • 0a470a6 (controller) - controller: bump tornado 5.1.1
  • +
  • e39218b (controller) - pynsq: no current event loop in thread
  • +
  • 1d8630e (controller) - tests: fix test_task.py run error
  • +
  • 1ff1202 (controller) - controller: fix test case
  • +
  • d8c0da3 (controller) - settings: fix env name
  • +
  • 6d8fd36 (database) - 003_restore_from_backup.sh: ignore script exit 1
  • +
  • e0394a9 (database) - minio: fix not bucket error
  • +
  • f35f252 (database) - mc: fix create_bucket error
  • +
  • 74d6886 (database) - postgres: recovery mode not run
  • +
  • e50d0c1 (imagebuilder) - caddy: fix caddy not start
  • +
  • f3bec7a (fluentd) - influxdb: fix influxdb host and port
  • +
  • bc19f27 (fluentd) - charts: skipped value for daemonEnvironment: Not a table
  • +
  • 338d623 (logger) - logger: logger not run in alpine
  • +
  • 7788302 (minio) - minio: bump minio version
  • +
  • 619eed0 (minio) - fix: use go mod replace dep
  • +
  • 3b42122 (monitor) - monitor: fix host error
  • +
  • 67998ef (monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api
  • +
  • 2cc361c (registry) - registry: fix test case
  • +
  • 548297a (registry) - minio: fix not bucket error
  • +
  • 5412ddb (registry) - minio: create bucket error
  • +
  • d0d629e (slugbuilder) - slugbuilder:fix normalize_storage path
  • +
  • d76ecbe (slugbuilder) - slugbuilder: use v3 api
  • +
  • c505e18 (slugbuilder) - shellcheck: SC2039
  • +
+

Style

+
    +
  • c893a17 (builder) - builder: fmt code
  • +
  • bba5795 (controller) - controller: format code
  • +
  • d36082b (controller) - controller: fix pep8
  • +
  • 66026f2 (controller) - resource: standardize the naming of resource
  • +
  • 03d7e2c (controller) - servicecatalog: change servicecatalog to svcat
  • +
  • 49dbb6d (controller) - controller: flake8 upgrade
  • +
  • cbfc108 (monitor) - monitor: format charts and dashboard
  • +
  • ee85954 (slugbuilder) - slugbuilder: use shellcheck
  • +
  • 3afed2e (slugbuilder) - docker: simplify dockerfile
  • +
  • 36b7f68 (slugrunner) - docker: simplify dockerfile
  • +
+

Maintenance

+
    +
  • 61bb0ef (builder) - aws: upgrade aws sdk version
  • +
  • 0f2e074 (builder) - chore: use go mode replace dep
  • +
  • e9a2219 (builder) - builder: delete glide up
  • +
  • bb8c518 (builder) - registry: del quay.io
  • +
  • fa6d02f (builder) - builder: upgrade go.sum
  • +
  • 9d61e8d (builder) - build: upgrade go.mod
  • +
  • d763a98 (builder) - charts: upgrade k8s newer API versions
  • +
  • d1bc1aa (builder) - pkg: upgrade to new drycc/pkg
  • +
  • 02b1e98 (builder) - builder: update go mod
  • +
  • 8e17d65 (builder) - builder: change alpine repositories
  • +
  • f32b723 (builder) - mirrors: delete aliyun mirrors
  • +
  • e33dc61 (builder) - minio: use bin mc replace docker images
  • +
  • 3ab4f1c (builder) - builder: update controller-sdk-go
  • +
  • b2adfac (builder) - heroku: remove heroku-16 support
  • +
  • f429ac8 (builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes
  • +
  • 7197c83 (builder) - go.mod:upgrade require pkg controller-sdk-go
  • +
  • 5f3e22d (controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs
  • +
  • 1db645a (controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfs
  • +
  • fbe8067 (controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs
  • +
  • 537d667 (controller) - registry: del quay.io
  • +
  • a23c65b (controller) - deps: update all deps to the latest version
  • +
  • 546337e (controller) - charts: upgrade k8s newer API versions
  • +
  • 06023f8 (controller) - workflow-manager: del workflow-manager
  • +
  • bba5736 (controller) - controller: change cluster-issuer location
  • +
  • 6c43661 (controller) - Certificatechange cluster-issuer location
  • +
  • 39a4728 (controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml
  • +
  • 9e96d3f (controller) - Certificate:upgrade version cert-manager.io/v1alpha2
  • +
  • 8e68049 (controller) - docker: use INDEX_URL replace index.docker.io
  • +
  • 8fda205 (controller) - cert_manager: change certManagerEnabled to global
  • +
  • 6fefb6d (controller) - charts: change platformDomain to global
  • +
  • 064b2ad (controller) - maintenance: remove maintenance support
  • +
  • b8797c9 (controller) - workflow: remove namespace
  • +
  • 1b20d76 (controller) - quota: add kube quota config
  • +
  • d780075 (controller) - pod: add pod default resources support
  • +
  • 3d72c08 (controller) - rename: rename ingress name
  • +
  • 0aa6ab9 (controller) - mirrors: delete aliyun mirrors
  • +
  • 7533a65 (controller) - heroku: remove heroku-16 support
  • +
  • e5a885d (controller) - controller:check mount volume path
  • +
  • 9014e74 (controller) - test: optimization Dockerfile.test
  • +
  • 0b6ebb2 (controller) - tasks: change apply_async parameters
  • +
  • 835f009 (controller) - wsgi: add tornado 6 support
  • +
  • 67a4ad7 (controller) - utils: use threads replace asyncio
  • +
  • a28949b (controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUP
  • +
  • a903209 (controller) - charts: add custom controller environment variables support
  • +
  • e0e783e (controller) - ldap: change filter style
  • +
  • d760825 (controller) - scheduler: remove debug log
  • +
  • a25928e (controller) - wsgi: remove a wsgi.py file
  • +
  • 7b2696e (controller) - log: disable nsq.client info log
  • +
  • 8d5c07b (controller) - charts: add default environment
  • +
  • 025f4a2 (controller) - controller: change quota name
  • +
  • ebda60e (controller) - controller: review pvc code
  • +
  • 8832ba9 (controller) - controller: change status\binding model type and mount path check container_types
  • +
  • 7148d04 (controller) - controller: add overcommit cpu and ram support
  • +
  • 4d2087c (controller) - limits: modify limits unit verification
  • +
  • af36970 (controller) - api: check cpu/memory range for api
  • +
  • 329355b (controller) - volumes: modify the volume size
  • +
  • 9dfee09 (controller) - LimitRanges: modify the default limits
  • +
  • 5205bca (controller) - controller: improve the details of certificate
  • +
  • 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z
  • +
  • 6415e2c (database) - postgres: upgrade to pg13
  • +
  • 12e6806 (database) - charts: upgrade k8s newer API versions
  • +
  • d294509 (database) - minio: use canary minio test
  • +
  • 1bad02e (database) - mirrors: delete aliyun mirrors
  • +
  • d51420b (database) - minio: use bin mc replace docker images
  • +
  • 4133d05 (imagebuilder) - imagebuilder: update caddy and kaniko
  • +
  • 6b4dd18 (imagebuilder) - minio: use bin mc replace docker images
  • +
  • 6df9b7c (fluentd) - deps-dev: update rake requirement from ~> 10.0 to ~> 12.3
  • +
  • c2490f8 (fluentd) - fluentd: upgrade fluentd
  • +
  • be4a56a (fluentd) - fluentd: add Gemfile.lock
  • +
  • 2237f75 (fluentd) - charts: upgrade k8s newer API versions
  • +
  • c574065 (fluentd) - charts: upgrade k8s newer API versions
  • +
  • 52b8084 (fluentd) - router: delete obsolete router code
  • +
  • 3b3cceb (fluentd) - fluentd: remove manifests dir
  • +
  • 25c6702 (fluentd) - nsqd: change var name
  • +
  • bd571be (fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS
  • +
  • 72aa4e6 (fluentd) - influxdb: change influxdb service name
  • +
  • bd61903 (logger) - logger: use go mod replace dep
  • +
  • 69c63a1 (logger) - logger: update go.mod
  • +
  • 3aa9cd7 (logger) - registry: del quay.io
  • +
  • f058496 (logger) - nsqd: change var name
  • +
  • 6d9787c (logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS
  • +
  • 85ed307 (logger) - logger: standard naming
  • +
  • d88e7b6 (minio) - minio: update minio api to v7
  • +
  • 43715d2 (minio) - minio: upgrade minio
  • +
  • 0e1239b (minio) - minio: use docker.io replace quay.io
  • +
  • f7f047b (minio) - registry: del quay.io
  • +
  • afa7128 (minio) - build: upgrade go.mod
  • +
  • aff2db5 (minio) - charts: upgrade k8s newer API versions
  • +
  • 4547f14 (minio) - pkg: upgrade to new drycc/pkg
  • +
  • 2769b85 (minio) - minio: use bin mc replace docker images
  • +
  • 35dde8d (monitor) - monitor: update grafana influxdb telegraf
  • +
  • 9e3a949 (monitor) - charts: upgrade k8s newer API versions
  • +
  • 6af0432 (monitor) - workflow-manager: remove workflow-manager
  • +
  • 0611c07 (monitor) - router: delete obsolete router code
  • +
  • be04824 (monitor) - cert_manager: change certManagerEnabled to global
  • +
  • 3780165 (monitor) - charts: change platformDomain to global
  • +
  • 50b04e1 (monitor) - influxdb: remove influxdb admin ui
  • +
  • 6ab4d68 (monitor) - influxdb: remove unuse port
  • +
  • f1510bd (monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetes
  • +
  • f36de2c (monitor) - pvc: upgrade to new format
  • +
  • fc78a0a (monitor) - workflow: remove namespace
  • +
  • e85890f (monitor) - monitor: monitoring nsqd and redis separately
  • +
  • 694f6b1 (monitor) - mirrors: delete aliyun mirrors
  • +
  • 4aea36a (monitor) - grafana: add ldap support for grafana
  • +
  • 68fc30f (nsqd) - nsq: update nsq
  • +
  • 16f32aa (nsqd) - charts: upgrade k8s newer API versions
  • +
  • 04db389 (redis) - reids: update to redis 6
  • +
  • 3f01bab (redis) - charts: upgrade k8s newer API versions
  • +
  • 647e4be (registry) - registry: del quay.io
  • +
  • 0bbce99 (registry) - charts: upgrade k8s newer API versions
  • +
  • a982b50 (registry) - minio: use bin mc replace docker images
  • +
  • e088da3 (registry-proxy) - ingress: renmae use_native_ingress to use_ingress
  • +
  • 7e88337 (registry-proxy) - nginx: upgrade nginx to mainline
  • +
  • 7204d72 (registry-proxy) - registry: optimizing variable naming
  • +
  • 2eafc59 (registry-proxy) - registry-proxy: update nginx
  • +
  • 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions
  • +
  • c72db96 (registry-proxy) - registry-proxy: change travis icon url
  • +
  • ca9f962 (slugbuilder) - slugbuilder: del BUILDPACK_URL support
  • +
  • 1b74dd5 (slugbuilder) - slugbuilder: add heroku-20 support
  • +
  • 54d4ad2 (slugbuilder) - slugbuilder: del quay.io
  • +
  • a78f37e (slugbuilder) - slugbuilder: add heroku-20 stack
  • +
  • 94ac94a (slugbuilder) - minio: use bin mc replace docker images
  • +
  • 53b4b8b (slugbuilder) - slugbuilder: modify stack priority
  • +
  • 58e2bd2 (slugbuilder) - dockerfile: add WORKDIR /tmp
  • +
  • b29cd04 (slugbuilder) - slugbuilder: add pre_build.sh
  • +
  • 9d319f6 (slugbuilder) - slugbuilder: silent mc command output
  • +
  • d1ec3c9 (slugbuilder) - heroku: remove heroku-16 support
  • +
  • 5048534 (slugbuilder) - slugbuilder: use drycc stack-images
  • +
  • a116537 (slugrunner) - slugrunner: add heroku-20 support
  • +
  • a1196bf (slugrunner) - slugrunner: del quay.io
  • +
  • 64c96d7 (slugrunner) - slugrunner: add heroku-20 stack
  • +
  • cc3e226 (slugrunner) - minio: use bin mc replace docker images
  • +
  • 9130bde (slugrunner) - shellcheck: shellcheck installer
  • +
  • 4ea33e1 (slugrunner) - slugrunner: modify stack priority
  • +
  • 5514e8b (slugrunner) - heroku: remove heroku-16 support
  • +
  • be829fb (slugrunner) - slugrunner: use drycc stack-images
  • +
  • e1e06be (slugrunner) - slugrunner: remove Dockerfile.heroku-16
  • +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/changelogs/v1.5.0/index.html b/changelogs/v1.5.0/index.html new file mode 100644 index 000000000..9e04d342b --- /dev/null +++ b/changelogs/v1.5.0/index.html @@ -0,0 +1,1169 @@ + + + + + + + + + + + + + + + + + + v1.5.0 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Workflow ## v1.4.0 -> v1.5.0

+

Releases

+
    +
  • passport v1.0.0
  • +
  • rabbitmq v1.0.0
  • +
  • imagebuilder v1.0.0
  • +
  • builder v1.2.0 -> v1.3.0
  • +
  • controller v1.3.0 -> v1.4.0
  • +
  • database v1.0.2 -> v1.1.0
  • +
  • fluentd v1.1.0 -> v1.2.0
  • +
  • redis v1.1.0 -> v1.2.0
  • +
  • influxdb v1.0.1 -> v1.1.0
  • +
  • logger v1.1.0 -> v1.2.0
  • +
  • minio v1.1.0 -> v1.2.0
  • +
  • monitor v1.1.0 -> v1.2.0
  • +
  • nsqd v1.1.0 -> v1.2.0
  • +
  • registry v1.0.3 -> v1.1.0
  • +
  • registry-proxy v1.0.2 -> v1.1.0
  • +
+

Features

+
    +
  • 0f5f8e4 (builder) - builder: multi-platform support
  • +
  • f269d06 (builder) - build: add buildx supportjkjkk:q
  • +
  • 5e72fe8 (builder) - registry: use docker build
  • +
  • 25d8a4c (builder) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 7a3e1c5 (builder) - charts: set the default chart version
  • +
  • 46b75ff (builder) - builder: add cloud native buildpacks support
  • +
  • 2db2054 (builder) - builder: unified build model
  • +
  • 4b7f9d9 (builder) - builder: add initContainers
  • +
  • b78c936 (controller) - token: add get token api
  • +
  • bac52a5 (controller) - tasks: use celery replace nsqd
  • +
  • b9b0c58 (controller) - build: add buildx support
  • +
  • 205dcb3 (controller) - influxdb: add influxdb client
  • +
  • ff15849 (controller) - influxdb: upgrade to influxdb 2.x
  • +
  • 4016244 (controller) - controller: push data to influx
  • +
  • fcfce2e (controller) - workflow-manager: add workflow-manager support
  • +
  • 00e9bfb (controller) - influxdb: review influxdb code
  • +
  • dd644d5 (controller) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 118278b (controller) - charts: set the default chart version
  • +
  • 122a9cd (controller) - oauth2: add oauth2 support
  • +
  • 559a5b6 (controller) - controller: use cncf buildpacks replace slugrunner
  • +
  • 96130e6 (controller) - charts: database configuration optimization of passport and controller
  • +
  • 2ea8508 (controller) - oauth: using passport authentication
  • +
  • 868c437 (database) - database: multi-platform support
  • +
  • eadd5da (database) - build: add buildx support
  • +
  • b6eea4c (database) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 04a88db (database) - charts: set the default chart version
  • +
  • 92ed309 (database) - database: add initContainer
  • +
  • ee6b78f (fluentd) - build: add buildx support
  • +
  • f523e30 (fluentd) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • ee47b53 (fluentd) - charts: set the default chart version
  • +
  • 80a51af (influxdb) - influxdb: modify influxdb naming rules
  • +
  • fb10030 (influxdb) - influxdb: use influxdb v2
  • +
  • 0e87ad8 (influxdb) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 9d10801 (influxdb) - charts: set the default chart version
  • +
  • d825c9f (logger) - build: add buildx support
  • +
  • b139576 (logger) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 88f84ea (logger) - charts: set the default chart version
  • +
  • 5ccae3e (logger) - dockerfile: remove chmod cmd
  • +
  • 193aefc (logger) - logger: add initContainers
  • +
  • baee330 (minio) - minio: multi-platform support
  • +
  • ad5d055 (minio) - build: add buildx support
  • +
  • 19868d4 (minio) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 4bd84b8 (minio) - charts: set the default chart version
  • +
  • 79d1f2f (monitor) - database: multi-platform support
  • +
  • 88e5a7f (monitor) - build: add buildx support
  • +
  • 5672e99 (monitor) - influxdb: modify influxdb naming rules
  • +
  • 8672103 (monitor) - influxdb: use influxdb v2
  • +
  • 66cb4c8 (monitor) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 9576eb3 (monitor) - charts: set the default chart version
  • +
  • 30809c9 (monitor) - monitor: add initContainers
  • +
  • 70d140c (nsqd) - nsqd: using self compiled nsq binary
  • +
  • 1073d4f (nsqd) - nsqd: use GOPATH replace /go
  • +
  • e498480 (nsqd) - build: add buildx support
  • +
  • cf9b7d5 (nsqd) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • c335856 (nsqd) - charts: set the default chart version
  • +
  • efba713 (redis) - build: add buildx support
  • +
  • c7a3b53 (redis) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 4cdad7b (redis) - charts: set the default chart version
  • +
  • 652b443 (registry) - registry: multi-platform support
  • +
  • 4060176 (registry) - registry: use docker build
  • +
  • 7102a03 (registry) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 6c8600d (registry) - charts: set the default chart version
  • +
  • 33a51c9 (registry) - registry: add initContainers
  • +
  • bef70dc (registry-proxy) - build: add buildx support
  • +
  • d2319c1 (registry-proxy) - docker: dealing with the change of docker in kubenetes 1.20
  • +
  • 02fafed (registry-proxy) - charts: set the default chart version
  • +
+

Fixes

+
    +
  • 5499c9a (controller) - gunicorn: gunicorn not running
  • +
  • 06e9e88 (controller) - controller: error loading shared library
  • +
  • 01b5bd0 (controller) - controller: upgrade celery config
  • +
  • 6e32d55 (controller) - controller: fix update resources bug
  • +
  • 0e0d53f (controller) - chart: set the domain depends certManagerEnabled
  • +
  • 2ac4ca8 (controller) - passport: error loading shared library libexpat.so.1
  • +
  • a0dd517 (fluentd) - fluentd: drone build
  • +
  • 6eca2a3 (logger) - logger: golang lint
  • +
  • 63b0aa0 (registry) - drone: charts url error
  • +
+

Docs

+
    +
  • 472cfcc (controller) - controller organize README.md document
  • +
  • d9d6e29 (redis) - redis: delete links that do not exist
  • +
+

Test case

+
    +
  • 1468f57 (controller) - controller: add command unittest
  • +
+

Maintenance

+
    +
  • 9999bfd (builder) - builder:replace the special words
  • +
  • cda8b58 (builder) - builder: remove docker keyword from charts
  • +
  • dc575dd (builder) - builder: use imagebuilder replace dockerbuilder
  • +
  • d3bb183 (builder) - docker: use the full name of registry
  • +
  • 5fe34d1 (builder) - travis: add DEV_REGISTRY
  • +
  • 7e36453 (builder) - CICD: use drone
  • +
  • 52b8d9d (builder) - drone: add image_registries volumes
  • +
  • 65963f4 (builder) - k8s: add privileged to dind
  • +
  • d345fcf (builder) - LICENSE: revert modifications to Apache license
  • +
  • 7975c99 (builder) - drone: always pull image
  • +
  • 59633dd (builder) - builder: modify launch imagebuild pod
  • +
  • 8d14e67 (builder) - builder: use Procfile in anywhere
  • +
  • 5357fa8 (builder) - go: bump go mod
  • +
  • 8d26ac0 (builder) - k8s: k8s deprecated api migration
  • +
  • 0af620d (builder) - chars: change org to imageTag
  • +
  • ae84303 (builder) - builder: run imagebuider replace pod with job
  • +
  • 3b2c496 (builder) - builder: change docs website
  • +
  • 5679a4c (builder) - builder: upgrade to golang1.17
  • +
  • a214503 (controller) - controller:replace whitelist with allowlist
  • +
  • 375ddcc (controller) - ps:drycc ps:list show autoscale num
  • +
  • c32e409 (controller) - ldap: canot register when ldap is enabled
  • +
  • c46580a (controller) - controller:modify redis config
  • +
  • fa9e87b (controller) - chart:modify controller charts
  • +
  • 6f9fd08 (controller) - nsq: remove nsq
  • +
  • 994b2dc (controller) - docker-buildx: add check-docker
  • +
  • a720c3a (controller) - controller: remove docker keyword from charts
  • +
  • e9a5c84 (controller) - docker: use the full name of registry
  • +
  • a26614a (controller) - controller: add rabbitmq env
  • +
  • 3df229d (controller) - controller: modify database config && remove redis port config && add env prefix with DRYCC
  • +
  • 257e94b (controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjob
  • +
  • f4d6ec3 (controller) - chart: pretty chart format
  • +
  • 63e6195 (controller) - influxdb: modify influxdb code
  • +
  • 0f6d408 (controller) - CICD: use drone
  • +
  • 87bad28 (controller) - python: upgrade to python3.9
  • +
  • e8f7560 (controller) - volumes: modify mount summary
  • +
  • 6cf6c6b (controller) - drone: add image_registries volumes
  • +
  • a9397e8 (controller) - oauth: modify token Authentication
  • +
  • c7f8c8b (controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfs
  • +
  • a1a08aa (controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfs
  • +
  • efd78b4 (controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs
  • +
  • 649b044 (controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs
  • +
  • 41b742b (controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs
  • +
  • 22ffe5d (controller) - LICENSE: revert modifications to Apache license
  • +
  • c98b468 (controller) - drone: always pull image
  • +
  • 20e6edb (controller) - chart: modify the problem of using buildpack
  • +
  • db16879 (controller) - controller: pretty pods list print
  • +
  • ba6f456 (controller) - test: pretty pods list print
  • +
  • 5fce4b7 (controller) - k8s: k8s deprecated api migration
  • +
  • e9e0bcb (controller) - oauth: using passport authentication
  • +
  • 0311172 (controller) - chars: change org to imageTag
  • +
  • 150eff1 (controller) - charts: update cert-manager api version
  • +
  • de8545a (controller) - controller: update requirements
  • +
  • 1442207 (controller) - controller: using django native JSONFiled
  • +
  • ab4e836 (controller) - oauth: modify passport api
  • +
  • 5c54e06 (controller) - controller: eliminate pip warnings
  • +
  • 870328d (controller) - controller: remove entrypoint
  • +
  • 5e5e6ae (controller) - controller: upgrade celery config
  • +
  • 607778f (controller) - controller: add initContainer
  • +
  • 23dc016 (controller) - chart: set the domain depends certManagerEnabled
  • +
  • f3cf20b (controller) - controller: remove default bash env
  • +
  • 73f2636 (controller) - controller: modify alpinelinux repositories
  • +
  • 498e9f2 (controller) - chart: change certManagerEnabled to boolean type
  • +
  • 27f5308 (controller) - passport: exclude cryptography
  • +
  • 370b75d (controller) - controller: use sh env
  • +
  • 07585b4 (database) - postgres:replace the special words
  • +
  • 20172dc (database) - database: remove docker keyword from charts
  • +
  • abb9b88 (database) - docker: use the full name of registry
  • +
  • e72f58f (database) - chart: modify the off-cluster database
  • +
  • a91f64f (database) - travis: add DEV_REGISTRY
  • +
  • 614fb76 (database) - tests: use add-host replace link
  • +
  • a3428f3 (database) - CICD: use drone
  • +
  • 239fef1 (database) - drone: add image_registries volumes
  • +
  • 42858e1 (database) - LICENSE: revert modifications to Apache license
  • +
  • d0fe850 (database) - drone: always pull image
  • +
  • 34a36ad (database) - charts: Nn secret is generated during off-cluster
  • +
  • 064ccf4 (database) - database: create database
  • +
  • 9228992 (database) - chars: change org to imageTag
  • +
  • 9f7810c (database) - database: upgrade to wal-g v1.1
  • +
  • 05783f4 (fluentd) - fluentd:replace the special words
  • +
  • 0739809 (fluentd) - influxdb:replace monitor-influx with influx
  • +
  • f02487c (fluentd) - fluentd: remove docker keyword from charts
  • +
  • 2c96cc0 (fluentd) - docker: use the full name of registry
  • +
  • b20c429 (fluentd) - charts: remove port config
  • +
  • 6dd0197 (fluentd) - travis: add DEV_REGISTRY
  • +
  • c5bec51 (fluentd) - CICD: use drone
  • +
  • f8524b7 (fluentd) - drone: add image_registries volumes
  • +
  • a50878a (fluentd) - LICENSE: revert modifications to Apache license
  • +
  • 14fe20e (fluentd) - drone: always pull image
  • +
  • 4a2f660 (fluentd) - k8s: k8s deprecated api migration
  • +
  • de2dd91 (fluentd) - chars: change org to imageTag
  • +
  • a9f1944 (fluentd) - fluentd: upgrade to fluentd1.14
  • +
  • 7cb4e95 (influxdb) - influxdb: change username to user
  • +
  • 0fdc21b (influxdb) - influxdb: remove docker keyword from charts
  • +
  • b2acddb (influxdb) - influxdb: change default path
  • +
  • ba88919 (influxdb) - influxdb: add check_env function
  • +
  • 9117401 (influxdb) - influxdb: modify init_influxdb has_bucket
  • +
  • 092a3e6 (influxdb) - chart: pod not readiness
  • +
  • 51de380 (influxdb) - travis: add DEV_REGISTRY
  • +
  • 66d7667 (influxdb) - docker: replace influxdb base image
  • +
  • 3aa3094 (influxdb) - CICD: use drone
  • +
  • 14b9c24 (influxdb) - drone: add image_registries volumes
  • +
  • 02b4cd1 (logger) - logger:replace the special words
  • +
  • 114b5d5 (logger) - reids: delete the logger prefix of redis
  • +
  • 639278a (logger) - redis: remove logger from redis conf
  • +
  • 90195e2 (logger) - go: remove GOOS and GOARCH
  • +
  • 31e2e27 (logger) - logger: remove docker keyword from charts
  • +
  • 8fbd9fa (logger) - docker: use the full name of registry
  • +
  • b39df2d (logger) - charts: remove redis\nsqd port config
  • +
  • 35d6d07 (logger) - travis: add DEV_REGISTRY
  • +
  • 69aabf5 (logger) - tests: remove docker link
  • +
  • e916644 (logger) - CICD: use drone
  • +
  • d6872b7 (logger) - drone: add image_registries volumes
  • +
  • 37801da (logger) - LICENSE: revert modifications to Apache license
  • +
  • cfb4b38 (logger) - drone: always pull image
  • +
  • 8bda3bf (logger) - go: bump go mod
  • +
  • e13ebfc (logger) - chars: change org to imageTag
  • +
  • 38e6d8d (minio) - minio:replace the special words
  • +
  • d6925dd (minio) - minio: remove docker keyword from charts
  • +
  • d56bc39 (minio) - docker: use the full name of registry
  • +
  • e4696cc (minio) - travis: add DEV_REGISTRY
  • +
  • 70c5c79 (minio) - minio: use latest version
  • +
  • 773cf6c (minio) - Makefile: remove DEV_REGISTRY ?=
  • +
  • 5ce5bc6 (minio) - CICD: use drone
  • +
  • 5da8be3 (minio) - drone: add image_registries volumes
  • +
  • c1f0611 (minio) - LICENSE: revert modifications to Apache license
  • +
  • b73f792 (minio) - drone: always pull image
  • +
  • 79d1c93 (minio) - go: bump go mod
  • +
  • c448899 (minio) - chars: change org to imageTag
  • +
  • 15ee49e (minio) - minio: migrate deprecated warning
  • +
  • 9968a1a (minio) - minio: upgrade to golang1.7
  • +
  • 14fedd2 (monitor) - monitor:replace the special works
  • +
  • 52c431a (monitor) - reids: delete the logger prefix of redis
  • +
  • 2c95b47 (monitor) - redis: remove logger from redis conf
  • +
  • da9bc56 (monitor) - monitor:remove influxdb
  • +
  • 53f47b9 (monitor) - grafana: use grafana docker image
  • +
  • 5bdb188 (monitor) - grafana: use grafana docker image
  • +
  • c0586dd (monitor) - monitor: remove docker keyword from charts
  • +
  • 87d02b6 (monitor) - charts: add nodes and persistentvolumes rule
  • +
  • 1b5598f (monitor) - monitor: modify grafana dashboard with FLUX and pretty config.toml
  • +
  • bcbc0d5 (monitor) - docker: use the full name of registry
  • +
  • 9418c9e (monitor) - monitor: fix upload dashboard error and modify INFLUXDB input
  • +
  • 589f29a (monitor) - travis: add DEV_REGISTRY
  • +
  • f776f8a (monitor) - CICD: use drone
  • +
  • 6ca3060 (monitor) - drone: add image_registries volumes
  • +
  • 6a9ffb2 (monitor) - LICENSE: revert modifications to Apache license
  • +
  • 45e41ed (monitor) - drone: always pull image
  • +
  • 654d407 (monitor) - k8s: k8s deprecated api migration
  • +
  • 41e9b9c (monitor) - chars: change org to imageTag
  • +
  • 99c10d3 (monitor) - charts: update cert-manager api version
  • +
  • 9bf83c4 (monitor) - oauth: user oauth passport
  • +
  • a128f6d (monitor) - chart: change certManagerEnabled to boolean type
  • +
  • 8f897fe (monitor) - chart: set the domain depends certManagerEnabled
  • +
  • ba6d793 (nsqd) - README:update travis build status
  • +
  • 49879c4 (nsqd) - nsqd: minimum git clone code
  • +
  • c5e2680 (nsqd) - nsqd: remove docker keyword from charts
  • +
  • 21dd17b (nsqd) - docker: use the full name of registry
  • +
  • 7d86b3c (nsqd) - charts: remove port config
  • +
  • c073d95 (nsqd) - travis: add DEV_REGISTRY
  • +
  • 55c297c (nsqd) - CICD: use drone
  • +
  • 165c2ae (nsqd) - drone: add image_registries volumes
  • +
  • 9c6a1f8 (nsqd) - LICENSE: revert modifications to Apache license
  • +
  • 9283098 (nsqd) - drone: always pull image
  • +
  • 46acf8a (nsqd) - k8s: k8s deprecated api migration
  • +
  • 43caf80 (nsqd) - chars: change org to imageTag
  • +
  • 6897471 (nsqd) - nsqd: use official image
  • +
  • 297bc05 (redis) - redis:replace the special words
  • +
  • f5f8b5e (redis) - reids: delete the logger prefix of redis
  • +
  • af7b657 (redis) - redis: change logger-redis to redis
  • +
  • 8dca154 (redis) - redis: remove logger from redis conf
  • +
  • eaeda2d (redis) - redis: remove docker keyword from charts
  • +
  • 53c6358 (redis) - docker: use the full name of registry
  • +
  • ae37416 (redis) - charts: remove port config
  • +
  • e985656 (redis) - travis: add DEV_REGISTRY
  • +
  • 423336a (redis) - CICD: use drone
  • +
  • be64ab4 (redis) - drone: add image_registries volumes
  • +
  • 3bec735 (redis) - LICENSE: revert modifications to Apache license
  • +
  • 4f934f6 (redis) - drone: always pull image
  • +
  • 359b878 (redis) - chars: change org to imageTag
  • +
  • 83b8ac2 (registry) - workflow:replace the special words
  • +
  • 869b280 (registry) - registry: remove docker keyword from charts
  • +
  • 999c1e9 (registry) - docker: use the full name of registry
  • +
  • 5652da9 (registry) - travis: add DEV_REGISTRY
  • +
  • cc8c6c2 (registry) - CICD: use drone
  • +
  • c7bdbd0 (registry) - CICD: pretty .drone.yaml format
  • +
  • 5c55a38 (registry) - test: use add-host replace link
  • +
  • f8866f3 (registry) - drone: add image_registries volumes
  • +
  • 6c8292f (registry) - LICENSE: revert modifications to Apache license
  • +
  • 1d50f2c (registry) - drone: always pull image
  • +
  • efbca6d (registry) - chars: change org to imageTag
  • +
  • 2eafc59 (registry-proxy) - registry-proxy: update nginx
  • +
  • 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions
  • +
  • c72db96 (registry-proxy) - registry-proxy: change travis icon url
  • +
  • 63ffb92 (registry-proxy) - registry-proxy:replace the special works
  • +
  • 1d904a6 (registry-proxy) - registry-proxy: remove docker keyword from charts
  • +
  • c8200b1 (registry-proxy) - docker: use the full name of registry
  • +
  • d3fa939 (registry-proxy) - travis: add DEV_REGISTRY
  • +
  • 5a8b353 (registry-proxy) - CICD: use drone
  • +
  • 703d05a (registry-proxy) - drone: add image_registries volumes
  • +
  • aa71db1 (registry-proxy) - LICENSE: revert modifications to Apache license
  • +
  • 710c126 (registry-proxy) - drone: always pull image
  • +
  • 2dcc5e6 (registry-proxy) - chars: change org to imageTag
  • +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/changelogs/v1.6.0/index.html b/changelogs/v1.6.0/index.html new file mode 100644 index 000000000..0c37fd3a8 --- /dev/null +++ b/changelogs/v1.6.0/index.html @@ -0,0 +1,1313 @@ + + + + + + + + + + + + + + + + + + V1.6.0 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Workflow ## v1.5.0 -> v1.6.0

+

Releases

+
    +
  • builder v1.3.0 -> v1.4.0
  • +
  • controller v1.4.0 -> v1.5.0
  • +
  • passport v1.0.0 -> v1.1.0
  • +
  • database v1.1.0 -> v1.2.0
  • +
  • imagebuilder v1.0.1 -> v1.1.0
  • +
  • fluentd v1.2.0 -> v1.3.0
  • +
  • logger v1.2.0 -> v1.3.0
  • +
  • storage v1.2.0 -> v1.3.0
  • +
  • monitor v1.2.0 -> v1.3.0
  • +
  • redis v1.2.0 -> v1.3.0
  • +
  • influxdb v1.1.0 -> v1.2.0
  • +
  • rabbitmq v1.0.0 -> v1.1.0
  • +
  • registry v1.1.0 -> v1.2.0
  • +
  • registry-proxy v1.1.0 -> v1.2.0
  • +
+

Features

+
    +
  • 52517d9 (builder) - builder: update controller-sdk-go
  • +
  • 1d78ca0 (builder) - builder: add affinity
  • +
  • 26b6980 (builder) - builder: switch charts to oci
  • +
  • bfd4385 (controller) - controller: add get manager user status
  • +
  • 874208d (controller) - controller: unified measurement model
  • +
  • cadf98f (controller) - controller: add admission webhook
  • +
  • e0050c2 (controller) - controller: new measurement model
  • +
  • a11ba58 (controller) - controller: multi pod restart uses async
  • +
  • fb3c15d (controller) - controller: add check app owner status
  • +
  • 3d78b76 (controller) - controller: add resource services api
  • +
  • 3d6a201 (controller) - controller: add search apps api
  • +
  • 01c443a (controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter
  • +
  • 7c26232 (controller) - controller: add volume size limit
  • +
  • 3bee749 (controller) - controller: add annotations support
  • +
  • 23cd97c (controller) - controller: traefik v2 support
  • +
  • e37b7db (controller) - controller: add affinity
  • +
  • b3b367b (controller) - controller: add volume expand support
  • +
  • a4e154a (controller) - controller: add database replica support
  • +
  • 2f37216 (controller) - controller: switch wsgi to asgi
  • +
  • b3314a5 (controller) - controller: add pod exec api
  • +
  • 75df2dc (controller) - controller: add stream support for app logs
  • +
  • 4229bad (controller) - ccontroller: switch charts to oci
  • +
  • 89bb19b (database) - database: upgrade to pg14
  • +
  • 9f45a5d (database) - database: add hugepages support
  • +
  • c4008c9 (database) - database: add affinity
  • +
  • 411a7b2 (database) - postgres: use patroni
  • +
  • 64e5cb0 (database) - database: switch charts to oci
  • +
  • 2bab823 (fluentd) - fluentd: switch charts to oci
  • +
  • 337ba62 (imagebuilder) - imagebuilder: run podman as rootless
  • +
  • 4396ffa (imagebuilder) - imagebuilder: switch to oci charts
  • +
  • f37ae09 (influxdb) - influxdb: add affinity
  • +
  • 04503b2 (influxdb) - influxdb: add influxdb ha
  • +
  • 41ddad5 (influxdb) - influxdb: switch charts to oci
  • +
  • 2006480 (logger) - logger: use redis stream replace nsqd
  • +
  • ab23d17 (logger) - logger: add affinity
  • +
  • 81d4e9d (logger) - logger: switch charts to oci
  • +
  • c3d9796 (monitor) - monitor: add affinity
  • +
  • cd9de3c (monitor) - monitor: switch to oci charts
  • +
  • 318a73f (passport) - passport: add change user confirm
  • +
  • 79ef100 (passport) - passport: add re login at authorize
  • +
  • 6927bb5 (passport) - passport: add affinity
  • +
  • 3146a09 (passport) - passport: add google reCAPTCHA
  • +
  • 802abcd (passport) - passport: add replica database support
  • +
  • a0dcd1b (passport) - passport: switch wsgi to asgi
  • +
  • 4c9dbba (passport) - passport: switch charts to oci
  • +
  • 74825f7 (rabbitmq) - rabbitmq: add rabbitmq managentment ingress
  • +
  • 12cf7d6 (rabbitmq) - rabbitmq: add affinity
  • +
  • 103417d (rabbitmq) - rabbitmq: switch charts to oci
  • +
  • 5d428bb (redis) - redis: add affinity
  • +
  • a88c1a9 (redis) - redis: switch charts to oci
  • +
  • 541585d (registry) - registry: add affinity
  • +
  • e9ca9d4 (registry) - registry: add garbage-collect cronjob
  • +
  • ec62a59 (registry) - registry: switch charts to oci
  • +
  • fde0b07 (registry-proxy) - registry-proxy: switch charts to oci
  • +
  • be14eb4 (storage) - minio: add affinity
  • +
  • 51af696 (storage) - storage: add k8s csi support
  • +
  • 76a75d9 (storage) - storage: add cluster health checker
  • +
  • a17dc8c (storage) - storage: switch charts to oci
  • +
+

Fixes

+
    +
  • e4f44fb (builder) - builder: no error return
  • +
  • e38dfc7 (builder) - builderControllerHost/ControllerPort init error
  • +
  • ff9069f (controller) - controller: influxdb query error
  • +
  • f7f5069 (controller) - controller: authentication 500
  • +
  • 7e297a8 (controller) - controller: add check remote user status
  • +
  • 9db28e1 (controller) - controller: celery MaxRetriesExceededError
  • +
  • 4bcff08 (controller) - controller: wrong name
  • +
  • d69fde2 (controller) - controller: traefik ingress create error
  • +
  • a3ad743 (controller) - fixup(controller: user login error
  • +
  • 662c8dd (controller) - controller: change influxdb port
  • +
  • 957bdf6 (controller) - controller: validate rsa key pairing before storage
  • +
  • 419ec4c (controller) - controller: kubernetes pod/exec cluster role
  • +
  • a67edaa (controller) - controller: Cannot routing:disable
  • +
  • e09e214 (controller) - controller: allowlist cannot remove
  • +
  • 318b126 (controller) - controller: domains update error
  • +
  • 92855eb (database) - database: premission denied
  • +
  • bde945a (database) - fixup(postgres: support arm, fix Failed to build psutil
  • +
  • 7854d45 (database) - fixup(postgres: user name converted to lowercase letters
  • +
  • 57b2a07 (fluentd) - fluentd: ifconfig_path not found
  • +
  • 20e72b9 (imagebuilder) - imagebuilder: upgrade pack version
  • +
  • 651db8a (imagebuilder) - imagebuilder: chown uid gid order
  • +
  • d2e9164 (influxdb) - influxdb: proxy not running
  • +
  • 3a1d361 (monitor) - monitor: charts naming
  • +
  • d754ae0 (monitor) - monitor: telegraf init error
  • +
  • 63f9e34 (monitor) - monitor: affinity error
  • +
  • 95ae1e5 (passport) - passport: yarn build fail
  • +
  • 3f5365e (passport) - passport: wrong name
  • +
  • 907f17b (passport) - passport: change uid gid to 1001
  • +
  • e3911e0 (passport) - passport: 'registration_done' not found
  • +
  • 2ace5f0 (passport) - passport: ui style
  • +
  • b3ba1e1 (passport) - passport privacy policy link
  • +
  • 172e9c8 (passport) - passport: check databaseReplicaUrl error
  • +
  • a3aeb70 (rabbitmq) - passport: change uid gid to 1001
  • +
  • 5c73dcf (redis) - reids: DRYCC_REGISTY misspelling
  • +
  • d7e3baf (redis) - redis: env miss
  • +
  • cadaa91 (registry) - registry: set gid uid to 1001
  • +
  • d524217 (registry) - registry: storage run error
  • +
  • 854f912 (registry) - registry: chown uid gid order
  • +
  • e642bb7 (registry-proxy) - registry-proxy: containerPort error
  • +
  • 8dfd029 (registry-proxy) - registry-proxy: chown uid gid order
  • +
  • bbea364 (storage) - minio: premission denied
  • +
  • 97deba1 (storage) - storage: node unimplemented error
  • +
  • b9bdeff (storage) - storage: pd can not connect each other
  • +
+

Style

+
    +
  • 1edb10c (controller) - controller: database convention over configuration
  • +
  • 1960cc3 (database) - database: database name convention over configuration
  • +
  • 06d1f5d (imagebuilder) - imagebuilder: URL to Url
  • +
  • b8a8941 (passport) - passport: database convention over configuration
  • +
+

Maintenance

+
    +
  • 8e9a199 (builder) - builder: upgrade controller-sdk-go
  • +
  • 4840151 (builder) - builder: use exec runner replace docker runner
  • +
  • 68ccfb1 (builder) - builder: canonical charts naming
  • +
  • 8f971cb (builder) - builder: provide any additional service annotations
  • +
  • fe2c55d (builder) - dockerfile: use drycc/base image
  • +
  • 2b5e706 (builder) - dockerfile: change user and workdir
  • +
  • 7a6c8d3 (builder) - builder: set gid uid to 1001
  • +
  • fe494f7 (builder) - dockerfile: use uid gid
  • +
  • a7c8752 (builder) - builder: change nodes to pod affinity
  • +
  • eb2e94c (builder) - database: bump mc 2022.04.01.23.44.48
  • +
  • cfaae66 (builder) - builder: use registry.drycc.cc replace docker.io
  • +
  • d7d2890 (builder) - builder: change default imagebuilder registry
  • +
  • ecfdb19 (builder) - imagebuilder: change python-dev registry
  • +
  • 6da17f4 (builder) - builder: https://github.com/minio/minio/issues/14331
  • +
  • 1a57e5b (builder) - builder: https://github.com/minio/minio/issues/14331
  • +
  • f1464fa (builder) - builder: https://github.com/minio/minio/issues/13799
  • +
  • b1e1c4f (builder) - builder: use env replace creds volume
  • +
  • 71a4145 (builder) - builder: bump go.mod
  • +
  • 3567688 (builder) - builder: fine management affinity
  • +
  • 73ea38b (builder) - builder: change storage to minio
  • +
  • 1f91321 (builder) - builder: use testify replace assert
  • +
  • d148b9c (builder) - builder: add check storage health
  • +
  • b768101 (builder) - builder: change initContainers
  • +
  • 1b3bec3 (builder) - builder: add replicas
  • +
  • 5cb0d61 (builder) - builder: upgrade to latest controller-sdk-go
  • +
  • 98b9d58 (builder) - builder: upgrade new require
  • +
  • 65817c3 (builder) - builder: change drycc.cc to www.drycc.cc
  • +
  • 4e3f9d0 (controller) - controller: add celery retry mechanism
  • +
  • f6716fe (controller) - controller: change cronjob name
  • +
  • eb60693 (controller) - controller: refine celery task priority
  • +
  • 66905e9 (controller) - controller: change manager auth
  • +
  • ea20c41 (controller) - controller: remove start/stop api
  • +
  • 4c8fc80 (controller) - controller: improve tasks error handling
  • +
  • cf7402e (controller) - controller: add blocklist api
  • +
  • 80f14dd (controller) - controller: use get_user_model replace auth.User
  • +
  • ffc7bb7 (controller) - controller: use JSONField replace ArrayField
  • +
  • 370df8c (controller) - controller: add validate metric
  • +
  • 29084ce (controller) - controller: use user id request manager api
  • +
  • 718fe12 (controller) - controller change urlpatterns order
  • +
  • 71f4042 (controller) - controller: measurements uses lowercase letters
  • +
  • e5123ea (controller) - controller: change resource unit to number
  • +
  • 18fee9a (controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfs
  • +
  • ffca6c1 (controller) - controller: use exec runner replace docker runner
  • +
  • 9ec12e1 (controller) - controller: simplify drone configuration
  • +
  • 4b4749e (controller) - controller: set default CSRF_COOKIE_SECURE false
  • +
  • 2ef6338 (controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfs
  • +
  • c7570d0 (controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs
  • +
  • 8b17bc1 (controller) - controller: canonical charts naming
  • +
  • c928fb0 (controller) - controller: use rabbitmq cluster
  • +
  • f917185 (controller) - controller: provide any additional service annotations
  • +
  • 22a8f63 (controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs
  • +
  • 3cc3b00 (controller) - dockerfile: use drycc/base image
  • +
  • ee274f6 (controller) - controller: set venv profile
  • +
  • ce6b069 (controller) - controller: set gid uid to 1001
  • +
  • 3a105d3 (controller) - dockerfile: use uid gid
  • +
  • 15f9b0e (controller) - controller: code review
  • +
  • 01e6fd9 (controller) - controller: use passport user id
  • +
  • 893ee31 (controller) - oauth2: update user info pipline
  • +
  • 3028fb4 (controller) - user: set AnonymousUser username
  • +
  • 5daf82d (controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss
  • +
  • 61f2c53 (controller) - controller: change nodes to pod affinity
  • +
  • 88feb1d (controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14
  • +
  • 914e03f (controller) - controller: use registry.drycc.cc replace docker.io
  • +
  • a5bb548 (controller) - controller: change python-dev registry
  • +
  • 3ecdd7c (controller) - controller: add a separate rabbitmqUrl configuration
  • +
  • 967cb11 (controller) - controller: remove APP_STORAGE
  • +
  • 473d2b5 (controller) - controller: use env replace creds volume
  • +
  • e410d4c (controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfs
  • +
  • c6ef777 (controller) - controller: simplified passport config
  • +
  • 0fd3233 (controller) - controller: remove settings hardcode
  • +
  • a64e99c (controller) - controller: change passport config
  • +
  • 62aba25 (controller) - controller: set cronjob timezone to utc
  • +
  • 760b70b (controller) - controller: change default ratio
  • +
  • 8dffc3a (controller) - controller: fine management affinity
  • +
  • 26043c4 (controller) - controller: change default app storage
  • +
  • 608bd8d (controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs
  • +
  • 18ed0c2 (controller) - controller: remove conjob affinity
  • +
  • add6712 (controller) - controller: add volume expand support use patch
  • +
  • cc1ad13 (controller) - controller: add startupProbe
  • +
  • 0e9a603 (controller) - controller: add clearsocial cronjob
  • +
  • eb6f05d (controller) - controller: change initContainers
  • +
  • 762c676 (controller) - controller: change replicas
  • +
  • abd7e8c (controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs
  • +
  • 07fdf1b (controller) - controller: remove database conn_max_age
  • +
  • ef8e41f (controller) - controller: add database replica check
  • +
  • 79143f2 (controller) - controller: upgrade new require
  • +
  • a624048 (controller) - controller: add app.refresh func annotation
  • +
  • b22d367 (controller) - controller: optimize app refresh timing
  • +
  • fe98f0c (database) - database: use exec runner replace docker runner
  • +
  • 5e00c11 (database) - database: canonical charts naming
  • +
  • d2cb860 (database) - database: disable huge_pages
  • +
  • 197d80d (database) - database: add persistence
  • +
  • 1c3e645 (database) - database: provide any additional service annotations
  • +
  • 37730ab (database) - dockerfile: use drycc/base image
  • +
  • 5014112 (database) - dockerfile: change entrypoint
  • +
  • 29b538e (database) - database: change nodes to pod affinity
  • +
  • c2bb074 (database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48
  • +
  • 077a4e9 (database) - database: use registry.drycc.cc replace docker.io
  • +
  • 560bdb9 (database) - database: change python-dev registry
  • +
  • 1e54b55 (database) - database: https://github.com/minio/minio/issues/14331
  • +
  • d646672 (database) - database: https://github.com/minio/minio/issues/13799
  • +
  • a6ac4e3 (database) - database: use env replace creds volume
  • +
  • 9618d87 (database) - database: fine management affinity
  • +
  • b823273 (database) - database: change minio to storage
  • +
  • 7bd5a90 (database) - database: add check storage health
  • +
  • 20c6d96 (database) - database: fix storage run error
  • +
  • 8bde830 (database) - database: upgrade to pg 14.5
  • +
  • a33b5e5 (fluentd) - fluentd: update plugins
  • +
  • eed7a78 (fluentd) - fluentd: update filter kubernetes setting
  • +
  • cc83dd8 (fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logs
  • +
  • ba2feb2 (fluentd) - fluentd: use exec runner replace docker runner
  • +
  • d528676 (fluentd) - fluentd: simplify drone configuration
  • +
  • dece82d (fluentd) - fluentd: canonical charts naming
  • +
  • 4e0a802 (fluentd) - fluend: replace nsqd with redis
  • +
  • 15ceca0 (fluentd) - dockerfile: use drycc/base image
  • +
  • a7f619f (fluentd) - dockerfile: change workdir
  • +
  • 9adf5ed (fluentd) - database: bump fluentd 1.14.6
  • +
  • 50c14c2 (fluentd) - fluentd: use registry.drycc.cc replace docker.io
  • +
  • 83171b1 (fluentd) - fluentd: change python-dev registry
  • +
  • ec83581 (fluentd) - fluentd: unified reids declaration
  • +
  • 07c63e2 (fluentd) - fluentd: upgrade fluentd 1.15.2
  • +
  • 65df9be (imagebuilder) - imagebuilder: update pack version
  • +
  • 66cab35 (imagebuilder) - imagebuilder: use dind replace go-dev
  • +
  • 0c82060 (imagebuilder) - imagebuilder: use exec runner replace docker runner
  • +
  • 8146da9 (imagebuilder) - imagebuilder: canonical charts naming
  • +
  • 7d97241 (imagebuilder) - dockerfile: use drycc/base image
  • +
  • 07e805c (imagebuilder) - imagebuilder: change default buildpack
  • +
  • 8d1038d (imagebuilder) - imagebuilder: upgrade podman to 4.0.1
  • +
  • 62d3687 (imagebuilder) - imagebuilder: change workdir to /workspace
  • +
  • da8bfb0 (imagebuilder) - imagebuilder: change uid gid to 1001
  • +
  • d44e3bc (imagebuilder) - imagebuilder: upgrade stack
  • +
  • 5b0c7e6 (imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.io
  • +
  • f74cbf6 (imagebuilder) - imagebuilder: add defaultBuildpacksURL
  • +
  • 941d493 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/14331
  • +
  • 449be91 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/13799
  • +
  • 63b0523 (imagebuilder) - imagebuilder: use env replace creds volume
  • +
  • 4e8a6e5 (imagebuilder) - imagebuilder: add imagebuilder config
  • +
  • 2d891f5 (imagebuilder) - imagebuilder: change minio to storage
  • +
  • addceda (imagebuilder) - imagebuilder: upgrade new require
  • +
  • a6e569f (imagebuilder) - imagebuilder: pack_build add --env-file parameter
  • +
  • 6191ff5 (influxdb) - influxdb: use exec runner replace docker runner
  • +
  • dc3f8c7 (influxdb) - influxdb: canonical charts naming
  • +
  • 6b5c819 (influxdb) - influxdb: new ingress style
  • +
  • 68b381d (influxdb) - influxdb: provide any additional service annotations
  • +
  • ea20eb8 (influxdb) - dockerfile: use drycc/base image
  • +
  • 64c0a71 (influxdb) - influxdb: set gid uid to 1001
  • +
  • a709ca1 (influxdb) - influxdb: use DRYCC_UID DRYCC_GID env
  • +
  • 740dff0 (influxdb) - influxdb: use common affinity template
  • +
  • e035673 (influxdb) - influxdb: change nodes to pod affinity
  • +
  • f1cefbd (influxdb) - influxdb: use registry.drycc.cc replace docker.io
  • +
  • a00100e (influxdb) - influxdb: fine management affinity
  • +
  • 9d165ef (influxdb) - influxdb: add probe
  • +
  • bee7fff (influxdb) - influxdb: upgrade to influxdb 2.4.0
  • +
  • 254914c (logger) - logger: use exec runner replace docker runner
  • +
  • 8d91c68 (logger) - logger: canonical charts naming
  • +
  • b6d2182 (logger) - logger: provide any additional service annotations
  • +
  • c35e59a (logger) - dockerfile: use drycc/base image
  • +
  • a63c070 (logger) - logger: change workdir to /workspace
  • +
  • a594b28 (logger) - logger: set gid uid to 1001
  • +
  • 9a90e22 (logger) - dockerfile: use uid gid
  • +
  • 36493b4 (logger) - logger: use common affinity template
  • +
  • 897a3a5 (logger) - logger: change nodes to pod affinity
  • +
  • 03b32ab (logger) - logger: use registry.drycc.cc replace docker.io
  • +
  • a50ba5f (logger) - logger: change python-dev registry
  • +
  • 23187a3 (logger) - logger: unified reids declaration
  • +
  • aaa129a (logger) - logger: fine management affinity
  • +
  • be4f656 (logger) - logger: add replicas
  • +
  • 7c25459 (logger) - charts: add NetworkPolicy
  • +
  • 6810149 (logger) - logger: remove memory storage
  • +
  • a918c50 (logger) - logger: add .vscode to .gitignore
  • +
  • a415210 (logger) - logger: add log follow support
  • +
  • 59b1da3 (logger) - logger: upgrade new require
  • +
  • 27cc151 (monitor) - monitor: use exec runner replace docker runner
  • +
  • 07d6a9d (monitor) - monitor: canonical charts naming
  • +
  • 1054357 (monitor) - monitor: use redis default port
  • +
  • e3673df (monitor) - monitor: remove nsqd
  • +
  • fc9dd3e (monitor) - monitor: new ingress style
  • +
  • 856a898 (monitor) - monitor: add default user env
  • +
  • 9857535 (monitor) - monitor: add random user
  • +
  • 38b5a04 (monitor) - grafana: oauth auto login
  • +
  • 5dfc579 (monitor) - monitor: upgrade version
  • +
  • e121b5a (monitor) - monitor: provide any additional service annotations
  • +
  • 84462a0 (monitor) - dockerfile: use drycc/base image
  • +
  • b9e8ce8 (monitor) - monitor: chore(imagebuilder): change uid gid to 1001
  • +
  • 05ee8ab (monitor) - dockerfile: use uid gid
  • +
  • e1fa68e (monitor) - monitor: use common affinity template
  • +
  • b8f302b (monitor) - monitor: change nodes to pod affinity
  • +
  • 4fc991f (monitor) - database: bump telegraf 1.22.0 and grafana 8.4.5
  • +
  • 21a2f6a (monitor) - monitor: use registry.drycc.cc replace docker.io
  • +
  • acc976f (monitor) - monitor: change python-dev registry
  • +
  • 62d76c1 (monitor) - monitor: unified reids declaration
  • +
  • b3c57ad (monitor) - monitor: optimize oauth2 configuration
  • +
  • 70af6b0 (monitor) - monitor: change passport config
  • +
  • 69f9a88 (monitor) - monitor: fine management affinity
  • +
  • 2fb278f (monitor) - monitor: rename influxdb port
  • +
  • 17548ff (monitor) - grafana: update dashborad
  • +
  • 69d7bbd (monitor) - grafana: influx dashborad disk size
  • +
  • 75db1b0 (monitor) - monitor: upgrade new grafana/telegraf
  • +
  • 80504a1 (monitor) - grafana: update influx and redis dashboard
  • +
  • f7078cb (monitor) - monitor:chown use env
  • +
  • 91ae0dd (passport) - passport: optimize login display
  • +
  • 2d3bbbc (passport) - passport: change drycc logo
  • +
  • 59790a7 (passport) - passport: make user email unique
  • +
  • faea034 (passport) - passport: use strtobool
  • +
  • 1fbf2bc (passport) - passport: use yarn replace npm
  • +
  • 119cac8 (passport) - passport: use exec runner replace docker runner
  • +
  • cff5062 (passport) - passport: set default CSRF_COOKIE_SECURE false
  • +
  • 9cc0210 (passport) - passport: canonical charts naming
  • +
  • 9ab3896 (passport) - passport: new ingress style
  • +
  • 259ccc9 (passport) - passport: provide any additional service annotations
  • +
  • af1bbcd (passport) - dockerfile: use drycc/base image
  • +
  • 9ae5373 (passport) - passport: set venv profile
  • +
  • 8f61090 (passport) - dockerfile: use uid gid
  • +
  • fcaf72d (passport) - passport: upgrade npm package
  • +
  • 546dcd5 (passport) - passport: add license
  • +
  • 4bda2d6 (passport) - passport: use minify
  • +
  • 73b0fd1 (passport) - passport: use common affinity template
  • +
  • 278fe7a (passport) - passport: change nodes to pod affinity
  • +
  • 3cd93d3 (passport) - passport: add reactive
  • +
  • 370b493 (passport) - passport: add footer
  • +
  • 483cbd6 (passport) - passport: use h_captcha replace re_captcha
  • +
  • 3d1675e (passport) - database: bump python 3.10.4 and node 16.14.2
  • +
  • 86a7835 (passport) - passport: use registry.drycc.cc replace docker.io
  • +
  • 2d65355 (passport) - passport: change python-dev registry
  • +
  • 90c1444 (passport) - passport: unified reids declaration
  • +
  • 2e0e417 (passport) - passport: fix firefox footer
  • +
  • ad274be (passport) - passport: use bulecss
  • +
  • f986d8b (passport) - passport: add main footer
  • +
  • 3e52867 (passport) - passport: dynamic settings for vue
  • +
  • 38adabc (passport) - passport: change passport config
  • +
  • f8d6b60 (passport) - passport: fine management affinity
  • +
  • 2cbd79d (passport) - passport: remove database conn_max_age
  • +
  • 7122797 (passport) - passport: change drycc.cc to www.drycc.cc
  • +
  • 8cc84cd (rabbitmq) - rabbitmq: use exec runner replace docker runner
  • +
  • f35930f (rabbitmq) - rabbitmq: add rabbitmq cluster support
  • +
  • fbfa3ba (rabbitmq) - rabbitmq: canonical charts naming
  • +
  • ca60701 (rabbitmq) - rabbitmq: use volumeClaimTemplates
  • +
  • fe5d1b4 (rabbitmq) - rabbitmq: add sharding support
  • +
  • 9c4ab97 (rabbitmq) - rabbitmq: provide any additional service annotations
  • +
  • 348a88a (rabbitmq) - dockerfile: use drycc/base image
  • +
  • 2388be1 (rabbitmq) - rabbitmq: upgrade erlang to 24.2.2
  • +
  • db2eaa5 (rabbitmq) - dockerfile: use uid gid
  • +
  • 772afd1 (rabbitmq) - rabbitmq: change to wait pid file
  • +
  • 2bfc25e (rabbitmq) - rabbitmq: use common affinity template
  • +
  • 11d505e (rabbitmq) - rabbitmq: change nodes to pod affinity
  • +
  • 69d63f1 (rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.14
  • +
  • 8380299 (rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.io
  • +
  • b3f69f1 (rabbitmq) - rabbitmq: add check rabbitmqLocaltion
  • +
  • 5327c76 (rabbitmq) - rabbitmq: fine management affinity
  • +
  • 5c66b5a (rabbitmq) - rabbitmq: change probe
  • +
  • 27bebf9 (rabbitmq) - rabbitmq: add start-rabbitmq script
  • +
  • 86ee6a7 (rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.7
  • +
  • 1f29683 (redis) - redis: use exec runner replace docker runner
  • +
  • a5041fc (redis) - redis: canonical charts naming
  • +
  • 64468c2 (redis) - redis: add redis persistence
  • +
  • de5d753 (redis) - redis: provide any additional service annotations
  • +
  • f644639 (redis) - dockerfile: use drycc/base image
  • +
  • 98051d2 (redis) - redis: premission denied
  • +
  • bcb548e (redis) - dockerfile: use uid gid
  • +
  • 524aa41 (redis) - redis: use common affinity template
  • +
  • 26c9466 (redis) - redis: change nodes to pod affinity
  • +
  • b67d7a2 (redis) - redis: use registry.drycc.cc replace docker.io
  • +
  • 839ec50 (redis) - redis: use env replace creds volume
  • +
  • 237ca86 (redis) - redis: fine management affinity
  • +
  • bdd968d (redis) - redis: upgrade neew require
  • +
  • 8b2910f (registry) - registry: use exec runner replace docker runner
  • +
  • eedbe78 (registry) - registry: canonical charts naming
  • +
  • 0241615 (registry) - registry: provide any additional service annotations
  • +
  • 9b58da4 (registry) - dockerfile: use drycc/base image
  • +
  • ab6acb7 (registry) - registry: change workdir to /workspace
  • +
  • f368bf7 (registry) - registry: use DRYCC_UID DRYCC_GID env
  • +
  • f4b9041 (registry) - registry: use common affinity template
  • +
  • c2e87ca (registry) - registry: change nodes to pod affinity
  • +
  • feb6aba (registry) - database: bump mc 2022.04.01.23.44.48
  • +
  • 956932b (registry) - rregistry: use registry.drycc.cc replace docker.io
  • +
  • deda8d8 (registry) - registry: move registry-secret.yaml from workflow to registry
  • +
  • f52c7bf (registry) - registry: change python-dev registry
  • +
  • 007fe03 (registry) - registry: https://github.com/minio/minio/issues/14331
  • +
  • d620c6d (registry) - registry: https://github.com/minio/minio/issues/13799
  • +
  • 85e6b73 (registry) - registry: use env replace creds volume
  • +
  • 6a1155d (registry) - registry: fine management affinity
  • +
  • 7b8ebae (registry) - registry: change minio to storage
  • +
  • 1338951 (registry) - registry: add check storage health
  • +
  • 2fa769d (registry) - registry: change probe
  • +
  • f187cbf (registry) - registry: add replicas
  • +
  • 09d8a7b (registry) - registry: upgrade to mc 2022.08.28.20.08.11
  • +
  • 4b187b8 (registry-proxy) - registry-proxy: use exec runner replace docker runner
  • +
  • 29ffbbe (registry-proxy) - registry-proxy: canonical charts naming
  • +
  • 6d783ba (registry-proxy) - registry-proxy: remove use_cni
  • +
  • 8cf05cf (registry-proxy) - dockerfile: use drycc/base image
  • +
  • 090e286 (registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 1001
  • +
  • 7cf6120 (registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env
  • +
  • 3a00697 (registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io
  • +
  • 30e69e8 (registry-proxy) - registry-proxy: add registry basic auth proxy
  • +
  • 942abce (registry-proxy) - registry-proxy: upgrade to nginx 1.23.1
  • +
  • 5ea3297 (storage) - minio: use exec runner replace docker runner
  • +
  • 8306add (storage) - minio: canonical charts naming
  • +
  • c917e9f (storage) - minio: provide any additional service annotations
  • +
  • 042c732 (storage) - dockerfile: use drycc/base image
  • +
  • 7b47b82 (storage) - minio: change workdir to /workspace
  • +
  • 6f3531e (storage) - minio: use DRYCC_UID DRYCC_GID env
  • +
  • 9795fb1 (storage) - minio: use common affinity template
  • +
  • a7b09c5 (storage) - minio: change nodes to pod affinity
  • +
  • 7607342 (storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39
  • +
  • ea2b2f1 (storage) - minio: use registry.drycc.cc replace docker.io
  • +
  • 445b501 (storage) - minio: https://github.com/minio/minio/issues/14331
  • +
  • f19fbc7 (storage) - minio: use env replace creds volume
  • +
  • 8982e2e (storage) - minio: use minio to distributed
  • +
  • 06bec73 (storage) - minio: fine management affinity
  • +
  • 9b8f006 (storage) - storage: remove assert
  • +
  • 59d64b9 (storage) - storage: change listen to POD_IP
  • +
  • 60044ee (storage) - storage: add juicefs mount options
  • +
  • 189f944 (storage) - storage: remove volumeName
  • +
  • 302fe89 (storage) - storage: mv to minio dir
  • +
  • 6ec586d (storage) - storage: change readinessProbee andlivenessProbe
  • +
  • 0e028df (storage) - storage: add minio pdb
  • +
  • cf9bd2d (storage) - storage: add check storage health svc
  • +
  • 2dd5c9f (storage) - storage: add volumeBindingMode
  • +
  • fa2effc (storage) - storage: remove databaseBucket
  • +
  • d166cc7 (storage) - charts: format network-policy name
  • +
  • d06bcce (storage) - storage: upgrade to golang 1.19
  • +
  • c2ca05c (storage) - storage: upgrade new require
  • +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributing/community/index.html b/contributing/community/index.html new file mode 100644 index 000000000..8c4678acd --- /dev/null +++ b/contributing/community/index.html @@ -0,0 +1,863 @@ + + + + + + + + + + + + + + + + + + Community - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Community

+

Drycc software is fully open source. As such, the "Drycc community" consists of anyone who uses the Drycc software and participates in its evolution, whether by answering questions, finding bugs, suggesting enhancements, or writing documentation or code.

+

Drycc development is coordinated through numerous project repositories on GitHub. Anyone can check out the source code for any Drycc component, fork it, make improvements, and create a pull request to offer those changes back to the Drycc community.

+

Engine Yard maintains the numerous Drycc projects, and as such, decides what ends up in the official GitHub repositories. Drycc depends on the contributions of the community; the maintainers will not ignore pull requests or issues.

+

Drycc uses the timeless, highly efficient, and totally unfair system known as "Benevolent Dictator for Life" (BDFL). Gabriel Monroy, the creator of Drycc, is our BDFL and has final say over all decisions related to Drycc.

+

Open Source Bounties

+

Drycc projects are bounty-friendly. We believe open source bounty sites can be constructive tools in the development of open source software. Community members are encouraged to a) offer bounties and b) receive bounties for open source contributions that benefit everyone. The Drycc maintainers, however, will not accept bounties on this project but are more than happy to help community members attempting bounties.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributing/conduct/index.html b/contributing/conduct/index.html new file mode 100644 index 000000000..cb8551b74 --- /dev/null +++ b/contributing/conduct/index.html @@ -0,0 +1,879 @@ + + + + + + + + + + + + + + + + + + Conduct - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Conduct

+

The Drycc community welcomes and encourages participation by everyone.

+

No matter how you identify yourself or how others perceive you: we welcome you. We welcome contributions from everyone as long as they interact constructively with our community.

+

The Drycc developer community continues to grow, and it is inevitable that disagreements and conflict will arise. We ask that participants conduct themselves according to these principles:

+
    +
  1. +

    Be welcoming, friendly, and patient.

    +
  2. +
  3. +

    Be considerate.

    +
  4. +
+

Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language.

+
    +
  1. Be respectful.
  2. +
+

Not all of us will agree all the time, but disagreement is no excuse for poor behavior and bad manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one.

+
    +
  1. Be careful in the words that you choose.
  2. +
+

Be kind to others. Do not insult or put down other participants. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are never appropriate for the community.

+

(Thanks to the Debian and Django communities for their text and +their inspiration.)

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributing/design-documents/index.html b/contributing/design-documents/index.html new file mode 100644 index 000000000..aa22f9df4 --- /dev/null +++ b/contributing/design-documents/index.html @@ -0,0 +1,881 @@ + + + + + + + + + + + + + + + + + + Design Documents - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Design Documents

+

Before submitting a pull request which will significantly alter the behavior of any Drycc component, such as a new feature or major refactoring, contributors should first open an issue representing a design document.

+

Goals

+

Design documents help ensure project contributors:

+
    +
  • Involve stakeholders as early as possible in a feature's development
  • +
  • Ensure code changes accomplish the original motivations and design goals
  • +
  • Establish clear acceptance criteria for a feature or change
  • +
  • Enforce test-driven design methodology and automated test coverage
  • +
+

Contents

+

Design document issues should be named Design Doc: <change description> and contain the following sections:

+

Goal

+

This section should briefly describe the proposed change and the motivations behind it. Tests will be written to ensure this design goal is met by the change.

+

This section should also reference a separate GitHub issue tracking the feature or change, which will typically be assigned to a release milestone.

+

Code Changes

+

This section should detail the code changes necessary to accomplish the change, as well as the proposed implementation. This should be as detailed as necessary to help reviewers understand the change.

+

Tests

+

All changes should be covered by automated tests, either unit or integration tests (ideally both). This section should detail how tests will be written to validate that the change accomplishes the design goals and doesn't introduce any regressions.

+

If a change cannot be sufficiently covered by automated testing, the design should be reconsidered. If there is no test coverage whatsoever for an affected section of code, a separate issue should be filed to integrate automated testing with that section of the codebase.

+

The tests described here also form the acceptance criteria for the change, so that when it's completed maintainers can merge the pull request after confirming the tests pass CI.

+

Approval

+

A design document follows the same merge approval review process as final pull requests do, and maintainers will take extra care to ensure that any stakeholders for the change are included in the discussion and review of the design document.

+

Once the design is accepted, the author can complete the change and submit a pull request for review. The pull request should close both the design document for the change as well as any issues that either track the issue or are closed as a result of the change.

+

See Submitting a Pull Request for more information on pull request and commit message formatting.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributing/development-environment/index.html b/contributing/development-environment/index.html new file mode 100644 index 000000000..fbcce8f9d --- /dev/null +++ b/contributing/development-environment/index.html @@ -0,0 +1,999 @@ + + + + + + + + + + + + + + + + + + Development Environment - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Development Environment

+

This document is for developers who are interested in working directly on the Drycc codebase. In this guide, we walk you through the process of setting up a development environment that is suitable for hacking on most Drycc components.

+

We try to make it simple to hack on Drycc components. However, there are necessarily several moving pieces and some setup required. We welcome any suggestions for automating or simplifying this process.

+
+

Note

+

The Drycc team is actively engaged in containerizing Go and Python based development environments tailored specifically for Drycc development in order to minimize the setup required. This work is ongoing. Refer to the drycc/router project for a working example of a fully containerized development environment.

+
+

If you're just getting into the Drycc codebase, look for GitHub issues with the label easy-fix. These are more straightforward or low-risk issues and are a great way to become more familiar with Drycc.

+

Prerequisites

+

In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required:

+
    +
  • git
  • +
  • Go 1.5 or later, with support for compiling to linux/amd64
  • +
  • glide
  • +
  • golint
  • +
  • shellcheck
  • +
  • Podman (in a non-Linux environment, you will additionally want [Podman Machine][machine])
  • +
+

For drycc/controller, in particular, you will also need:

+
    +
  • Python 2.7 or later (with pip)
  • +
  • virtualenv (sudo pip install virtualenv)
  • +
+

In most cases, you should simply install according to the instructions. There are a few special cases, though. We cover these below.

+

Configuring Go

+

If your local workstation does not support the linux/amd64 target environment, you will have to install Go from source with cross-compile support for that environment. This is because some of the components are built on your local machine and then injected into a container.

+

Homebrew users can just install with cross compiling support:

+
$ brew install go --with-cc-common
+ + +

It is also straightforward to build Go from source:

+
$ sudo su
+$ curl -sSL https://golang.org/dl/go1.5.src.tar.gz | tar -v -C /usr/local -xz
+$ cd /usr/local/go/src
+$ # compile Go for our default platform first, then add cross-compile support
+$ ./make.bash --no-clean
+$ GOOS=linux GOARCH=amd64 ./make.bash --no-clean
+ + +

Once you can compile to linux/amd64, you should be able to compile Drycc components as normal.

+

Fork the Repository

+

Once the prerequisites have been met, we can begin to work with Drycc components.

+

Begin at Github by forking whichever Drycc project you would like to contribute to, then clone that fork locally. Since Drycc is predominantly written in Go, the best place to put it is under $GOPATH/src/github.com/drycc/.

+
$ mkdir -p  $GOPATH/src/github.com/drycc
+$ cd $GOPATH/src/github.com/drycc
+$ git clone git@github.com:<username>/<component>.git
+$ cd <component>
+ + +
+

Note

+

By checking out the forked copy into the namespace github.com/drycc/<component>, we are tricking the Go toolchain into seeing our fork as the "official" source tree.

+
+

If you are going to be issuing pull requests to the upstream repository from which you forked, we suggest configuring Git such that you can easily rebase your code to the upstream repository's main branch. There are various strategies for doing this, but the most common is to add an upstream remote:

+
$ git remote add upstream https://github.com/drycc/<component>.git
+ + +

For the sake of simplicity, you may want to point an environment variable to your Drycc code - the directory containing one or more Drycc components:

+
$ export DRYCC=$GOPATH/src/github.com/drycc
+ + +

Throughout the rest of this document, $DRYCC refers to that location.

+

Alternative: Forking with a Pushurl

+

A number of Drycc contributors prefer to pull directly from drycc/<component>, but push to <username>/<component>. If that workflow suits you better, you can set it up this way:

+
$ git clone git@github.com:drycc/<component>.git
+$ cd drycc
+$ git config remote.origin.pushurl git@github.com:<username>/<component>.git
+ + +

In this setup, fetching and pulling code will work directly with the upstream repository, while pushing code will send changes to your fork. This makes it easy to stay up to date, but also make changes and then issue pull requests.

+

Make Your Changes

+

With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.

+

Test Your Changes

+

Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See testing for instructions on running the tests.

+

Deploying Your Changes

+

Although writing and executing tests are critical to ensuring code quality, most contributors will also want to deploy their changes to a live environment, whether to make use of those changes or to test them further. The remainder of this section documents the procedure for running officially released Drycc components in a development cluster and replacing any one of those with your customizations.

+

Running a Kubernetes Cluster for Development

+

To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions here.

+

Using a Development Registry

+

To facilitate deploying Container images containing your changes to your Kubernetes cluster, you will need to make use of a Container registry. This is a location to where you can push your custom-built images and from where your Kubernetes cluster can retrieve those same images.

+

If your development cluster runs locally (in Minikube, for instance), the most efficient and economical means of achieving this is to run a Container registry locally as a Container container.

+

To facilitate this, most Drycc components provide a make target to create such a registry:

+
$ make dev-registry
+ + +

In a Linux environment, to begin using the registry:

+
export DRYCC_REGISTRY=<IP of the host machine>:5000
+ + +

In non-Linux environments:

+
export DRYCC_REGISTRY=<IP of the drycc Container Machine VM>:5000
+ + +

If your development cluster runs on a cloud provider such as Google Container Engine, a local registry such as the one above will not be accessible to your Kubernetes nodes. In such cases, a public registry such as [DockerHub][dh] or quay.io will suffice.

+

To use DockerHub for this purpose, for instance:

+
$ export DRYCC_REGISTRY="registry.drycc.cc"
+$ export IMAGE_PREFIX=<your DockerHub username>
+ + +

To use quay.io:

+
$ export DRYCC_REGISTRY=quay.io
+$ export IMAGE_PREFIX=<your quay.io username>
+ + +

Note the importance of the trailing slash.

+

Dev / Deployment Workflow

+

With a functioning Kubernetes cluster and the officially released Drycc components installed onto it, deployment and further testing of any Drycc component you have made changes to is facilitated by replacing the officially released component with a custom built image that contains your changes. Most Drycc components include Makefiles with targets specifically intended to facilitate this workflow with minimal friction.

+

In the general case, this workflow looks like this:

+
    +
  1. Update source code and commit your changes using git
  2. +
  3. Use make build to build a new Container image
  4. +
  5. Use make dev-release to generate Kubernetes manifest(s)
  6. +
  7. Use make deploy to restart the component using the updated manifest
  8. +
+

This can be shortened to a one-liner using just the deploy target:

+
$ make deploy
+ + +

Useful Commands

+

Once your customized Drycc component has been deployed, here are some helpful commands that will allow you to inspect your cluster and to troubleshoot, if necessary:

+

See All Drycc Pods

+
$ kubectl --namespace=drycc get pods
+ + +

Describe a Pod

+

This is often useful for troubleshooting pods that are in pending or crashed states:

+
$ kubectl --namespace=drycc describe -f <pod name>
+ + +

Tail Logs

+
$ kubectl --namespace=drycc logs -f <pod name>
+ + +

Django Shell

+

Specific to drycc/controller

+
$ kubectl --namespace=drycc exec -it <pod name> -- python manage.py shell
+ + +

Have commands other Drycc contributors might find useful? Send us a PR!

+

Pull Requests

+

Satisfied with your changes? Share them!

+

Please read Submitting a Pull Request. It contains a checklist of +things you should do when proposing a change to any Drycc component.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributing/maintainers/index.html b/contributing/maintainers/index.html new file mode 100644 index 000000000..a736f882d --- /dev/null +++ b/contributing/maintainers/index.html @@ -0,0 +1,922 @@ + + + + + + + + + + + + + + + + + + Maintainers - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Drycc Maintainers

+

This document serves to describe the leadership structure of the Drycc project, and list the current +project maintainers.

+

What is a maintainer?

+

(Unabashedly stolen from the Podman project)

+

There are different types of maintainers, with different responsibilities, but +all maintainers have 3 things in common:

+
    +
  1. They share responsibility in the project's success.
  2. +
  3. They have made a long-term, recurring time investment to improve the project.
  4. +
  5. They spend that time doing whatever needs to be done, not necessarily what +is the most interesting or fun.
  6. +
+

Maintainers are often under-appreciated, because their work is harder to appreciate. +It's easy to appreciate a really cool and technically advanced feature. It's harder +to appreciate the absence of bugs, the slow but steady improvement in stability, +or the reliability of a release process. But those things distinguish a good +project from a great one.

+

Drycc maintainers

+

Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.

+

BDFL

+

Drycc follows the timeless, highly efficient and totally unfair system known as Benevolent dictator +for life.

+

Gabriel Monroy (@gabrtv), as creator of the Drycc project, serves as our +project's BDFL. While the day-to-day project management is carried out by the maintainers, Gabriel +serves as the final arbiter of any disputes and has the final say on project direction.

+

Core maintainers

+

Core maintainers are exceptionally knowledgeable about all areas of Drycc. Some maintainers work on Drycc +full-time, although this is not a requirement.

+

The duties of a core maintainer include:

+
    +
  • Classify and respond to GitHub issues and review pull requests
  • +
  • Help to shape the Drycc roadmap and lead efforts to accomplish roadmap milestones
  • +
  • Participate actively in feature development and bug fixing
  • +
  • Answer questions and help users in the Drycc #community Slack channel
  • +
+

The current list of core maintainers can be seen here.

+

No pull requests can be merged until at least one core maintainer signs off with an +LGTM. The other LGTM can +come from either a core maintainer or contributing maintainer.

+

Contributing maintainers

+

Contributing maintainers are exceptionally knowledgeable about some but not necessarily all areas +of Drycc, and are often selected due to specific domain knowledge that complements the project (but +a willingness to continually contribute to the project is most important!). Often, +core maintainers will ask a contributing maintainer to weigh in on issues, pull requests, or +conversations where the contributing maintainer is knowledgeable.

+

The duties of a contributing maintainer are very similar to those of a core maintainer, but they are limited to areas of the Drycc project where the contributing maintainer is knowledgeable.

+

Contributing maintainers are defined in practice as those who have write access to the Drycc repository. All maintainers can review pull requests and add LGTM labels as appropriate.

+

Becoming a maintainer

+

The Drycc project wouldn't be where it is today without its community. Many of the project's +community members embody the spirit of maintainership, and have contributed substantially to +the project.

+

The contributing maintainers group was created in part so that exceptional members of the community +who have an interest in the continued success of the project have the opportunity to join the +core maintainers in guiding the future of Drycc.

+

Generally, potential contributing maintainers are selected by the Drycc core maintainers based in +part on the following criteria:

+
    +
  • Sustained contributions to the project over a period of time (usually months)
  • +
  • A willingness to help Drycc users on GitHub and in the Drycc #community Slack channel
  • +
  • A friendly attitude :)
  • +
+

The Drycc core maintainers must unanimously agree before inviting a community member to join as a +contributing maintainer, although in many cases the candidate has already been acting in the +capacity of a contributing maintainer for some time, and has been consulted on issues, pull requests, +etc.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributing/overview/index.html b/contributing/overview/index.html new file mode 100644 index 000000000..be2f0d3f2 --- /dev/null +++ b/contributing/overview/index.html @@ -0,0 +1,874 @@ + + + + + + + + + + + + + + + + + + Overview - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Contributor Overview

+

Interested in contributing to a Drycc project? There are lots of ways to help.

+

File Bugs & Enhancements

+

Find a bug? Want to see a new feature? Have a request for the maintainers? Open a Github issue in the applicable repository and we’ll get the conversation started.

+

Our official support channel is the Drycc #community Slack channel.

+

Don't know what the applicable repository for an issue is? Open up in issue in workflow or chat with a maintainer in the Drycc #community Slack channel and we'll make sure it gets to the right place.

+

Additionally, take a look at the troubleshooting documentation for common issues.

+

Before opening a new issue, it's helpful to search and see if anyone else has already reported the problem. You can search through a list of issues for all Drycc projects here.

+

Write Documentation

+

We are always looking to improve and expand our documentation. Most docs reside in the drycc/workflow repository. Simply fork the project, update docs and send us a pull request.

+

Contribute Code

+

We are always looking for help improving the core platform, other workloads, tooling, and test coverage. Interested in contributing code? Let’s chat in the Drycc #community Slack channel. Make sure to check out issues tagged easy fix or help wanted.

+

When you're ready to begin writing code, review Design Documents and get your Development Environment set up.

+

By contributing to any Drycc project you agree to its Developer Certificate of Origin (DCO). This document was created by the Linux Kernel community and is a simple statement that you, as a contributor, have the legal right to make the contribution.

+

Triage Issues

+

If you don't have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. See Triaging Issues for more info.

+

Share your Experience

+

Interact with the community on our user mailing list or live in our Drycc #community Slack channel, where you can chat with other Drycc Workflow users any time of day.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributing/submitting-a-pull-request/index.html b/contributing/submitting-a-pull-request/index.html new file mode 100644 index 000000000..20e8abf70 --- /dev/null +++ b/contributing/submitting-a-pull-request/index.html @@ -0,0 +1,931 @@ + + + + + + + + + + + + + + + + + + Submitting a Pull Request - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Submitting a Pull Request

+

Proposed changes to Drycc projects are made as GitHub pull requests.

+

Design Document

+

Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see Design Documents.

+

Single Issue

+

It's hard to reach agreement on the merit of a PR when it isn't focused. When fixing an issue or implementing a new feature, resist the temptation to refactor nearby code or to fix that potential bug you noticed. Instead, open a separate issue or pull request. Keeping concerns separated allows pull requests to be tested, reviewed, and merged more quickly.

+

Squash and rebase the commit or commits in your pull request into logical units of work with git. Include tests and documentation changes in the same commit, so that a revert would remove all traces of the feature or fix.

+

Most pull requests will reference a GitHub issue. In the PR description - not in the commit itself - include a line such as "closes #1234". The issue referenced will automatically be closed when your PR is merged.

+

Include Tests

+

If you significantly alter or add functionality to a component that impacts the broader Drycc Workflow PaaS, you should submit a complementary PR to modify or amend end-to-end integration tests. These integration tests can be found in the drycc/workflow-e2e repository.

+

See testing for more information.

+

Include Docs

+

Changes to any Drycc Workflow component that could affect a user's experience also require a change or addition to the relevant documentation. For most Drycc components, this involves updating the component's own documentation. In some cases where a component is tightly integrated into drycc/workflow, its documentation must also be updated.

+

Cross-repo commits

+

If a pull request is part of a larger piece of work involving one or more additional commits in other Workflow repositories, these commits can be referenced in the last PR to be submitted. The downstream e2e test job will then supply every referenced commit (derived from PR issue number supplied) to the test runner so it can source the necessary Container images for inclusion in the generated Workflow chart to be tested.

+

For example, consider paired commits in drycc/controller and drycc/workflow-e2e. The commit body for the first PR in drycc/workflow-e2e would look like:

+
feat(foo_test): add e2e test for feature foo
+
+[skip e2e] test for controller#42
+ + +

Adding [skip e2e] forgoes the e2e tests on this commit. This and any other required PRs aside from the final PR should be submitted first, so that their respective build and image push jobs run.

+

Lastly, the final PR in drycc/controller should be created with the required PR number(s) listed, in the form of [Rr]equires <repoName>#<pullRequestNumber>, for use by the downstream e2e run.

+
feat(foo): add feature foo
+
+Requires workflow-e2e#42
+ + +

Code Standards

+

Drycc components are implemented in Go and Python. For both languages, we agree with The Zen of Python, which emphasizes simple over clever. Readability counts.

+

Go code should always be run through gofmt on the default settings. Lines of code may be up to 99 characters long. Documentation strings and tests are required for all exported functions. Use of third-party go packages should be minimal, but when doing so, such dependencies should be managed via the glide tool.

+

Python code should always adhere to PEP8, the python code style guide, with the exception that lines of code may be up to 99 characters long. Docstrings and tests are required for all public methods, although the flake8 tool used by Drycc does not enforce this.

+

Commit Style

+

We follow a convention for commit messages borrowed from CoreOS, who borrowed theirs +from AngularJS. This is an example of a commit:

+
feat(scripts/test-cluster): add a cluster test command
+
+this uses tmux to setup a test cluster that you can easily kill and
+start for debugging.
+ + +

To make it more formal, it looks something like this:

+
{type}({scope}): {subject}
+<BLANK LINE>
+{body}
+<BLANK LINE>
+{footer}
+ + +

The allowed {types} are as follows:

+
    +
  • feat -> feature
  • +
  • fix -> bug fix
  • +
  • docs -> documentation
  • +
  • style -> formatting
  • +
  • ref -> refactoring code
  • +
  • test -> adding missing tests
  • +
  • chore -> maintenance
  • +
+

The {scope} can be anything specifying the location(s) of the commit change(s).

+

The {subject} needs to be an imperative, present tense verb: “change”, not “changed” nor +“changes”. The first letter should not be capitalized, and there is no dot (.) at the end.

+

Just like the {subject}, the message {body} needs to be in the present tense, and includes +the motivation for the change, as well as a contrast with the previous behavior. The first +letter in a paragraph must be capitalized.

+

All breaking changes need to be mentioned in the {footer} with the description of the +change, the justification behind the change and any migration notes required.

+

Any line of the commit message cannot be longer than 72 characters, with the subject line +limited to 50 characters. This allows the message to be easier to read on GitHub as well +as in various git tools.

+

Merge Approval

+

Any code change - other than a simple typo fix or one-line documentation change - requires at least two Drycc maintainers to accept it. Maintainers tag pull requests with "LGTM1" and "LGTM2" (Looks Good To Me) labels to indicate acceptance.

+

No pull requests can be merged until at least one core maintainer signs off with an LGTM. The other LGTM can come from either a core maintainer or contributing maintainer.

+

If the PR is from a Drycc maintainer, then he or she should be the one to close it. This keeps the commit stream clean and gives the maintainer the benefit of revisiting the PR before deciding whether or not to merge the changes.

+

An exception to this is when an errant commit needs to be reverted urgently. If necessary, a PR that only reverts a previous commit can be merged without waiting for LGTM approval.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributing/testing/index.html b/contributing/testing/index.html new file mode 100644 index 000000000..23342b16b --- /dev/null +++ b/contributing/testing/index.html @@ -0,0 +1,882 @@ + + + + + + + + + + + + + + + + + + Testing - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Testing Drycc

+

Each Drycc component is one among an ecosystem of such components - many of which integrate with one another - which makes testing each component thoroughly a matter of paramount importance.

+

Each Drycc component includes its own suite of style checks, unit tests, and black-box type functional tests.

+

Integration tests verify the behavior of the Drycc components together as a system and are provided separately by the drycc/workflow-e2e project.

+

GitHub pull requests for all Drycc components are tested automatically by the Travis CI continuous integration system. Contributors should run the same tests locally before proposing any changes to the Drycc codebase.

+

Set Up the Environment

+

Successfully executing the unit and functional tests for any Drycc component requires that the Development Environment is set up first.

+

Run the Tests

+

The style checks, unit tests, and functional tests for each component can all be executed via make targets:

+

To execute style checks:

+
$ make test-style
+ + +

To execute unit tests:

+
$ make test-unit
+ + +

To execute functional tests:

+
$ make test-functional
+ + +

To execute style checks, unit tests, and functional tests all in one shot:

+
$ make test
+ + +

To execute integration tests, refer to drycc/workflow-e2e documentation.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contributing/triaging-issues/index.html b/contributing/triaging-issues/index.html new file mode 100644 index 000000000..13dba8317 --- /dev/null +++ b/contributing/triaging-issues/index.html @@ -0,0 +1,946 @@ + + + + + + + + + + + + + + + + + + Triaging Issues - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Triaging Issues

+

Issue triage provides an important way to contribute to an open source project. Triage helps ensure issues resolve quickly by:

+
    +
  • Describing the issue's intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took.
  • +
  • Giving a contributor the information they need before they commit to resolving an issue.
  • +
  • Lowering the issue count by preventing duplicate issues.
  • +
  • Streamlining the development process by preventing duplicate discussions.
  • +
+

If you don't have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours.

+

Ensure the Issue Contains Basic Information

+

Before triaging an issue very far, make sure that the issue's author provided the standard issue information. This will help you make an educated recommendation on how this to categorize the issue. Standard information that should be included in most issues are things such as:

+
    +
  • the version(s) of Drycc this issue affects
  • +
  • a reproducible case if this is a bug
  • +
  • page URL if this is a docs issue or the name of a man page
  • +
+

Depending on the issue, you might not feel all this information is needed. Use your best judgment. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem.

+

If the author provides the recommended information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author's time.

+

If the author does not respond requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided.

+

Classifying the Issue

+

An issue can have multiple of the following labels:

+

Issue Kind

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KindDescription
bugBugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate.
docsWriting documentation, man pages, articles, blogs, or other significant word-driven task.
enhancementEnhancements can drastically improve usability or performance of a component.
questionContains a user or contributor question requiring a response.
securitySecurity-related issues such as TLS encryption, network segregation, authn/authz features, etc.
+

Functional Area

+
    +
  • builder
  • +
  • cache
  • +
  • contrib and provisioning
  • +
  • client
  • +
  • controller
  • +
  • database
  • +
  • docs
  • +
  • kubernetes
  • +
  • registry
  • +
  • router
  • +
  • store (Ceph)
  • +
  • tests
  • +
+

Easy Fix

+

"Easy Fix" issues are a way for a new contributor to find issues that are fit for their experience level. These issues are typically for users who are new to Drycc, and possibly Go, and is looking to help while learning the basics.

+

Prioritizing issues

+

When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.

+ + + + + + + + + + + + + + + + + +
PriorityDescription
priority 0Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release.
priority 1Serious: Impedes user actions or is a regression. Fix this before the next planned release.
+

And that's it. That should be all the information required for a new or existing contributor to come in an resolve an issue.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dependency_update.py b/dependency_update.py new file mode 100644 index 000000000..af634b286 --- /dev/null +++ b/dependency_update.py @@ -0,0 +1,27 @@ +import sys +import yaml +import requests +from contextlib import closing + + +def load_index(url): + with closing(requests.get(url)) as response: + return yaml.load(response.text, Loader=yaml.Loader) + +def load_requirements(requirements_file): + with open(requirements_file) as f: + return yaml.load(f, Loader=yaml.Loader) + +def dump_requirements(requirements_file, requirements): + with open(requirements_file, "w") as f: + return yaml.dump(requirements, stream=f, Dumper=yaml.Dumper) + +def update_dependencies(requirements, url): + for dependency in requirements["dependencies"]: + dependency["repository"] = url + +if __name__ == "__main__": + requirements = load_requirements(sys.argv[2]) + update_dependencies(requirements, sys.argv[1]) + dump_requirements(sys.argv[2], requirements) + diff --git a/diagrams/Application_Layout.png b/diagrams/Application_Layout.png new file mode 100644 index 0000000000000000000000000000000000000000..46ef57fa4267abb89dac58b4478ae6da51041414 GIT binary patch literal 49623 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 R;RO6$Rk^PGR?+h5{{S*Q{A&OJ literal 0 HcmV?d00001 diff --git a/diagrams/Diagrams.graffle b/diagrams/Diagrams.graffle new file mode 100644 index 0000000000000000000000000000000000000000..ccea9786a0e959eaf8e9e2557921e41377c85754 GIT binary patch literal 373823 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 ^(AfQMtVLN{3YT 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%0AxvBLfwzZr(h>Jo7RgSoz3ae)N49LX}z+=j# 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 o5O-1gSH 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®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�- z{UNZoUdzLO-*hO#F>wsXWf+Lzb5I=6edW3J=hA-k{*t!0O8{CJHkCD|B zPc?5;$ARS`t+wt3{}eMM&TM7ZjMh0x7KJ86FVWybn%`wQugH@%+>e=zqQu5kyFval z?gK{k=isty2R^~1nqSD1kA}XcJqh$GIZY4aZAk~0*&A(v-MT$UpxcUGJto;1f>ob~ z_gj`zZ>2?MqJ2mYegO)Z4H5&r-m}&|TjUY@gzm?1|1-02i+%;aY(0i>EY1 zd1&A6@L>9Bt`FV;f&p-J2Phf_pKCm?c27K4Yi&8jZB=_p_ktc-;itv&?e8Svr@3%W zQrJb^+}Xu+*YgbG_}-KkZo-Tr4AZ8Y0>vr8CE>8?rZ_mLJlUxR`~?9oHNZA_en}qe z^fdlx*cp@juIdS_%emc*cMEVCfNNI;gNJJnZD0B}cLM)I)O`soe2z1~2Dj#U!|kfj zDF0+%ga6WP6JdyF*6wjCVByxwx9yY=!N?HZ2Me)Ohpi zMD2U|3t46J=Kx^$TBPstOhWL}j)h+4LQzEMoYAA>_}&D!+mAG3dMIO9iIYXA zyIm>bPgP?czLGDW)-hg*V^>LYsd)g;r(l))ZJ%vB=N0QWbPDFH-SU5zbf(l5^)3GU zcJ7?nO}d?%5dTe)O?5Y^*Nlz}RHYNs3}SH0LhNzi2Rm zma9|=7JP;3pjp?iX5=6VoE6Xidj%=`;9Wnc;MaZl&?3ydXy_lT_faxa+w98wA87nrXLI)G8YJy8 zfA?Z`Ny*ejRVEadTEC$qi@0SK9c2GL_nmM@G3-?iy)M4zA8|fN72plHLU$&2jKO6R z#YaCxKH`0!CSmsQMTK_}hwC(HQnNp%^HGfK!-bP>2mR1uo>Q#ttAze+K1{vjML}>Q z$S`jU+68ibsaz4pPRm<^oI2c1D*u^GbBMk7j`XN!e$Dk4b&^U7(vN1kTh}l3@o+<% zQV<98VIPS1<3nmhH3E-0!w*3_YwV};bU?`EMtr!*6`u+CFYyMfwm1C)m^+@84tmK_ ztU}X~d(V4hk=j;$G#)*^-0+y%XuFp?dApf&zxfHgjJ6E6DRtbooMOKFa&PbD(lYut z4v_*ihAUknxAt&H6v(`9{@+yS)@GYDQ!ISP!eoSv4D+}l#1d{JQMGE zR|#!NBSg3>+`LzcN%FlE!xg;yLSk8JTGnFrc^MftUv><(e_58R-v0jneGbXHxPwZG z5z1|Z+yW1tx#^y{Pie zJMWsN#dlGvg!pQ+@+jXtqyOwaez5k+{@BfQjj)-xV=>PzUL$f70 z{1}0z$cL)sN{n4jeS78ZkOv!d^7xFmoU~el?i{5oGf%XTU-YBz`n^bdbj%)tnnbaDvs)w+OFgiG zc*qsazxo$KlI{{Cjvi+#6OsMKZIPNtqMRt{==Px4YH!;Y=lX*0jy$YRL!K2tp{#rG zqj#2f#Onc;--7%H(|WC`)4QWNM#8shghd#jxcMu#RX1~Fkg_qy(_vG)rZ-SMWd+5= z(ND^IqvvXE8vK@f+h8r(rm;`Aw#%ovs~g4KANd%?FvS~OKcH5Af*cV-?KP5H{oXM+ zf`3U*{zq;sV=Y0i;1P0O&tgq`I#ZC=VBdUwnnsP<*%xPi*Ycx}UG9 zkE8FFWg>ucVn*;(&az5l&?&o?F*^M7h@Az`8xx^d&43I67FU{#K zjh^E}duW+UI7)TVfS-RlED~dfpA1)m?O1SrQ?@Y7zSGa#l+-@cJGU_`tm>{%&YZa4 zqiEJy`99T+tuF6?!0e=;*dY%$W@wJKw=$)5_*zH+Q6^`yR8BAd@4G&yQZ?+?Xy2rs z7}f?i?CrT+=pPOz1Jo(c`kt$=OxSpeA%tTiFjh zcN%5XFZELDE>}0MQSCfS0duD0!&e3-RGg23zBL$rk$_c`cU@1S5=}xis-ng_{4`&7 zbbqui<{WXC$vsFIkfWCjW%`A1O4~Sx+o9gUo4hWoH&Y+fsP!%!?zLASTjZXlqvL^| zcU8DGVvjeD{&(GuZ<!S1-AYi8JHmW_%P&e7Aj&|5Rsbm21M!o*LX+# zVrGU>FB0gkvRwNHn|8V|pG@(9u%aOBe`|Io5`H6 zc=Uqq)NhTE4%hA|=zjOkqyWb?ep{1T#07m#-4Y3MJSb1f2*5KHab>;6N^<1!%cGZ= znwI+u7^r(TcmO=5-JVPj`#AQPGj~8U`g`)+x%@1`J##LEh7YzNeg&3NLAigPH=bxq ze0ZklARhv-z=}9dMMVx)KVsfp+a|KT6%W6Acx8DmiZ-(Vd=@b;7yhZQkm@{&bE|;* zGR0EUAUkPe_=Di9Y+6vkDdV}Gf#vdthaqa`uwc2yjgqx10tx$|3)L(X%4UVwQ$mhB zPX$KiK;&U_Ns%7sTAlNzox6(%DMM;CHc6SVY>=l8EI<(m{YXe*+8k{A5uZN(eSJ6J z2DQ>|#t)`iy&zh8=+fUSibk)>mwwPkl6+@Q9YMml{5vJcm6*T9*ssCzE{Yv+6#nId zj)Y|0Cs9ql_?7j~{Tr@zKG}p}+@Z}lMG~fddZ-~;*m2TbXTgkmePp(k{T^(%cftb> z*e+~3G-G6DydqhbjCb*f!);saPZh2u&l_PWyBOmUsy6p3IzK;iDs&2Aa*d&36?~D{H|+dVIob?opJUG@mfn-z^Z59hWM5OINZJvflW~ro8>&)j zk|)J&wDR!ah3ULDOE((U`oItky-VNveHg<%H+x!Yx?PMJ_uHe}D;ZK!*x@`Po@!#n zhecNrK(BmMc-Upb_rqX1&`(oLD4PpmY{J{x;~St!!A5!uR7oHhhKShe8kKe_>dqI} zY@OH9U!c;sh{noHj=#eMt~)%4ZCW6TjWqvyh@ye``lw@Tp3zH_R@N>v?FUMy5*@95 zoZTlN+}U)J0q5p6Z4VtTK9r~LS} z*TLG~2ex2&GA>iSS$AOu(#4z9{v~EK^M%J2irYDNy)Okl<>|GHN;kK;*Y}a4oLtiL z2coX%a0pFIHL&{KNl(@8?P+YS;zOu9 zm8JD%&kt-=rm#uC5S8HTce8w_)wDjOi2&?_c91MK z4-}k-X$)1>F#H1#rdz{JZk|?SOy9iC#mf|W?g#}~%@nCvy^%Z`1JAydALu9y%D5&% z!Hh4l{!c#i!IxGJ{@!_+c$ZPwf|6S|d9~EZvG#nZ>h|%KYYx3s$rCk^c_v`5FfvNm zh*`or?#Q4ziH^)w&D7)2?~q^q{7GGreSKf+YA}Kx&5fQNBTXJZ1FMZFdd@8t%O7W! z;85#YCUL}F{vzJ61EsAo9nUQr97n+_lQvOVP&!NUb1CXBER~UKB}JX9mHA_XR?DJe z@O_krA)0ExCDqVHK*?lbAi;(~t(ScrS_2;b>A2ZXc4LW%**|$`(55BN(FR?ED&a%x zhYcIaHQZAyh92TY3p6RaZMo4FuHgiupia?xx(f|!Pg)}bxlJ6?6jy1yL-Ne;nE8)U zObK<5_>h%AWu3Re{(3X9<05#h==iQzdG_meRq0plU*_X6j{E~dqyxqgT8WGu_wA=>a_#0T1127e~9nihrozbIG|Lq8MFdGVBaI|?`FWCAc*<5P>?NN zl`G=e`{Dpzu5g3+OA7^Y&>^M?Z$TV_PhfWbj_Gl5QabxQh?DV&hfoRFr$f zGN8yG#4h->nVRBIqbPBkm zI*Ks-4R!s7={4DgurGwheZhJbp)ETGjT&`bvc`T>L7~njF~6j-#c&2yjhD2jJ1S3Q z%aSt85@geSZGA_Z?P+1WN!I3PcTMoMoq`r`(cqbVIZ=WwCF`97$eDev$t>u?5LL?` z5l_bJeXX?r6edvuJZPKyTguz6S@aD0w2}u00ap&uAEJ7qO$;e|_tQPD_hdpWdFVBA zmn-60_-w68{J)cW009>la*+JLePM5t<)r*FVZ}YLa`yyO-abmZzIq<~rXMi`PqGS? z>7-qb+JVD{P2i8CcIJ(>wgcCgUncfPZAg~G%AkLhv_CJadI>0TO0V6NT~tc4AM>HC z7A}iBk>}@cvaZM2>O*jZP^uU&<9CYD zQzKfvKX@9oZay3w&<84PTLp=7HUTM43&AO5i7Ji~h3&Q(U$WxMks>RzW%{mM*QV9$MayxB^?fNF!Z zUNnovO^IkUAvfCEE(&SUDlr9uwUVVExB3~V7D%3+&S$BOBg zL&T`nQKi0|1BQTFTfy<{aM#FQ;21HW>>60HmJIlPi}+IVP|6hnPGCPj4bm=yzldSJ zz5jZ3k`cLQGoWPlbJvdrcbj9x;A(!`rxt-hUSf?o5U2Lqff`#K_~o`{HI>#s*;r|Z z1!kDOGZiXsaPMdt*)b;L5c*HysfTpp#onC+Gq&MH5mvI4eefc;WV04rzUZyi_$NHP z;L_AbOTb=a!@y;!<$w1-pHTm^6XAK_>w9SdHmwK$_>aB?YgIsfSHVh7g#lOKP@ng7E%fF4f0;5+ycNBx5lpN$#E4&i{zYCR@Udq75{@UJ zV91JK(0cLqO2awx!e+wWyc{jcXSb)^l`L%qs0NIMOMwEM{Oe%F+zNmJN2`QpFG_EFk$X6 zAtwFP+Mq6_`?Tkp~GzG;88i!px3UC-v*!4-H^ zOi9v6pF>wRm|L@GmDKTx^Oo`LIp2K{IqVY)TL_QQ!LE(u5HIqie!I>^QLAFKCcQ;P z{@>%dnhR*(=yT{CD-t)1EIjI7HcJQYX4P0p;6y)w*=K*qNkN3h3GsdIjPmgz&&}vI z+YNJ9As_YGj6~WIq`{*k8NAeSzqXi|luc}4SB)gU(7DcDr3g6(o5keKTLsUx9Jx*0 z{*CPww@0WI&7>^olRtr8y zeq(wM4FbrCa8#jBD6aTkYCuGOyySBLLL2Rq>{@faIZ90@^Hk?V>H;wMF^W_F81d)_ za|)by-z+=}+}5s@bR6HtN3+CG!ZTU1ytf~4F?R|peTpp)J~7IxjN=zMTxCHe9G2c& z(v9(s5`^O-whbB|sA86gdL{wh(}2N^{NHzW6mp9c z-)o}%*cgp>|3HcL48?+kV>C+(G3JuBQfLVqq)eI(%ZVo@0N?LMfPwWnP2L&m}z zA=?}gjMo=YInGv(%c-E3W>1YkbH?$nPzensI^z7eT^b4&p$_RI7!X z6IDBQVqY|Ee&Wg>%s=dve_V^Y28${Ox56b-W(Wxi5Iz*&63*Yi9oQCmy4kwlm+@Fj z@rv0U2qQyX>y^KL;g%z}Va||}Eu(ybOHSPS(tXiC&TRGF;=O)ES1RA!yVF6I1=Cla z=G_iO2?8B^3;48j^LaT893DeqTWFV_dwSQSA*|)HJnx2T`b-y6kKM6GeU|`KV{paDp!?Ra&tTdV}I0HHlIQhMuL(=ay81JN6(VHyJ;e zDntTgK2`6M=OuAwd{*#SSVTL^!O>iQ%_RSIl%45PPMoO*wzl0P>WHt}nWdmKm-55+ zwDS=?)fX}ymggh55YAeyMttYA7Dk8S%N~6HSgF*%Qh4z>{o*7plGa&qAwZoJROY)9 zzC@wBzRjkMf?sM@&kzY{p`%h6#g7r_BP=mNSDmAQ4&so+O*Yl{``14(->ER>2mgKp zSuUO*05)V=&5$l&ipu_QFQ7S@byT2#s}I7dn^GeOzJ*+(&5DI7#|!H1mt}ryjY9NX zvOqm5w$zh?`dT$BF>%H_G*hS~TODqQeYT&|RPOb2t1#B?eGN(#$%@=d8-Fek6W?Ow z{UEgKl~805-<7Wk&o*vNh5&MR&p0#qHKtJTwelNrzo<{beEkDat9#d#H0(i(gy+s( zf4v{pgtQdj8$mIqRMZ-8CYIsPJh;4xC2`lsk7YmnYi4!|5NA`txA?>cm*Q&uURiN0 z$$3*3`_$bF5FLy*bItEfm#|*4>E6}9x~-Yfwh5_&9v9$zk@)LNN!U%U zEAG>H$8e;|FBF43L(VBwno9u5Os=5FiPUee4m8yI&k<45;0tcX`mtg1Q@^8yyrS~a z7vw{iRsrihJ&z6`d@V(YBxbe0%Lu-&aFh7tYn~Idf@7@W5xpi>T;e4`@xizE!-mM| zQ^5SKB|nSL|g#ys-aNnIYkIb?)tJx9oIC5Z;}x%QO5?FrltQ?|4LKw%kC5_8Oo( z$nxt1MZ}Zd-;7@OVVu>DNS@i1toAu-#0a<@0NkO!ThIzjS-gTIDsI(94quEAC+IsXoxTlj(+Mob$1UK?P8! zZrpj~=|NHW=I&kVn88v=aK8PaDs12e-BZoic}^brwA1D5Y1@34C4PFVdSml!`Z-Zt zf1mZdb0iLjKVJ%X0#6+5e6cUeJ^CvU8pty8Lv^d(?YR){)7yd>RJ2f6GS4i$PlNU@ z4WmOK|IMO13mnRK$^EN=cbGtY;Cc(GefP1B`JTpju9M9_OW}0#36r4+j?_YtirN6U|$`t!Pj~fY@^ktr@sorc>vpl0)zu17E z`yyfm&X1yAuhjL%PwFL%53Fm!LmA;Q2vIxg%qNDH7n3`eo7aJ!sv7+Av zR4X(E?`~jzCNeoL|5T`^Yf<=LiANnFEC6%d=q@@&wyuIbd|P5b&Usw7U$Wd=a&cu+1W4TyUfLDWE|`Jmvi<fU zoqfpsW-Yxo?9?&6P#( zdXv~J5!40p*ZMw~Q!X(XZ5pGgAPKEY-Q`PWqXtmIGg8q-DI3aAp|4`tfa>q6ApRB+ z!YLtNNAtHJp@_QRKVIV^E_J?C`i*S5iz41g73dE;FN-pwjhS>d$@Lew?6P*|=*A#{ z)@^Y}YA*nwa8svASNjke6kp0DE%C$Nl`qn^NQGWs150aZImI#PS1>WQyX8JEH^ybr zVN2zu4b-}4pzoTJncU=4@iqj?kp_!>-%FDe?)iz3yY#;O1|40*z>+8rS&c9p?JM{_ z(pj}>Ep3|5vc^GSm9n58H!6wBQSEQT?ork8Hi`YV;8cpYRMIl>G_a9h+C1;=v+JHD zO&lRVM;HV|#aBl4;mTP==#4*_<_w!4PYo9%n=E1LU*TKhAUpFAm5W_y=@DG8hhC1p^3CGz@5&)d8B8s` zHZnnB&7Iy0Fratu*~@xfJx5*w2gezr3wvyX>^*LPR0NwoP+$hZlOE5W1Kh3>5*3mM zg_n+A0Yu)yYbXv7Yx0M{umRZk!E*+2f8`bH030a0H4Kg_g;A71G|UbV7IM2Fhi|ag zy9hc;N~P|&x2DGp?`F_$AcKlqyleX7!tbI4Pdkv8i~m@EO!yrT} zOvYn>PEH_joiyS!|N4`m6~$qQrULsrCWT$fx!0JIzS;{LytnK%b5oj4&=7fWydQ~5 zkbqZG;_QDgKG#>n(?8z;=z6btBPliN=!APS>8~LkP#Wh)GZOH{cgU=|o}P!EA;$1P%(OiI>lrBF8^#f^;Fy4aUIvCg!bKCqu?6)kLy5&G`FCMWgw!IG=7vht)5UUufNzNXFdn%=*MyqkMN67J>1p zxxmz4kE3ViA|EuJ>zq+&BN<%dHJJUJx#UfZBKG5$tqRIUIGvsoE%X#9PzpC{L_0&( zh&hP@8QJhjB?7|`cP!V;E+KH2kohS5C`hcFXC&2a`E99Ju147xvK!e>Zqv~w7wWgz zz9lBdAAjpLV3zUtp?m!p4&++r>SfFJ>9B$V&6#5fFt-cBi-@S=9|dCEhBX_7rn6k%&SXTsRnfW zl46Y(5F)TjrQ{(ik0&{~BtS8D+KO23e!n0VT4i9CM(4D5ZuljRe0>!)yPXz^6D4J=@f*m{;sxdb)HH zX~V5$QO z9i_2tVts3=Cz3*M-ZfrYh3xI2LrO1bN_FVaYSi|=9x%1JNd>Mvg`EOqaRRfjeFEiS z>L`&W7(7VD(}o3TuygsqmTzUCg_Hm<~Y?M<7l)sx@#b7~w8(gBtr}FJ!_Vs1v9CV3O-< z$A(B)xbQ+O;-G;15=r33LDIV*d;Aet;bTVq2^lWmAmRxl;NBMugXdxd3?WKn@~(iC zXz-Tp?}%m@(>vZ5yZ6B|@KTHbmW$`iS9P17{6V*q;|J3HkaR8=sD4`pAyx6lsN8~b{fkwta8BFlZp&+OYjKcf@CER-?`DZRIbaMe0{BT0fQrFzqAKj^Xa_&j9)gqe}k}>OOc&8NsFkYbP|ZY$Uls3@1E* zs(TUl%+8O3n&Ir;*}Ij@Tv9$ZUZum4Qd0J{(l}y#=Hu(1dmbb>-XU`frp)mA=2KLu zCHIp+ty;5o7Rj=4-^@gL707;FS$C{RAFHOiixWCrVEID(d9wzbrVMzMAK>j@^EgdhBU5AT6))=cd@)cA2 z1F?&?0H*(Rf`dkxS_7u)S1eQHr|ngn*T|SsjZDkNH9r&DKs{gAMfVHVPGk)h&@c=( zy1$tlg)d;SZ=FTjPo4Y^JwU?0tqdBD!{UhiLN~5T1sM>}Ba)l; zo?|v8w0T>{n^gb-7l(XN1vvHrMF<0}_XKSBx+p=bj=Za(;`ck*HVDfNdZMbHPF063yni5 z##AByvG!4xkdsae*zyAYM7}Wsg5WrUM_S_BsTYd{whvOirOFMVD(OC@7}-R;a@+{qiPkV=`~$PumJ0Y0-q@&9+r#? za-srktXklKsUW>rD0bUHB22mfm}aHmNM(4D2xm5#hJsn=i>i+` z#1P*01p~>Jk2%)a51eyO;)AxC1TwLNf3{J_=M>Il0CQS+<1Im-Jd!l;&<4D`5|Jjy zDxTe7)PV!t{gHzU#UfKiZwbC+@OK5-&9kOVho$Vt<6al19oS4@QrcuxUF(-QFWOU) zg<7K;qu}BS9qQ&4Es^#9<-I@@bHvCk zJ@s=RF!VS(E{55~A*jWxFv+f?E|L*493;HsmTI?Ay^b+i1X!RFKgqE_0|sh`QpfVc zOr^qyQ}*3KuM8XuMdBUg4?UF=Xc)YznMJ8r{iJN^|OvJd6R}d35W#v9TfGgBYCrLf=v;PUy zPvHPG}Qi;BP=$LsfhI)n%_lr{N{hw&|X>n=+bTo9ftj+ zCH2HE3hYrI3i5!B&uAN;8wB}?2-?i&Ouz0>*uppL=fu^o@p@+>0#|MRLHY-XZAdr3 z$4Y&Z#jC)lz$GtPMDTJ^@BNF??Oob0H`1P1KA^<*jOE0Bi)Qm0@;5wW+2Z^2Bxl)f zdeHljv*Zp%1H9@S%sAQpVs|2eWE^LzWa4#DBgJU-@s(HH6mi=L9?pC)c=4k^;H!i3Yo$3NLH!e?Lsoltb zXhYkck*u_^C5qpzc`G9rCJ;|JMk&C?7Tuv6Zk_~auD*=`d2%!`nF7la(|#$*U7pq+ zjYqY@{Wij5EzD~6cE7)r4S=#6gx4c(z> z(4dLxj$a7Ijw}TQ`v=~Gp2=P?P>xr(Y^7(lr>!38>qSj6d!M~BhC8)N{X0Zq8p)@q z50F19Ti7WFz!*ygZdE3oeYZxeqww zTvbEN4pe2YT-KDqx2iciGxi7OzCX}aEtlmo3aeHrnMnRD2;Vj!Lm$Zyk7Jur7*C2h)Ewxop{FLh6z!MB%E zXinTT`dQSqQXggJ8KsxKR9XOhPEX%|5^pR0p|SQ;yZr;M4?^oF(-*RWSTBSc<^o&h zM~5MZMe%2W!RDm~)g}P@OfucR%WjFREE_pWKEzY2;)~y?Y_Y`9L*_PX<>Tv|p9>T@ zm9cOgH^N?$$?bCQpVEFZg!97C`*xWPnR_|oh5sm!u_hFmw89lQ@zX-pzT{*NRZOWECSTp|OYib+-O|&c zOPi+6^)_jON1X~Gy}GtDMJFb>3IB`?wA!Kop2NGBtP|Z~Y`Srl4h4DqdQBhj5kuMq z(M=sSpfu{DSD7uYAAnT>r{|Hemime@? z*SqmW2rVJNXppBc;~*R9KVB7usbfwmHwYP%@Z+i|JEYZBT4-{yiALQL&iB=bp^kVp z=e;iqd53D%)4@ilvh=Ah`4^;EnK@97Sxi0BNGNlbFQMw#kmv0;v<#0&CPTNBCr#V+ z!7Nj<`gK}joMGUu>Q<&37#l(+-Ay)~^vF8v#DwE>tJaTu|C}bq#qWg!Id=9;;RA4r zGElA3q(BeH1*=VJy;o7@xD%V>7GbyrQMK_Fh54>bIP&lHn{iH!4 zt;#0HXpzcN5;sce@wU5|;5EIuiYLB&CR<>-gTPF{mno?!Fn)$gXC}AziN}<0Df_~+ z=J`wYNLZ>;jNFuq>xF>SiJx7?+Ne^$CW2xxhXI9GBYOus``&d6uX~FAI>mehhK9bV zY|AAE>!m4`a|5Ivzwd>u&KH!OBV)JCM$sHAQr|~=cLFHpd9I>T1lGhr&fvO7d9L&0 zXJQ3va$eN)dF>8o@sF3C7pd$5)Q<z@iA$4%_~`4lzjt=BE>?P8}O((5%#qgVp!`XX}JC%;>*tHHlMbQ&W=eiDx;IIEcwH` zAN=$sDC4h#5X&9&5Hq*uherHL+2?$;lDB;MBMqU~r)FFKE!moT-v^ct8AIXKt){Uh zVbj5EoMG0S)6o&075Bu*_{{LkX>>(c6~tjY?)!ee;r>NcqW31awy_NAjfa8#${Y%w zYW&%>Z7CQZtWx74nH77@#ObcUtB3R>L1`{b5aR}NX>Xv=^9(AozV94*dobS*r9D2& zbNHZ~^)86|H-WB2>ef~#Ow?rJ@(0gBG0(7 zsGBXaDshOvq!Ap7mQc{%3(4&CFL{XfDjWLFIx-)~a6qua=nkKg1cd-wBUIo}3 z3e4eusa^U`R^CgfanTbvT9~61bf&|!3b1%E znsa79=z{%>8(ZjqDbf8_T9KDNmY}uOvvBJzm%GoJJV_3LFIJ_hD$e?t{v16r7|S!> z?iAMyEV|z5v~c1{s(NO;Kj~C}A3miSM>7UYIz?$FsV??>U7qZbP|?kA=QUAm#L<&H zk-uTUOg=&;jXZgUOo5Ur=(s-%s$~jVAN5F2%Ah2okkt)Kf2?*iqMHa?~uwro~XE zog$~~SCAxtxt|N^{Q=QR+DMQ5yG_u*#;`}eD_`*JQK`B?{IHS8WV&u>Xk|lz#N77? zQ#u@HVaVoPcOrQgTHaKctrH-53%cu3vRGD?=j6ap^Vr2W=9{XpZT zE_vq_ou8-E5!IHs^%CGCqu69Fo#OJ=hq+h2k zqW6gpif`CO*LN%$x->xax(xYUMoB3*_sW|&;cG@k{_ZB3GjIR5Wkz~Pj0k;^-X}$(Zhol{lSv7R z@xn^^AvOZSXzFz|)z{<8>LTN=wTB6NZUXfCg5U=57Hng``TM@YiFm9r78Ns7RXIkX z5=YmA@Dy@gB(8V-jzA<{o}z+n2&%r%?)IC*s}!wPu)Q%;i=3mm$b+qg>5(20zydOs zEiAt#WG6}MRgdyjzxq4=S+4pNsr+V{lerKsU#<>tkuu=Z>QXyRaKj0aiB6#;cP#hl zws!iJzSzF#FkIliU^+^_7YVmE$NMr$shW9A_Ft21*4)9->{Qy9(QiJx-gs$L(!Bxa zt++VYh)_;T()ebfIAYZ=#6k_m%`SXTf8Hh<4F)Gpul|lR$cdjqj{n&F>ZBtOb~~5V zcQD)_;DM7evSOe+M=M$axCy7l7?k0C&XPW*n=Yo!U=u#?F6UHul2<7D)UXJaF382#U(FZ0jMe_t$w781eWG?iZcCZ- zvE=3fp7}=k`rDT4sx7J@RL!^*=m@-D_@@9*ZDEB8DBfEaMS&1_{fYIr{gn8Gi{iMV z-$ubZ3r<2q^SOT5Qh4D;r5`l2q_?_Pp-<@&Dfa>P>o`H{_C!LJ9By0sPRq@tTJO)_ zR)(p9{OO3g$B@YDOzhQI z#YU?^OQPTBvqH)B+S_>^gw`@@lYJkSYFR)O=z3DHuqOlW+Npf@OJ^oVB2T%ypLy!_|iG4BLuze3A9 z#b96mVLHqYxkHHeeE^Tekb?Dud<6NL{Bh$teqXOwjFayQlGpZ*<+9U=*;d3wv|h%- zrYU7f0C@eg??$=!vNF^iXGm={uQ3#SP=*A~Gze}AgIN=IYhUtzrV{?A&SrA|l3D`& zsUZI+oecjUQW^fUBjHbK{yz;*`d>|h|7dX6e-nRmdmY(Bf7SRu%``vt|1}>``|sTg zh2vjSNB?Dxr1;ODcL4|6eg2uh_tX6TsguM0U(;S(>3UbxnG{}t{%Z%s|J48f55t=N ztDgIh=Fk7N3u5=Z)=j!LbfyqYpLCskF#^X56}Jik_Ky_vkI*GOk$%bfF_Rw{MnWH@ zX*kcpVz>}P-uv*%lOUMkBwV0IF+RLI-a3n8mJxIv$t|0oWJ!=Od}XoHYmZlW5fBUw zR+4^xbk6WYcn-V?y!{x43)CY5>m;nbG(^$Ie1c$cfpOoQK@_A=ItOP^V?bcfxfQj( zC3c@{5T#)I`zCX9tu0Wi%Iz~HMnI!0NE{CuCTOH>P^!?Z!1|^$0-n~r50pypO>12U zj4H7el+f@E5vy6!pt8_@LPG$dK<^C7HGFpQ0{G3qv)A$O znyp^$lxcy4;XFau>q$TG@93;)zE*c?Y-orezv5s~o}&StAi4qoAk%;Zu>?8OCwN|f zkcx_P1s6N!?GhUA=f)B!p^|>dz>~EMVhuqs2fw)@L}2BYT2n|b=BQWZxy3StlN)ed z$=km0bKy3dd9mO`X5fM?r=usha}&$m2CKvr52uBu`VC;5QQ<^V;J-PgIxmyr;}FS5 zZp5rLc^NGvTL@e~?7cG9)=$nBt=D(6)A%aG=2PCd4g@wslB=|^EQW|UF5fzU(Kp8A zHoj%#q%-uInOhE3bar`+Sc=*A_mRh_LC<}vP0ak%ps8C~E7g*VdKK=);>`1uqoeO9 z!sA%JVm#*icL$b2@S60DD*V-B$wlMRlV2Z~;olkMIk9!dY@4(%Vps(rqa~X*GT6CB^XA3+=SbxeRQWJ1e2zc0N>A>`6-LSf@*9 zKXmZWG!@Y2pyEE8BvH(pK~0rF<;$1-QKT8Lyzi|=32DS!bkmcW2xn4h1K|3ZJPm-s z2zE&;!DSe-Rty$r#pt_%%dgYOYWHA+Mv#0s;7&f4w5TM@h~fU*bFn-~9Gtje2nD*A zeBMrFo|Ag(RaB6$8Xz01RaQw^tq}`#^^4}sp{k;eJEkYCJi^EsCu5mVM{#KPci%fB zokDs8Q`QW$w&7CD{1WwQ@AFPLiC}gY(@ntkypT2O9As_I%Wt0QK)D%s+^a}EowmJBzZuUT4JQwxk{(xGYOPm~25{j7Hf$zNCG$wrUnS^G!*-87MV zpoc~NczA7hD#m^wZa;L?zRs5dIJ>Znk4Gbr%mWtqx4L37?J4$CKY9fE{yP0=A>;sl zLo^q;Tx8*ac<%?3$8x>S38!NZmm@Ds_T?m#Rt~%IJmlVYCyzx-%MX?%^^_667%1yu z%LFr$n$-$c2R@=1qt}sQInT_&J}q?P9)+?Z2DSO!F$Io~?Q!#G)h@A#XOlQEpLLoU zmwEk6>lmbx)PGg*<{e|+YM%(2JIHwe@8nz>^10hVDh7G?Azl$R8JK!DioFE#CVo9X z+-`n5bT}-8wB(u7AYvF!IB^yuN(jay*xUTA_ zlX0`_`O@XTg0J?BTQ@iytUcplMQ;6wH`!I#ch{|DK&WxM37!k_sNdr}fi=;)El>5# z>DZKb#LrM)l@9&QSsxdqe1*pszzb*g24rFaJAJ+Om-|k>qJoC)RD&#v+6VRuxixLP zd*8)LB6OfqyvzQz66INWPQJx<4=i*&ndZAqoN{(wjei=wn=9`L;_h|P@Xv@!5%J!+ zr1&g^CTF53_yBLh)6PBB1l7By z>)JE$qY&sg3UQjj+h1$P$rt6j?F94b0csk8ccHY+OAMCsII`D8TH095-3T)Z)^g*? z;NO=wnr+xA%uNdDkx=Go(&)*8w-fDQD+WI5$QLtf>7SKe|LLCEno8)d>KR8 zvE3w}Vd7o59H~E;!d;HYt?`fSSm`5&7k#Jj`ECus=du{SKPLevWFagWV2HT+Sc6FPu%};r!*?1Fn^#MI=i`NM4-Ui1xvuQ8orBbq z*$~u+>kl4z>kmuZW|$bL2(F_wvRmeBcGd6xp*~dKYexK@1Hdgf@1ulRtuuY{T<^FP zj)^jaM(z`POdt8{sak_N)XU<>dDQ~R8i<^Pr>gI}WDUi*oy&*$JD-`FzKpM79LVfd zVEXPfKL~Wbqyl=#hX~k8dgRda7CLeS7J{QXSUkFgH`zO=?{W8MjI98;zOH0_qp~gQ3;%kUPzUN4|uo$ zc6oV|mV|xdLkCzxyi*eer84>KI|o~)NZfe>G_9&Vuw+1#yF>Xts6Hv^3Uz}T9QKm; z!1*2Q_S*TSKv0sxm;v?p@mnP$2ugqe_VVXvp*}aZWh@;R8-=I#YF-#cV+GLZ>upLD zCbi>RFV5p)+fMdPb{bUeV1)ZNlq~{0sDNaxtgzU|uCD+=acTXI+U8SOcfJk2$}}BH zQ%OE;V}mvzSvz-RB+NAF%BI*CCTKA!9LLt#J+(7 zwZ|Q2s8tpuL)kOS=bmgMXsoH@9dBDuXDTHg-&p8H&Sk7nXJ+P;@EThEaI3vm>6`gz zOu1Hb$wV8e} z@G=+ei+G6SYU;;VWfxl6Likv9>c)faTQmJ=6HZD6FYLs-B^#q%rc|#lL;DO;br*o< zmS+pNTt3)LUJtilY1Cun_4;Y3@~6^qoD=H41fMuwk3^Bg{4MPx9F&&S8yb}?eVlt}76WnbIDz8ASDnHyiHtn2;RRTk&* zgE<#*CzSomiauXlC>uBclw+Qze1QgMe}21Wp{kqb0PO{8m)A=xJQSJ^en01nOOV0V zJtdM36o6!%buynCrhI#6^3*1~@zS0&-pKTeBck1NW^!|~DTaon5N5V!kc^%!%G$KN z)SNE=YDjF5Hov?CSQ9#{z^kuU(yRuKF|Wwf6Qc5CxO{!Hqn}!3sxySy3$F)-m;dsK zx{&5Dwbv*&)w;6IvpvQ*vKZ6uqN-wiGV5lAgd7*5q`VBnA+o!K+Mye#R@7zBiB2NA z$d2Ml*rBhWk4H-!NBQ{mGV^-?gY1 z?EW^ZmTx~ab;d4aC_MMa56_$MALtH29Xzv*BW2>K-~nUPmGhBFQ<5{V#LUaZWs@(S zY^h4YaNj>h)q=N+zxJG-ob`|7(*fz431hClNi~xqj=7X$~|`3oVr=_5AJ)Scl|;tKK@-X8w3O*2gac zwi(ciYYAKtI+XCaaq9%CI3OANi+rTd@X(S8qwD;b`_EgZTJ$}Z(Ofk{vP2j}&M`8W z#%(9|=bD>Rc819ayexyp1i1AUH-LCzc;S*efdLy3ilkx?Bx6l6vhW=j1|98O(B6Ft zkW7yxNU4uy)0vmP6v zcb&CSxmUkw1Xh<9(~QAp4blwdg!?}5{%61)rPy2hk#=utcx*5(htCS%5v+*3WpYFKaw13GWc{Xe9(6J!M+^{gUe5&5BqIhCV4LxtkMJ^X5g&dgLH_HEugQ2#nAo>i zv;p#=gG8gutOcO}YRuuG^>H4?+uqkLdDg@67^xfgST64MGY}$ z&xY(n?)8z3`#G0+t|e!~s;7F^)DyBJ`s?Hrf-6-Z*R+jXKf&Irn&g@#mC<-WJC zZt^`po6Dw4r-csqj|?}DK5*;^`X-JqAv;WtvLD6>h&9H0Sb{sR>uJ@#1kio=9thOh z+ILP8@;CTc-jW!z4Q%~tYJgU+EDFq`D}Sl*{ytW#7zLpclNF-#TvT#X_eyu3o9Hvw zDmYTbW${2VXeMTqYjlcS-?|gzoH@6lc9`jTrf4{e3b~iJKFn)gW}y;_*)NMD5j7^B zCH(cCchK^j=tp&f*BgJoSr4AE6uDn~NCc_9@2;y(VZu@F2*fIIF^dJOd zQhS`WzH@6;{8EdDHq5p`Gcf9zl>E9_N2flY0zlU3+cf512Y9NcYs-a-%1O!*q;*&Y zF#jvC-NZ^`6>dxn;|j)HP>ZRAyy72BcIO3Elg!9vg?!o8iz?XGK8=Ag&SR6;KO+~U zq;0kFs7uXyRc9fp-#2)dE^)~PhLm+_rZnk*T5wG`*$1~(V*J=bt}!hjBzO#85+!?G zm}zBI`^S&SKD8xx3jwD6GSeYb0L226*N0zn7W!G5?4iB;S%ucwiUGn&~A^@g>Md1Ze7LlProI-f2 z<^-DZOFwX#c&J99qQs3$Iup=%@lb!IyTwP*r}arfB`uiOV{A*JU7qpdc>_DWC|(K~5?3_Py^Nzbaxm@i}vy z$^OBv&`!!OM>Z_@N*g-c(S~AI(fv%;+8CEp6s6mqIpo)MulsIY3&eb!v?Q-0 zqh`8``mILr`>V@R*=?4KEY|WVgQO_rR3LP_z@n&TlTnJvzFcFwoOCe=ha*yc{`^r?14h(X*j!P*pN4p{`3L-~(4Qx~>PmeD-mgb8oDc=P1XZ zh?5na`N1>5A1)E^nR20uMYQ73!7ubAo+hhgKYWeWyTrJ8ggvTnYI_YPPeoUwJhRj* zY0A&Yq|E&Bl8=OVK5*A>f2G&2l!HDAH-9ws-K|`kDoTVJ`(z$1?Z9X-lC0@vM1TsL z{9;xQ$8W!h5)$)`YmQA%%4j6I^Dtu}(2T79=5PMStxTCj zV4^^s1Bn^_q=ED+%JI{3lxDJXUsG%G;?u}SzU;W~QK;=}{Lk)&oAT+@+0`5G6!{oy z%Sn7UIr4;{&xZ7DSQoE+4@PhHqV_9S$1fjc3@uE0Idg%{N?m+lbG5TTbJi-j_HlPC z?4#l4N%Yi)aX~eS{;zbtaV`T&K7#$&}$t&d0h=zdFy|jSba>S z+M#QK$HYTT__B!MWgFg|zNE<$g&i@-=?S7e`g%x^jqHBzLwZV*I|e_Bk{+d+Cm0P6 zTd6MPL1r=~_Cy{hTx0ZifVbznl|BCE)92R&eD(+7`kP8{C(O8XOLlhYZ@_^A zuO?M&`!ggwMgpUF^G#$f%o%&5mpwJHbkb~O7c!I0G4ickUX*6=mn=^U!a75fH&5de zIk)~NQy-HbFqa}ye8V{~G!i0ypq3xGB2j!YF|QWTu0xeRMhid^XWj4n-pEP*vM?l- zW7p;Ac1b@8pk=Q^hLfXmCJa^mp<_=}3~5B;C4l+m2_WM(E3UZoWpGheU$34J*m!Lr z`R`)Z+n2~=t(y1(AvYy513(0`cisikf*7pv`bPq>f#4CjC3byi&K>GrXYjHDlpuhx zw6rx@_5#HfKfZBm5>RB2d@98HJki{eURDNKOsk$g8%v#H#rc6SfcVkTQkq9qh!a@( z>4wI0LCXQGJy_9-3!k8R8>Cu2)13H?EX9&+_k!Ms7}Y&!j9&iZD}IR=#rT*S>qJi# z+cq|v(Se9EFdsv%VjN=gd6d9(B_oz>o||~X8;HXfuRbfsggqgQ$q!>bU^j$ zo0uO~`WjF8Ndb>Weie{Les8}rh;QP<3*V`?aBFx;yUHIEZG%DxcqqY!4!KPrB~Hq; z%v1G@yW%&|u$X4kL4(=kWZ$_i^@RJM=&Q^*P!l^5hcDZvvI<#?L7j6Mc!hPx{%|?) zy?z|3&SIN}#i~8}5)D9nhfNfIQ?C@De52i8rF~*;SSb7UYt=?UrOU`X%>PaTi}IVqLuBk)>b(HhOvDbZd|pkYIijGiFn;)f2*XBFjJqV$prg$9h)g zxFue7$0I{M(Iy|MYJbz)%@}p<`j~@z0sKNR{<}*QGp|1e{J^dS;Y~|kV)GQh~*B&UWfmTn{`fW63-M6v~7t=&?AYIvy=ZcxNB0>?}$GzY=lp0|||s4td_Q z9Vsrv7BmqX?!7a}Dg|46VWbN{0$HU*d`2;FXVg#T*V2Q>pVjKfZC=s7Vj)xaunnN* zKW&MK+B!O48H_Z_C#ilb)i{16Gi)R8p$>Z_V!3r=^S>5h;0=nBy}O01f2R)di3UL;qn2 z5`u`W%9JWWz@@5n!85~#Tfgm3Ws&<#_l}?^;qv3B*>^Vdx1oGzdbV=W%_{NyaFop@ zM}j{~#l7q85jWS^P*ouD@!DYQF*onA;}LO<0}F_9F-TsV@PtjzN1pGr%ksp(b*EN( z>TK&c&s_UIE2^ z_GlzNOI56b0@@DrzR);WHNc2`R{J`>Tu$HqXzvae<@L*tBTm>F!=J>4VLC_S3HfHP zuMmRvw8BOKOv5F|gh~FxgSO9e+5;6HIBa5k#y4)g9=Z@Q zKDYGStYz2Bw>=g)Z~u1ssM?tFWazXvJzc6*V6_?zkFeW6%yKZ5pN^dHJxNS}&wF1+ zmb}@D8K5f^vn;;_cI)_RX%H1D`BAw$&afgJKu>ckl^6Y{(%4x=wWLto{p3|IxRkuM zg25-p!+N5&bp4x${hM$m@iqinp_)p@DNl4N zj*uz)9QuJ^V0z=TS>vPD!<|p#_~LtfaM?r)Fp>;#nW$k*F0^38kRsy`szUOMtQFvW zUii0^mQ3YK)*Oq_X>srMgk2S^KPdcgjB7=4w95UnKYJB>o1Q*+bt5HuyiIUXfaualM7q2CB7A< z?Ikj3#u%qb~>Sc8l5Hr@i1*he0nQFQlSW*`D|ID88PP5ug-=p z1Dl~)x!_CcVQey386cw`iVWMI7q3ti2-)r=XP?RoS=61D+dphAE##uwJ^n#TTUisy}SUA7xjP{BhV`Joz!5yVTI%#jHldG)>OIjK^!XrnqdR-X0 z9y9y?J{UG?Wgb}_2D6%+hbJCqn7zz+BYiwIL78GOj!H;|$V#dQU;{{X`&&`5{$!Eb z#cD@IwUbpEioR&;@>Ce{lsSUivhFi%sbJ7X*a4OP*Rry|Ze;oJr@f63|yZ^w`FNTTjpgSlg(PKZ1;!j^*byQAg1=hgOP<3}Yo39!BL zUmpqWxkT8!4CKLQp);^25qy~f-E!Y{FI*40BqY~6a|9JZD_HsjlID)v0D@?3ufpYk zL5Ah;TcfG*sqrb*(8{n%q+Wy?nr%Zr6pFY#_xgbDIA$$nBDe4S9-4wc@0R-f2poBy zv4=M6_Imb8_YA*2Ma>tK50C1p2tOS`V>vb!>}ToOy)N+Y$Co>bO8dUUim64j+%pMc zEG))+m(7Z3I<)&aoPCjD>sb9o(ROW+R_F<4F$a&cvAZ6wQC)vL-oz}cY4JR>SpfXI zesg<{a47g%ANOFODPjx?>ytXG0>s9~{v^lYXz!ZI7g#wM>N7BhbL)SNvMydS`15X2 zj~DbxxgvY0h6-S>;nN3Q8d=m8JznYF3_74IupJt>XbgB(d)}l`t*2jqkh* zO;q9pg68-5InOd&BW?`e7ct2JOOonV*k9M}Hw3Y3Yu*G8Ay)F6#~Hp?J=~Cr*;J_} z^y6e;?|k(c339Q~hVbiTIR`}t}J|9 zC|MbolHNmi;!pik)v60#kKJ*biyE#=wzIT7+gZh>?{8fJaT&ePdT0}gJ}!Wh6}#t0 zA-sT%`E8p!UfzNS{Q4+TvV0*5*=7bIU-eV`*x(f9Q!qF{Zzz=32wf(+6^h19aGw{K z?ntrC#9)W!q}CzR#!NU^-ZJ}wDk)Jm3>T9K!<$v|gDG!i`BxwJrSN^|f$xD@Z}z#u z>^Bq08D`~0n3P1{u`$nM*!aZ4qp~(JR8Zhok5_GpBzv>@c|YY4I+76I8oWsn&#OBa zt|%1b!+CLu>8+RfVFbMO8`&f0WBTy-F04Yqw&5#%UZvj3lvmZt^iiMM@=GVF< z16!ax^7@^#ie9_8H^8+Cfp!dzXmI(*T)kzXnmPK@`s(Bg#*`v1oOR=d6}Nw=OXdYzvfFRc5Y+gAfR+!yT{8m!#Mq@r&La1dcEFZkUN)X=)O8j)WKpU2 zps%-%fW>v$=qs2n*d%KfE~V1;l$^JS4rrp4upc^g=7RE|HtXqsF*(8SeR!n%Yo+pB z8-}9COXab{5#7 z=+i^7HmcJQl6GMWzYMChO@m7Gt;6!1JOT=&bW-}~;RYO&>oHjczY(f@qK66&M#H2# zcm27#Y~i2JyuT0JxNOxAEC7M|Ve615d@AnU3B@FjU1{3*T9HWgr5P-3XF`Ig?zYzm zBVrt}a{0kIqXJ>Ixrd-Y?vVVZyD!1A@e9?ZDO<$iJV6PaXW&K3p7spDlsbr1{{NKe$*S|Ivi1Xpv1ROtWlUe zrh+pEFR{0dyA!L<8%8-^!lkt;U`>s+cb=U3=UllL!Fat?DeGNQhLdOEA1TL4orvXYlu!n%%Ox;v(u{m+Sy=6v zI{o_8%mpK46;8`V?C2^jrnzme6MWJ9%R(~V9W^+bh&H5UQ}LCE`QZtfHd@41ovGjsMfgC^QdI)3`TA_2yhg6V98J!; zVhNw_tVZ7~>$@B863G*@qqnnk;j2sDJoVK@nDi6XulysN`ka#blvz~|Yi0UnP<5Ex zam<>q2~}{aj!ds(W6v+%R0~Sg3Ht*yLe*=#jEK{xgNdLu9|7gA{_P*UH_5a-(&M`~ zR$X|Y%j<&Iu+}0kVin|%chHZOi1PQ@=ZFA;zLMWMSLm4iTh%JNmmIA&k_YhqB-MZl z1?=)({B0WKO}bSRzGuP_$Z9pG+rEGuqPh>*6}h@MF7nU|M{Op1@!&w`(@L?Z$KJI%Ifg2vWdfT-!r|Xj!4EAo>uPJn4E?ba|bz^m`S7e*a{$mP@&@A`9 z>+>$dP>V{DwZBg-TwK^!(@$^d+|nh~Sw}74Keuy^gZ5ZG7K&eYUf%nYu^$L34LP_x z)$Zn!W3NyXg6}t;W=exW#sj6cpbF+0dn+qGk~gpVAg@GY`dMgHS9||yr%3nH>}9+k zmYQKlmL# zOVVk1ZEpGctnZTxQreVFuG|pd+9`DrkZq@&!qJK>AcY_anGg5t8{=QT4U^>Vq`1;f ze20Y|V=%T3MLgVD%iFyPKA#VwjPWNIju-*+?w7YcUI>I}W<5k6I%4%qxnU+5wHr%> z&6ueKi-yBkMHx?jnG6#ACB4@rLLv#M2a}RyyDn=HYWcIVpR~4!haO09IR=|V&XzK^OZLqi7)?Jm{og%X-0=YrgNpe&FXqAbkXA5)Ps{Wi&-tFzusEw5nB) zuMBT?xV)i|fd0UGDER4d7xT%o_x9Np7e42c%LcryALLeBd-{58(-ZoLQi%rc7o3K# z29!O1Bg<_BZ>mR z%YwRbeR43Zx;rOOX}X<1-`He-l<^bdUSE9Ir>`TSI=8od@l{KM3Sxu{16qK~O2mS& zRby?WpO3PeAzTrP&V?iV3Z>C|`!JH42=G4Ct*vi8A3KB?VBJIwB4TY zeWySu??8fTYd9hP;>q$wV>v7zwgcFVoHb^4EqDfN`JEvO4u5p5DxA;mWuDKYPs1?vm+%Cv=IBw!bleZb@Xwp~_t?v)C+ zS~?j$@LZJ`seocP-&G58AR{*nALuZ>o!c2|pSoKeRN2`VU$`rA@_raRGB%q)YGqG^K_dNo(I;+_TdjN1* zZ7O9BlQeZLD^()h6g!v03YWF@phTb77FQhE-n^J*+U!r*+rqT#*A)9>(4K%#vjRO9 zYsW$DFu$C+&U1OSAG_qnS4!=uOXYbHu$M(2kNB>GR^`!lAvW~*^mqVv z^NCcBQe#N%ed)qB^EX3-gKOnKU0;WXZ)}AYG8JtkssQuaN1)PlKQcT4?=wCTiV&r`@C#;qGlhdCE3tnIn{#1 z4>aP~e6o*`bBKqxIHT%-BH|yf_k^Vz_`|K1`k;FD0+uiD(^L2v)L|Z*R-?Wb=>UqM zI6YDfslYPwNACjfRab5vKzQ&roNNiy%#%w$*B5GI{rGgx#$jVs@h>JOaER|VkFpVs zzAY=|=HY#vsSdPEz%zW2uxfhAAjMt?d_lmWzLus?!Vo*9uY9vtp6-M<|3>EyL?8DS zu3OMfuJQ$0yw37l^a3UmdYQCU&|>!5Nt3AKEkp?N+k(drpQ&L=C4D!J?*K(Wy1yK- zxg=7Cv812shg}3OeCPqvJw&L6O*~BDl*p~%-oK~eIc30atOv==&O1Jk9jgMb`ek}o z<%nO4!1j$AVkXJ}-*>!>)?LRyhg?TK@SQ#Pn6E#U@)-}=v`RuG@x0en_n)H^ zgzn=Tui0<30ux00>ot{&sC+$wQgZ19K<8$zY{C%YB%NvW(Ib8sUvj+9W>8Pg?WdWv zSS(jfha+Su?4>4WnSSCqNE!yaeEPI!LJ=!AVa}B}ysJVow)?&#L=8yu5q~x0#iO_d zBa0Jk3F(Ea@##a#4KKbWsw|NJGHH~EvHb3Xv}wSwBr+R?IyY@POPJ5|acI_k|w@;PBISisb;gFmq{XDD{fL1Ns2uhRY^@UXyDjI*Ij5OY)!ceFQCZ$4S8q*#J z1$d~--nC!tRsp`S_4}(^eS7NPzKm}7Im^->aJRd_&mnmu$-CQ!TFRCFGL5=IM>gTTMNkr7YS9 zQ6T36s~7!VUv;8Lw!l*{=^aqs z`g_Pg4`6*x@CL zn|DrDxKv=VxZa!X&*Hwg9IyTNy?>U(!?dhH?QER}p{=52Mh0Dbs~_9#UZgZOP1}I4 zf=G>dLbzR*-~Qn%70OC#9w3|=xNa}e(-mX@v)&Ps6_wD|Yj+7PE-)ek{8y#17kc0K zuV$(4NVaJ^UlyiR0otKgR0!=4xJl^6EtDL<5Ufu?CcQW^HPZ;HJmT2SQZk*UIDdR92cw9%XmuD z@R`DQGf|_JGbzz|XsaU9eQ&>vDG5uN4`pNHx-1W|c}K|N|@2u&jN z{$>_nF=B6_wMS-z?~GWXYaOCoJ8 zuSRXE*1cY%xjIA(NTj9Kng!6{NohM;M1-9hW^pDkjtqYzuRG}J9yIbsoEQ|4g2U!= zV86ilo(9Ix_o{g5joesoO%k}SMFaxB@ioS+aMv_~`QeSmm6eAzahdZ7sr2gx?}^8b zP+r_MVwHJltL}KSwzfYr;w!7?6v2&UIoytUp_EK zJkHw1U8N3|=o@Mn!35`tu?Jl2)d4FnwW(2DpT1mb-F$P{{mW>ot3>*or5y~krUTsv zNEAn>fl1=Ykb_ck`8NwG4#C?t*=~Gh%vOtd8ssV5>48#O_2DAW(;{=sBwUa$ck-;S zHkaR>Kr6w4o~9cQ+I#T|%V*ffVlH0$k&4-Z9jW~GgH%<%lz4jUE6X0mcRF#O@12Xi z-uHbng2}TpP9Zmez#>f)ut40{bXNcoqWKj2B+Zj@_(0Qj+Dv!8zXs@#au+>-ZIwukvm7&i`;`&zMZ`XWX%{|@#-}qe8Aq< ze=a@``|-XGcipGZdOj(ppx4r{_2CM*Ka7)hO8CSL5b2&oK5}X#<-Fhf7U7MCVBS1u z{ajdLmTlh!>!G5pZtUP1W|>bXpR5h|2x(u)Y^7Q`;ZVvi-xl=iJJN?Hv<8=br~+b_ zVXpLOFnGD`oJJ5QV?#lZx@$DcSHiSs3WT)j|N4+0`o|NO$jq9N@Oj9b-=FODhM)`! z=<#AMMu9!^%zisk@m#9Q=iPpVs$yu9fr+nzWrC84xS$CBXGFxzx!0B%e7Lnd?ThSX zvQ8sK4QaXK489VDc$21&kKr9OsUQpUCh)fq0Wq?L%fZ6$5UH_1f*y<~p@wZjx7|ff zrhBHVU{pj*9C=33Vk74?BJtlhfuN*4pYCeYI|QN-1nI+~XLr8M?3qCJR9io&!8(&Y zwK^TQ+9M&229M=B?n~LrLQ=02I^S~-FOB}2Z;{ZSvDMEvyiRabea~lzGCuq0*7MhMJbC_5Ic{IOI6X0ljuz1sd68Z zP*1c&mcRFFvB7*+*G29E-h$3pb{Dj0kthqkI&^u(NBA}Ap&ezb?VJQTbn1@pKEt4W zTomG?2U3tkW3F3Y;QC3NwW9|C2>#P~rSWPzLLSS<|C_x(YjPV`)`rpRy?#Y~H|Ing zwM!hp>D}wy5hO)wq9jVB#^{JIIExY|agxLx>%Sk6D%({hN>$~yyX|heqivN606_qm z&yxut)6o1LUitaL(|~gKTYYKuJDNS2I)@p#(DJFb_j9;R`HgGJ#WTXahr~ zi$78y?Y4(iv=0~&>OuiBJ85Epbf|bJM{eZUq?hP!t)8$}moezMkct;Q@6TO4Tr)*- z-jj(`jE;6O0E&Iy9mDs&Yz+lLWGp#t z2xp3)Djs>BmY3g^eOl&|>M2{PBd6vlHX%hNj>Y**yF%(P18R|-vL2`5nH*Mn*HqI? zY0ph;yTDUB9Jdw1n$x3G$L{X5pfBuCL&pz9cWDgIevm8MM6K-2R1b!oxo>K8JM6eB zeo&G@I$R|OIn9=Yv7EPHxT3aI_A2w&gD`@u5+AdSW>8#4hBMXF55~<)GbCD8fs935^G-=@z(~ zIMCb^%CIE;if3)bT`t6i7e{WcIO=|oCk{D74|^+{wL3n8sN>$o8raNvaoENkmk(N1 ze1_S0OyJA?&QEAcC9R!l1ByNdp(3+-dm5O#qk787Q9H5cqwQ&_;Dj4o_SFO|(6QbC zAEn%=ecXe%)8EOnrA5z*^T;IfOd0p1ymua{^DzTW+(o57tef- zNRtXxhFDuWrAu!pMJog`>2F)R^MdaOmw43Zc02&%HkV z>2}9z_c3~2@!eC9a6$lVyE8j_0nM(ChBrdtkefqpIbRFwZF_AF`?9ADrh?F3)AN2M z@0hV0i%Kv^k;qsH`WWrEy&`2jF`giUqRrcT(mF>w12IB+4CPbVp_e!r6H z(?0VCY9=!qK~reRK{mT3!CJ~XZOuGwIBjESuRqAwRXuM#p|~CvZp~SLt!~E2$rKJy zi?t{KyfdSYGr3FK_Mt$$)@VISddthba%`}kxZ1GSALZt%SP0lyijm22*|EnaV&sB# zPE3l$THI$cL+F1n;XZK3+J}tpAOEW!SpajXJDps z7UJ3SRc9bi_9sL|R{c)s^}3^V6viHMKo-OT8&rOxK(untiFc5T>zlcr58J42t#oc9 zj*64r87@x6q?p?3gkJ>_6&Y-7RQCHYn{*A_cIHfB3l7CBn85^zj%#AbXouETMdDOB zEZ9SKKA3|k2Ic6ozqt@6i)HG~`lO`|woHm^=fS*~f@Lc_ZWcXbI-LZEeLLSQ4}QjfpL*l0lJo*RrvVQ|Q_u{1-(#EZvrh0_OON@Tm)JT}ih3C!TYok@u01UjEH zM{>7N+AC(JAt((Q|3=4<^AV}u51lgT4j|je)4HQ<9CtB?S9!x-IF`{d-A$i8liii$ z0>WMJ?L%-FU=?m2=*7}rs465dlAd-DetYD5j5O**=OHs5A)H09E6gw0HtiGR!*06l zRlK0@VS3o@jWi0O$UXv28HzV4q?L?p zr*|UwT%L^fMl=R^jEo_QD0( zW=;@ZRE*4hMg(3lUhNUj2bSuT{-(&9Ni7LC89I;{j#@^Q+$!;IWNMkX3(A!0rknHq zt?umyDoCI(wgufl42zQRD}=2rMgjVYYJ6Gs*+QNQIAPZ2)K-lRbHQs ziY!`*CZsXANa!p1P~JeT_|js5%q=O!T!Nk?5S_qi<8_oR6VDt|9ayK6LG4j{h0eoX zbUcR>GP&GOH4i&^&)|Iwown^2YmVC1cHhN7%bzUv`&k*iYdnm1twkU$J=vmmzW(Ij zrBPqYv4ge<+M<`v^7Sc+NnPndMX?rq`V_D8$w>yC4J8!GM3`RkX^fqGAgqt9(B?ai zi?%w-P>g|Rb&nF{O73uMg!bN4+mJS0t{{3N077VEa1?keHUqi~*1XO@uc7dp!YATvcy zcl5KnISaFS(!0dR6j$9INw38{1S#{pLd7AL?-yiHL{a-3+S5Y|mpnb7u_d9c3@xFz zMa3gkf0Vbxn3$j`a$1TQUy!|&C>S24httUsQm5>=IPnu4NIWNv27)=boaf_(VKTM( zo-sQQy(6;SDurzQtuLl7Ii2H zzuR1sK>w77-7X|_?I8yGTr}DjR6E;p)5=cmB;s_#2}vS<;#8a{a&)dJ~RgoogOLLl4}#a^C@x@99n{@gen~@l+x)4 zA&z*M$2;c|zqQ4z*SqB)7$}r68z)?3b28?v5XPINt1+ALhb1-Lr$W+l7iZBw`8~4I zFX;)=aN1ODoZq#E`5Gl8PVIE?X>rgnElLJO-t{ui9$I~Im?UdLkt=){0JD=Xdf?PS zr3|%^vzd&b-7TSxMI+A6vSuF>|&)PEis3DsTunvgJ=Q+bq^AxD}3Sf zCab+BlRj=xQ{LW2Mr*uu6V&Thb}D2%hXdKt4!%mC*l14XxNz7XHiT;~N7-U6Q-XGA zpB*eD(mB3531m|F^;2Uj$0O~~BR!lyFrn_JZnSQpYP*2-Sv%~ayS%HcDaBl_=EunP z``+dLtxCD(!bzBc91n-dNzO?bECT`MxwO%yrcouLI z-*0(7L&hhm1ty&(#pSl!nVgi~I-D<2LdKEyerB~=XpCl+p77WBUYd&OCLR+c&4-e= zh^4jztW%N8sXDY1D>xoPLb6ZvNk}p;rn$?${k$cN*?x#SIA>47QF||M=h9L-i?$_% zV45qG)*mW;yepC57;M;WrFY|fmWDzc_d{lGnEsrSy4ubjs>GTBXL2Uc?9N)ad)<~y z2{i}2ommx5N2)h4WB|yy0+cDQ1p8hlkmtFfi^sLv-VD0K$w6FBB5x_R=sZYxraE_F zy1o&*=Z%t!YHQu5lYF?;*2MW>9p)rylb!Z5C3|{0KO@HhLr;;;zQVsW+-KTm!?!}m z(wGe=1}$0%t|i zD`O3!AWLP}m>lNGSU{Jf@k!j~!9l6~FWM+7+GN(=kc6~cX6|6#9;ov?TNmB}F0pS%xa9sCSCxp^Xnl!x*ABc)_9cc zkH?~9O*|O&JNqMY##tis1fpL!EmS*L3w7AlE4~!8&^0z$NTzr0pT+|#oAqXS?y0#w zk9;z<{hhW~EEXVbfJpk;Q<&8yuKRiBYm3k{4g_JPk;_Qp-W-R_su!Q5VA?S@gg28z zg>>cEVUHGBv@1Sw?iZ-z#1vS#J~b4I$!wB$TN>%N18tBmlO5AOsck(~rDDjls6iW zy;MddvgCp>g{J4zy1)V?=Z^@lwMnr*$3;764d!!+nOyFx?X5wJ2^ZV--ZKSG^}Jjg zo7#HmxkxtL2ljGB7I7-$he>QpPM&VbsIvbK9AO@|YfZ8ztHmif(rqj_Y}3==INXx? zN?1;~4Kr^K9iI!-mEA=c{-P&bkgxEqtk0O!0y53sLMA4|C0brsopA>*Pe+l8x7SH$ zjYziU8>>tF5J-bjTxqu^csd%9qwP#~CKO|);!NoDj(`;${McRd%t@w>D}_brS?`js zKvSlRJ~bWe5XVF&qp2VFJ&3`HjYJV4rqQ?+E(p#hXYG(1&y>}!eaVN}Q@q_sRo3a5 zw5?OVlosZ(FK<^PL1%ZZ)_6y()4p z_rQ+&)a0o8eKm_|kl>tU0T=IZv}|u>V~{JdblT{ynGW*^Le!#F@m*Vy(5WMEn5NqE z<1s1I#)G*zl@%yVb91)D*skItnzKE1Q;o0o(dlpx*Fo4u_88ewCxWolk>fD} z1H#XfKI5gHS1EHqv3hvAS5QlZbAZaeI69O z6%adQrLPM`a5l39430aQ8T)kCn8nPV;)GOE=WKhXPD6jXnfh~b;>n6@8%9#$-=5s} zaaLz}sAA0{51cgAnd5d8rBr7`vaRJ7nuR@W$ZWB;Fkfzivr+lWjoES}07WD^y59zl za`F&t8@SyS4K}k)n6zj@-EVVr*!JxqJD+UX?dXz+<7n>VZHS!uXaf1_h=g2jXbp;E z*VZI!KmnFWMS4GCx8n{W?m@R#`LhabIwV=G>&DZ$?kh&0LVKO1k@Xk0tH!dw=UR$R zbyxGvVIvp>GmMCeC%X~kt;#tEcq`D=fwLXjp?kuh@Ee;hJsNg58$w!%7Ge}#@9eMV z(dFFsq(6wFna?qVtZrydVAd`Lt@Iy}*+;i6LWdW7`j8wCJL8b|4nZqcqIr=jNGtG3%?wp!nRoZ? z1D?%C%3!_rxW#Itrq%jH&RntKO@uyo+Gl7GjQ1=>^kS2nZCCjo@^N9in9K7S%CAH{ zNBEv-5SMXbgR$myyNRxHWEgbUz7Y{&aoQ6nhbDI2gWDwstqn~d%~OUC`qRrjeS738 z9xiEgI)}Q)76ZSnuU4KW8?3(#v~a+Lh_dRSvnavI^^SBPC|B~AYIE$gc87(6>nnR! zP>T-LJJ8FG8Lg0`6^AsK^v}^Y-tHvZq6{sp^!#A!9k@6}%;s``bEh*l0@bsgGe>{4IGzf+!=&qwnK1l<+XpSCLysH-hP4LzC02tUe166m>nS_+DfK5O6l!s zfa|=^DGM)XZ&Kc%Kab1X;C?ep&WNvGs%+n5-O9-Y^$q) zwPRa0hT6<^DMZ{(S764F74O;3^8O@kZ~D84*~`otQH#lT#1rd7?>Ikh7q$?d`kk}8 zDWii&%N3d?mAps2V|YGhL*&@=OueU%=Cr#v#VW%SGE1L{m^l(PpWe`V3U}q|Bwr#H%fW zWk`3+9yDP|0}VaSTFe=s(SBKWeLzh;5|i-M?vX3u631mb8|>}+c+tW#n;JRY!V6<-S9QU*Upc1Lwf`vtlf4@Sp+IvX1y38a|dW0z%y8QR6y znQKbvKwjsU_CCxqLXV=@h{@bvP{Mmbo3sA(yh;=DcycWu(HRe60NC z&RI@32F?~;yN_|!sh1L@?l`@@umCYG;-*danXDsY`B+#@{iPsE6~6DL%0MTEE2suN zg$r#{r}QNea^?)1s!7^uPcZ=+aPCO!v>1Md@Y1l-gR&Dc;z3We3?sHyA-DSOVBM$B zIL1x(E?LO_NbRugo|EIkgf2{Hl2v-%v%3YY%jlf%%A;{?^}Y3M1C|1^ifcBlaFsRP`hWu_v zofhgrUwZs>-CGtbqixOVcAnq7)r{<17`+la-3fBwT?#^H(at~y3<<6 zaEZ~Y4c2Yjj~&q`d&UOq(=yz9dqL0AowH82IBH$W3zc!SS;R~F7{k*sF(ZwtNlo7 z^_TM@7LL`UXUsegX<&v$H62>W-?DsCf zhW&M$$e4X+--$V$J_W6Qj|Ue&3hD0EnKj-}glnG^dy^lNuHs<^>ns*bIEzQy(_Ehj zgJ32t>=;D0U|02&1#gV!XS?4%GnBM(Mv`HAytXblL|D4{`WPX6yq(d6Pl_vUvosd; z{u0MpwZM5lT_dZGCCD?6UTpG#A?#d5#F1j5NRVluL9tOs0uQDMx0tOjem-}H^X|E; z<#UIgo(UvKC;dG-g8XJF9%hAVo;GYg+=7^L&txYLo!}B*m}F^sYKA*w8p|%@vyRzU z_N$1NT4ZFZvk8IeiMPQwKOSIODU6^fRo+F+dJ`j|`h zBN_)Ql@TXn)1G2G&z@BJY?zKX)aoVtN%LD?CMqE@n4m+1T9NpnKo9Ci18_c_lT|y}GVr}(ZbcUlMp>5lTL2CyMtnDJg_EX7}C&(oa z_-YKstih?sPH!E%E=5L1lfrubI)px0Bi0{Hs->^PM&*t(($?j z3OROqR^kxGdbQhCa@)t-@j4vQo$*>Q+IrU`w%KIXQc%LlGc8Iw8r^R3Zz>+ZN=$=x`k;(}&_EegSSsx<79jbl=qjoD=(? z<#`NFg=B{4CZ%};ap`+48%syHG}#Wjgjl^_CpV=PVYd5t=mE4l#^x(Y>Q7hMOxd6| zZ^mIUl0(OeJ%2+Jg1l1cO8z8Fny!||>5jc;>IveWqPgvbt)5m868e5b*#7L8qKS@(eJlyM`5IDfsq()_ z1z(Vzg(8~U4a4TdK<0O6oZR%tV=g7ygo3ifAKg9z2i2x`1hCJQKT^o!v(nWED}!2U zf*9p%R~;RUQM_=qts7E0&IkILv2~o*x+pkF#3k=>fSw6?J6W5WbeN~T!%7s!hb_78 z9_UqwM9QHRqK6SRAKCMk*~<@@9bN4A$pj(fNVK|zhUN$A)Cr==6eZ8uXrvfpH`?i4 z%~H?uAW%-h%I(KUv6=5@!AQjcfy}b$cDY>3fZufYC&aJ#?taw4>|A0t;-DYf zC&4h*xz-y-_B>z2ytOu`Y@b9&tDKD7QPJr+^HX)Ma$v1Rts_yL!CEG*nUDJdQkc@o~<8{{I0i!#+=}`u1c042QLGIxpXMmpSkP^%5 zu2#tdr~A-yx6NZrc}Tk_Mk39#HW-Acw^lYg);dqf+5WszH`CF;2#}e#ujJid9_*NQ zcZx7Rq3Y}afvjCDb8QQWXlJ{?*-fXrx5SK1H)ka1Lguxs{1g7lG02V-a0M8)jJ@f| z^mrWUz0;WCR++{O4yrSekHL04-tR1SJX#yoz4;Y6_3f-%oJQ%u!WLA-2m6T~9wzJg z84UD}gdpJl3!Bk`(4eV*92c!9f7_LjNXJGXGK7Q=x88RgKj9D1~nM(eMQUx#D zPEF7SuD)KbK(#*kwc_%WyB~Y!@m?5^N(-bQ5_+SIl+NcpZAXxBWJ``3n28`SSvy23 zJW`;=w-%=aBV*e&5k@=S8dxbRiLs4zyY$YQcAUONJC>qOk9aBs4qnN7F|gDLEson_ zus4~`hTWdT4rWNH*Xf3k#DwQv8w6UP^F(UDZb>JUtNaWjd8w=^)oXW=^N>Qjy~wsV z_zn)q+*F6yZZ*aSbf^xnyuD`Dfw|pngUh`aZ!_wjFk#?iz5pnGaf~s6q&ixt*h86N zJ$i>*MZqpyZcVlp zlqcq!_3>igl83G#hlGkbfibegZOfm~JNL{f2G?HgHY2ldo1N8m%=EP}%LRhfxx{B+ z#DQ^?H{3ay^)MMzPy5`U#z;S(Oj{h7XM2qDIwL;clXzecSBdAhtM}Xa+Ca41XQJOn z4?%1x$YScWR&8zNdbxtHNuyZGC%e_Pd|o35?Ib5EySV3SkRwg@hvR%Y@3kY{5xS*$$!xdY=Y-n!PFN8s4ob|D`H-BU>%Qk^ z)U;;})M}k=gPGu+{mBqT#<=Df5`{<^>GS8#uCJtv!%|KC5I?XK-{wUG)AN46^3S73 za^9x#ENrE7m0Pq%zB}iwMFP;}0?Vdn3AKt9pCsL4dC-QvG*j2rc($mdhz6-L*WA;= zZ*ej-=g>9nOg7PynHu3T9-BwR(V}c|5b_R+<$i?^UB&Gb2aj;Kn190D!qp&+ouD4( zB0JTyhx{gWt*8@5vLCi%_fVu#h40DeJW3Y+2w~1lZ{Aapts-jVj@XOwD8wLm$_EN01j0v#q6e%>rAT(Qnd-`uxS z;JHYgF$1=ruR8PnAz>77Q2E1VE$jS@$p?B$^;hOPqOuBC*2EEW&IViHW5UbPcN7x7g1&;N08qM$YndZY|}WU@#_!^{25orot!`mfh9q)M56= z7#VtfSL#cZ|HbbOXK?Y_K^n=Ziyx&C=C5Xo=I=>t>q=sG*|B?PNZJ+ya$z3MYS*}& zyO@kud6yY`X3MtNxlPc_!0u1mbZ*OzD=b?Mvp+0)Yo~LLIe#R_qYIyK)kNuZO=jSW zopf^2mY%To+E|$idP_*tLA;+!h8vunXjWvViS`(&($_>6D6=$3&HO9P$IYuwNbq?*5lup;(@_2RUr#h!+D z0wEi6`6lel$I>ZYk9QUwPncO@F03)6vQU&q)jFF_PcnCQL~-S8*MpNIj=_jwqX_^h zi-D=%?x}s*68*NYSO*GRF2bhb69P#3BZ_Sgl%u;}pJ#69OI>#CjkPIDQ8_)>?h~Ih zjHyoM3}p2~xmEG&n3*rrv<6A!clf7K%r9s6fAQT_B^J$+vC88?A48M+tk!{ zHGdOC=xyZ{KnZqr+#AAJJDKCs>lS#^Kwy9a#?mOXOHd7WG@)DTskG*i~o>+0= zWHGN`&Ve2j+X2KG-W6$fimh@*(S&iuuZ0#J#EE_ysA*q_2NNsg5nmVkOgJ%4E#rW> z-W*fG!f6kz6*-1x99r=~nUoo?y|K0aj5{q^e>T)l#kf#_F-TASC3`fa-ARPMprzm> z;%ryxSAHUT3f9sfUZK;8D{jVviO!k8!}h7-9yguyW;e>_JGawTU2>&r+_Af~FL_DN zyIyPN4afM>fC}p{)KE=ECWW^lyf)dVjzedts{?woC;FR#S1b*)+J7Gd-`e+Seiu5e zeM0k-<)FJj^eBs6g>{C3n=n&q%(nK<*6UBsJ)#qMmv~RnB8%+9afB^(ZI$)O)|?_I zqQBaSVqZu@TTxi-@*V;vn~Pqt>;%`3i_P2>jQwDdPR<=| z5pOoghM~kr+501&;SbT$>?!Cl7An6Rg?r(dn|WOY@({r!+``bn!Wa`N%Btw9*W!D$ zI>**Fkj`nb&Rj{Z&Uu*PNa!7>c!%$7rTyFnM}4O9vW^QhjqCz#1e@(+!=kt8WM@5& zH>0q1iDQ<}?Nk(zPK53V*u5S*+rN6eb~) zDBOE0x84yGBbgVzTpAE9I;#=R~|5#k({jHHlm=w`fk`y_M)`G1VL3 zPIrkrgtlcm;8evC6lass0$1X`D(&VB;-9;YIt`39xzj~+-crX=j*)3_#4t_Dx3h(= zlhu9|4kR;>3hT%(TFLo{OG9B7ujnzW1^m0;onh>p~lNFB#(#LmN*^F zjboQ#tIp#@Pfx?v3D>!_-`=??CfeAFCW&fX29!nlt$8TM?UUNG&gg8+j5BMs>5f{AE0U7=E4Kn?;Ld-FtJOY zc{>{~TkDNe)nlMpu(6L;Q4HJOQ92cH*=?c$b3Ve6>&nk(>*pU#QhQ z?6-ZQH=|s9GdoLa-;33?DKglm12Qy%A`s^bM)gL_o=EdP z%`l7@bBmwfCP-hr@k9?8b~yvay;&d5H|!DbAxWby(DY;Uq&NZnTZ*rW6A zW;eauTVe)%ArJU9wJMglCM}X|iEaW}A`wcAIxi_vgKOk0N@0*xOX?5(Kk=XyRT zp)yJoVZIq|S!%fxhPg6U=akU13Z^{cyqfMubgT}#cqBTD7E$4YIZ9l!z378@NGudn zaBz8eh?CgPHrBxt^fHG|+@DiUxSU~0n`4a2y?Ms&jNDWjbnM8T%f58VC{)ygIgxfl zS@+LG;)RM&kTfbGZF~@nxprkgw1RPa+-vvJ)^x1(1VwI5p(V7LwQWCN2H-e28MMB| zhf7oikzfPo>Pd?wzd8gbw3vIjnMzT*K$*AjTYBH0EWqaQ* z+(O$q-jpSy6Dm(e`sSc|lHO7@)5SDpWlr0nB_k|2RrU%gwG*4z%Ok0~#WovR5^{c% zFkVX76K{uX1Z_@xn9y+4xu5X@442( zI`54@XrViOxDLcl9@1eo@2z5GA0{@@^AKI%#K|rcyE>!E;~n9PuSc3QUdJ5D^^P_% z8)?C6KBpEM8cxRuMDm_yw58nds91H+hBt>1IctM;Ta~(M?y>&pU?AFx1To*udeh}m zO}d&Gq+4lHrqVf`s7oGVrc8UNYB^x@voC35jJFKeFU?*d`TqmJLDOau4*R)LS!Ll-ga z{%RKuq2RHOY}m&j9#L-Ay6gkZmW$4KGy)dr=wow4oDdEaD}6FHxu{U>$rxT!|XojVnNaA`80zhNq3L63DGGfIuXKc+C46IJHGN` zCR1dQssXwS16Qy_h+GrJTTpeefpx~hCINt&Rk7u)1Xv^bD9%!|*Bqp==VALo??$U$EcJW(Sk^^xV0`V@NQv)CSm-{&g5_Ha65O>T?d>kHhKImo)$E2RV zvsz_LK1v-Z`^}NehSM=;^2f^FROjo|=tScV)sa`TZL#alkSUF~!*;@ClNn#Qn|zZG z&1~v18K3bXd$~RNmQ*vf;Iky(GLVE}T zoLh0gA_qdy3!Sssu@&Wf=2KbUM-ej?Xpxc0mcNWZ(XZAS*BTJ+&LJm5@vstD9TMre zD6?XAUc$+k3a-v=ohi!k?ZWPNf;CIeCztr_Om;jRhu!(eX-mvj8MCZH_>Q94&<>~$&oT_4SO*=DvyUu;z9#r6(bQb zwmG4-84p(j#34Yt+Ltl?Sz6@OVQTC;6G+1%lI;@7;gFJ$pwVR5-ln}XEzgJSR-y}i z(czbs-YvGwh9(AEX||nW^m#0XV zDf#hv6B21VG8quLGlTs_Yps;*k#*7|787t%VS zwRA|u8+1T=(w17A5epKfJ)4g}Yca!9j2;rzxNM|_K9Hy(X`%RHZpERFEd6tIm;|A0 zj(P_!-$WhBz;+Xa8u8*`lFll8;z# zj#4aCjoXBxSLv7G5V5JjrX^X(Nb$q9BH1n$;wd9gXJtHcW?|=aiqAcIQ`nnSIHPo4 z@g+3NlEe;8X1hvchg=$`aiC6IrG+usj2y}mJ)l-WG_VM~%MFWFdyiDSz?|ata1e@? z;I339>2`6I(p0GBR-sO*QgW~Xwpxeh?hfjIoa^j{NyW1^@?ei3dRIs`D;i7veW$&i zCrkdE?J;hWZQF5&>E@X`ZEfgtZ$Hhlw3!ZiwKILUE&QZ*gBkLW8E zclewv;%L_653BuF-rD*lKM5(y4g{ChWQWg(UbpX##$zTEpi=VULQ(ymH?n(uj4t4+ z$mV;EVk&vxVCk-4WZURCL|*La*xll*)QGyto(cxLIHTL`MIKol%m(bTjjF;W&caBL z;mj(0D2J!rpy#ynsNEglQ*o_lJDxeh4vq_EgyaVI~D;%*%8k4MV ztTE5sO_zRmrJYc~j=OS}w3u$Yx;Nk7tz|rw_nX}8_SDV}o3=>DogdZhQq*1XxZ3r4 zOHMY(b$^c?Ju3~)m7NoUWj@vvied+o#WCG1ht7E1K6Kso@I3E#DUf;I&d|JIV6%p? zP6OGl@;;tuEne~4a1UAcVm>@ZanCro3e-wllT{gamGl^QwDy_SY61F5BI!ky$Is(8 zv5bS5CZaR~?0(o|Lr%0k2;Zx%n2cTKB+W*dv7XRfdZQnEIbDs**}xJc;_R7Q=<61U z5LUMRxiO%I?1;u9ZnE1A+G0EvioP>hw2ountKN_HSDXRVA+oo_8QVI}LN%sGX3~qg zWsprvT%v(B!*?f0{rWVO3kR*@b-08oG_(weE~d)C5`&DWFYgz^af1x?RI`Q6@SKRJ z{X}6R?uec7!6hCN>tVP9SVS*(6*<%SExJFMu2DFV1j!Cy?;uoc^?RRwBVxGjnBVVYFLsA}}m$41LP6y8$Ay&j}~ zSF(Sa&sRDg)}#t4k7YmRF7M!h;AUTT+z6x9^VJDCY>f4=8V>0M58H?&MylChfIocb z)S8@rsht~9Y4a`uRN;7llTc?{5Rg?VirjenJXA|v}RO~_gX zl%6nL_{RQYp>Y*ofr-7-6pud+%?%v-x`}HPK(eEi66LEA zSWkhfh@A`g^^{q3oe=)orBx1rr2U#UJ4DWLo?SwGPc%ZZ<|NynN^>v2vuSch)_#^s z4SkIuKI^M$s7x%ouApPJUmGx@J&vc3L11)WY$i%HF1?0;AsMS=SAICy4X5xU0Jdj4 z481>=*HTpd!bthb%WJVMB59EKrDA}>Rb|1o(TJJ1)N{e5-*Z~TRB13pRS(!=jBg`1 z4@Ev$*tR)uH?<~3ySf4THJ=^X{It{@7QHT*+tj#Yuqg6sy4!&TD5z+UM<0M8`If{0DV+~i3ivA1eaGT~on=$z7gK|zM%C&gpn{?~gmwM`p;*B~tVsg+BF z`S@cn8HPYMCk;P;&aJzF?4RxwIc5fDM~Z4?E4EL zNkBJeHacT2lT&HRE@{zb<7RGcq^#bb7Pq^N%vacM^6an%+}Q}kor~Plxas_*W`j}Y zF9Z8Z0@>mXV#o!wZGwJD(}!tPm@@FQ^Sk*i0(dzfk<0u&s8S(%W5YfF>eyWjLM(4DkczIi8`PaH-bv zn0Oj8zhB!>LEreIrP{0`iLq#|O?ysCfd@XNxkOj=; z?hRwV*5yq1-NhI{9%{Y5_}PCBDVwM?&!%!r#Q!NJfAQw3WigDLM2s16GPGQKm8 z>;4|ydFhm0hGNG`zEnmo!r_m#1hIGys9!_Tm8Xgu!f?sRvQcubRs)Xukk0Dj#D4nvkD=XBG*3RD9lHmZ)oM62GkWTAM8ar6E`ks?9L1}0&e`*#y*)NY z;a9g@d3JIjofoctUK2__apk`{L!eNd7pl1OJ8_x`n+wxEA|G?5$?zBu^VrRJ^szT_ zJw=Bz(z?kEVBa1P;s7GLTF+=3gw`}iJmUpJ(;J&ji~8eE35@o_o5MWkc%x%whT3*4 zDAox_2JXW(LC%J5@mT!!)2S#X9MUFueByZ&jSDsU@ZJHy6D`dpDgDh23 z>o6h?xfg0Z>B2`v=kE&J-oJOEI=kxWx?$0R$Do>9$Y%1I_Ew<&xNx&D_SK;Ec}*P#R2+O(OD z2QVbYS6+GQMA-M{c~w*u{SXC%r^06N--mwlzJ=n3E$xtduG%_auBbEn_vcmm?r!{< zb5reMmUc8Ku_c|ZNEzRYM4Cp+@TOrNG;{Pd)g`wW<PQam4{crD#ZD(Zeh%7|09egxja4f zYR)yC7Ro7?OHknD^>TgdgJ+)rkteFT(%Fzi*ok0v`Nv zx#7EN88fHe}%Vr|6`{uwf`m$_JiE)$U@GDlqh;`SbOTNQtlGzlxsi=wjzI4y` z74_Emg6hHmlYgM^>HEdsS@x*0&m~$9!R(RJO-rTX`L4;D6N&2kZ$hp-Tyvgo4!o3+ zMwb4MQ1XW~LrmIOs!~IIaC1$F{DY%9F-cqstWQUNxK^}iqVoK51seXG-!lw01gotN zvNMaia9hsc^~PM+Z+ka$c~b7YMrY#PTu(3A-bKp%DojB*b77=_j5 zPmfdtJL+`k*5fQ+q%U`C7WKUEUod1Ej8=nMlRcB5^zyP^G#_|#XZ0sS!>AD|oMs-=OR^C+)el441tM#*MT z+>yiA`AavYUA{d=B6z3y;Y7LAv}Iv&<6rFOmP>>dsX~9bmBquXh_Yrlt?BU`RkAyw z_mwZx7H}7yFYX5d;@O1ZRSOJdsT}>HRTngFV69wPVy>!w@*Jv&(ds#Dn9z>BwB|at zkY6iBOQut3^q)1k>|ss!(MP$i%Qjc03PO>(&#-wOSh|?n<+RQ{_3M~4pULWT z<=j@BxY|P*_jsuJ`TdCVIyow4)d{DWT2S5W5pK&j8il!;kwuASc;?g)t;;{~4~x~$ zeNIzURYHy1JN`_}&3Ou8{;b|y!{RY*klZ{!3XO&<%6pmLUypCgXbib7`-Livps9!! z(v0p2WQ!>>wLjI3fh+wn6)>U7|8bD>Ld^2H;*B!bP-|8jQke zBbvR#>$h{3w1DeGs}S+)u1P8k%E8d1lw>x}Xsh4P$>^{}ew1X$EQ8U_!W0Ifrvie} zYxfP0xqYuVlI=?DZmA*u7opNl5t<+0>r3_6a|cgFGL94bn%hOD#1&g@57CEr z$F_*SIBcAwBDv4$u)3ss(fg6Bj{i=NH_~HRB5H}K#d9webk(ZUwKQUI=T&d{$?N=? z@~91^v2d*8_QW4&YJPg^6TPi#{)0|#psve?HM9%a#B zw6Hg`Bc%uQm?F-|Nu0b6@`!Q=U0~XUkNFb*NFHdpw7iQMV&&WCme(H<$#$dv2~b(H zD42fCRzZ$_a2p|Lto@1j-|RCcH>2H!4TuZN14NRG zd@y*9=dHaJ{AS5*jh;O)U_%LN`Gp&$j@VG~4fB2H9b53Ktj^>Vsy$kGRg^V}TTjKU zZK{7*!B0HjO1Z1!Eq3mPXDf$oItM1tTzPxl%S1DNN7d7>46WpF9*k2rZ|HueR23tj zHu#nFx0mS~$T${s*~n63rMXr2IBPuY%CR>mMxMI=$HgONQ$h9EuQi^Nj8H@(MxknL z46T^n_MWw5d^GpZ+)H%RmljdpGE|S4QS;53M{x7(ZdtZlQNrI+N{v=@~~^F3)!%{VO5i7) zqP#3A>7KD_F{rsnRe&({DD(Y#<%Lh?$iG3CJs|6P0=R`lHkg&W^MJ|*jx$M0{)E-s2Oe>AkPk;;l<*#lYGfOe; z?pDI2yV2fVgbZo-A4m)JvU%y*%&7eys5bWBeT{RjQ_l2A!so7{ z!5EV`1gE(9)32Uyt>gOvXgj81ZW%V6M?Hk$B#;Q^@2`DapCjE&aHDV)brVU-^YyOO}U@)j| zyuE$7US$QE-LXy@ z^47LfZ>r$opYVm(9)G}q?Gvz=#Mj@ zm9tQ@=~w#&Q9J@ke;jNQto$+HeH&TMY%y4-RL={l9xsc?w!=I+(zlWUL zv3~2z@2cs3z+?uN5uyXjz7_ne`BzVMZ97$3ad(d`8**!0``V9Z(G8xP&S#^R6@28< zj@U0Vou+J3jn%wu0L+_(-GT8uOm4$`oD!XUe{EVXMuB!Uub=K!a$IXBYtql(^ajy$ za}7Qnt1LLpx-xwdbubS7w4SfJiB*wZ!{V^}d``(;Nc_SBUfzM6Ta&Zu?6qe<3_YLk z1KQNlWsXZ-h0-5ZZyba@;_m?>I{T}zQ|X?+eAurLrj8#UYJa4G0pmVk!|V1<%*VD( zydQnO7JM`&XGTqe0^28yNG~L7VEt>Y4iL6KxV^jYiHv0Uec6|ForI!r>Qlz#_?Z27 z7VCrYL(_M!f`xx}UMzR%*rQ|co{K?-_jL`p(NabdhAD7$pY+OeoGz3?axBx~W_e#w zi@6|ZUL?t)f4jMv6zQP0sGX!!!~Co_%MK@^*dyv@XeIyrnjswU+1Aj1tO0*UPB?}n za@P0xQoyUdJXq8yT3xSRe_AuWZ{A4q;^rUskWcEOuR0wDvLjv|BsO3@rX#jtQy<)H z$G_(75D|Hd0LgHBoo^B<3G~oEj8S*P9Sj@Yet&E}o^%xszmDsD;3B3&R+nB%oqF?H zU-)(z^r;o#8iy13>SgfD;?gj1&EOcEv|$Qh+89_AKHt8)BYOTt6-OcQG3|YK{Ww2d zI!8H)SanZ%n6eO)S`Et>KyM@r{3w>QZEtq4EhmB_VeYcWkyN|Gh7!p?fmQ&M;ebV9 zK4v6#0F^dcsCu{OaB%uqaOlF!a#cGXIWB+nuY z*7dVW14_=z0Z4cyb|(pc@gH~GGD`E`0rn+;wZ<+rML^T%123Jo6g{!uXGg8WF37^y z>;l&;&!-OLsHQyDRZ5U=m(irUzj8n7D~aha=#v%5YT5fc>+y@(xFfAwxY)yC4<|9{ z=XaH(6YI(+TvFtqY2@$<395CbVT5%Pq$<~7tAP}+gN~;TRz1(x{$aVLudOAUeeF-N zMXv#ql%MHRv$AlX`RbW6EH4-_@E^+66`Iw6?EwCy-IKKwgY=ET$ z{lq>&>;2#Y6#0+GU~{Su0N(gxIqcSaay#7b88@H^xI!NY>YO@W9x(2{oewTKt|fdv z6f{KY8S4K4VX?*-j{TbudG5>tYl((|A55laK!?Z2WUPhRx>;=Z+x#w_xCi>K;;A-T zBIsV+Ypi&u%lfSM)5`+W)+Hs@Csu(yzBSkj_ZZdZW?GWbT+lrCRcKP&*FnyA+m~nk z>3bx+(L$G1_?bHM{P&nXKj)&rZ)yR2Mo-svc2vo4=JY{dw$FXK^{b|}8R6hDVBOnH z*|ETvA>zihORtBo9$k+4CAB7X>6ryt6-)Hhl^wXh*9eWhs~ANZYasUB;%=zf%S^_t z%GZjk!u7uEB3X*M5(j4LsT|qe<}4af#+aldd??_aN7R@2HJ|&ic06^CFuQazC$M(B zQ{5R%`t!Gn9?I~XH*CrbJNb%NlVLv~F>-~gi6C9unO~3aV{4xzT4ovDJcz!>1umJ-RUj5+6 z0JHeLLhnzW`3vSi7fXE*o$LBZUiQIip zExD-k$F(Bqfw#qwsrE=&s$(*NycDHN?$3EaAEb8mdLIvml|fo=xjQTU*O75T6O^`2 z`bS_Nh#xpV(o5FE0t3ArLp}i8fJ}K+eE*1h&F&Ep4PXnk+x9_jC3@S4^(nF9100aK zrSWQVGkVhB*vsH|_wO@NPng;9H7y+RYoI412Ou@x=l>lF1TU|n8XE7K5e)f_U?rfF z@O`g&Qd5|?2ER^cWx65G7O3g*7I9XRC zaMJSn7Ya%?8pY6QC^>5lawZVOd|4U%| zSFdm~kmrX?65fxYp`j&ZX39zPb2Dpcv%L~C|4(^$+(At=O(+N5MKT*L@4_fT;rqsh ziij_?jtJ!%@?{vo1ptiuD7t(bKU2WRNzKbQDU<8l-_$jouc}250aJ*%p0{3RhT6O1 z?CmX=1&baeK2qm6(Z&YNHASGS zS!+FJ{6-$g-0!?`VOGanCsl{3%);35A*d!)=&O!LXT`e2POG>PaDuJ+RM*tbj;@z5 z`3v7^^N~2d>q{6rSLiN2Tn(vV({1lm$uOJiw$X7D%wkSxD=cxB&Wwo}^j?EV6?$+LIS;!5;ns?b>U;$h!0 zbC{Jn$+Aoqi*iSE{+==#nwXj{6B0+|Te=%@0!k>Q32*1gTtQ&CHbe{tzFwNOv$K`< zw%_(s#xgI{Y&tO}Weu8~(0)wat%2%MRe?aOK6s?UURJTG@~l?o`5#}bD?*3MLxGOQ zz5j_QMMALI4*pk@&pe>8=Jp%{d3WHi#ki}=NV?3DIvcI-atd2sF#~j26R)2=c1S_Z zr}EvKXd(M_-kWG}wuEcHOn?C$BycsHx&&C*w$l{&w>7*ye;VL==#r&G@3>Ibnz{Og zwl^at6S-9K$Oxpe^LDbjy?yv15uiGjhSGW>2~Ajb(!IaJ@84yyRs@>ZoMo&OJE1vQ-t-2rcsr&p{;Lf5zB@V$ zGftcQm}OX zvq7;TjQJaX;jT7Bb>8IV-N^EaY#4&{*+%ra9$jXcw#E__h<*tDiy_S0KKQL>lbQSS zU3@8uP0fgM1&=2Rj8v6ir)$#xO1QLK*B$x5T~%uqfO`IBrMq1TFi|vSe)5^}FFU_{ zPnX51F^cyvykW#HVtd83cSHGjC)3#4W%#n*DEfuINFAXDrpGRn0@96Mo}HWOhFSJF z0P1-OBXOCQ&@nd*c=@}#bl$jn)!?-%&3hSXNBFiwpPV=1Q&yx_Wg%z;WL&+J4sVh> z-nTiQh%er~HSw}UX`cAUn293WXTa`e5TgLIU@fojRyN%K6FzO=v*?Xf%58feulxFz z_L6Q>=lT#)F58zX*TJo-Jzp^uND&nKTEma)vt6m~$8{IipX3!UyL5gd5c93_;NAcU z&8J8$yXVA!1?JdOI+QAp-MiA}+&(G_ z*q_aRU(WUt#W4MqJ|R90m{&IbLL>JfPQFQ+lcKf19FE*x8ywZP|Z5YQ{=!jxM zM)LvT8KC)(*nK^w&Cu}>1E+`vXF=^i2Uqf|=uZH+O`(MYq25WYJ(d2MS>eh2UHT+r7MiSO0jrS-@|U%jL2RUv5+8c_H`3bZy5e-|Y&Ai$P= zh9Dz;hV5%%mTiv*L6pT{$Z5eWv4AOND-d4z9V3X~^)m-EpHQmgogvSs#i_QUmJZpb znN%6k#~Yj(oWw8F=PQcg-lx5WZqLp{;Yg#WkFUu6_v1pA@NI+QLS(q$^eyr}Lg5Hs zu!(HxBt*?k(6#6JHu1m5^?J%8ro{Cw{crit1o?&iz#=k0j@R_4yvJ)?W5Wr8nf8j! z3TPVo{`PBvr-FT*u<;U)YyBr+^}9t`riF9d>e8PdyuaBt|NQuG8Mpe_!n=-R+mw+3 z4}XT&xatfOK*gH%{fj5Iu0o-2J#!?|^1yAFSoLtb$P+?e>2U4T0ak*csb2O%iDG!*3@v&# z)%%nUlZS%;ZS2IkW67*s&DWZ-gwmBUU&a0rNImbgJ7o6=(hVdVtq8GbX|xw|I;PhP zap;!1T7KCc$I>AH0&rPg{dYyoMp$CU8EUmAw9H|vS<0cp*V=z0`TkgKPoC;f9J;1^ z`N}!)Yq^pjiIr0=D?gBkG^Jq=M99muw`_Od_b+jhSB~-Qq>=VxjomB|qP+Njk87X3 zdk42Gdpi_n#&7-0qw7B=75^m=-@b^dY-QvcA;kr3)|rSKYWY^ZXd9iD3a7R+aJ+x5 zu5`QfXr;Pxuio#7*-oKY0kA3lcVu^`>2o)NUpFiFB8iB0M^FVElZ_Qg0;oN;dm2gtGXU3nH|@^JZ2}$O2pqd z|I3Y_im}h~&b82(#R?{hMmyUpUaQU&DPJn>UOas5?IVqk;K?x872~`VSv1!$HEU{< zK;>j7ly?}#=-{V+z;OE&z&VE8sHT(UdT=o?Q7SDdZJ|g(;o<_9;<>OR$n*e)>4!o{loC~%6Nk$D`!ebDe)4O{60e5 zZ*U@?$_`MhrP7!a0+vcfBN*-wwFywZ+@!cST!mnqN!Rz}^vH@4rE}!=*7V85{OET| zeXV!q)d>ID8AE_4NEgSpLW_1e1AvGLQ)L=<24MWtG0x4yM>{v9w+^KwNVCTQfxEwv zBsytE?}_^eWt!7L<zvNH3n$oVNPgCW!WI{tXHl?R~fL9xKND7EwurC5IF_jx&g2{$|f6xagoxc_@U!aRgui0`zKMfIu> zw5zHp3KRf*+yXptZ11QJ>z=(sW|W#s<^}h%;mG+!zCz#cQM0eXO_fH#=Kp*4}{W#<8 zfa*5C+U4!l4xgvatAg{ar>XO+=5CMU_eK5kE~n4@^`i%`Ne8D)liI;7FN|I-n)BN9 zLHkPbrb7qEA|OoXTg&Wr>#smC&FhEX2{#@`?Ny#hZCB;nF}Gsvk)vl0;k<(dbZ5JO z2MF!)W6tG=-M!;VNM?kd8@THzz~QPJC}=wrXK=k8q`BRB9_aOZyYo2EW?{Q~-`ETG z8_$$>u4C{FI#33 z#e@X&2|eo9huX8wkv7EDUFz9(S|ieO%(+Qp#nSAz%gd*1ct?hGBHLPM$L@Hxw^s%} znZ0R80%J5$HZG{#%fuyOM!!WA>3N*Tsy<#WXaa%-X};HXP8b!9=f*D4yJ~F&V%gqv zZMIhbe4e-0OM_}Q2y^W1GMOZ**H2nAwd1*It0UKnq#?xn56LKO z9RGeiR--Ey&N|SveqdqJcs*Gpi)y$3moq>KmO_s@g$XK7h#LOucMr8|0Bv@G%Z-dn zxP)_ZNq4i!L#NV`Y~uAbf8UNXrZ6R)WfP71zd9XgD;0{7e5Q^Pg50>w@L4z>dT;Oo zxQL-I!vsX24^iim>C)*OL!y(!x<6;>lwGQoP+YcMx+b=J?T|9B`Tot;Z0;aRl5IcT z7ysd})G2zDY4@MPAE+e#Ub&t6GpQZ zKU!Gg@|F6-%mWFLx=uExH@{ijh3||mB+c$BsOwVhUh*yRB#MW87U+I_YZV`cej&8C zLS_^=IknGwl@zc=2<{nLkvjq3C2;e$aUQwRv*%d{1{azb;}gmy(8;U-@W-T9bhj|_yDLuU|M*fN zqbX5_W>O{3UFC44$A}sesFc-hPo0X`k*IrvKHV6DTqY~Ky*T%;JcpRc_|5f1uzYXk8vqYt-D*^|xiop?d%JD74x`WXnr*%aE&yWh6_rCcQFqj+gqJ zl0MVv*NW^M*LGSHdXaq%5wK;Rds}72pY`@`a$(#fS)0+9yFAs2sk1$KGJ3hg5?Uz7 zyZS4{Vr7_to2ww`?#+#L`FRuwdoF)Qc#e6586pQ^GmB zT%utQb%|FOY+O}JROM9H-TMl69;8=wJYMy{lKpmI5zOkBsg5^yKDF6Lrix#q@~6|q z7@eZ_^%*`vDVYl-SI8$XSpjML8wSOajP4`Wku3oyTOhfF?Pq0h9{7wi*<-9O&Fi$K zW99%AO0aa8FZICtz%*|Iw_H~BMDJ8HKq<)JukvQ*8MK?-3_is zS!%l%>A`CjK+zXo*n8i5POz+(XgFo71olDyla#tu8o_ZsgvfG-M0V>sZ&J9*2Y#*- z&*qbyMh(F?4w3Ip4vMc)4f-1jmtHyCSHhpIsF-wfVp7nUs8a7n6i|aTj`~RuLVZo* z1$0PSw5A9pAwS{1UWvi1{a*|g#_gvc354uV;F&$VG-o`Zn76aH1#X+r-{IzR z8o0Ep=kjV}tS{x#9?}Tp&o)EN=5}7{(Sx@62hF@!tfSlM21V?2{0 z2zB4)&3;(>q^0Si>zj&9NKDUjTYyXPogpftizB(^o?2uCV$BGP91?59+u=?>-HWi5 zhC?yZKkDLI7{d#R_Adbtc9zg~s72g~OJZw)pm-|9mR`w@*Ouq`DxQk=O9;C5-Z}ts zf1T3=c>>SXFc6_Px5gV2!IctuQjjC3@cwvhV3;$fpJuBycqLCa%v_WM_seTuYv6(S zypq}iy!I8ZdW|SnP{U`E7nwd$e4U7hVZh8JUa2zXK~i`mGt{4CD*tqZ^{1`3k0jph zpIttJH`{T1As&ZLvPk|WI8%b+P}_LXAQk@}FX{a%R8();ugAOt2c3ASAQi)@b#dfc z3%BmNVY>nrsLhY(Y>%(Ex%fHPF>^1ud^y+A3wn5!AmhJN>x}O*15<*E?=lNhEqk6@ zdd9rwUR$UA%xzWGF0ve=xPzeFpMgxt$HICaYFyK=>H(@!(|+v2*Rl_t*vpN^-<%Mf zeoRbdAvblqWAB3!20`7Tf=?3efmCufKNhx}iU}Zq1q4BStzMFxgqgSSws5O6v60qX zT!r}r%5=Aa`2*Lgvy;wyPOvy&x973A4TPs;NmH(}(`&C$XDEn366Tvi@u9428fBG~ zHLLXlRzG+TJJ(Due&ufN(oxk6fqkN+pX4=3C+LwpPQm4nCHkiJ$v?Pz79cdBm9C*^ zlD!A)2zPLxxZ%+-UK8Lo|1ZXz(A55a(LwlZ0c@+}Qu)_8-!bxL=Ds3k!*S&yL>Bzq zCe5SP?uHJ*O3-?>5QD<$mn(@)4#!l^ObqhP#E5-4woYyr82+$G3FnfR&n%*HqNVon zTV49Dz(bTwwwCDs$4dO{RXa!ErCF1GMKyx~uCSgggW>4fx8{@C21-Q)3ThBSVK$hG zo{-)qu3$Vdg%1h8!JRho;LusH$Oz}aiY_caSb`104$qq@2bBsb8aZSJNBl#mJL1~h zI%vakXm*{(%|rKA#R{cMPm7%k-Sg6VQILDvX=^F*r|59&hxEkRHRymb5+s}*+Tdxo3EG=>Lg#~(&JxGW3^$)pgNfmBjiuOT8m5~axfL~z7d?^e zRey!Mt}x>8!kr+y@66+Rl!HVGvsL+xi=xMnTzfo4e&OhX5EhK-d^2vkhT{US*O zRNVKnduNH;KD@s6It6ae-r*fBN|#?_T^2?9`j_99-_~~avrwMOqENVC&2TB?qr~(@ zmz2rENaANpoX)L5;enCSkXOuf|34R zC46Sq4cOKF_vgVy~a& zw%lvE%r}1CMr|@aPoEk?7Qdwi!f=U=i%D=re}jqRy-FL}boHZ8iR&nKY2o^xclYGg zVkuAfs{Q^3T%mjA7Gl-i_j#cgV#PNq*)+o-#F(LihM*jO%Q~RsTAZ0qBY!j2?1iJe{Yj7g_GXzCJ3@!l!MqNf4+T&a7p4B~9at|g}M4l#r zb{r7rUwmQ2_o8N(zy33`p&v!@xKRFW;+j6%_(w@nGd84~Lrrt7+I9a~!exbh{TJFz z@(SA>Xn!(1w2hban+8*`8tXXGZ+Pi4*;qQKlf>Y!7zHTc5YwHc9s-1U{Jt58YMye) zPq{pZQd_Yks(%pq<2v*^nygD^FgOK8X0|Crq8pl`-7N%9%M!*$|?s1mk;cB~gSRGlvY8=FT!{IMVo zbBk?Ca1-6jcY#gGAx7mBv#)-Htqc|WqPZ2c!!BNg5bPRGzD2k~cChdq?_#KifQJ8} z+-pFN9CH4sA~Nd*>qODxCSX7&S2Dyn=WQFf5X}=VMoM8eFmh+h0L`sh+&m*2PNUAJ zhoDUEe#p{07KcMf?Se$XP8YuSs7s?(B(1^H5}h>Jjk?=fGIjte8XPvf05L=om$qclD2Slayvza{d!ZkEd-FV+_z{=Z5F073y1z(+>~@V2E!Y!%yMQZ*`vjM>qR zbXX88g!>e+&-?oVDS=IgikTzhAQY};nKu^(fgf353ljqwx}O?WXQ+q*ffAYS7aNol zhA{|KM&2=pFUEv>8^|Xiw1*`2H|LLh3$KHby@eTc);(50#vmT8(=3D~WWH&cg$ial z#-^s=jnsye+*;cTw}yf)CSfFCSCAyiY`btuR+FOZ+;|+oxLLM?y!oLY9Gs`>3iVmu z4`GXS!}QySuu#OqmUI|DZNNLebq?w<7fF&=KW`QaIOKD6b^t>L7h+ZPV8gf+dUv}o zbnqmyFsZhDYL;&$Ayj~(aTHAsDUY#0tvEm##)cDy#TQe6QKbkEi-^agg2AOSKa-e` zf1xV68y>iiNZZa|d7lE%dX-~x`}f0!cOK8W$68Dj!-TUai&8kgkBBdss8(#~_#G<& zf)YX{{p)ld-N!m~h>!%14Ec9Uzag{kV zeMoV|Fd>TfQNQ9w7Y66;fblTNDSGlzrpToT^y8V(55+L^7>|kJ#?zvZ!0wnmNlyK| zGe5;Bp?K*@QUAzhN{lOED-mqm?RiK*8atYayg}1%0aQ<&@7L3WwwShnn8p1kk#mdR z1THXHCDYZZimc^MC1~jHF%@`?Ni$f(D9ls4WH{B*cCRS{XL01iI9};*M|KuR=kIU` z(b_fv(mB(DKA*6^MX1uym1&OspojUkw@o_cw0n~_+#(k$#Ws?T zcriqm_U*Y{5ire7fkNli&H`5FdU+LjNq;@>Ko!$gySqD!R|tUKE`T#<vfCb7)i%ESX4;hQ{fozsxGh?SC$6>0^Y5%QEuVzzvR_p? zvqw5KqLu|8>~T(rQl5541DQ{kEu5(jx%spyAzPNgm4|_n%|QbiHPo*iB8L%N{;H#S zJ(O_l$i)~?6pTr&*@Z=4+hUXVn00cDlB+;ZbY~R$ z_QSa-YpqjcXZB$)g}YH^C_mu+jK66&C38pq8Zoyh+|zf#{5;=c)zLHq2v(Hu$G+ z4~6>WSym$?sy>yp-y2=_%1I7x1TT;|^7Rr@l4bZu^zfJ#gj}#W{%D@ny+=vN8-V!g z)+xg8w+vCM(@yt4AMr|W+9Ncb(^KP>a3)CfWEdb0@Q3=KhVfoUP5}G3b<`36lWaj5 zZ!tc*VdV^4I2!~EAIP4%n&6o^_6mvf(1D+%eP;6f!|qVWz)E!6rjJo557U2yqvNV! zWsxN8@jKC5!3+>GNwUdQ&V)0E#o84@+^DvDG!WRVZu9e~TvD-8H&ceLjs>RKYaQ#oO)Uz_u*oR*glDhpzjNr znn-EJrcsBuyX|nKGZ;Kb(DE~>)H2&qhZ3gy<0x^~f9O3$XPiEs-+j%q;-t>9_s>xhh(nZTVfjRQ)?#ZFOzeSkwnshnxe3lus5m^Zn-0MBrU9ze8u&t49^i+N;DI7m%WR-C z=i@c{OhRpfs&1cyUY7p^v?Kk8G`Wy8p1GFyH^pC{P8nH$1Z+kBYKj4XThrSaK509(n)pat zZ!ABoYCW5(%m95%UA1(pJr7L_zO^x28!HI1jx#PP_xiGPItmR8wYnG%6&A`mTE<4S z75~GaB6?iH+57duFJ)7FhTi~}{ z*MRi5mCct!kuIzz4R8mSBe)QmUZfM77>&4*6Kc`cxA!anzf8(sXgMB*`ZiJmTdFiY z=JDF^+yW&im8RtFU%*bIq(bNS-`3Lyk3;-Mj0etN<~Z9+YzV=tDh~50`vd+0WqREeY&KnJf8#(Me2x4C9CtDHe8%yMi?G*7SD-)E|;wH&#=pR87Sa;MO@P-?xTbWt=phQ z$xq}+!cy?Sj~$}RzSyz+DD0cyWQD$m+|gl(4#s_W?AFvZ_OLikHSJW$(bzBZu6SCr zx>-n?wWKKX=%pH;Q$N|N(v=a0rBeQlsUja@6hWMok?C=ON>r-RkA=9WWft` zVnwwL7|4&>@*z}aLwE;>v1JyhWw$^4#X~i3A)=~)gFyWPpGO~Q38BEo=ULhNwm&j$ z^UH~Jq%=1XB`ky^nJJzeCxkTF)8#oSi4nLg3~{fP6Sbmvi5S)n?GQ<~YGy@HwgbvAT}s<9b8C z#HsJV`1^J7a8&ofWvf)UIA-U@8+-!7C*Gm|;Mtt>hN6S>y4Icc#pm0)izv_Kx!0u5 znx%p=xK1jVFTzu1Sld@= zLD`ZJPnULmmT$8Z?|1o2 zE)N60pL@+WXegJm9h?@4zbqfuc4s5ajHf)i`>;Ux{E^bGDmKerI15?JH;^a?OSUQ6 zf0NjrdT|pZxZV8A1DLtaL2cJwOipzy&gX`_k&U&6_}9uP&mN?tUF@5qKV0W zYG{+yJ-T~6jTO12H0kbPUK5G3CH(xjG}}U?SRpTek5@v~UMz5Ky(196(&eq?wQvV0 z{LSd{B0~5AqF^TOpxe(qd;x+T0HTDX8t}L&5bc$T$TbEU#o<)p;m2Q;WLI z(8c!tCFGr)s8z)cm~r%^?*Pni46^nkq9*d|sBZ}h?uz@!xxBQgZxYSgC^@7-?_2 z{d66x_f-mvd@)~VU~bZKI>j*lI&Vx^$|txcjc9<(Xrhey^gZ!2rMj@nYKaUKfJ+%)i2F#*{}wuIr{>r;@ivqhG5vW2W8p zJ~O9s6Aw0(q##a%AN6u$>}6642=_IUbJjy2bTG?4-jHaMw-;AfSGgAhrG2aIHtZ0{ z+tyLZA+}C{?Hq6S!(CyyI$%I9AgjFK?2|h#3&ud+q9g=*B%?hZe|My-+4bu!>>)_O%AByn6fwg2EDbWdeEIgx5aPvYcL&nEzHwNtXxL)M&F35ROkw`f6-^K*V@u|8H(8S2YdIIIQtV!j>MTAwmrZl8gYi&QiB_*-C7dJsB&A6! z%Q+bBH|9u{AVvNuDlc!KFznJCidx6g6CqrJu4IM~yBjN^Jt)hgj}DGr2^p4pI8MT| z6zO{dArv9Wb4)<%?tTlOvWe#UhWMiWSx$lL>i!MF!jpABd4=nCT-Q7FfVHr)2PO+X z<*i$$&=uQ(BeO>hkui6;exFId-BtdSMeh{gbC^y`j6Kuk*?ZruFFE<8_*rkkhv0p* zyFNiAFHpu-wnWFOzN2`L-wBmylZnqp%++!x?PKGwY@q1##HbM01vpo8KL-WRhTD0BMB6w>1Wm2_Oq1kC7ppHnwg3V3E|`{%%ea9a#=OI zJiUFsYPw3_-vJ$e9Q|-@ItQC#kVlpT!0hpp@ytO<;)=07aB6)BXGr-HVjZuhn1fu-8IRo;*-z zFAjG_co)t&&9B7@ljEyNJTt+-LEW#w<(Fc>JO6d|(f!_k-I{~4Sa(-X-Ju@O96{S? zbb}>FdLJ=I!!z6)Au3qCDsQc2QH;kGs&k%;7Mp^w+B;XnrgQUKIN#2*;gGEaM-I57 zXs8PEByN?_feAxj5O+K3fv%guiA#d#txBqA(2I9r5jW^v zt@z|ecv>C&WaT(g0XX7fz$2!~oc$GUTL=xrcLTT6-#MmxSa z&GV1hw@hl&pXu(Eup5NNM+JzE!w;&^a0n$iL=<*EQ|_@oK*tFqV*k;P6FCd)D|UZ| z2*JH5Kpkeu>bL#W>W)NX2&qyZZTj#X+CMj(UvalBP6Rrs3+!{tBn?HNU^rx(>Oo4) zX}OX6fFXKy#A@FZ*goI%78`R+Hh*!m?qInwPbvOsXIFFXYe&lul*pDjFdG9gy|&nN z!j)TyU;GThwi*~+|6c6SG5PKViSZ5DH9R}gszusv*W*F3Ek+I{DV$lzr(n@pEcv5$!1%yHYlm3tSeRsV{Vy z=awhp^dP%oCxu@*!lHL{U$u2-ig-&qHuI#~hfsx~Z9jet^1CZ*{yiYY>l7H1QMjo3 z1rV;UZcy_9sao;bK>hpSR#}Xut1co5Psvd#VG$Q83L_KR=qBhbZ<~elV*j0y(jlUW zW#P`+=3%!wG5PT~FI1|#byowqDQdSoGC%dJg{po15Oj9B$wGeialoUZ9C_Vy}BppIvP~|-hV7$6#ARRZA^PswW75)!{%CD^J|O! z*Aw{^D}eS7n8hN3OZHDWbvt?5LTS9K%H{>e%nvTCNfjG%&rm1fn(#loxfT|J!DRr;0X3GC6l7ZR9 zvCcbk^&>nv>h~?ZnR$M(9`numk)EEH`q2Hw^j39y-57<-4UX%`X6f07?)86H!zl4e z8f9t-h1>;L3rkauO3N9jlK%4G2ICV_8|c6QFj6%$UO2SwLXLKtLPru~{_-}D%o}g# zLhM54guj;ji=x9c>Dl5MQq6lC=(G$Z7XUK7}+>|=-@d(Ll--@&Q!#NP9`_JVulk1Tc z3sIjPkF**ZR64bT$XC>1s3b#&V~xPO!T6lX_h5lICBaW;3eZITm?WZfFlK(W2Q;$V zS7x-(;xD<&odURt}okjF7HPtQvIH`u`BbM0qo=jnLY2i0+B!gy_-R{4lv&@w2XrF})M)U|wL z_4vs+({~BQ>+^TU4u_^Uh!*Z=vq-0p zUfKU~eS^jO6bE1E<`L2PBVl+Ka?N{T-d=t4c7^*^(&FMo|M)!`!O6+Q>~}Nx=gFO2 z7e6TqH%${`i-!kiceXu?m#22Ntu8M(A3V~11c0}a>H&`@-%G3Zw))f@e7g**x=My3UhNXO5Fk&U(YefoN1r{^zDC z7UX`{{b#YPG+Q}cX%5)w!*D%n^yJE*x%r#3_`JAWB73Ps&6C(RSb`{My4!jBSArZGN&I_wczA%LgyEJSTkmJuYmy$N8 z;fntOzw~}2`<>zG7kmBS>9{znqz>Bo7gft_CH~8PTaEoHYU7{+B+Me7?*^+cipO3Lcfwp@#ZF5UQf9STQ zH+ZL4yJ+gC?>t4GA%7*3_*C6JjW6;4Cxq<0t|m$tMPXqg@fo_CRamrCzXzP?S=?Zl zdOl`x%B3ru7hWB&FILxB;)F%=tBM7vdgsDinR9>&Adhq|;#VNbdBgAXhl5P@W(~bN z9rfgx6ze;%4Ow%kUXdX1(?s=gX*KH=q5+As@t@VtQy>dcWK4BZxMF40kE|k4bOnft zGav~nGtU6isY&28b+CW2IcrGI?@82XY+jf!Kr>;wl%q5?SvdZp6DID9I+5q+SxzyC zq%9^`b>H=Z$Lx5r{MrxgJi^7`VEn941U$S_uRC^db2N8ZrJETGty~qx?+xSrnH)aX zwDaLuHxt8<^E*Y8JI*05Kz#AF(Iv~r)G{ES_4yKC0n7DSe_>`WA`oL>w`KToG;xME z&~WpBMWlTe^E3H4zs!GG=HV!tRpVzE1G63W0yCE8#bG+?&Szo8^;DH)l#U9A_D9L5i_X%harWC zLr9fMbPqKKdJ1&neugCUr?*Z71h`LKYDv`>@jsf0IFOUj+PzpFPcNT_4%@N|oi5t_ zKDae~ziVfAo!q}GW9^@d;zK`eJby>qDP;^k|JrHM4VwVjv;oA@^mCq0g#cc*PN$9# z4V$)s|L~pB!-Cv|Q*r#{e*o|B6QODuGF)YhbrLagb>E4$dp63(EFQw5&v1Qq$73q? z-#b`Xi+K_$KV!Z&R_5|{gLX}lx?BA>(2K!1Y%n{L!}4ct#V8;^a(f{`(S^x>MjleV|J2H>(?pbQD*0M$2BL^`wiPf>!T;gI=1| zBxy-iJO%evEsu{vUSzE_eh#Jsj*2VE9+caZP46XjH23*f&D8yV>kPW% zfoR2l2^*zsq*8J__%bzEo4?+)Y4)S>aQDO$yR1=nr0_k;9+zE4;8{5)v-~MTR>Syz zmguo?o~1Hi=S;f4^hOhcn%JhpXg#t`DZU=uk@I4s-x_4c}=z^jD z0#0-C?7M&!>Zq(bk1vI<($&R-K=12njq3P~fpu(gR+#uLrS-Y~&zk$N5N$2TLn5FA z$R{iN?RJ%Rf$n=%!r9+qYIk&ojGq)Xr?vaFmuH+4+5gV=e<1=qqc@q}j67XnTQQ`W z4b2R6ec*>EMJKi2`uMoYd%Vp=-Cij@-;J)(5%82utyVkX>TloUT;#lc%ldaG?Rd|r zC|99C@W_P|Iwwz34d0R?auCG#$152i_2lIUuhwo#ZJJ%b2-}!^bd$oYWGvf)GGdJ5b_Wo zJ^{Vc70&Jw;gpDz!H|N142L-d-b3LF`N>cmFCXd;H;Z8~!n}~{!Fft4aW1VNyZ(Nq zACN9nBh0R{RQ3GrmTp_Okpc-F67d>k3x()O# zN1(c}aHnBTO3R~Y@qM3DYUcppl9=Ya5h$GH;R+JSSN3qcb`3?8F3SO+Q-JM4yBu-b z?cTw1>Tl3LU7oC-utG60h<8Hg9{6LOdBH}t5OCni_pP$G2p)HQ;??HR|jaViLb@UIfp#gTZ0cFHNJFpO#aLiQ2WH z^G4djC-dDkUP1xT0ngH}Se7&ee>i#rD>Uelm7`2IKyD-DUWf{qP?#)gRL^9C&=^G5y+})%J{4FLFZmcZJQJM!GHmILt;TH@ zce%`WvH$>LWPlcwwuUvJoe}@T9f|9 zPpY_(AO-Km-EFw|m;VX=l&}8=gjM>B&_Ul%Lhgpp2FcGfyA%;lBod!7cSVw5RnY(2 zINg+N3Hd&+Lc(Q;Z;t@1A{;f5t~6Og6l!%72w;vZkM)+wmo??!b#(jFXM~-}yV>{I zhjyav3;yy69WjkmFf4dn{x@xUD(`{X1EE_|^m5|NBq!ZV?seb{hOF>kgU3ax{3#sm zT1u4qY7XZ(pT~IoWrdawf?*+%lLJ6(A18^b4Qj|toF_>0UI#jj}DRko6vN-)88*kQwJ+vf=P$j>Q!bkLycsr)G zq?!|eX%bb|lsZ9*Gs7|7d+ct-q|U3U;dGBvU4c1XWkD zCFBsp3ymX){Y>>RjZBi@m^wf1#;f?SCPq0*1#_eJPhH$O4rV zDIXiq4dDy62Ds};#8ho&&8rlA0Rvu)m?kH9ACvOWPK!ANPPH4(E9^I{Gtm%+JqC&L zBg;zXMCOZS=3z>RnxRUF-sGjL=F6qPSpwl&aYH@;nJel|)>pvIJb?E;DXV#4`G(S-DO`6r-85 z8fSM9A}RHBrJl)w8Scq5d-SxKRls8~JO;q{Aa7J|4y$ZjE45*@EZcUUD5i4SF~c4rI@$QE!eVvFz{1Af8BGTJTN{Y;Q=ZY`;oFG z{0Wds^NNK*GYn2eAnNnDa&5sZ1kO&%&?vt9zAt`SyrMDc=6uD4)td*Kij#tO+xCeM zj?I6@R$1qp|IFc#a_c!d+ceTotGcC+xt#y#8lp_(3fXgk)k^(>aFif)T7y}^QAl>j zD+#spFWtS{SqFVyg&KOu{;nsj8?Il0-OYwZAe*u*a?qoqcST0Un#mi#rv0rIKK)&U ze3PiNy`z=LRY%_E?tF&Y&69!$w@5@Xy+o0S=)z$xh735_KzY5BTF)qco&Nm{=hUjZ zxfal+=Hi!A8nkS$8z%E;{)tQ6OLvJKm+0Y(2N+m=udw$U^hFa(B%0t%^}J%H042@P zoGNq?*Tx~7a|6wx$uj}CL>1O`U+Op6!YI!(H5R4AcuO?bfXVv8o_Bwoom_8`a`b&|M2U2*6u$gIFxu)y!odzg z!lV&NgEE2%3ZKQN*{Vds5q)$g77y6Nq^)jtuh5Mtm0=%Bm#nyG8ft5(WUYbRj)M}j z>}L%!FD}1DTQx*liR12mp`umz9QqF9VZ`KAEc(OP*&X4UKd9K^9J&lAsh#2AkW*uo zXQ;zQ?2a$E%A}el`+95o52Fx6-l(&Opv`&P=Q7IB zMgC_7tUd{fQI37B@yd&m0@6%+-+tPQ_mK&DRq z+J-#z82PplHLC_W5jFSmIv^cq?mt?W6PGeom91%_ajK!bgR57;hOrj2XuRRnDUSp| z=OXdwm5X~X7TJ(>3|bWvqQI>)~}K{%n|y=C<(DoqG3B@$36<*#H{<`XCxf0AQjD+q1&kt#%{cn?gHm1ml|aB?Nw8D_LYr0GWj(XO9|4luu3y=On)q6 zOaZ78FLGx0a9fI&V2`oI%TDL+&t-_qNBs(K`%d{EyZXR8!Ed=&8T&m0E$T%r`rc<9 z2ra)pS0%IA;e1__x@E5$GxFAc3J{h!tKU>g9H%FQjnY1)w~Uf0_GQjg!7{G4H63a& zDqkS9h@nnuV4ooQwkPx1xpoN|0i{ketz}`9!-jR9xpqvEHr4j0D|6aR;|x2#w3SU_ z%<(=Z5AYk8@Hd%hOS^^;dKjAQblI!t$lY^~Dew6HMWt;~fn(Zj+B33GrZ$MmunT+O zCMYNkzp8-lF|R~}x2~|YBJNbo(Nbnr`r01{_cDHO<}5EMY6~f&p-1SieWyG&j$+u? zS{%w)pc-V7TIe)Bxgi1c(W)lLJyARf)ZmnJm^VFw_TTnQjm7dIVP8Bjb#mZQd729P z#J~Yy53w(hy!gP?Rwww~$Sze$tzUHIggIj(}pw4rNCE>S1^y_Jfp8)ecdPG9SiG)riBa7x#KUzV>yEgM3$bqJ5YBMqmTSvnyljSPfl z+~yCvZtT^xW!!D#ohRV5lTT#j0)#gEDxX-Ubtb-fN$mnX-88(Evbh8$hR<-V?^`f8FG>RAa%Q9lk!SjDef4F_ z8A#j#YrCyFVX z)cRCJc843uxhvtsSWm4=k2f`189^H@)P=VtHNV~W9+jVpn+e5Hw6I7ggQ4zy>(lUj zxVSeXOW%$8ZUCz>H6^!JMh&8jSgTKy%q=HoJ)YEfsp%gi@%9DOu(0Wj*KYvd z?|nG>7K46#Wc6o}lxQ%FP#Jz1E#abn=tiJ{e}K*@ zxIh=49 zHSL`R^Ho_}|BNKpTsHsL+ZG`FeZdpV>--9gzwn!0k^Dgk=Acgn+f=2P93+Ob9=5XW z`AOK}r4p!X2&+1f==25n<(?92;(>BxQ(~N}Fb;V{8m$#W>en8e{t;>Q_MSkrfBwbk zj_%#Jfl9|XA^jmKnDR{Zgmx%924jQDeUt_FmU)V7UFPCR>3E}TTI7eNN3a#O(&!pj z%k4OZc>RuJABpH%5LENfE)KH!4q&ju(0q;43wk>6!~z}&L|{Y$X2k+dZhxU`I)FwU zx?DcPPSBuHnWGa3K_X6@oh9AZTJrgY#v)F~U5HEmK)M)0$@Pugf#VW@n;r%00`C#V zkZYZi_|9q=on{`69Q1^XfsZqq4h2cUL7!Yr$nZozyK_0c=mrzyc1sFs>_fhd ze@Y#;^-4yo;`xXNU06$=Byi$J%rx>?wK@6zqp#-q{-IOnX-`wRl}wA36{(+Rm_GlW zmTO6pi+btdJtHAnZ8cb@+d9|Ssbm2dX+0cMt28k(WRt>Hl;-+L&Ic2jnWm6&F(BxL zjN3Y!!BS;GDo=3iy_rPdaSguRf*xYe`v@y{yA(Y_XwR4TW*Vh?36Y5lw&ccdgYWWj z+T5eb9t%kwuue3WZxY>OBNTtXdb>54@IwtG1t2=AQU<|c!AKxtQiudW{WYk>GL4(& zwX<{>Z?Yy~jzTwj;w;f#)G+FEtXFB=m)76mwbq=r5+5B!(stxy9BCtEfOT?)z-Uh2 zsIhIKp^<8Zso?bWuv{GB89}kkRSZvu@M zbY4KrQzav&?xS#J2ikgpLJdujkRBQw-hWQKer?mImit;^p9M3Ew^FEqrA?n2(GXLw zJOY&&Pk);5o;BR%hMeP9Xg9#Q9YPerb#HU~8y<5kVj)8LJ@@_-Da;;;Y(HHQ9Ol~J&Ug4{uwTC)@dO!GK!{Bu@8bLI{jqbj9ND9AA&-3D!%A&LazK^qxOuw zo--roHCYQ8G+ldo;O>-htGM3ax}>D2$E2C9>B-s(vk9HhMypd^hjmz-^AqdOj95?LJ3J70W(!9FoP>MEY=DdGc zn6O@RqjntM%hoV?En4BSiIo`n=?ctqQ`0ButGnD{V)5krV}XK|rKFmH_AE){V2Nz# z#Ty8+$C5FL@i-+}fb^af_H<*|yM;A;9#k$3MSbd3J2W@CbnHe_5{*oP1ATm&t8y#8 zW&{0HUyGmLc;aOUqB*gntgZZ#2$14r6g6llJ|z0f!>}U_QGZCx{3Xv$C~qI5M9F4P z{^|4RWj;1i-;Wbp-lhax18hplYr~95R^)3mX6#KNhj{FGh&yF$3Zb*g?u-LGJF%K1z-_ZBy3)#MZ3~- z%R7&fQD;ib;?~4XTp8XC)j`~!cq=d6xC`y#!y2ZN9R6EN$yh)6s|_=Dh>IE|tkxFh zo>G7WJz1t39~us^6Y*SfjN$4UM_h9=T8q1RS~1x(JyY+%#x%y0T6#LZ5mmLmsCjQR z7>$r(<)*>qoX5qX(HW83c`0PLK3Ri|JqNon`yq*wp{|k3klWH3e{U3)J)sJix@XOK zYqI@=h`@J@ln|1}$|XL3@ayg{uwYC3ikQjd$C*hrny@N2Kik+_jSW=3AgoFq7Yq~@ z)by!;31hnlt6^UpW5GuYMAP-RINFos2Y5s{#Cje$`ms{){v5%F0F0_Y-fiwXg>7jk z#veOLbmN67@KcmjhgLV6tKlYl4JvrMu&~as(L+xcT>?u)Zfus`#I0ASx@pzNpw{Gp zg(SgKqmNX56`F*OF}PS2Nx-$DTw5|Z&EiRiY9;%o$>bLycQkkdmMP#v8_)}`i0dM- zS6gVI?)V1TLt~ih(ohhwQa5B`x7K2~*fcIW;bKSE#@u#gonIsTc#fFp>2e^`$D8L2 zHB?u&dRvv}kzNu3#72>3XqC~t?%JA1pu@?Z`zYykMFAeuRXTTzI18wI*~mP()6}~4 ziQ8aoE5qj>?cTaO;$V&$ZQS&0UweN{Gwxk*up@rPCqvt@>XFbCZM70uo@}_)D9vTG zfpMAat$8Le+cJB^*Q(AvwjMUBvQ`bAQ2FQ;A_O!y;Wzu7RA>|trf-gjYm|z$HS&3Z z>$2!($T2dWOIP+UZJR>IiRV!x;h*AsvzNl>3CViOsx;&4&POc4c!lSr^G*)jim&YN z7|5P^6{>A!=`-wTZVN^pxf%ypWZ1nDm$Nj!*I6%!{~*EwaycdJGmqLpD35^OOnT|R zyfSnuWVXoNrU>p!d7Al6_cy-$3$Xdb_dIK@$b=;Kd#|}Ca0U-~j^CzM3zOc}0cL;K zxg_u?Wm%K789$pD=Q2;szVWm%T>U_%=*7}xD9^#vjoza6smCuP?EN1KWZvHhooe}blu2{yqy1cbLf;^tiGNn^Gv?%`ZgaAI$rqZn2-NvjnA+P%*3oqed?RYg z*-iEFa|DMmv5qq67mhyZglC2HMMdyhSo+=>fN;VK5K*sw{7W22T=e>5;n-D3PTv#J z=YGp8_zkIPZf*UU-6QMn^&fhgq}1p-i_r4utAQI$Y${i6%}V>mwSr6+zj9nMpH`_o zg~nzbZEHZIgR{mz_r(Y1Vg20OBSC)8H_MZrPToS}!lrnP6+Q_M>#u}LwMJ*OR7=#o z8(@S7VaT)c^RuwVec0pj3E1uusD@wvxK7{HIwS=c{P~^@wES&?!#QsSp1zK`SQAL& zdzZQK(ELg`aMRRD*Oqw)$by}jRH7+ z>Ni`jaqbV=2S{C<^R@T^u`q=D6HOmRUtjEYFt+KF8S5803JTs2Nc99q>zb!6;4Sc< zR^>gdZ)iQg+_=O=b-<3fwMS^aw2&dTe()^KsD{uG>!WX#=OjFm(ZyuoCO1zLjw;NQ zi(c}zI96(XtWrkNmgr^})Vz03S!Z5HVp$(V_ar8kS@T6GLu6~azw+aLu%^Xgk$GU^&w>lre- zSlWQI@7?2f;RP=(4IOkzT`VoE?0H=T$p4ieYG|)-XKLeMYHdY&cU@gQYexqGa`L+y{pY`bJ*R`I z(f_%VmHj`>0u5xk`-F*wk(uc~uMNJ+fA=o0h_$7SouR!wxV|6<|KBtJ+k5}#KL0xZ zy@|DhHRuI9Q+-J*2SYpXWe456rxRrT=iC4HGydnb5k*0|5E z6SVkj&#C+sSw*99-jPRTD`FiheP+k>m&krbh87@U5SRG5&!G19^t8C;cy_UAaN0TD zbD(Kp^~fuA(lfPUaKXH!>ZIA-bKr=7OHB>tharqaCaPMVhx+$bHsb$&@T-iuJNbV< zM8;v=efIAT7$dN|Q~vjZFkI^HvwsfcXimFxEN*{(cavBG#t>flA+!aRHa&xi8(%hHA<2jg?C!`W<(LjMjRNL{^r2A%m zF0+@#LL*NZ8or>1OB#ROXrV~8MZDnc)zLzGu3Wlu-uu=MXvl}X@l1QCi{5+M#xX-2 zlfNR4L{&7R;%}bKTL;be#xiue!M2rB`J87eO`{=CIpVmiwT>*KslzDft?yd#ot~+*f;J54e6s2;Jy7Joh@mXKS`69{8qR zYm@N^h3=>~{dV*E@>HD5cc&vbE)sjSKiRlF0Ikf4;7Jj+OcJGNSCMwh0+oTb$HC*j zPgqDaRlO3y$9JAbdkL4%?{8i;*QfUwD@hKGWG#72`0(7etMG!lGOm7Qt9oNn<>6EG zP^Ei2GgUv-ghz9nyO|!FO&0qrZG8LqFoTfQVyZM@;A{lS#QVG(HPMF5P^-eIKSX&Q zpUsGJU-V2>f3u7V8mHlIIqjEnF>TyncRms`f42^zcu0B8`aK69W5U*|$~W6hN-)Io z6QmU+3lM_W4lacc*VDakHeN4n< zB4`NQ@7<>tRQsZg&}1P|jwK)ILXpv`)r+l?Xs{}SqZcU@q1ydbtY^!17_8 z-nZ9WI@%D8+My?$uG-*^ri;zje#qKn$2JdOuNT_u?AIHwPiCceQSsn35Gp^6#Mp=4 zd#cJ8X{uFYBR;tFh9QMw_m+^-Sipl!|-3Wa-aEJzs!G z=m-o$t5NCjLOKhPgxdYq@Tf1FM>Ac0li7;)^bqZ~_ zO5IPbZcU&5oh)=}YUiysVCl4`Hnig-d=hf95gw!pRFb(KVuo!F8qrS?2;nzQ0V4>g zdxP_G2l5h%LEIY<67J&pa)O>|Syx8YShEsg+dp3(@q2VXJ2`}tS*1WZHf3!Dc7VZh z`*@>unJ&5x^-L>gJIc^AjSUn!4!l4r-!d#o?{J{2KEjIhf{LLVD1G}aZKy|8sD zR;zfT%iA3hrx#*apj?DO)n|5feY&`kKUHoBZMyC$=Rr2*kX8LBEY9h_=Y~|}m`-ws z!ESQsO!E^+U%$%L66NU>wto7&t8vOcz?5!{xL&rSvD4;VR90(Z@Vh zA(E9bT&L8gq;0qyMtyiH^1e@>qiC{NJ9wu=!DMZ4+*H{37pfEoQg|w|g(-DvvDW&N z#rcznx5&?jo7}d`)^-`oQ1Vw-;ly)IGjz~?z$cl-$8=cBl-;`}F$h#uFuVSD}RLk_3wO_G<@o@9I?|bZ_tlIBFwj4o8MeR{fZz-m%@aE=CZ3 zIH+Tkxp7h{ypjoVdj9w-^0mLP)Ms0L7iCZ&{=$7p90i`WH73L4Y-agN1odCJ_60gWOls2#;_>rltq%ACkE`C!?(vjbY z$v8tg%cs`Lyn3kO_fIoFF-jF)L-Z?SOuu`c&Yyy4baON)v|wF#O;=~o^I6iaf?C}Z zs~CZTLp#*>w#n_dxaGzz*G%YmOhJ;@!vno0aZ3xgtlav1#?jJE92@4%zFm8nyLjc* zyEpezR^p(3=X$z$gt{md9}b;A?T_xRi}OkMx}Y;2ASzB$EL0`aam!xOfU+=+DB-Bl zV5zGs|3=m0mUf1WH@ezWWGuL>ps{`TJRVmOU%lugao>GN;S39t>rqbkGpF-##q_cv z;ohG%PA9AA6O>>mPcZo{AiEp3@?QR$W52@DQcGk0XU}+zqw3_>_4E?2O5=skr26}j z>66u0+mmY)FFO9X{XBZC&A6~#-1X7(mCnSj zbGjGo4!HizGG~g{#%ZoI`QzlWI?~#ZcYMKyORe+SlF=OI6A75;3~ekqhy-RsDcR2l zbkm#By71m_sYcRFA1uXucWv#gk)kB4#?l1bdt>NU`sW}JTtA=3sI^kbLf%?!Thi!% z(gf1I*HfLz2`)!9pAtKgWOXyjo%e)`Ar_@c9S=O z=&uL_-2Si)@+(vr$(+=!#;FI@7}8_UW|`6*8f0e=AX1oh+ccf$m9ix;%U2X!YOLlx zV224I_lJFqP(vbl)F`-KjbGk^hd{M%?7&*l~fF^YANZ8z#8@w zp4$QG3IxlzG1zpR+$-5WAC7Nh*q#^`s?ci`w43J3XNgUhe)ZFMFgm5%9*`LE%hQmf z-)#J=rfnx~=ckv(EPii&p9~{RC(;x7G#(pOmw&+N##(!q6h|5WW8D34{~-Z~nc`PP zy3zLE@0K%1F166)m)NaCNxZLyQ~vlq7u>hzXfivYq!-q2;SQ+6S;2feT6|GyF%5&$ z%QU(UViS9L#Z=)$>>Um8MdUiw*{$}ySffr@=N=8ZDiZI&%)N3>O*I55LG^G4O^S_= zc`dx&VIz!d0ne8D<)D>H8)E?ii7JceiSVBM`O&&|qf1$f+7EQfzOFy%GGeb9SD7Q3 zsa>7BGy)$4O+enl2^2izUaRTVh@+OeY?pQSp@WR<(~*?FxuXfh5G_-Yl`Q@n`-|y* zcS@IHjk?A_ZP(S>6#nLK!xekID-uI(#%Y{)HLf1!9et@ zs}^kP{Z65(f?{+Pa*^8W!Uj%|&gW08f6FCRtDDl1R`;1F_5KXKzmbOs;^K;E^GAI- z6XryF$aQaj%J7(E0S5xd`Di+)Dy#7Hxh)_0VYKH&p_($r{-bU~kv_g)CvtRV>PvJd zIwPEN_RlOC0%t#cogztlUkAl4hk7I0<}I2ttG#(_9_L?Q9SyFHg*KNoog^u=zQ@kt zO(N^A>eb(m>rzY?HO*%)QLI(&&O#vl>iA&bl!bht{a}5Zt1DKV#4`rHQtq3a(Dhiz zd=NYZL!e;%D@e-(lpS7r@!D&B^Ikuep-AhishM{ol&P4lb3BmJcA7RUzT_u6HRH!c zx6}7HTM86BVHOD^;PAL1iQu{ej{7yb*WTC6Ig`mPUi^E5@9xW$IUms5eYEm49-C;@ zwjkltznzh>op7DJd8qF-TWMndx!5qq0*;dARUcg-B`8Q_N{2d#U1A!7v(xPpxBS+7 zfM7T)hwB5sdUu&a# z1kq)GTN&f8p=H{2WXEe{mM~9Vyxsat^$4=!kOD!2{nIr;cU==SU^-V@=15kgQO8Oa zTNZW~*lbDNB2ooC>-!^lY?npXRj&A1D;WFyl=nO|iE1UtD@0nnt~D059LJT`3WCmG zk;|?G9chJCw7s=@);FRYDWBy0v@*5qg+2LR%ciYFm@TAz)rOv}ytTT?%PUjl^2FNH zxi3V@vN8Xw@}zl09!kRR@6Z}asHCKl`}aZbt0r}jL3SM0e~n?%*1E;N8G)^x+HZ^? z8tqV;qBg2<^kZG$3tsKF5A1ZPrZ~-*c4;nOMeTTE98n(M{N%jD7Dgm(bXOFLPC4}$Arj7T!)vv%4`JoH}%S0L~U5gx^0jyxTP;c-tAf22g>_bqk! z{9`t;xB`Uw;IE;Ug@fc0oDU+n26i|rW)h9l@ON~>)`#7Y%dmJ_GFjIct{lo1HkWqC zx$joSJuCVO!cmYt427Dg@mnFMK98Qz|)##er zzdvn$XlI&Fx=+ja{wIM-QJ(=F$nMXmw#Q-d+GzqZG^XX|bO8)Uv?=VSpD&+IV2%pd z4|xRKClT>Kcy%v|v9%z^$SWU{LTrj;6qzJ_bF#$x9d2||#u#e@>DPg*+9TSk zc!T1kuyg9_W^m;UeJE+#M~zR&8e;9;Q+XXd>W6QN+m;QT?5CUPmA)EOuLPi*kp0Jq zhTeu(iIWepXu8iDGQBw1!-4@U>C}H_Xc|oYHts~-_Q%6Zk%FuBaE_@jU z$vgz?CV9R-u|Qdn#eW1Q%be-Hio-H2xn5l!F3H(8$s^3$j zxY64*4p25#D8dz?XXf|@@(ynr75zKLnl);01?$^N95TUbsO2+^@^4zAgvGnoSQHG& zTMWePvQ6Kw-X?8_MMJ+g5qSIiGBN8gtiVz4f2x|6730m%a~Oe{@9tu0NF+|?5bp&r zOHmb>((_b}h2k&PnJLv+y)w=Ju>YOB?R93#vLi?gqh2zznbJLbc>fg(=eh3w(}TG> z`<*4D7g~qrbjGQ^Z%QTjAu?DH+~V>3RWS@Fb6xA0S=jRTJJb?MFFsgR(s%5x@t1hl zd;8S(TRr;j-aYi!4ofC3vEh#|#LVy;g>#cW~%)-sJ>rJ@a_ z%6>CN)gPyX>fP>43+K)kff9Lo9vOw6d<3VJ#@<)lu;&{vTd7_{vd^q!6-^h2s_8ml=4w6ES54uT` z1NEoN4WEjAbO zOtoUD)^-I;{ca#qq>V`Cf(DLef?W)14tW5-0vQQC<1C#(E0$J&z2s>?0R4G4PU?Cvr8!3va08!**kdcoyY;Ea%Hvitm+ZN%~^+3%<-J*tN)ogQo4x%mi}#`WG$MJ<7zqM$m3nE2M z6KA}xj6sV%K9HL7+k4Kx|7QQ@+2jc6v91?F#$pFvJEXoo1P5uhh&kP1Z1S_Rg&sp& zWoik1c^XXpvK`l+YJwfr&wk!iC%ZY5pGwZcnZUQS+ zF^;>Dwlp)-YTmlsU`t5AGkh!-1@DwovlQHL zB@n|MUf^eM^_5ZPMtVsxHH@Xt3Y*`N9RZwDRLOtYy*fLqhB3fzgP3mt$JErkuMPI2 zzHI;djqgxQ+5+2+TMNU`7vW>^nF*9m7gYX z--Y0u$X6myz|IVJ?h#Q=+^rIhQVIg(_bA2Ybg) ze@0;+xH>$3ScO(47_cbT9*(mzuJuHB7ng+QBBOPr^`#K-IlX2u-QP-S4c>6Kt!CHp zL>h7`PUh74cF&G2GgJBsg{I0hY`4LljWVfzw1$ll)U~Sr6-njML%Yg%)+tg+Q0e35vt`uYTwGEAim|eB|6+fF zl@=8d70@5$n7^OEnxOoM^tg+XY^!+&&_zeba?31IRIzu{BF0(NIJnQHQc-GCs+K>W zfXfPJ{|=X%pklFSi$9Eh4}ImjyYmhCw`Ny&BfWCrPd011D0s*{)rLo&k=I4)e#1X* zw$X1$jh>Zm-H1J!UbqhiI3p&TrN9-&hpznrJkswy0)l^tA z1gF5T*OHT|H>0CKOMODgwtz9VHh%=@(3&3(suI29m8PR6zP8d3G%b>mK-C|CN>~zT zY?gkvn|^TBThQ4(T8gyJN zIOlTBoi0Yk4!k9T1WD%!8_stdJ2%A8K40h8C(bfOIK4c4bHCNMz`W*@612$r)a*(u z{}+o4Rc@Rfp56FYc-7Yt82o9z_C%K>HIID;5ma35k`S<+;-KW&f^7T&gwaO&Ny{eu% z3XDt2E5bu%Emw!oB-CH7Oyuawp*{RuzQ*n9KvVfWoK=>HsV(s=`bSB8@u^uYN_R&` zFt*I|$s%=?Ub?0#ob4M|OxHgB?*TUYN8Xdxl0owHl7ELJp=I?et`I2#5st!t&SK|0)?q#JDJ$%LB1Qs!%7?r!UHs`hBxr9qS5meFKK#dV=4b8 zj;eE-RhzRlC6!~tK7Q$1JpK!@aaiOa%119sJ$jUz)*~f{?wro7Zkpd=MmKeE{2U79 zkZC7Z$~azF%p9PC*Eu>P0e#5RxbSnFowms!rJyojTpTZ4Cjf{Np#{~H_wLjhIQ>Q` z@|OF_cK$-pcSzPAkjO$j;l`s@Lc#lcT`inWUTozpC5j5vyRYUpj0KXKPSS_qUsqH< zArL90mGK2qfN}}>E&n;LmsxeZ*F1^*HWz3RBe0$a%CyNvAsss6EK@8!=e9>zxn3@- z2Z>Bwe>Ry5PN&8dd}6$9x_4i#m{64(QzfZ_mgjM*5@3S=7;2DE{s$X6@O z?uxj>;?iV+OGCi|0w~lF52yupO5AtUX&=BJ!r5pHHt~}FSFp{nvyI6Tl7g4mrn0<4 zvZ=fX9vviG5O%>PAQL+Sv2qE!0)8!pcR17cXZGbIFfI9=-nl}lK z^0bEQo9kGf{0Qtuhv=(zOIk&q!)FB`pPp(@iT@R-E63zVVFt)XiBJ{8gb)%+ z#0y4^-}ES3if&_d?>=2>(p&)j^sg$d`g3Thoups$cCB!{;j}w4e(MNVTZpsCcy>cT z&y9t}W+KP+ZSSq~e4Hgo*y7mAJlc*H)zX8C2hO+qTT2h0Mt|Mfkn(7<~KfG}Ko8j5#77tElxMV(lsSfYij6|z||C{{1qS{_{N zd8dkzA1$%|l|nV3uci)9%PU_w(m$D{Fhc zI{h%9iv$;<)aVk`!5Foh+HpFjAoo{8T|t75kk+e0-i>_^Q71;qLZEQYvD}yxe{)f+90M6|Q^i()fnFy{gVPR3 zLsoZ+hjb-@l42*TDH_-LYvNfZ0*Ds%0`6E9c21)?GMfI{j!J?mc7T$&GaiJ(ZjF;> z%DCDq$C?ez+mPwBlIt5CHB9rv2qzcawu&&jy(V&JYHjs{SlOhZKwzJA%sg1>_GjDy zB1_);r5B<0eG&R(Z9}V~qpR&k!GfNR;R8g;Lta#%Hq>5FL zG$F4_oRHRroMcz|=%Ii_>92@qT3fOYs&GmMg>L!N+SEKbtQYu;S=(!_# zMR#Ufyjy}Up?^h9{TQjyyRNKqpYR!in`v%obyvs1D~!;vo9$M6@hwYfIA-^G?z5ngubI}w-$?xYQ2zf}*-?mBP zBd%l=kOzZH>zx{G;AWGd+Tm1?<8BgfkE?_3UmUcGd0%da!n*(sRKj3eU8#6sN_S*7 zlFjnzD6)gUtt7_t5_lc{OzB6g^(9iwEZwji{@3eH!qgY>afKy{@`f(+pL$=k!gw%T5_&zU40fHJnnmK<{2y_U3YUXr(s+=_Zmz~_ zJ5edqoT~y+XxTwHoNb-liK*7i*fVmjFrf)atbSnR>Mam}hBX6lCEH zS&HnVif$%!Q=C^@2>%B;!Y&s-iv>33^%vePj(F6imB}Qr2YWM9JADO0S2CA1`h4Vb zp)2Mbwv+91A+?6@A&Ii^UYfo0KO3W1F68O#^3gPMPCFX4He^TRt-enKpShL*2{$7w zh^grhxz+NAyEdZmQCh9sHYGpRuoNR6nBS z1Wg~mC_p#-5my95NUf*XqaS`JKKz{(q2;pVzs+ws!)`23n}Et#`#}^3Cziupx$x7? zD&E<~8~KvPL#d=y@!4I!#2Vm%VNfeKDAVgSiSJMU5%Z|{dk;-|pVE*CrRW-BI`;@j zW$?ZJg|fZHXG5@3z*iYgavZ&c5vCK{m@M8r`(371Vbsa)#5zB(Bz(F%zrrF~M!E|! z%VlkYQ=p1};x2kU^NHkSpdGm?oV!VA;3aB{j%bjwakE~aUrNv!O`*oHY)8_EV(fYE zThD=4%#4kIEgGOQAMuE4&lCwnFU!f0%Z|JF>HA!kZ-;$7M0mVF#Tqb3Sb_-vR}0go zyAJYxqQ%uu)q5-YCvrn{c`cH3qNcxmK|&-xM^|jCZawYtWY#)4B4Kr??Pm4f33IdI zi(m!lyVr}x4bi~Dw&*l#*@dTE1g`==Y7L~2roHA%u)}>Hs{|6S4gBju+N{<>b-N@Okg%i{V2%h$fbq67CZ)Xsg>nf zjR8zfVnoo_Q8}UcB!egDL@xatlPTUe=Z>3WELKd9_^OHEUO3V9QQqDN;*(r0 zNq3rU7d|b$KAfV)Z+d`IQd$a#0**K4b?p5>`yX_rNcx=_+y1UI$p3T0$&7g_oL=wz zW;XTu3asiIZ|!fthf@a5^@GwtnoF+GzArKNyH$jxg*<=?@xqaLVlo3z1i6pU?DQ7f zT_}T`R`-_L#TnL)f3`lnJl&g3e=(dwqnK<=$G3f?!+9A0>I^w`0WCY=>FtmE>G2V$ zL7NCym!B#_U0t3dzV}n%;<7k-dV#m@`oz2==}-IBmRmfK!v(st#(+Oy{fpJFbC76# z>}VBhd%%T8$SEq8ogHwW40B)F5yW^^hcwr<#AK^_Q=qe`24lPt!vI!}mp?-2Dy$cq z^Jq1^{Cvr(hcJHAs4MQy)eY0$38V)~KtSdSbl4mVE_v}<6{Bc?^33=tw!B|ap7-s| zNdZ`{JgeaouPAIu}drD4<(59&{1bxv=w-!Og(*_JF>RIS=BAiEz2T%eI7r zo{_e~Lv#rXQlea3PMNv!+Xr3OQv;u|UNXmjY$djj!hF-8#8D9#&!l}5&bMn5Yg&b~ zN}A2AFkONnCzH%s1@DEwLT(jY^1}}0dP%k{lo9oT(jY9KElToiY+FU?t0HitHAUpK z(jM=(Ki8*WfMp})aA1Yuk!V-i1&QS{#4%|PT#A~~y@q+151<0q<8zYKbLhXGO*#va zkl?f&OmhQtM~Ud|=?cPbd`?O+=kiu3{s$-Y%PXPx?79r2U2t%H#?5|xkD6FBs)}Lx z_9c4z#^uiti!yXNv$S`A*q9ul5R~G!na^fCz)r%FhW3hg%**`;q(+DBXqa6kM~|rT zj28K&`(D#&W~^^;vCUH3Bca5wj4GUJf!XM(_I;znB27vpAvzN8^VOGk$r(sfO#yX; z^F$ifZWvI?tRS5@IQUz(Pr>`?@8>0PQj#(e69p{g$IpuOoepic2W?`*)%(GH zmpX3Qen-=?=1^WyvpN%m;(u zy>B?tvC!~h^{a61OU4|{*$+<7BP~;Z7D$OBFGhNMG$itzhYO3@in;@lJ+S%9LDo1? zWsCo0N}rP%wKs-Ne}qBwbzu8TZrb->?qM?_qXPz_?%Q$jpGw9~=LOfm@1Dk#sec{F zQHhl}PiW>mfNg;03RK^%NsuFaZr!y%Z~I_WK1#q z)Vz%TG~wazSN}WnQ{FQ{ncN0uJ)Yr8#mYm^fi1uMx?ewpj{4Xnci$A#C1ZS)&M0oj zPCgdBb6Dfo6O)JtCQ)Y^cKVP#)sOI2MotOHi~hMWmim2$sr9s5Ld>&qC!{Kc zo9y9hC%XAj;M?wCDY#q5NMwJf0=UxOvH16g|KD!#yHxQ1xWWIsH~c?-`-|H#g#XbRO&e}o603~%AC3#+U);q#n8qF9<)CL ze0zmz71RQ|N5IC>__?>`_NL$mr5}d4IMnl?^Cch;GVFhVgzEyhemmi^!1+S#`Dgf# ziB06^$zn}DkF$O2mg^H>4_>fF#ig&bTa{Ya1`^nEM{t%{nBJp9lpNsK8Ft!Rng>}T zu-o1SJMGMH=(as#AKIO7Xv&&zbUkY9WCT8Lwi^)27Fuhq=Iep{qMdTxW%!ECNV;qB zOG)zueVCn9Mk0lHxOCesRWbF;_=Yy`8sM8wb(~O}BU>l|$$;ZpqH!}&%>@Iq?8*&# z4nh7&eI;bl9sbHV#a0X?3~4UQ$O8EO7|VI4`9N@+16XeWLIPUj|57V~IAlE|ka%;Z z%3Ke+&;rcAVAlmMmj#cb{@gS-vxDVM0MU2nbU_9N2<@eQnsg7llWAjZAZGw6jBl?I ztoUj_@b&e9)CTZiq0&InsNBK<`QI71mZz*=51Dqe2e3!KRxVU+^?A%?HD~e^esS_E zTCVxmXQ)O%2pA6LCyNfFGVy?sh1AR~e^x*qh5<<=tR)g-D6`q~lDB58KxGdM8R!KB zkV7)xLc91)DgK>sOhL_gaW6 zqT#bXdbsc3dIh7TfK~|zHX0sCqQ4dhfRtCv)I*YzoA)FpA zQ#)!S1qw2f@h~w<92$rIgJxCN1r7r%_yZ^dGbM8Wmy zX;8KxU>(n>sqyxmEM#?*H>7DPfY7BqOfg3qA3Y;rI~0ji9G@ffGck*vXe_-FWBqUP z`bw1&EmO1npwl|KXe1#Vp<4oz-Jn!XlOfUpyBX8mSc%mThT@-boO?TtIDn}5Q-$Np z%SbOa4JNI>tq%>~0J`~JE41@r>eK5VOf8|#eP(n|ion2xlZA=c{raw(SwbzB<}t3M z!jglf=qKa@v2Hwg;`_qq9*GpFWWZ;-h8n#$md>H4eo{oce= z6YiN~;Pj^`iWEHwY*wPg#Pt=x%;Kvmzpwhp=wKM%WP1cALEgpxOy`*kW_yKnO}fK~ zRJ75knN2ZF_U-W6Pz+q#A7EWGS+u(MxZQ8pxmXB@72n>%&afha_I_-Gv`E)xC zxY$W*Sfs}Cqif57q4Wv>r#wna13psqE;~L1AwQ~znA2FinDfqJLMhuGlv&PJn^@{1@vp`xqy#XC2^z}>fEu8EiUm`A@|2Vcien5d zv32~QAYpurgWqDNoZ~au^N;;*^;V1Ba%L?2z~pg7Dhr|a?};My zCOG}4z#u_EV;K|HYRRKCRL|DOFB3lO-hcQ+XYFkV_j6GNz03-dC||$GWc8PPVPX2_ z)8$mkyI0G9KFq+l{Q975nt$Yg7G>ADi3kxe{}GfnRQ9Dz+m;zh8eyvNbcP=S(((%z39 zIzT!zx6whU*|86)29a6t41{ru+6>j6P(C6i=?8JSPn?MBtb$okmk@aMG4%!BO20Wm zH!a4tCB>zFGVRf!+$z2;Ib0c2R-7UG9ugD)e2zNKwx<3;^H!7(7@4I_=<=<&FGh1k zG~o2hxQXnhSoQdyNR^57o7jvvWBiWLS;`CV<|=J&<(_&H0L6vD1wD$$ zBB<8y*=omY8G%*zO>UAk>PtoqV1{>JFMXI{!8ok{Oz14fv;KPlg1nlsHg1_hpr^Al zr_<09P^0X?R+TP3C#0AAm(+!s(0M!sRt!fgT?d*kG|Nch+c-iK_^$=LHC#hS#Eiw0)obeDV+ z4qJ}IpJZ8x&_tBvjX>pF`g0+B5{-_5+@{qA*;#GIK4DGuReCw_qc80SLGSyhajj7Mcm1<}fk zzVW)ledrStx{7%-()GJS4r;d^H}~tRm_g6onZ?}E6nF^V(6rNCYMhI}<3q;Miy^Om zIsYv>>1mBjegBttq1E_2rKyo+7!5(^AqTi}_^=P+LI)Mu8mtue+j$1vyaaNybFMpP zbV;sFa7OrSU+9l5QD8@b$~t>Nta<4dGPj@c70t%-bdCG)k&N2h{C?|BsoOrHpu_74 ziZ6G^!g*JUiM!I>G~F*jE-U^m4F7$wy|CoZ8K@+hA33UCB(?x3HK3lydCMaW?I1Ml zhO(nL30|=#E0pQ;H}&Fgpfsk0o+dPCz)`p|k?ZXo`F;)xOEUj)3$y=27)-T6dl7ap zm8}`%^v(p6gUfbRF#yRqdLcE@vqNIZPZ*O`SRadRc4ZPKcq+yY=^T4B(gVYWi!TQQ zZl9ZKyhN%f$fZ3}Ouw$Y3$m4k*f+8}N{D#@3dcs@*az2Hr;0CStQjLCb3`iSIc5F~ zi_1(8UM`PPjWao|E1(ukT^oaS>2$>|Z!h$`06G1LJQR^ltwavgTcj20Z?Qj##>yUH zr1{`JA`^~`yq@k)X#LPl_KXcrHX+5jNW9N4lW3cW`xxW?$#4WWSSr^t`>$DdK_v=V zP;wY8-d1FYGV3mzL)uZUM{iWA?aR=rXEY|Fg!uhuqSu-YWCWp-0UIic_wK)ClfhxL zfrUz&rqNQ3CkEXQonej1tSP*F?i^w6ot5}oL{FRhWs_fPk6{e!`~qNB#AHTyC=G1} z`dCrET~MX!*tN5_)i}hACcHcd8M=+>i}Y5b=UhnH=@1kY&QAZhkYFN zK_Ww0L1YatFx+06lMp;c7JhLrdU8P=n&I^uTP4qn8#3PH?%bTYIK(xOH6(2S`{_lU zw$ZE@8pkT|23fWs1I*1T{dZgJpom8Dcrz)4XC1_8zwby8!#6M;lLP9XoLGS@eGR-) zQf9opLD*Y(oE8_>@%Ya~f{tDzVTy52GGiAR?9DI@lP(8JnzbfJxcY*{EAniKlTRL_ z)Na~B@;=0e_MSKP1LVhz^Ri}C?0#}8HZjhcF(xXH9>3vew8!OPI`wsSzY;A7ey)K; z=wg+z#mrJq)FAk%#nlIARr>elg%E3$B_p|0`JngvAlWRDGoi2zYLEb#<~z`kA=gHr z_-!SbWY}O3hV!u^&-(wN41Cw|C*uy-MaD_t)e1LeOt+Ga#WSZGnBy$Ta91Ps91@t` zLCmO7ct|1Vu$}#<(7^py)VJaeWI&?DAjhxzZw1Kz4qg89+5cW^{O{2v{c!022gq1| z_ngR;V?g^pSPCTJt+@h87$Cx7g{v_PD!V{Al!)x2aj$* zeQ+wEh{9j-X@1OS|G7o9=Hqe%wmWD(DUOn6{=l#o#($W9m^hFU`|=Y zk4I+anoi*KT zHctPacrN8JF|R`&fJ%2DN(NL70!3rd?gxaCCl&*u1d!1gD)N2Eox{Q&3aYGj8;@kK zw@~gT%i%-+sGQ||0Nep|9nCU$gP6BzM*~7nFGC4GpgGpA0rq4CMyC>^km~v0*#P_< z8T|{wm9S_4ETru)3{ao>32?+8Sk}yUC4&kdQ21B`kfae`rrGyMG9-fdxMhcUEjPN0 z&{K)ZjnUi&S^7JnPnd|}FWdrf79CD$z0er1>7)jP7?#^90qy?*xzsz4X02Q1?FR)s z92Z>I=Rs-rUCk^Z531NJ_D4p<=BWhSHa|H4>bf~!pUhVXETz2t9QA6<0AT3_<-SzD zQvj)XH`VK6!{xf~WH?J)0Xz3; zBxijk&RPK&(bo0MFNoi7-00-e_#H0wBLu{1My~)nYzs!iiOUZT2nZjL7pgo0Jf~c- zDFCrN!`O2CZ`J!w09GV?NH|#_?2q!NXj&qx)(K2Ek=L*SP+>Kgz(S!6!7ZYmGv%gQ z^f;0U4GL1JpLazrZaRVQ_5g^_1h4#V(P7yeizr~hSk~kq?2aIji#`}v{vW6-#kmBm z8`J#IA=tCc+B`f%z;ng}y^GZCt_o{Mz$G6jk{z_iph6`bF!ah$783z5*PfXYeWnmc z$M*Ces@wcpfTw^=4+k=o`dw{YfWf0yFyMro7T;Yqv{`+5?E>30W!@Mt-^0%F-S`fG zC@H8PN41wXf%uaL=i!xp6aee7QP*MpjZbEu(}Rk$AP$D4xXfxAz=i+-kICql^KKMI zlj;DwJlWBlUno>#`{OsNCoTlMv;e7okvU+)s_VqnC84-4FPxWmm-kQiBE;!3(_yft zJa&ll?i{VA&jB6DD{OhFZrNq~eRud>=dqtJe_|3d(nYM;$ch$C4K%%dTVLr;%qvoShoc%Wx=^7OO+(BVt^J=OzL zw^-o|+k0G(t#KGwjE*mG3*x{Z<1l>V5^ZiA(?OS;qW9WBHJf|r3I8?FLhkfu5|B?W z*GzrXaRR``0T|93^lmAf_;`J}0D=^rA($8YBH;D|DV)7Zv68{Zbp4LM_xj=ZRzjDm zT>T&ReiK+9m}mdig0=lG;0Ednz>N;!ia_(^C&qdtnQeXync(07FHv+>p>K2bxv5S` zfANhWz~tM)_eMi6WQRH(fY#|(vyA>}grhKFc>x<$2(rnu*SCn$sHwi5+r>9-~z`27p6toPPe zDt0iinvPI9u)TO&$lc{;+-LEda{ZN0%b*#ZyJ>0D0p`PG6{xPve*-KVK(hRW1}~CM zWChgO)^OHS-f<80TAQU1T!tCGz*k6yY;Y9!SjeMj+-6e&RuGl4OXAv=V3j8F>o3Hd zAGnc++jPk4hUhqSh_`cZrd;eQ^1FoNy$9wE2zB}O|3D^cU#_4hZQNlmdJ<6tUxoLl z3Gn&SY6D6j0&;~`gg^=bm4Pw#sKmU&K?$zL6qyVT$V6U>yN?k-E`9629_v(Ev6K0;ly&q!>jEzD1E13#hqqhS{Z0uq3l#Gyf{}q*x z^86<%@m&R*Rc9PSajnnRZlnF(U)TU`qoKVEzU1>&0CxB#|G!`db2#f0ciiV)4?8}l zCI@^jU7>nNdBC+M;F@3~?>hcLt_M?BLd)in^n0RDMUQV)q|7MGk)J=$MZAaJK@D0W zSCILs^W5%!!%LJA{8+=% zHI~w(k@XPO-z@(QZLF6Y{&2H?@>jbNe+y-C!bNv zx?+GA^)H}^Jy({vAE3J2Az5dD^SqtsAtiNS%vfc*D&MwCk4NQJaYJ|oUKTnD3$-WM zHasZnT>+JRL&b(QnJ3>qkZ`ojiYWj*B^^*6^$zaDFPG6cTI@hdgZbeQED zme!KFqJ)N}N&PkGfOYO!W7d(P7dD*y^R>XoyJn0bjQB7dnTkD(kvhfc9yA~gcXvHY zmwMGrppE&zs)Cm;8meyicP)0v4%mx1eYQ8=J&f;&X8PXJ`!;nsXwPB!u47WHj(wl z#Y>tz5ac{D=+cw;Ef5xE=BKdN!95^;6utrh9Q|Fjl~q;Ml}E;Pau=zK|6X!E-_N{y zg-#HN>RWXma%VgjDdoKWSdfrm&?lBQy3ZV`rhoK7BA};6Ytl z|NbEe+Rt~vtZN=7hStMAZA9(+W|Vp$4`S#XDW?!Y+&uPH3(uH({dj(V3mSpn>U{uJ z{C}(WlZ@Z$U9ISUSML_r{!#Dm1>wJn*QrUGe}wAaCj9)5+(rmlRVPpElslg-o%QOa zF;~#W=ad@jUpwZcKSrguu%ZWoQndywN&_^+l0aBd)xqV-LyVrPkS7m-QwfI)5`l#I zv3qi(S4;-zIwQTLO!BuKc0sbBADb$W@(M_NMa=T+W`4Di6o}|m>&4w?7S_3mU-kD? zDA13%5s1Mp8TOk&kQaG^rs%A>ADcC$ZXLzU8&{5|HG$vW$_rF`q-BY*UJ`abcvRZj zsZeWoWw&lvk8>^TF?ndm6&FME%rHjZ@031er;7rRAUs?Vm)AGJzzh|Sd zz7n0;A_z7n0F{1OXmkz>8kw2JNEqo&jTg!ZSLAD4U&^qUk{pr%XS^PIu#8}BPWyrdfu6B9SkU1gfAv zpOKVv64y2>GN6dK&jp}?%*f2>b<@-t^5~ zGTjC*7f`Naxw5Wfran(^5*)a7Ka6)#(L~k@U6G!h|N)FVX6Y)MG9u+zX1W( zTLD3_hEW26WVVB>{}SgBFl|Y&Q3x&)v{d^(`|h^Va3Y!H(Cpabme(yeiHdU#U0flc z*@tclvTq6Mre6jHUN#!t=q20fzR=*f;&t@pU1_x7N*7>6=)Z@k43kD?m|Qs+kb3@8 zqcLq7Y`eBtQNUz@z<&kgO+1Iu3>CWb~S4*sa_-gGmFL^7g zECCdR;N@u?fkXc>s1HSn+h_cTiHzJ{$Bq!E`t%w7nXR7IGDb_=@}ZLvF~#^wGsZ76 zf6s{gAvaGTwCn8Xm+IEBrEw`TUgf(tQ@PV4q}jqRWCj>?e$B*&c-Ru;U6>Boh(1hMa$-A&@@cx8@38j2NZ?i%VyJ#ZJ$LbJ+34iTT94<{CR;lB2#F;&WlqutmSMA=wx``s4m)( zWldGKuST)HeU)}x?4#-sM@ z-AeifL^;Y$&Kn7m#e#d>6`rEuzqI~3a9q-qyMI~f5ESP^b&o(mT7Nfn(zexi`I4ho zTXR0+#QG^l+%UV%6G-OwK{yLlIH~^AwWa0I;sv)$?i^V)(Yyv$Je0;6XK>9T5+rK3 zrR>_J*F1&=9CF%0VmQ%A|ABs=x)Kz_PNt1w>!4QtBqb!h8nzuRj8pFf73`XMZ}TyD zz)se*5B*G6t9Dse8B+Qxz6edx8|MzW5`9vhjW+q#1gVZ;eg6q^RV8sOfa`ji<{-hnyBs_( z;}*Uh-Oy8F_K})?mg*hYs6dlal>37JaWT#IyN4*e8Uoo+M#AFcEFW1UNBS4TEP>Tb zeh-mwvD`4i{z^(&zL&0bUxSkkS~kXP~coIueA%mR#v z;mZ^$f-7ivQ~`KId$U-dQ62d;(LgWJz8YyY$dp#JQVg=*Iavo}Q#ofiEeAb?nX5p& z+Fdc2thF_@D$p61|J%bhrRscFs4Ep;dU5AsM2Rs%JLLRoCdeTI9YtX6V^P}sNXtf4 zE9;CNYJNQ2CC41?cwf^l3fL|Rj`1ek{v(HZU!yKfRUgb2ooX5Suo*c;pg=EQHdS`g0-U#{ZSa?Fy5vlG8m(kUrM*ZKxgf@TBfbLqJT3l`S_JAx z<|xfUyiy7`ZU`ZhYZ;|Ma}_;!VkPqI(rRs zhDzIl)TEer4yo17Y0MB+?95)vOJg~8v~fVcUdFj|=CsGcVm*u_$SbA;lWXdl#{4!O z#8;RRI#7(edTm<-8wv}mCCBGmGAg@89Mp)X2=Sg8YM#nueEI@Vq8kQ>*Xf>jx-3D>8o zbq7z5TQfr!n!W7I1m=0KuF8a(5K=3V!(Wgt1a1h2Ti{2%Psj_2Nul(EpwgCk2xWAw zIU#RE(eKwwyT|5Bw-h*Yt{o`B@(QNspGAf{Ysx+%0K^b=fp|XVlkvS6i z1=rOzpT^SiQt7r2IU3lk4zhQgGdJNkNRO*xmy_$f6KIS`u))3ezAf#cQsfyo5$8>m z_?22%K02;GaQQ5*G&d42`hG?P&nQ*A%<`C#G><3iakN{7N0vEQ9Mc@UN~vbuAVT(N z?He1>p}Kt5&n6r-X{b-_NCMl385s z-ybNESzpPwd-6Rx9yF}q{VROXR(vbYt?y`1HTpS|9M|gT$4$O*MiUvuI3A#g0M?T( zTaOj}BR}P8$K7hO*7)A3&GV{T1rDM=vTO*}43EE}!TFz=4>CJ>ze;(7jE9{%fJTPMyt3yp3QYc7ed(LT2R>{=nsANgpeNt_^<;^SIT z@@Mjs5%^$)vh2vVFL0lM@CpEtG<#jq>f63FC3l^}Xkf@rN-pLz7jz`b`oB(bHMw1{ zXPE%13a)$3VlNBBmuYIBWOfwGZ`ZvZjtyO5-4Ez<>Gvfzd>#WsjliXq^)OpMTi?eB z9*g6I>1n>3h--FE`0Zo0U%Szc@f3jX^hqVZ!Z4{GnF0ie^5V$lA3&YFi*i}!i0=dD z)Wk3Vc2d5&*u5A9%>s3wNosN7qp%&iQ2`COXzLvU;A138Ll<5D0IhQHiOMGTsS-CH zs-_f@cMP}{U_S7GF(A!ijC9W%s>|a<^$XmjCxC94{?+mOfeTtKK#$4(g>pH-o}?lPATOt1 z2rbrFLc)2+t!eSpjQUJ1Y_2$|~LpXls+t&H@4e~p#pxJEg6 ztKBl)x%^hXIFHgD!7nze_gll2xStmKamjl)g)~go= zlFgdbV9HM|n1@zZX4Qoa=*qm^`%6!^QL>yUxSa5fIZ4WUuwbLMW9-zA9mD}(gbB=f z53-}&1pIUkBb&~304ARR>Wbq9L=|X3g}cz{qNg$Z}8R+!^>HP;z>- z*>5}3!svMPvDgnI&hj*H2Czn>tD#2`@pC5Ye`4r1;Jf4mxslubH0;|Rg17YdP8oUsr_)KOZ!cfW(qszLr;5Ia zLH!vRkV*jzOOl9$3Ho1rI*ciOh>cg6w8h+L)Haq1Z{)%5ZY16B!1#f|_+c_s_^=uP zQUyNMM#YH_Wru{*VVqZsX1`o)_(&u`-pIkaUY{zQ$K_exnuyX<} z8<;PcBFT@xjMN-mdCLqG*ki^g6-wuZ|27;43_!O9pn#leq^Wloo0DWp z9J!{fv=9lBy{cNKkSLLh&szThAsjAmeQ^NLm41MZQA=1W(@LLaJ5l|%yOea}FJK?(X!9T5?i1!kB(yS_ zXDXeG+}NQC8?Plu5AuhC(KhiGeT}Ka43T=p_^G%Xm~>)EcgytBnBq>aFOrMVbV?qSPDHp=gxh;Q%k_v!H>qe z-gSp7K0{DEj@U}vpdrL^k7%XWR2lE}V+I}ksO}^43aiL0qa3Hf@r-*18+p*+9ZL*g zKlK(Z?MrUguuQ*%9K%Y>HXQab2kF;6=ITQ}}dL5Q~|LoH`BSZO?(6>FZ{s(yh& z4o_gJo(5jGIaf>srJ5NRFMJ>D08*Kv@ViHqeUWX7X{h|=tV60cfqO|zyvAmD+!f4i zLw%$Ph8#+zgH>}ccWQ(mv4D#`JrZ#a^chki$*o1$&WG2WT$6l1-uEI=^qi5ikpLh= z3Q<(uvE7e=#(O=idq^?nSaJE%IUmPX*2bmwg@tzucbJ8!FKIL^;_jz-c=#=6qVTaa zz9Dq{=C{8CCt&B|5ccP-nkr0Zkf*oK;XH<#8kRqPSrZKLXz_%yx!ITB`w(4J4lfwP zv!xawX%ViS>~dUZ$%Vt4rGsy^Ezdn8@Zu2t7>_n+|D=u!v@iFJroV=9$KlW?td+Ga z*;DpZ!U&9$adv@|AHG;u>8Zs@F*zo^n59OwR2SMi$V%}w5$WHcf9?NPW3cE~@iqtb z*1Q8rS*V55h6!v2sReVOi=O^d1ltUKBF)&{i#onPT_H)o3Knt=G&*AqI5k`w1j5?U;3}X^R zFEM%sg{Pd?xBzyJGNcip?z-�jm$RR}&p!Kkzn=Z>v93Dp#Tyr?sHkW` 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 literal 0 HcmV?d00001 diff --git a/diagrams/Git_Push_Flow.png b/diagrams/Git_Push_Flow.png new file mode 100644 index 0000000000000000000000000000000000000000..096bcfe6808a1f94aa885ff9220d662eed509c79 GIT binary patch literal 41453 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 literal 0 HcmV?d00001 diff --git a/diagrams/Workflow_Detail.png b/diagrams/Workflow_Detail.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4980009407a1db9d089c0e0912a6d36b00889e GIT binary patch literal 45357 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
+
+ + + + + + + +
+ +
+
+
+
+

Architecture Diagrams

+

This is an OmniGraffle file which holds the source materials for the following +images.

+

To update a chart:

+
    +
  1. Make your modification!
  2. +
  3. Select "File > Export"
  4. +
  5. Select "Entire Document
  6. +
  7. Choose: Scale: 100%
  8. +
  9. Set Bitmap Resolution to 72 dpi (for web)
  10. +
  11. Uncheck "Transparent Background"
  12. +
  13. Select "images" directory
  14. +
  15. Click "Export"
  16. +
+

This should update all of the graphics in one go! Commit and pull-request.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..04f26d64e9dcd98520b6b58471a574e6ecb54f6f GIT binary patch literal 32038 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/dev/null || echo "") +if [[ ! -z $filename ]]; then + tar -xvzf $filename + rm -rf $filename + version=${filename#cert-manager-v} + version=${version%.tgz} + helm package -u cert-manager --version $version + rm -rf cert-manager +fi + +for tar in `ls $tmp | grep .tgz` +do + helm push $tar oci://$DRYCC_REGISTRY/$([ -z $CI_COMMIT_TAG ] && echo charts-testing || echo charts) +done diff --git a/gutenbuild b/gutenbuild new file mode 100755 index 000000000..d1ce9ad0c --- /dev/null +++ b/gutenbuild @@ -0,0 +1,23 @@ +#!/bin/sh + +set -e +set -x + +build_dest=$1 + +# ensure we are on the master branch before building +git checkout master + +PATH=$HOME/.local/bin:$PATH BUILDDIR=${build_dest} make deps build + +# build again, this time to /en/dev +dev_build_dest=$1/en/dev +PATH=$HOME/.local/bin:$PATH BUILDDIR=${dev_build_dest} make deps build + +# also build each version of the docs out to /en/ +# NOTE(bacongobbler): do not build any pre-release tags +for tag in $(git tag | grep -v -- "-alpha\|-beta\|-rc"); do + tag_build_dest="$build_dest/en/$tag" + git checkout $tag + PATH=$HOME/.local/bin:$PATH BUILDDIR=${tag_build_dest} make deps build +done diff --git a/index.html b/index.html new file mode 100644 index 000000000..9604a001a --- /dev/null +++ b/index.html @@ -0,0 +1,872 @@ + + + + + + + + + + + + + + + + + + Home - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Welcome to Drycc

+

Drycc Workflow is an open source container cloud platform.

+

Usually we also call it Container as a Service(CaaS) that adds a developer-friendly layer +to any Kubernetes cluster, making it easy to deploy and manage applications.

+

Drycc Workflow includes capabilities for building and deploying from source via git push, simple +application configuration, creating and rolling back releases, managing domain names and SSL +certificates, providing seamless edge routing, aggregating logs, and sharing applications with +teams. All of this is exposed through a simple REST API and command line interface.

+

Getting Started

+

To get started with Workflow, follow our Quick Start guide.

+

Take a deep dive into Drycc Workflow in our Concepts, Architecture, and +Components sections.

+

Feel like contibuting some code or want to get started as a maintainer? Pick an issue tagged as an +easy fix or help wanted and start contributing!

+

Service and Support

+

Coming soon.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/install-cli.sh b/install-cli.sh new file mode 100755 index 000000000..760cdf61c --- /dev/null +++ b/install-cli.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +set -eo pipefail +shopt -s expand_aliases + +check_platform_arch() { + local supported="darwin-amd64 darwin-arm64 linux-amd64 linux-386 linux-arm linux-arm64 windows-386 windows-amd64" + + if ! echo "${supported}" | tr ' ' '\n' | grep -q "${PLATFORM}-${ARCH}"; then + cat < + + old_lang=$LANG + LANG=C + + old_lc_collate=$LC_COLLATE + LC_COLLATE=C + + local length="${#1}" + for (( i = 0; i < length; i++ )); do + local c="${1:i:1}" + case $c in + [a-zA-Z0-9.~_-]) printf "$c" ;; + *) printf '%%%02X' "'$c" ;; + esac + done + + LANG=$old_lang + LC_COLLATE=$old_lc_collate +} + +function install_helm { + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + version=$(curl -Ls https://drycc-mirrors.drycc.cc/helm/helm/releases|grep /helm/helm/releases/tag/ | sed -E 's/.*\/helm\/helm\/releases\/tag\/(v[0-9\.]{1,}(-rc.[0-9]{1,})?)".*/\1/g' | head -1) + tar_name="helm-${version}-linux-${ARCH}.tar.gz" + helm_download_url="https://drycc-mirrors.drycc.cc/helm/${tar_name}" + else + version=$(curl -Ls https://github.com/helm/helm/releases|grep /helm/helm/releases/tag/ | sed -E 's/.*\/helm\/helm\/releases\/tag\/(v[0-9\.]{1,}(-rc.[0-9]{1,})?)".*/\1/g' | head -1) + tar_name="helm-${version}-linux-${ARCH}.tar.gz" + helm_download_url="https://get.helm.sh/${tar_name}" + fi + curl -fsSL -o "${tar_name}" "${helm_download_url}" + tar -zxvf "${tar_name}" + mv "linux-${ARCH}/helm" /usr/local/bin/helm + rm -rf "${tar_name}" "linux-${ARCH}" +} + +function configure_os { + echo -e "\\033[32m---> Start configuring kernel parameters\\033[0m" + if [[ "$(command -v iptables)" != "" ]] ; then + iptables -F + iptables -X + iptables -F -t nat + iptables -X -t nat + iptables -P FORWARD ACCEPT + fi + swapoff -a + sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab + mount bpffs -t bpf /sys/fs/bpf + rmem_max=$(sysctl -ne net.core.rmem_max) + if [ ! -n "$rmem_max" ] || [ 2500000 -gt $rmem_max ] ;then + echo 'net.core.rmem_max = 2500000' >> /etc/sysctl.conf + fi + nr_hugepages=$(sysctl -ne vm.nr_hugepages) + if [ ! -n "$nr_hugepages" ] || [ 1024 -gt $nr_hugepages ] ;then + echo 'vm.nr_hugepages = 1024' >> /etc/sysctl.conf + fi + max_user_instances=$(sysctl -ne fs.inotify.max_user_instances) + if [ ! -n "$max_user_instances" ] || [ 65535 -gt $max_user_instances ] ;then + echo 'fs.inotify.max_user_instances = 65535' >> /etc/sysctl.conf + fi + sysctl -p + + cpufreq=$(ls /sys/devices/system/cpu/cpu*/cpufreq >/dev/null 2>&1 || echo "false") + if [[ $cpufreq != "false" ]]; then + for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do + echo performance > $cpu + done + fi + echo -e "\\033[32m---> Configuring kernel parameters finish\\033[0m" +} + +function configure_registries { + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]]; then + if [[ "$1" == "runtime" ]] ; then + cat << EOF >> "/var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl" +[plugins.cri.registry.mirrors] +[plugins.cri.registry.mirrors."docker.io"] + endpoint = ["https://docker-mirror.drycc.cc", "https://registry-1.docker.io"] +EOF + else + cat << EOF >> "/var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl" +[plugins.cri.registry.mirrors] +[plugins.cri.registry.mirrors."docker.io"] + endpoint = ["https://docker-mirror.drycc.cc", "https://registry-1.docker.io"] +[plugins.cri.registry.mirrors."quay.io"] + endpoint = ["https://quay-mirror.drycc.cc", "https://quay.io"] +[plugins.cri.registry.mirrors."gcr.io"] + endpoint = ["https://quay-mirror.drycc.cc", "https://gcr.io"] +[plugins.cri.registry.mirrors."k8s.gcr.io"] + endpoint = ["https://k8s-mirror.drycc.cc", "https://registry.k8s.io"] +[plugins.cri.registry.mirrors."registry.k8s.io"] + endpoint = ["https://k8s-mirror.drycc.cc", "https://registry.k8s.io"] +EOF + fi + fi +} + +function download_runtime { + # download crun + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + crun_base_url="https://drycc-mirrors.drycc.cc/containers" + else + crun_base_url="https://github.com/containers" + fi + crun_version=$(curl -Ls ${crun_base_url}/crun/releases|grep /containers/crun/releases/tag/ | sed -E 's/.*\/containers\/crun\/releases\/tag\/([0-9\.]{1,}(-rc.[0-9]{1,})?)".*/\1/g' | head -1) + crun_download_url=${crun_base_url}/crun/releases/download/${crun_version}/crun-${crun_version}-linux-${ARCH} + curl -sfL "${crun_download_url}" -o /usr/local/bin/crun + chmod a+rx /usr/local/bin/crun + + # download runsc + gvisor_download_url=https://storage.googleapis.com/gvisor/releases/release/latest/$(uname -m) + curl -sfL "${gvisor_download_url}/runsc" -o /usr/local/bin/runsc + curl -sfL "${gvisor_download_url}/containerd-shim-runsc-v1" -o /usr/local/bin/containerd-shim-runsc-v1 + chmod a+rx /usr/local/bin/runsc /usr/local/bin/containerd-shim-runsc-v1 +} + +function configure_runtime { + cat << EOF > "/var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl" +[plugins.cri.containerd] + snapshotter = "overlayfs" + default_runtime_name = "crun" + disable_snapshot_annotations = true + +[plugins.cri.containerd.runtimes.crun] + runtime_type = "io.containerd.runc.v2" + +[plugins.cri.containerd.runtimes.crun.options] + SystemdCgroup = true + +[plugins.cri.containerd.runtimes.runc] + runtime_type = "io.containerd.runc.v2" + +[plugins.cri.containerd.runtimes.runc.options] + SystemdCgroup = true + +[plugins.cri.containerd.runtimes.runsc] + runtime_type = "io.containerd.runsc.v1" + +[plugins.cri.containerd.runtimes.runsc.options] + SystemdCgroup = true +EOF +} + +function configure_containerd { + mkdir -p /var/lib/rancher/k3s/agent/etc/containerd + if [[ -f "${CONTAINERD_FILE}" ]]; then + cat "${CONTAINERD_FILE}" > /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl + else + configure_runtime + configure_registries $1 + fi +} + +function configure_mirrors { + echo -e "\\033[32m---> Start configuring mirrors\\033[0m" + configure_containerd + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + INSTALL_K3S_MIRROR="${INSTALL_DRYCC_MIRROR}" + k3s_install_url="https://get-k3s.drycc.cc" + K3S_RELEASE_URL=https://drycc-mirrors.drycc.cc/k3s-io/k3s/releases + export INSTALL_K3S_MIRROR + else + k3s_install_url="https://get.k3s.io" + K3S_RELEASE_URL=github.com/k3s-io/k3s/releases + fi + if [ -z "${INSTALL_K3S_VERSION}" ]; then + INSTALL_K3S_VERSION=$(curl -Ls "$K3S_RELEASE_URL" | grep /k3s-io/k3s/releases/tag/ | sed -E 's/.*\/k3s-io\/k3s\/releases\/tag\/(v[0-9\.]{1,}[rc0-9\-]{0,}%2Bk3s[0-9])".*/\1/g' | head -1) + else + INSTALL_K3S_VERSION=$(urlencode "$INSTALL_K3S_VERSION") + fi + export INSTALL_K3S_VERSION + echo -e "\\033[32m---> Configuring mirrors finish\\033[0m" +} + +function install_k3s_server { + configure_os + download_runtime + configure_mirrors + INSTALL_K3S_EXEC="server ${INSTALL_K3S_EXEC} --flannel-backend=none --disable-network-policy --disable=traefik --disable=servicelb --disable-kube-proxy --cluster-cidr=${CLUSTER_CIDR} --cluster-domain=${CLUSTER_DOMAIN}" + if [[ -n "${K3S_DATA_DIR}" ]] ; then + INSTALL_K3S_EXEC="$INSTALL_K3S_EXEC --data-dir=${K3S_DATA_DIR}/rancher/k3s" + fi + if [[ -z "${K3S_URL}" ]] ; then + INSTALL_K3S_EXEC="$INSTALL_K3S_EXEC --cluster-init" + fi + curl -sfL "${k3s_install_url}" |INSTALL_K3S_EXEC="$INSTALL_K3S_EXEC" sh -s - + kubectl apply -f - < The path ${METALLB_CONFIG_FILE} does not exist...\\033[0m" + exit 1 + fi +} + +function install_network() { + echo -e "\\033[32m---> Start installing network...\\033[0m" + api_server_address=(`ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'`) + helm install cilium $CHARTS_URL/cilium \ + --set operator.replicas=1 \ + --set bpf.masquerade=true \ + --set bandwidthManager.enabled=true \ + --set bandwidthManager.bbr=true \ + --set kubeProxyReplacement=strict \ + --set hubble.enabled=false \ + --set hostPort.enabled=true \ + --set k8sServiceHost=${KUBE_API_SERVER_ADDRESS:-$api_server_address} \ + --set k8sServicePort=${KUBE_API_SERVER_PORT:-"6443"} \ + --namespace kube-system --wait + echo -e "\\033[32m---> Network installed!\\033[0m" +} + +function install_metallb() { + check_metallb + echo -e "\\033[32m---> Start installing metallb...\\033[0m" + helm install metallb $CHARTS_URL/metallb \ + --set speaker.frr.enabled=true \ + --namespace metallb \ + --create-namespace + + echo -e "\\033[32m---> Waiting metallb pods ready...\\033[0m" + kubectl wait pods -n metallb --all --for condition=Ready --timeout=600s + echo -e "\\033[32m---> Waiting metallb webhook ready...\\033[0m" + sleep 30s + + if [[ -z "${METALLB_CONFIG_FILE}" ]] ; then + echo -e "\\033[32m---> Metallb using the default configuration.\\033[0m" + kubectl apply -n metallb -f - < Metallb installed!\\033[0m" +} + +function install_gateway() { + echo -e "\\033[32m---> Start installing gateway...\\033[0m" + + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + gateway_api_url=https://drycc-mirrors.drycc.cc/kubernetes-sigs/gateway-api + else + gateway_api_url=https://github.com/kubernetes-sigs/gateway-api + fi + version=$(curl -Ls $gateway_api_url/releases|grep /kubernetes-sigs/gateway-api/releases/tag/ | sed -E 's/.*\/kubernetes-sigs\/gateway-api\/releases\/tag\/(v[0-9\.]{1,}(-rc[0-9]{1,})?)".*/\1/g' | head -1) + + helm repo add istio https://drycc-mirrors.drycc.cc/istio-charts + helm repo update + kubectl apply -f $gateway_api_url/releases/download/${version}/experimental-install.yaml + helm install istio-base istio/base -n istio-system --set defaultRevision=default --create-namespace --wait + helm install istio-istiod istio/istiod -n istio-system --wait + helm install istio-gateway istio/gateway -n istio-gateway --create-namespace --wait + echo -e "\\033[32m---> Gateway installed!\\033[0m" +} + +function install_cert_manager() { + echo -e "\\033[32m---> Start installing cert-manager...\\033[0m" + helm install cert-manager $CHARTS_URL/cert-manager \ + --namespace cert-manager \ + --create-namespace \ + --set clusterResourceNamespace=drycc \ + --set "extraArgs={--feature-gates=ExperimentalGatewayAPISupport=true}" \ + --set installCRDs=true --wait + echo -e "\\033[32m---> Cert-manager installed!\\033[0m" +} + +function install_catalog() { + echo -e "\\033[32m---> Start installing catalog...\\033[0m" + helm install catalog $CHARTS_URL/catalog \ + --set asyncBindingOperationsEnabled=true \ + --set image=registry.drycc.cc/drycc-addons/service-catalog:canary \ + --namespace catalog \ + --create-namespace --wait + echo -e "\\033[32m---> Catalog installed!\\033[0m" +} + +function install_components { + install_network + install_metallb + install_gateway + install_cert_manager + install_catalog +} + +function check_drycc { + if [[ -z "${PLATFORM_DOMAIN}" ]] ; then + echo -e "\\033[33m---> Please set the PLATFORM_DOMAIN variable.\\033[0m" + echo -e "\\033[33m---> For example:\\033[0m" + echo -e "\\033[33m---> export PLATFORM_DOMAIN=drycc.cc\\033[0m" + echo -e "\\033[33m---> And confirm that wildcard domain name resolution has been set.\\033[0m" + echo -e "\\033[33m---> For example, the current server IP is 8.8.8.8\\033[0m" + echo -e "\\033[33m---> Please point *.drycc.cc to 8.8.8.8\\033[0m" + exit 1 + fi + + if [[ -z "${DRYCC_ADMIN_USERNAME}" || -z "${DRYCC_ADMIN_PASSWORD}" ]] ; then + echo -e "\\033[33m---> Please set the DRYCC_ADMIN_USERNAME and DRYCC_ADMIN_PASSWORD variable.\\033[0m" + echo -e "\\033[33m---> For example:\\033[0m" + echo -e "\\033[33m---> export DRYCC_ADMIN_USERNAME=admin\\033[0m" + echo -e "\\033[33m---> export DRYCC_ADMIN_PASSWORD=admin\\033[0m" + echo -e "\\033[33m---> This password is used by end users to log in and manage drycc.\\033[0m" + echo -e "\\033[33m---> Please set a high security string!!!\\033[0m" + exit 1 + fi +} + +function install_drycc { + check_drycc + echo -e "\\033[32m---> Start installing workflow...\\033[0m" + RABBITMQ_USERNAME=$(cat /proc/sys/kernel/random/uuid) + RABBITMQ_PASSWORD=$(cat /proc/sys/kernel/random/uuid) + +cat << EOF > "/tmp/drycc-values.yaml" +global: + clusterDomain: ${CLUSTER_DOMAIN} + platformDomain: ${PLATFORM_DOMAIN} + certManagerEnabled: ${CERT_MANAGER_ENABLED} + gatewayClass: ${GATEWAY_CLASS} + +builder: + replicas: ${BUILDER_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + +database: + replicas: ${DATABASE_REPLICAS:-2} + imageRegistry: ${DRYCC_REGISTRY} + limitsMemory: "256Mi" + limitsHugepages2Mi: "256Mi" + persistence: + enabled: true + size: ${DATABASE_PERSISTENCE_SIZE:-5Gi} + storageClass: ${DATABASE_PERSISTENCE_STORAGE_CLASS:-""} + +timeseries: + replicas: ${TIMESERIES_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + limitsMemory: "256Mi" + limitsHugepages2Mi: "256Mi" + persistence: + enabled: true + size: ${TIMESERIES_PERSISTENCE_SIZE:-5Gi} + storageClass: ${TIMESERIES_PERSISTENCE_STORAGE_CLASS:-""} + +fluentbit: + imageRegistry: ${DRYCC_REGISTRY} + +controller: + apiReplicas: ${CONTROLLER_API_REPLICAS:-1} + celeryReplicas: ${CONTROLLER_CELERY_REPLICAS:-1} + webhookReplicas: ${CONTROLLER_WEBHOOK_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + appRuntimeClass: ${CONTROLLER_APP_RUNTIME_CLASS:-""} + appStorageClass: ${CONTROLLER_APP_STORAGE_CLASS:-"drycc-storage"} + +redis: + replicas: ${REDIS_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + persistence: + enabled: true + size: ${REDIS_PERSISTENCE_SIZE:-5Gi} + storageClass: ${REDIS_PERSISTENCE_STORAGE_CLASS:-""} + +storage: + csi: + statefulset: + replicas: ${STORAGE_CSI_STATEFULSET_REPLICAS:-1} + mainnode: + tipd: + replicas: ${STORAGE_MAINNODE_TIPD_REPLICAS:-1} + persistence: + enabled: true + size: ${STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZE:-5Gi} + storageClass: "${STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASS}" + weed: + replicas: ${STORAGE_MAINNODE_WEED_REPLICAS:-1} + persistence: + enabled: true + size: ${STORAGE_MAINNODE_WEED_PERSISTENCE_SIZE:-5Gi} + storageClass: "${STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASS}" + metanode: + tikv: + replicas: ${STORAGE_METANODE_TIKV_REPLICAS:-1} + persistence: + enabled: true + size: ${STORAGE_METANODE_TIKV_PERSISTENCE_SIZE:-5Gi} + storageClass: "${STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASS}" + weed: + replicas: ${STORAGE_METANODE_WEED_REPLICAS:-1} + persistence: + enabled: true + size: ${STORAGE_METANODE_WEED_PERSISTENCE_SIZE:-5Gi} + storageClass: "${STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASS}" + datanode: + weed: + replicas: ${STORAGE_DATANODE_WEED_REPLICAS:-3} + persistence: + hdd: + enabled: true + size: ${STORAGE_DATANODE_WEED_PERSISTENCE_SIZE:-10Gi} + storageClass: "${STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASS}" + +rabbitmq: + replicas: ${RABBITMQ_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + username: "${RABBITMQ_USERNAME}" + password: "${RABBITMQ_PASSWORD}" + persistence: + enabled: true + size: ${RABBITMQ_PERSISTENCE_SIZE:-5Gi} + storageClass: ${RABBITMQ_PERSISTENCE_STORAGE_CLASS:-""} + +imagebuilder: + imageRegistry: ${DRYCC_REGISTRY} + +logger: + replicas: ${LOGGER_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + +monitor: + grafana: + imageRegistry: ${DRYCC_REGISTRY} + persistence: + enabled: true + size: ${MONITOR_GRAFANA_PERSISTENCE_SIZE:-5Gi} + storageClass: ${MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASS:-""} + telegraf: + imageRegistry: ${DRYCC_REGISTRY} + +prometheus: + prometheus-server: + retention: ${PROMETHEUS_SERVER_RETENTION:-"15d"} + persistence: + enabled: true + accessMode: ReadWriteOnce + size: ${PROMETHEUS_SERVER_PERSISTENCE_SIZE:-10Gi} + storageClass: ${PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASS:-""} + +passport: + replicas: ${PASSPORT_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + adminUsername: ${DRYCC_ADMIN_USERNAME} + adminPassword: ${DRYCC_ADMIN_PASSWORD} + +registry: + replicas: ${REGISTRY_REPLICAS:-1} + imageRegistry: ${DRYCC_REGISTRY} + +registry-proxy: + imageRegistry: ${DRYCC_REGISTRY} + +acme: + server: ${ACME_SERVER:-"https://acme-v02.api.letsencrypt.org/directory"} + externalAccountBinding: + keyID: ${ACME_EAB_KEY_ID:-""} + keySecret: ${ACME_EAB_KEY_SECRET:-""} +EOF + + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + cat << EOF > "/tmp/drycc-mirror-values.yaml" +imagebuilder: + container_registries: | + unqualified-search-registries = ["docker.io"] + short-name-mode="permissive" + [[registry]] + prefix = "docker.io" + location = "registry-1.docker.io" + [[registry.mirror]] + prefix = "docker.io" + location = "hub-mirror.c.163.com" +EOF + else + cat << EOF > "/tmp/drycc-mirror-values.yaml" +imagebuilder: + container_registries: | + unqualified-search-registries = ["docker.io"] + short-name-mode="permissive" +EOF + fi + + helm install drycc $CHARTS_URL/workflow \ + --namespace drycc \ + --values /tmp/drycc-values.yaml \ + --values /tmp/drycc-mirror-values.yaml \ + --create-namespace --wait --timeout 30m0s + echo -e "\\033[32m---> Rabbitmq username: $RABBITMQ_USERNAME\\033[0m" + echo -e "\\033[32m---> Rabbitmq password: $RABBITMQ_PASSWORD\\033[0m" +} + +function install_helmbroker { + if [[ "${INSTALL_DRYCC_MIRROR}" == "cn" ]] ; then + addons_url="https://drycc-mirrors.drycc.cc/drycc-addons/addons/releases/download/latest/index.yaml" + else + addons_url="https://github.com/drycc-addons/addons/releases/download/latest/index.yaml" + fi + HELMBROKER_USERNAME=$(cat /proc/sys/kernel/random/uuid) + HELMBROKER_PASSWORD=$(cat /proc/sys/kernel/random/uuid) + + echo -e "\\033[32m---> Start installing helmbroker...\\033[0m" + + helm install helmbroker $CHARTS_URL/helmbroker \ + --set global.rabbitmqLocation="off-cluster" \ + --set global.gatewayClass=${GATEWAY_CLASS} \ + --set global.clusterDomain=${CLUSTER_DOMAIN} \ + --set global.platformDomain=${PLATFORM_DOMAIN} \ + --set global.certManagerEnabled=${CERT_MANAGER_ENABLED} \ + --set persistence.size=${HELMBROKER_PERSISTENCE_SIZE:-5Gi} \ + --set persistence.storageClass=${HELMBROKER_PERSISTENCE_STORAGE_CLASS:-"drycc-storage"} \ + --set username=${HELMBROKER_USERNAME} \ + --set password=${HELMBROKER_PASSWORD} \ + --set replicas=${HELMBROKER_REPLICAS} \ + --set celeryReplicas=${HELMBROKER_CELERY_REPLICAS} \ + --set rabbitmqUrl="amqp://${RABBITMQ_USERNAME}:${RABBITMQ_PASSWORD}@drycc-rabbitmq.drycc.svc.${CLUSTER_DOMAIN}:5672/drycc" \ + --namespace drycc-helmbroker --create-namespace --wait -f - < Helmbroker username: $HELMBROKER_USERNAME\\033[0m" + echo -e "\\033[32m---> Helmbroker password: $HELMBROKER_PASSWORD\\033[0m" +} + +export KUBECONFIG=/etc/rancher/k3s/k3s.yaml + +if [[ -z "$@" ]] ; then + check_drycc + check_metallb + install_k3s_server + install_helm + install_components + install_drycc + install_helmbroker + echo -e "\\033[32m---> Installation complete, enjoy life...\\033[0m" +else + for command in "$@" + do + $command + echo -e "\\033[32m---> Execute $command complete, enjoy life...\\033[0m" + done +fi diff --git a/installing-workflow/configuring-object-storage/index.html b/installing-workflow/configuring-object-storage/index.html new file mode 100644 index 000000000..965d1f4c4 --- /dev/null +++ b/installing-workflow/configuring-object-storage/index.html @@ -0,0 +1,892 @@ + + + + + + + + + + + + + + + + + + Configuring Object Storage - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Configuring Object Storage

+

A variety of Drycc Workflow components rely on an object storage system to do their work including storing application slugs, Container images and database logs.

+

Drycc Workflow ships with Storage by default, which provides in-cluster.

+

Configuring off-cluster Object Storage

+

Every component that relies on object storage uses two inputs for configuration:

+
    +
  1. You must use object storage services that are compatible with S3 API
  2. +
  3. Access credentials stored as a Kubernetes secret named storage-creds
  4. +
+

The helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster object storage. Drycc Workflow currently supports Google Compute Storage, Amazon S3, Azure Blob Storage and OpenStack Swift Storage.

+

Step 1: Create storage buckets

+

Create storage buckets for each of the Workflow subsystems: builder, registry, and database.

+

Depending on your chosen object storage you may need to provide globally unique bucket names. If you are using S3, use hyphens instead of periods in the bucket names. Using periods in the bucket name will cause an ssl certificate validation issue with S3.

+

If you provide credentials with sufficient access to the underlying storage, Workflow components will create the buckets if they do not exist.

+

Step 2: Generate storage credentials

+

If applicable, generate credentials that have create and write access to the storage buckets created in Step 1.

+

If you are using AWS S3 and your Kubernetes nodes are configured with appropriate IAM API keys via InstanceRoles, you do not need to create API credentials. Do, however, validate that the InstanceRole has appropriate permissions to the configured buckets!

+

Step 3: Configure Workflow Chart

+

Operators should configure object storage by editing the Helm values file before running helm install. To do so:

+
    +
  • Fetch the Helm values by running helm inspect values oci://registry.drycc.cc/charts/workflow > values.yaml
  • +
  • Update the global/storage parameter to reference the platform you are using, e.g. s3, azure, gcs, or swift
  • +
  • Find the corresponding section for your storage type and provide appropriate values including region, bucket names, and access credentials.
  • +
  • Save your changes.
  • +
+
+

Note

+

All values will be automatically (base64) encoded except the key_json values under gcs/gcr. These must be base64-encoded. This is to support cleanly passing said encoded text via helm --set cli functionality rather than attempting to pass the raw JSON data. For example:

+
$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+    --namespace drycc \
+    --set global.platformDomain=youdomain.com
+    --set global.storage=gcs,gcs.key_json="$(cat /path/to/gcs_creds.json | base64 -w 0)"
+ + +
+

You are now ready to run helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml using your desired object storage.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/installing-workflow/configuring-postgres/index.html b/installing-workflow/configuring-postgres/index.html new file mode 100644 index 000000000..fe27a36dc --- /dev/null +++ b/installing-workflow/configuring-postgres/index.html @@ -0,0 +1,892 @@ + + + + + + + + + + + + + + + + + + Configuring Postgres - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Configuring Postgres

+

Drycc Workflow's controller and passport component rely on a PostgreSQL database to store platform state.

+

By default, Drycc Workflow ships with the database component, which provides an in-cluster PostgreSQL database backed up to in-cluster or off-cluster object storage. Currently, for object storage, which is utilized by several Workflow components, only off-cluster solutions such as S3 or GCS are recommended in production environments. Experience has shown that many operators already opting for off-cluster object storage similarly prefer to host Postgres off-cluster as well, using Amazon RDS or similar. When excercising both options, a Workflow installation becomes entirely stateless, and is thus restored or rebuilt with greater ease should the need ever arise.

+

Provisioning off-cluster Postgres

+

First, provision a PostgreSQL RDBMS using the cloud provider or other infrastructure of your choice. Take care to ensure that security groups or other firewall rules will permit connectivity from your Kubernetes worker nodes, any of which may play host to the Workflow controller component.

+

Take note of the following:

+
    +
  1. The hostname or public IP of your PostgreSQL RDBMS
  2. +
  3. The port on which your PostgreSQL RDBMS runs-- typically 5432
  4. +
+

Within the off-cluster RDBMS, manually provision the following:

+
    +
  1. A database user (take note of the username and password)
  2. +
  3. A database owned by that user (take note of its name)
  4. +
+

If you are able to log into the RDBMS as a superuser or a user with appropriate permissions, this process will typically look like this:

+
$ psql -h <host> -p <port> -d postgres -U <"postgres" or your own username>
+> create user <drycc username; typically "drycc"> with password '<password>';
+> create database <database name; typically "drycc"> with owner <drycc username>;
+> \q
+ + +

Configuring Workflow

+

The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.

+
    +
  • Step 1: If you haven't already fetched the values, do so with helm inspect values drycc/workflow > values.yaml
  • +
  • Step 2: Update database connection details by modifying values.yaml:
      +
    • Update the databaseLocation parameter to off-cluster.
    • +
    • Update the values in the [database] configuration section to properly reflect all connection details.
    • +
    • Update the values in the [controller] configuration section to properly reflect platformDomain details.
    • +
    • Save your changes.
    • +
    • Note: you do not need to (and must not) base64 encode any values, as the Helm chart will automatically handle encoding as necessary.
    • +
    +
  • +
+

You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml as usual.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/installing-workflow/configuring-registry/index.html b/installing-workflow/configuring-registry/index.html new file mode 100644 index 000000000..2d55dd897 --- /dev/null +++ b/installing-workflow/configuring-registry/index.html @@ -0,0 +1,913 @@ + + + + + + + + + + + + + + + + + + Configuring the Registry - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Configuring Registry

+

Drycc Workflow's builder component relies on a registry for storing application container images.

+

Drycc Workflow ships with a registry component by default, which provides an in-cluster Container registry backed by the platform-configured object storage. Operators might want to use an off-cluster registry for performance or security reasons.

+

Configuring Off-Cluster Private Registry

+

Every component that relies on a registry uses two inputs for configuration:

+
    +
  1. Registry Location environment variable named DRYCC_REGISTRY_LOCATION
  2. +
  3. Access credentials stored as a Kubernetes secret named registry-secret
  4. +
+

The Helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster registry. Drycc Workflow supports external registries which provide either short-lived tokens that are valid only for a specified amount of time or long-lived tokens (basic username/password) which are valid forever for authenticating to them. For those registries which provide short lived tokens for authentication, Drycc Workflow will generate and refresh them such that the deployed apps will only have access to the short-lived tokens and not to the actual credentials for the registries.

+

When using a private registry the container images are no longer pulled by Drycc Workflow Controller but rather are managed by Kubernetes. This will increase security and overall speed, however the port information can no longer be discovered. Instead the port information can be set via drycc config:set PORT=<port> prior to deploying the application.

+

Drycc Workflow currently supports:

+
    +
  1. off-cluster: Any provider which supports long-lived username/password authentication, such as Azure Container Registry, Docker Hub, quay.io, or a self-hosted Container registry.
  2. +
+

Configuration

+
    +
  1. If you haven't already fetched the values file, do so with helm inspect values drycc/workflow > values.yaml
  2. +
  3. Update registry location details by modifying the values file:
      +
    • Update the registryLocation parameter to reference the registry location you are using: off-cluster, ecr, gcr
    • +
    • Update the values in the section which corresponds to your registry location type.
    • +
    +
  4. +
+

You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml using your desired registry.

+

Examples

+

Here we show how the relevant parts of the fetched values.yaml file might look like after configuring for a particular off-cluster registry:

+

Azure Container Registry (ACR)

+

After following the docs and creating a registry, e.g. myregistry, with its corresponding login server of myregistry.azurecr.io, the following values should be supplied:

+
global:
+...
+  registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+  registry:
+    hostname: "myregistry.azurecr.io"
+    organization: "myorg"
+    username: "myusername"
+    password: "mypassword"
+...
+ + +

Note: The mandatory organization field (here myorg) will be created as an ACR repository if it does not already exist.

+

Quay.io

+
global:
+...
+  registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+  registry:
+    hostname: "quay.io"
+    organization: "myorg"
+    username: "myusername"
+    password: "mypassword"
+...
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/installing-workflow/download-linux-brightgreen.svg b/installing-workflow/download-linux-brightgreen.svg new file mode 100644 index 000000000..a8a6a50be --- /dev/null +++ b/installing-workflow/download-linux-brightgreen.svg @@ -0,0 +1 @@ +downloaddownloadLinuxLinux \ No newline at end of file diff --git a/installing-workflow/download-osx-brightgreen.svg b/installing-workflow/download-osx-brightgreen.svg new file mode 100644 index 000000000..477afbf52 --- /dev/null +++ b/installing-workflow/download-osx-brightgreen.svg @@ -0,0 +1 @@ +downloaddownloadMac OS XMac OS X \ No newline at end of file diff --git a/installing-workflow/gateway/index.html b/installing-workflow/gateway/index.html new file mode 100644 index 000000000..76075c67a --- /dev/null +++ b/installing-workflow/gateway/index.html @@ -0,0 +1,945 @@ + + + + + + + + + + + + + + + + + + Installing Gateway - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Specify Gateway

+

Install Drycc Workflow (Specify gateway)

+

Now that Helm is installed and the repository has been added, install Workflow with a native gateway by running:

+
$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+    --namespace drycc \
+    --set global.gatewayClass=istio \
+    --set global.platformDomain=drycc.cc \
+    --set builder.service.type=LoadBalancer
+ + +

Of course, if you deploy it on a bare machine, you probably do not have Load Balancer. You need to use NodePort:

+
$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+    --namespace drycc \
+    --set global.gatewayClass=istio \
+    --set global.platformDomain=drycc.cc \
+    --set builder.service.type=NodePort \
+    --set builder.service.nodePort=32222
+ + +

If you want to use Load Balancer on a bare machine, you can look at metallb

+

Where global.platformDomain is a required parameter that is traditionally not required for Workflow that is explained in the next section. In this example we are using drycc.cc for $hostname.

+

Helm will install a variety of Kubernetes resources in the drycc namespace. +Wait for the pods that Helm launched to be ready. Monitor their status by running:

+
$ kubectl --namespace=drycc get pods
+ + +

You should also notice that several Kubernetes gatewayclass has been installed on your cluster. You can view it by running:

+
$ kubectl get gatewayclass --namespace drycc
+ + +

Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.

+

Here, it can be seen that the controller, builder and registry all took a few loops waiting for storage before they were able to start:

+
$ kubectl --namespace=drycc get pods
+NAME                          READY     STATUS    RESTARTS   AGE
+drycc-builder-hy3xv            1/1       Running   5          5m
+drycc-controller-g3cu8         1/1       Running   5          5m
+drycc-controller-celery-cmxxn  3/3       Running   0          5m
+drycc-database-rad1o           1/1       Running   0          5m
+drycc-logger-fluentbit-1v8uk   1/1       Running   0          5m
+drycc-logger-fluentbit-esm60   1/1       Running   0          5m
+drycc-logger-sm8b3             1/1       Running   0          5m
+drycc-storage-4ww3t            1/1       Running   0          5m
+drycc-registry-asozo           1/1       Running   1          5m
+drycc-rabbitmq-0               1/1       Running   0          5m
+ + +

Install a Kubernetes Gateway

+

Now that Workflow has been deployed with the global.gatewayClass , we will need a Kubernetes gateway in place to begin routing traffic.

+

Here is an example of how to use istio as an gateway for Workflow. Of course, you are welcome to use any controller you wish.

+
$ helm repo add istio https://istio-release.storage.googleapis.com/charts
+$ helm repo update
+$ kubectl create namespace istio-system
+$ helm install istio-base istio/base -n istio-system
+$ helm install istiod istio/istiod -n istio-system --wait
+$ kubectl create namespace istio-ingress
+$ helm install istio-ingress istio/gateway -n istio-ingress --wait
+ + +

Configure DNS

+

User must install drycc and then set up a hostname, and assumes the *.$host convention.

+

We need to point the *.$host record to the public IP address of your gateway. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed.

+
$ kubectl get gateway --namespace drycc
+NAME      CLASS   ADDRESS         PROGRAMMED   AGE
+gateway   istio   138.91.243.152  True         36d
+ + +

If we were using drycc.cc as a hostname, we would need to create the following A DNS records.

+ + + + + + + + + + + + + + + +
NameTypeValue
*.drycc.ccA138.91.243.152
+

Once all of the pods are in the READY state, and *.$host resolves to the external IP found above, the preparation of gateway has been completed!

+

After installing Workflow, register a user and deploy an application.

+

If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can +access both internal and external networks, and then expose 80 and 443.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/installing-workflow/index.html b/installing-workflow/index.html new file mode 100644 index 000000000..c71c7e30f --- /dev/null +++ b/installing-workflow/index.html @@ -0,0 +1,970 @@ + + + + + + + + + + + + + + + + + + Installing Workflow - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Installing Drycc Workflow

+

This document is aimed at those who have already provisioned a Kubernetes v1.16.15+ cluster +and want to install Drycc Workflow. If help is required getting started with Kubernetes and +Drycc Workflow, follow the quickstart guide for assistance.

+

Prerequisites

+
    +
  1. Verify the Kubernetes system requirements
  2. +
  3. Install Helm and Drycc Workflow CLI tools
  4. +
+

Check Your Setup

+

Check that the helm command is available and the version is v2.5.0 or newer.

+
$ helm version
+Client: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
+Server: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
+ + +

Choose Your Deployment Strategy

+

Drycc Workflow includes everything it needs to run out of the box. However, these defaults are aimed at simplicity rather than +production readiness. Production and staging deployments of Workflow should, at a minimum, use off-cluster storage +which is used by Workflow components to store and backup critical data. Should an operator need to completely re-install +Workflow, the required components can recover from off-cluster storage. See the documentation for configuring object +storage for more details.

+

More rigorous installations would benefit from using outside sources for the following things: +* Postgres - For example AWS RDS. +* Registry - This includes quay.io, dockerhub, Amazon ECR, and Google GCR. +* Redis - Such as AWS Elasticache +* Grafana

+

Gateway

+

Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.

+

Install Drycc Workflow

+

If the version of helm is 3.0 +; you need to create the namespace in advance:

+
kubectl create ns drycc
+ + +

If you want to change it, set the variable when using helm.

+
$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+    --namespace drycc \
+    --set builder.imageRegistry=quay.io \
+    --set imagebuilder.imageRegistry=quay.io \
+    --set controller.imageRegistry=quay.io \
+    --set database.imageRegistry=quay.io \
+    --set fluentbit.imageRegistry=quay.io \
+    --set redis.imageRegistry=quay.io \
+    --set rabbitmq.imageRegistry=quay.io \
+    --set logger.imageRegistry=quay.io \
+    --set storage.imageRegistry=quay.io \
+    --set monitor.imageRegistry=quay.io \
+    --set registry.imageRegistry=quay.io \
+    --set registry-proxy.imageRegistry=quay.io \
+    --set global.platformDomain=drycc.cc
+ + +

Helm will install a variety of Kubernetes resources in the drycc namespace. +Wait for the pods that Helm launched to be ready. Monitor their status by running:

+
$ kubectl --namespace=drycc get pods
+ + +

If it's preferred to have kubectl automatically update as the pod states change, run (type Ctrl-C to stop the watch):

+
$ kubectl --namespace=drycc get pods -w
+ + +

Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.

+

Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start:

+
$ kubectl --namespace=drycc get pods
+NAME                                     READY     STATUS    RESTARTS   AGE
+drycc-builder-574483744-l15zj             1/1       Running   0          4m
+drycc-controller-3953262871-pncgq         1/1       Running   2          4m
+drycc-controller-celery-cmxxn             3/3       Running   0          4m
+drycc-database-83844344-47ld6             1/1       Running   0          4m
+drycc-logger-176328999-wjckx              1/1       Running   4          4m
+drycc-logger-fluentbit-zxnqb              1/1       Running   0          4m
+drycc-redis-304849759-1f35p               1/1       Running   0          4m
+drycc-storage-676004970-nxqgt             1/1       Running   0          4m
+drycc-monitor-grafana-432627134-lnl2h     1/1       Running   0          4m
+drycc-monitor-telegraf-wmcmn              1/1       Running   1          4m
+drycc-registry-756475849-lwc6b            1/1       Running   1          4m
+drycc-registry-proxy-96c4p                1/1       Running   0          4m
+drycc-rabbitmq-0                          1/1       Running   0          4m
+ + +

Once all of the pods are in the READY state, Drycc Workflow is up and running!

+

For more installation parameters, please check the values.yaml file of workflow.

+

After installing Workflow, register a user and deploy an application.

+

Configure DNS

+

User must to set up a hostname, and assumes the drycc-builder.$host convention.

+

We need to point the drycc-builder.$host record to the public IP address of your builder. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed.

+
$ kubectl get svc drycc-builder --namespace drycc
+NAME              CLUSTER-IP   EXTERNAL-IP      PORT(S)                      AGE
+drycc-builder     10.0.25.3    138.91.243.152   2222:31625/TCP               33m
+ + +

If we were using drycc.cc as a hostname, we would need to create the following A DNS records.

+ + + + + + + + + + + + + + + +
NameTypeValue
drycc-builder.drycc.ccA138.91.243.152
+

Once all of the pods are in the READY state, and drycc-builder.$host resolves to the external IP found above, Workflow is up and running!

+

After installing Workflow, register a user and deploy an application.

+

If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can +access both internal and external networks, and then expose 80 and 443.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/installing-workflow/system-requirements/index.html b/installing-workflow/system-requirements/index.html new file mode 100644 index 000000000..12b035b47 --- /dev/null +++ b/installing-workflow/system-requirements/index.html @@ -0,0 +1,887 @@ + + + + + + + + + + + + + + + + + + System Requirements - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Requirements

+

To run Drycc Workflow on a Kubernetes cluster, there are a few requirements to keep in mind.

+

Kubernetes Versions

+

Drycc Workflow requires Kubernetes v1.16.15 or later.

+

Components Requirements

+

Drycc uses gateway as a routing implementation, so you have to choose an gateway. We recommend using istio or kong.

+

Workflow supports the use of ACME to manage automatic certificates, cert-manager is also one of the necessary components, if you use cert-manager EAB, you need to set the clusterResourceNamespace to the namespace of drycc.

+

Workflow supports stateful apps. You can create and use them through the 'drycc volumes' command. If you want to use this feature, you must have a StorageClass that supports ReadWriteMany.

+

Workflow also supports the OSB API through the 'drycc resources' command. If you want to use this function, you need to install service-catalog.

+

Storage Requirements

+

A variety of Drycc Workflow components rely on an object storage system to do their work, including storing application +slugs, Container images and database logs.

+

Drycc Workflow ships with drycc storage by default, which provides in-cluster.

+

Workflow supports Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), OpenShift Swift, and Azure Blob +Storage. See configuring object storage for setup instructions.

+

Resource Requirements

+

When deploying Drycc Workflow, it's important to provision machines with adequate resources. Drycc is a highly-available +distributed system, which means that Drycc components and your deployed applications will move around the cluster onto +healthy hosts as hosts leave the cluster for various reasons (failures, reboots, autoscalers, etc.). Because of this, +you should have ample spare resources on any machine in your cluster to withstand the additional load of running +services for failed machines.

+

Drycc Workflow components use about 2.5GB of memory across the cluster, and require approximately 30GB of hard disk +space. Because it may need to handle additional load if another one fails, each machine has minimum requirements of:

+
    +
  • At least 4GB of RAM (more is better)
  • +
  • At least 40GB of hard disk space
  • +
+

Note that these estimates are for Drycc Workflow and Kubernetes only. Be sure to leave enough spare capacity for your +application footprint as well.

+

Running smaller machines will likely result in increased system load and has been known to result in component failures +and instability.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/managing-workflow/configuring-dns/index.html b/managing-workflow/configuring-dns/index.html new file mode 100644 index 000000000..d465a6148 --- /dev/null +++ b/managing-workflow/configuring-dns/index.html @@ -0,0 +1,948 @@ + + + + + + + + + + + + + + + + + + Configuring DNS - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Configure DNS

+

The Drycc Workflow controller and all applications deployed via Workflow are intended (by default) to be accessible as subdomains of the Workflow cluster's domain. For example, assuming example.com were a cluster's domain:

+
    +
  • The controller should be accessible at drycc.example.com
  • +
  • Applications should be accessible (by default) at <application name>.example.com
  • +
+

Given that this is the case, the primary objective in configuring DNS is that traffic for all subdomains of a cluster's domain be directed to the cluster node(s) hosting the platform's router component, which is capable of directing traffic within the cluster to the correct endpoints.

+

With a Load Balancer

+

Generally, it is recommended that a [load balancer][] be used to direct inbound traffic to one or more routers. In such a case, configuring DNS is as simple as defining a wildcard record in DNS that points to the load balancer.

+

For example, assuming a domain of example.com:

+
    +
  • An A record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining)
  • +
  • A CNAME record referencing an existing fully-qualified domain name for the load balancer
      +
    • Per AWS' own documentation, this is the recommended strategy when using AWS Elastic Load Balancers, as ELB IPs may change over time.
    • +
    +
  • +
+

DNS for any applications using a "custom domain" (a fully-qualified domain name that is not a subdomain of the cluster's own domain) can be configured by creating a CNAME record that references the wildcard record described above.

+

Although it is dependent upon your distribution of Kubernetes and your underlying infrastructure, in many cases, the IP(s) or existing fully-qualified domain name of a load balancer can be determined directly using the kubectl tool:

+
$ kubectl --namespace=istio-nginx describe service | grep "LoadBalancer"
+LoadBalancer Ingress:   a493e4e58ea0511e5bb390686bc85da3-1558404688.us-west-2.elb.amazonaws.com
+ + +

The LoadBalancer Ingress field typically describes an existing domain name or public IP(s). Note that if Kubernetes is able to automatically provision a load balancer for you, it does so asynchronously. If the command shown above is issued very soon after Workflow installation, the load balancer may not exist yet.

+

Without a Load Balancer

+

On some platforms (Minikube, for instance), a load balancer is not an easy or practical thing to provision. In these cases, one can directly identify the public IP of a Kubernetes node that is hosting a router pod and use that information to configure the local /etc/hosts file.

+

Because wildcard entries do not work in a local /etc/hosts file, using this strategy may result in frequent editing of that file to add fully-qualified subdomains of a cluster for each application added to that cluster. Because of this a more viable option may be to utilize the xip.io service.

+

In general, for any IP, a.b.c.d, the fully-qualified domain name any-subdomain.a.b.c.d.xip.io will resolve to the IP a.b.c.d. This can be enormously useful.

+

To begin, find the node(s) hosting router instances using kubectl:

+
$ kubectl --namespace=istio-ingress describe pod | grep Node:
+Node:       ip-10-0-0-199.us-west-2.compute.internal/10.0.0.199
+Node:       ip-10-0-0-198.us-west-2.compute.internal/10.0.0.198
+ + +

The command will display information for every router pod. For each, a node name and IP are displayed in the Node field. If the IPs appearing in these fields are public, any of these may be used to configure your local /etc/hosts file or may be used with xip.io. If the IPs shown are not public, further investigation may be needed.

+

You can list the IP addresses of a node using kubectl:

+
$ kubectl describe node ip-10-0-0-199.us-west-2.compute.internal
+# ...
+Addresses:  10.0.0.199,10.0.0.199,54.218.85.175
+# ...
+ + +

Here, the Addresses field lists all the node's IPs. If any of them are public, again, they may be used to configure your local /etc/hosts file or may be used with xip.io.

+

Tutorial: Configuring DNS with Google Cloud DNS

+

In this section, we'll describe how to configure Google Cloud DNS for routing your domain name to your Drycc cluster.

+

We'll assume the following in this section:

+
    +
  • Your Ingress service has a load balancer in front of it.
  • +
  • The load balancer need not be cloud based, it just needs to provide a stable IP address or a stable domain name
  • +
  • You have the mystuff.com domain name registered with a registrar
  • +
  • Replace your domain name with mystuff.com in the instructions to follow
  • +
  • Your registrar lets you alter the nameservers for your domain name (most registrars do)
  • +
+

Here are the steps for configuring cloud DNS to route to your drycc cluster:

+
    +
  1. Get the load balancer IP or domain name
  2. +
  3. If you are on Google Container Engine, you can run kubectl get svc -n istio-ingress and look for the LoadBalancer Ingress column to get the IP address
  4. +
  5. Create a new Cloud DNS Zone (on the console: Networking => Cloud DNS, then click on Create Zone)
  6. +
  7. Name your zone, and set the DNS name to mystuff.com. (note the . at the end
  8. +
  9. Click on the Create button
  10. +
  11. Click on the Add Record Set button on the resulting page
  12. +
  13. If your load balancer provides a stable IP address, enter the following fields in the resulting form:
  14. +
  15. DNS Name: *
  16. +
  17. Resource Record Type: A
  18. +
  19. TTL: the DNS TTL of your choosing. If you're testing or you anticipate that you'll tear down and rebuild many drycc clusters over time, we recommend a low TTL
  20. +
  21. IPv4 Address: The IP that you got in the very first step
  22. +
  23. Click the Create button
  24. +
  25. If your load balancer provides the stable domain name lbdomain.com, enter the following fields in the resulting form:
  26. +
  27. DNS Name: *
  28. +
  29. Resource Record Type: CNAME
  30. +
  31. TTL: the DNS TTL of your choosing. If you're testing or you anticipate that you'll tear down and rebuild many drycc clusters over time, we recommend a low TTL
  32. +
  33. Canonical name: lbdomain.com. (note the . a the end)
  34. +
  35. Click on the Create button
  36. +
  37. In your domain registrar, set the nameservers for your mystuff.com domain to the ones under the data column in the NS record on the same page. They'll often be something like the below (note the trailing . characters).
  38. +
+

ns-cloud-b1.googledomains.com. + ns-cloud-b2.googledomains.com. + ns-cloud-b3.googledomains.com. + ns-cloud-b4.googledomains.com.

+

Note: If you ever have to re-create your drycc cluster, simply go back to step 6.4 or 7.4 (depending on your load balancer) and change the IP address or domain name to the new value. You may have to wait for the TTL you set to expire.

+

Testing

+

To test that traffic reaches its intended destination, a request can be +sent to the Drycc controller like so (do not forget the trailing slash!):

+
curl http://drycc.example.com/v2/
+ + +

Or:

+
curl http://drycc.54.218.85.175.xip.io/v2/
+ + +

Since such requests require authentication, a response such as the following should be considered an indicator of success:

+
{"detail":"Authentication credentials were not provided."}
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/managing-workflow/deploy-hooks/index.html b/managing-workflow/deploy-hooks/index.html new file mode 100644 index 000000000..32b0bff04 --- /dev/null +++ b/managing-workflow/deploy-hooks/index.html @@ -0,0 +1,896 @@ + + + + + + + + + + + + + + + + + + Deploy Hooks - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Deploy Hooks

+

Deploy hooks allow an external service to receive a notification whenever a new version of your app +is pushed to Workflow. It’s useful to help keep the development team informed about deploys, while +it can also be used to integrate different systems together.

+

After one or more hooks are setup, hook output and errors appear in your application’s logs:

+
$ drycc logs
+...
+2011-03-15T15:07:29-07:00 drycc[api]: Deploy hook sent to http://drycc.rocks
+ + +

Deploy hooks are a generic HTTP hook. An administrator can create and configure multiple deploy +hooks by tuning the controller settings via the Helm chart.

+

HTTP POST Hook

+

The HTTP deploy hook performs an HTTP POST to a URL. The parameters included in the request are the +same as the variables available in the hook message: app, release, release_summary, sha and +user. See below for their descriptions:

+
app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv
+ + +

Optionally, if a deploy hook secret key is added to the controller through +tuning the controller settings, a new Authorization header will be +present in the POST request. The value of this header is computed as the HMAC hex digest of the +request URL, using the secret as the key.

+

In order to authenticate that this request came from Workflow, use the secret key, the full URL and +the HMAC-SHA1 hashing algorithm to compute the signature. In Python, that would look something like +this:

+
import hashlib
+import hmac
+
+hmac.new("my_secret_key", "http://drycc.rocks?app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv", digestmod=hashlib.sha1).hexdigest()
+ + +

If the value of the computed HMAC hex digest and the value in the Authorization header are +identical, then the request came from Workflow.

+
+

Important

+

When computing the signature, ensure that the URL parameters are in alphabetic order. This is +critical when computing the cryptographic signature as most web applications don't care about +the order of the HTTP parameters, but the cryptographic signature will not be the same.

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/managing-workflow/platform-logging/index.html b/managing-workflow/platform-logging/index.html new file mode 100644 index 000000000..4bd45f3b0 --- /dev/null +++ b/managing-workflow/platform-logging/index.html @@ -0,0 +1,896 @@ + + + + + + + + + + + + + + + + + + Platform Logging - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Platform Logging

+

The logging platform is made up of 2 components - Fluentbit and Logger.

+

Fluentbit runs on every worker node of the cluster and is deployed as a Daemon Set. The Fluentbit pods capture all of the stderr and stdout streams of every container running on the host (even those not hosted directly by kubernetes). Once the log message arrives in our custom fluentbit plugin we determine where the message originated.

+

If the message was from the Workflow Controller or from an application deployed via workflow we send it to the logs topic on the local Redis Stream instance.

+

Logger then acts as a consumer reading messages off of the Redis Stream logs topic storing those messages in a local Redis instance. When a user wants to retrieve log entries using the drycc logs command we make an HTTP request from Controller to Logger which then fetches the appropriate data from Redis.

+

Configuring Off Cluster Redis

+

Even though we provide a redis instance with the default Workflow install, it is recommended that operators use a third-party source like Elasticache or similar offering. This way your data is durable across upgrades or outages. If you have a third-party Redis installation you would like to use all you need to do is set the following values in your helm chart:

+
    +
  • db = "0"
  • +
  • host = "my.host.redis"
  • +
  • port = "6379"
  • +
  • password = ""
  • +
+

These can be changed by running helm inspect values drycc/workflow > values.yaml before using +helm install to complete the installation. To customize the redis credentials, edit values.yaml +and modify the redis section of the file to tune these settings.

+

Debugging Logger

+

If the drycc logs command encounters an error it will return the following message:

+
Error: There are currently no log messages. Please check the following things:
+1) Logger and fluentbit pods are running.
+2) The application is writing logs to the logger component by checking that an entry in the ring buffer was created: kubectl  --namespace=drycc logs <logger pod>
+3) Making sure that the container logs were mounted properly into the fluentbit pod: kubectl --namespace=drycc exec <fluentbit pod> ls /var/log/containers
+ + +

Architecture Diagram

+
                        ┌────────┐                                        
+                        │ Router │                  ┌────────┐     ┌─────┐
+                        └────────┘                  │ Logger │◀───▶│Redis│
+                            │                       └────────┘     └─────┘
+                        Log file                        ▲                
+                            │                           │                
+                            ▼                           │                
+┌────────┐             ┌─────────┐    logs/metrics   ┌──────────────┐     
+│App Logs│──Log File──▶│Fluentbit│───────topics─────▶│ Redis Stream │     
+└────────┘             └─────────┘                   └──────────────┘     
+ + +

Default Configuration

+

Fluent Bit is based in a pluggable architecture where different plugins plays a major role in the data pipeline, more than 70 built-in plugins available. +Please refer to charts values.yaml for specific configurations.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/managing-workflow/platform-monitoring/index.html b/managing-workflow/platform-monitoring/index.html new file mode 100644 index 000000000..e1b7bc3ec --- /dev/null +++ b/managing-workflow/platform-monitoring/index.html @@ -0,0 +1,931 @@ + + + + + + + + + + + + + + + + + + Platform Monitoring - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Platform Monitoring

+

Description

+

We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components:

+ +

Architecture Diagram

+
┌────────────────┐                                                        
+│ HOST           │                                                        
+│  node-exporter │◀──┐                       ┌──────────────────┐         
+└────────────────┘   │                       │kube-state-metrics│         
+                     │                       └──────────────────┘         
+┌────────────────┐   │                               ▲                    
+│ HOST           │   │    ┌────────────┐             │                    
+│  node-exporter │◀──┼────│ Prometheus │─────────────┘                    
+└────────────────┘   │    └────────────┘                                  
+                     │          ▲                                         
+┌───────────────┐    │          │                                         
+│ HOST          │    │          ▼                                         
+│  node-exporter│◀───┘    ┌──────────┐                                    
+└───────────────┘         │ Grafana  │                                    
+                          └──────────┘                                    
+ + +

Grafana

+

Grafana allows users to create custom dashboards that visualize the data captured to the running Prometheus component. By default Grafana is exposed using a service annotation through the router at the following URL: http://grafana.mydomain.com. The default login is admin/admin. If you are interested in changing these values please see [Tuning Component Settings][].

+

Grafana will preload several dashboards to help operators get started with monitoring Kubernetes and Drycc Workflow. +These dashboards are meant as starting points and don't include every item that might be desirable to monitor in a +production installation.

+

Drycc Workflow monitoring by default does not write data to the host filesystem or to long-term storage. If the Grafana instance fails, modified dashboards are lost.

+

Production Configuration

+

A production install of Grafana should have the following configuration values changed if possible:

+
    +
  • Change the default username and password from admin/admin. The value for the password is passed in plain text so it is best to set this value on the command line instead of checking it into version control.
  • +
  • Enable persistence
  • +
  • Use a supported external database such as mysql or postgres. You can find more information here
  • +
+

On Cluster Persistence

+

Enabling persistence will allow your custom configuration to persist across pod restarts. This means that the default sqllite database (which stores things like sessions and user data) will not disappear if you upgrade the Workflow installation.

+

If you wish to have persistence for Grafana you can set enabled to true in the values.yaml file before running helm install.

+
 grafana:
+   # Configure the following ONLY if you want persistence for on-cluster grafana
+   # GCP PDs and EBS volumes are supported only
+   persistence:
+     enabled: true # Set to true to enable persistence
+     size: 5Gi # PVC size
+ + +

Off Cluster Grafana

+

If you wish to provide your own Grafana instance you can set grafanaLocation in the values.yaml file before running helm install.

+

Prometheus

+

Prometheus writes data to the host disk; however, if the prometheus pod dies and comes back on another host, the data will not be recovered. The prometheus graph UI is also exposed through the router allowing users to access the query engine by going to prometheus.mydomain.com.

+

On Cluster Persistence

+

You can set node-exporter and kube-state-metrics to true or false in the values.yaml. +If you wish to have persistence for Prometheus you can set enabled to true in the values.yaml file before running helm install.

+
prometheus:
+  prometheus-server:
+    persistence:
+      enabled: true # Set to true to enable persistence
+      size: 10Gi # PVC size
+node-exporter:
+  enabled: true
+kube-state-metrics:
+  enabled: true
+ + +

Off Cluster Prometheus

+

To use off-cluster Prometheus, please provide the following values in the values.yaml file before running helm install.

+
    +
  • global.prometheusLocation=off-cluster
  • +
  • url = "http://my.prometheus.url:9090"
  • +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/managing-workflow/production-deployments/index.html b/managing-workflow/production-deployments/index.html new file mode 100644 index 000000000..6d4b004bd --- /dev/null +++ b/managing-workflow/production-deployments/index.html @@ -0,0 +1,896 @@ + + + + + + + + + + + + + + + + + + Production Deployments - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Production Deployments

+

When readying a Workflow deployment for production workloads, there are some additional +recommendations.

+

Running Workflow without drycc storage

+

In production, persistent storage can be achieved by running an external object store. +For users on AWS, GCE/GKE or Azure, the convenience of Amazon S3, Google GCS or Microsoft Azure Storage +makes the prospect of running a Storage-less Workflow cluster quite reasonable. For users who have restriction +on using external object storage using swift object storage can be an option.

+

Running a Workflow cluster without Storage provides several advantages:

+
    +
  • Removal of state from the worker nodes
  • +
  • Reduced resource usage
  • +
  • Reduced complexity and operational burden of managing Workflow
  • +
+

See Configuring Object Storage for details on removing this operational complexity.

+

Review Security Considerations

+

There are some additional security-related considerations when running Workflow in production. +See [Security Considerations][] for details.

+

Registration is Admin-Only

+

By default, registration with the Workflow controller is in "admin_only" mode. The first user +to run a drycc register command becomes the initial "admin" user, and registrations after that +are disallowed unless requested by an admin.

+

Please see the following documentation to learn about changing registration mode:

+ +

Disable Grafana Signups

+

It is also recommended to disable signups for the Grafana dashboards.

+

Please see the following documentation to learn about disabling Grafana signups:

+ +

Running Workflow with RBAC

+

If your cluster has RBAC amongst your authorization modes ($ kubectl api-versions should contains rbac.authorization.k8s.io) it may be necessary to enable RBAC in Workflow. +This can be achieved by setting use_rbac in the global section of values.yaml to true, or by adding --set=global.use_rbac=true to the $ helm install/upgrade command. +RBAC support was announced in Kubernetes-1.5 and is enabled by default if: +- your Kubernetes cluster is in GKE +- your Kubernetes cluster built with kubeadm

+

Note: helm may need to be given specific permissions under RBAC if not already done.

+

Attention: Azure ACS Kubernetes clusters are not RBAC-enabled for today due to lack in authentication strategy. Feel free to watch this PR for more details.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/managing-workflow/tuning-component-settings/index.html b/managing-workflow/tuning-component-settings/index.html new file mode 100644 index 000000000..b8e95fd1f --- /dev/null +++ b/managing-workflow/tuning-component-settings/index.html @@ -0,0 +1,1186 @@ + + + + + + + + + + + + + + + + + + Tuning Component Settings - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Tuning Component Settings

+

Helm Charts are a set of Kubernetes manifests that reflect best practices for deploying an +application or service on Kubernetes.

+

After you add the Drycc Chart Repository, you can customize the chart using +helm inspect values drycc/workflow > values.yaml before using helm install to complete the +installation.

+

There are a few ways to customize the respective component:

+
    +
  • +

    If the value is exposed in the values.yaml file as derived above, one may modify the section of the component to tune these settings. The modified value(s) will then take effect at chart installation or release upgrade time via either of the two respective commands:

    +
    $ helm install drycc oci://registry.drycc.cc/charts/workflow \
    +    -n drycc \
    +    --namespace drycc \
    +    -f values.yaml
    +$ helm upgrade drycc oci://registry.drycc.cc/charts/workflow \
    +    -n drycc \
    +    --namespace drycc \
    +    -f values.yaml
    + + +
  • +
  • +

    If the value hasn't yet been exposed in the values.yaml file, one may edit the component deployment with the tuned setting. Here we edit the drycc-controller deployment:

    +
    $ kubectl --namespace drycc edit deployment drycc-controller
    + + +

    Add/edit the setting via the appropriate environment variable and value under the env section and save. The updated deployment will recreate the component pod with the new/modified setting.

    +
  • +
  • +

    Lastly, one may also fetch and edit the chart as served by version control/the chart repository itself:

    +
    $ helm fetch oci://registry.drycc.cc/charts/workflow --untar
    +$ $EDITOR workflow/charts/controller/templates/controller-deployment.yaml
    + + +

    Then run helm install ./workflow --namespace drycc --name drycc to apply the changes, or helm upgrade drycc ./workflow if the cluster is already running.

    +
  • +
+

Setting Resource limits

+

You can set resource limits to Workflow components by modifying the values.yaml file fetched +earlier. This file has a section for each Workflow component. To set a limit to any Workflow +component just add limitsCpu, limitsMemory in the section and set them to the appropriate +values.

+

Below is an example of how the builder section of values.yaml might look with CPU and memory +limits set:

+
builder:
+  imageOrg: "drycc"
+  imagePullPolicy: "Always"
+  imageTag: "canary"
+  limitsCpu: "100m"
+  limitsMemory: "50Mi"
+ + +

Customizing the Builder

+

The following environment variables are tunable for the Builder component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
DEBUGEnable debug log output (default: false)
BUILDER_POD_NODE_SELECTORA node selector setting for builder job. As it may sometimes consume a lot of node resources, one may want a given builder job to run in a specific node only, so it won't affect critical nodes. for example pool:testing,disk:magnetic
+

Customizing the Controller

+

The following environment variables are tunable for the Controller component:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
REGISTRATION_MODEset registration to "enabled", "disabled", or "admin_only" (default: "admin_only")
GUNICORN_WORKERSnumber of gunicorn workers spawned to process requests (default: CPU cores * 4 + 1)
RESERVED_NAMESa comma-separated list of names which applications cannot reserve for routing (default: "drycc, drycc-builder")
DRYCC_DEPLOY_HOOK_URLSa comma-separated list of URLs to send deploy hooks to.
DRYCC_DEPLOY_HOOK_SECRET_KEYa private key used to compute the HMAC signature for deploy hooks.
DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSINGrejects a deploy if the previous build had a Procfile but the current deploy is missing it. A 409 is thrown in the API. Prevents accidental process types removal. (default: "false", allowed values: "true", "false")
DRYCC_DEPLOY_PROCFILE_MISSING_REMOVEwhen turned on (default) any missing process type in a Procfile compared to the previous deploy is removed. When set to false will allow an empty Procfile to go through without removing missing process types, note that new images, configs and so on will get updated on all proc types. (default: "true", allowed values: "true", "false")
DRYCC_DEFAULT_CONFIG_TAGSset tags for all applications by default, for example: '{"role": "worker"}'. (default: '')
KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPECset resource quota to application namespace by setting ResourceQuota spec, for example: {"spec":{"hard":{"pods":"10"}}}, restrict app owner to spawn more then 10 pods (default: "", no quota will be applied to namespace)
+

LDAP authentication settings

+

Configuration options for LDAP authentication are detailed here.

+

The following environment variables are available for enabling LDAP +authentication of user accounts in the Passport component:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
LDAP_ENDPOINTThe URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: "", example: ldap://hostname).
LDAP_BIND_DNThe distinguished name to use when binding to the LDAP server (default: "")
LDAP_BIND_PASSWORDThe password to use with LDAP_BIND_DN (default: "")
LDAP_USER_BASEDNThe distinguished name of the search base for user names (default: "")
LDAP_USER_FILTERThe name of the login field in the users search base (default: "username")
LDAP_GROUP_BASEDNThe distinguished name of the search base for user's groups names (default: "")
LDAP_GROUP_FILTERThe filter for user's groups (default: "", example: objectClass=person)
+

Global and per application settings

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
DRYCC_DEPLOY_BATCHESthe number of pods to bring up and take down sequentially during a scale (default: number of available nodes)
DRYCC_DEPLOY_TIMEOUTdeploy timeout in seconds per deploy batch (default: 120)
IMAGE_PULL_POLICYthe kubernetes image pull policy for application images (default: "IfNotPresent") (allowed values: "Always", "IfNotPresent")
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIThow many revisions Kubernetes keeps around of a given Deployment (default: all revisions)
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDShow many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30)
+

See the Deploying Apps guide for more detailed information on those.

+

Customizing the Database

+

The following environment variables are tunable for the Database component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
BACKUP_FREQUENCYhow often the database should perform a base backup (default: "12h")
BACKUPS_TO_RETAINnumber of base backups the backing store should retain (default: 5)
+

Customizing Fluentbit

+

The following values can be changed in the values.yaml file or by using the --values flag with the Helm CLI.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
KeyDescription
config.serviceThe service section defines the global properties of the service.
config.inputsAn input section defines a source (related to an input plugin).
config.filtersA filter section defines a filter (related to a filter plugin)
config.outputsThe outputs section specify a destination that certain records should follow after a Tag match.
+

For more information about the various variables that can be set please see the fluentbit.

+

Customizing the Logger

+

The following environment variables are tunable for the Logger component:

+ + + + + + + + + + + + + + + + + +
SettingDescription
STORAGE_ADAPTERHow to store logs that are sent to the logger. Legal values are "file", "memory", and "redis". (default: "redis")
NUMBER_OF_LINESHow many lines to store in the ring buffer (default: 1000)
+

Customizing the Monitor

+

Grafana

+

We have exposed some of the more useful configuration values directly in the chart. This allows them to be set using either the values.yaml file or by using the --set flag with the Helm CLI. You can see these options below:

+

Setting | Default Value | Description +----------------- | -------------- |------------ | +user | "admin" | The first user created in the database (this user has admin privileges) +password | "admin" | Password for the first user. +allow_sign_up | "true" | Allows users to sign up for an account.

+

For a list of other options you can set by using environment variables please see the configuration file in Github.

+

Telegraf

+

For a list of configuration values that can be set by using environment variables please see the following configuration file.

+

Prometheus

+

You can find a list of values that can be set using environment variables here.

+

Customizing the Registry

+

The Registry component can be tuned by following the +drycc/distribution config doc.

+

Customizing the Router

+

The majority of router settings are tunable through annotations, which allows the router to be +re-configured with zero downtime post-installation. You can find the list of annotations to tune +here.

+

The following environment variables are tunable for the [Router][] component:

+ + + + + + + + + + + + + +
SettingDescription
POD_NAMESPACEThe pod namespace the router resides in. This is set by the Kubernetes downward API.
+

Customizing Workflow Manager

+

The following environment variables are tunable for [Workflow Manager][]:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
CHECK_VERSIONSEnables the external version check at https://versions.drycc.info/ (default: "true")
POLL_INTERVAL_SECThe interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours)
VERSIONS_API_URLThe versions API URL (default: "https://versions-staging.drycc.info")
DOCTOR_API_URLThe doctor API URL (default: "https://doctor-staging.drycc.info")
API_VERSIONThe version number Workflow Manager sends to the versions API (default: "v2")
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/managing-workflow/upgrading-workflow/index.html b/managing-workflow/upgrading-workflow/index.html new file mode 100644 index 000000000..206cc6300 --- /dev/null +++ b/managing-workflow/upgrading-workflow/index.html @@ -0,0 +1,914 @@ + + + + + + + + + + + + + + + + + + Upgrading Workflow - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Upgrading Workflow

+

Drycc Workflow releases may be upgraded in-place with minimal downtime. This upgrade process requires:

+ +

Upgrade Process

+
+

Note

+

If upgrading from a Helm Classic install, you'll need to 'migrate' the cluster to a Kubernetes Helm installation. See Workflow-Migration for steps.

+
+

Step 1: Apply the Workflow upgrade

+

Helm will remove all components from the previous release. Traffic to applications deployed through +Workflow will continue to flow during the upgrade. No service interruptions should occur.

+

If Workflow is not configured to use off-cluster Postgres, the Workflow API will experience a brief +period of downtime while the database recovers from backup.

+

First, find the name of the release helm gave to your deployment with helm ls, then run

+
$ helm upgrade <release-name> oci://registry.drycc.cc/charts/workflow
+ + +

Note: If using off-cluster object storage on gcs and/or off-cluster registry using gcr and intending to upgrade from a pre-v2.10.0 chart to v2.10.0 or greater, the key_json values will now need to be pre-base64-encoded. Therefore, assuming the rest of the custom/off-cluster values are defined in the existing values.yaml used for previous installs, the following may be run:

+
$ B64_KEY_JSON="$(cat ~/path/to/key.json | base64 -w 0)"
+$ helm upgrade <release_name> drycc/workflow -f values.yaml --set gcs.key_json="${B64_KEY_JSON}",registry-token-refresher.gcr.key_json="${B64_KEY_JSON}"
+ + +

Alternatively, simply replace the appropriate values in values.yaml and do without the --set +parameter. Make sure to wrap it in single quotes as double quotes will give a parser error when +upgrading.

+

Step 2: Verify Upgrade

+

Verify that all components have started and passed their readiness checks:

+
$ kubectl --namespace=drycc get pods
+NAME                                     READY     STATUS    RESTARTS   AGE
+drycc-builder-2448122224-3cibz            1/1       Running   0          5m
+drycc-controller-1410285775-ipc34         1/1       Running   3          5m
+drycc-controller-celery-694f75749b-cmxxn  3/3       Running   0          5m
+drycc-database-e7c5z                      1/1       Running   0          5m
+drycc-logger-cgjup                        1/1       Running   3          5m
+drycc-logger-fluentbit-45h7j              1/1       Running   0          5m
+drycc-logger-fluentbit-4z7lw              1/1       Running   0          5m
+drycc-logger-fluentbit-k2wsw              1/1       Running   0          5m
+drycc-logger-fluentbit-skdw4              1/1       Running   0          5m
+drycc-redis-8nazu                         1/1       Running   0          5m
+drycc-monitor-grafana-tm266               1/1       Running   0          5m
+drycc-monitor-telegraf-51zel              1/1       Running   1          5m
+drycc-monitor-telegraf-cdasg              1/1       Running   0          5m
+drycc-monitor-telegraf-hea6x              1/1       Running   0          5m
+drycc-monitor-telegraf-r7lsg              1/1       Running   0          5m
+drycc-registry-1814324048-yomz5           1/1       Running   0          5m
+drycc-registry-proxy-4m3o4                1/1       Running   0          5m
+drycc-registry-proxy-no3r1                1/1       Running   0          5m
+drycc-registry-proxy-ou8is                1/1       Running   0          5m
+drycc-registry-proxy-zyajl                1/1       Running   0          5m
+drycc-rabbitmq-0                          1/1       Running   0          5m
+ + +

Step 3: Upgrade the Drycc Client

+

Users of Drycc Workflow should now upgrade their drycc client to avoid getting WARNING: Client and server API versions do not match. Please consider upgrading. warnings.

+
curl -sfL https://www.drycc.cc/install-cli.sh | bash - && sudo mv drycc $(which drycc)
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/quickstart/deploy-an-app/index.html b/quickstart/deploy-an-app/index.html new file mode 100644 index 000000000..90144286d --- /dev/null +++ b/quickstart/deploy-an-app/index.html @@ -0,0 +1,948 @@ + + + + + + + + + + + + + + + + + + Deploy Your First App - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Determine Your Host and Hostname Values

+

Drycc workflow requires a wildcard DNS record to dynamically map app names to the router.

+

User should already have DNS set up pointing to their known host. The $hostname value can be calculated by prepending drycc. to the value set in global.platformDomain.

+

Login to Workflow

+

Workflow use the passport component to create and authorize users. +If you already have an account, use drycc login to authenticate against the Drycc Workflow API.

+
$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as admin
+Configuration file written to /root/.drycc/client.json
+ + +

Deploy an Application

+

Drycc Workflow supports three different types of applications, Buildpacks, +Dockerfiles and Container Images. Our first application will be a simple Container +Image-based application, so you don't have to wrestle with checking out code.

+

Run drycc create to create a new application on Drycc Workflow. If you do not +specify a name for your application, Workflow automatically generates a +friendly (and sometimes funny) name.

+
$ drycc create --no-remote
+Creating Application... done, created proper-barbecue
+If you want to add a git remote for this app later, use `drycc git:remote -a proper-barbecue`
+ + +

Our application has been created and named proper-barbecue. As with the +drycc hostname, any HTTP traffic to proper-barbecue will be automatically +routed to your application pods by the edge router.

+

Let's use the CLI to tell the platform to deploy an application and then use curl to send a request to the app:

+
$ drycc pull drycc/example-go -a proper-barbecue
+Creating build... done
+$ curl http://proper-barbecue.$hostname
+Powered by Drycc
+ + +
+

Note

If you see a 404 error, make sure you specified your application name with -a <appname>!

+

+
+

Workflow's edge router knows all about application names and automatically +sends traffic to the right application. The router sends traffic for +proper-barbecue.104.197.125.75.nip.io to your app, just like +drycc.104.197.125.75.nip.io was sent to the Workflow API service.

+

Change Application Configuration

+

Next, let's change some configuration using the CLI. Our example app is built +to read configuration from the environment. By using drycc config:set we can +change how the application behaves:

+
$ drycc config:set POWERED_BY="Container Images + Kubernetes" -a proper-barbecue
+Creating config... done
+
+=== proper-barbecue Config
+POWERED_BY      Container Images + Kubernetes
+ + +

Behind the scenes, Workflow creates a new release for your application and uses +Kubernetes to provide a zero-downtime rolling deploy to the new release!

+

Validate that our configuration change has worked:

+
$ curl http://proper-barbecue.104.197.125.75.nip.io
+Powered by Container Images + Kubernetes
+ + +

Scale Your Application

+

Last, let's scale our application by adding more application processes. Using the CLI you can easily add and remove +additional processes to service requests:

+
$ drycc scale cmd=2 -a proper-barbecue
+Scaling processes... but first, coffee!
+done in 36s
+=== proper-barbecue Processes
+--- cmd (started): 2
+proper-barbecue-v18-cmd-rk644 up (v18)
+proper-barbecue-v18-cmd-0ag04 up (v18)
+ + +

Congratulations! You have deployed, configured, and scaled your first application using Drycc Workflow.

+

Going Further

+

There is a lot more you can do with Drycc Workflow, play around with the CLI:

+
+

Important

+

In order to have permission to push an app you must add a SSH key to your user on the Drycc Workflow. +For more information, please check Users and SSH Keys and Troubleshooting Workflow.

+
+ +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/quickstart/index.html b/quickstart/index.html new file mode 100644 index 000000000..a775009da --- /dev/null +++ b/quickstart/index.html @@ -0,0 +1,870 @@ + + + + + + + + + + + + + + + + + + Overview - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Quick Start

+

Get started with Drycc Workflow in three easy steps.

+
    +
  1. Install CLI tools for Helm and Drycc Workflow
  2. +
  3. Boot a Kubernetes and install Drycc Workflow
  4. +
  5. Deploy your first application
  6. +
+

This guide will help you set up a cluster suitable for evaluation, development and testing. When you are ready for staging and production, view our production checklist.

+

Step 1: Install Workflow

+

For the quickstart we will install Drycc Workflow.

+

Step 2: Install CLI tools

+

For the quickstart we will install Drycc Workflow CLI.

+

Step 3: Deploy your first app

+

Last but not least, login and deploy your first application.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/quickstart/install-cli-tools/index.html b/quickstart/install-cli-tools/index.html new file mode 100644 index 000000000..6231762ec --- /dev/null +++ b/quickstart/install-cli-tools/index.html @@ -0,0 +1,887 @@ + + + + + + + + + + + + + + + + + + Install CLI Tools - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Drycc Workflow Client CLI

+

The Drycc command-line interface (CLI), lets you interact with Drycc Workflow. +Use the CLI to create and configure and manage applications.

+

Install the drycc client for Linux or Mac OS X with:

+
$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
+ + +
+

Important

+

Users in Chinese mainland can use the following methods to speed up installation:

+

$ curl -sfL https://www.drycc.cc/install-cli.sh | INSTALL_DRYCC_MIRROR=cn bash -

+
+

Others please visit: https://github.com/drycc/workflow-cli/releases

+

The installer places the drycc binary in your current directory, but you +should move it somewhere in your $PATH:

+
$ sudo ln -fs $PWD/drycc /usr/local/bin/drycc
+ + +

or:

+
$ sudo mv $PWD/drycc /usr/local/bin/drycc
+ + +

Check your work by running drycc version:

+
$ drycc version
+v1.1.0
+ + +
+

Note

+

Note that version numbers may vary as new releases become available

+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/quickstart/install-workflow/index.html b/quickstart/install-workflow/index.html new file mode 100644 index 000000000..46a337e3e --- /dev/null +++ b/quickstart/install-workflow/index.html @@ -0,0 +1,1242 @@ + + + + + + + + + + + + + + + + + + Install Workflow - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Install Workflow

+

If you have a pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop. Then this chapter is very suitable for you.

+

Operating Systems

+

Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements:

+
    +
  • (Red Hat/CentOS) Enterprise Linux, they usually use RPM package management.
  • +
  • Ubuntu (Desktop/Server/Cloud) Linux, a very popular distribution.
  • +
  • Debian GNU Linux, a very pure distribution of opensource software.
  • +
+

If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.

+

System Software

+

Some basic software needs to be installed before installing drycc workflow.

+

OS configuration

+

K8s requires a large number of ports. If you are not sure what they are, please close the local firewall or open these ports. +At the same time, because k8s you need system time, you need to ensure that the system time is correct.

+

Installing open-iscsi

+

The command used to install open-iscsi differs depending on the Linux distribution. +We recommend using Ubuntu as the guest OS image since it contains open-iscsi already. +You may need to edit the cluster security group to allow SSH access. +For SUSE and openSUSE, use this command:

+
$ zypper install open-iscsi
+ + +

For Debian and Ubuntu, use this command:

+
$ apt-get install open-iscsi
+ + +

For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:

+
$ yum install iscsi-initiator-utils
+ + +

Installing NFSv4 client

+

The command used to install a NFSv4 client differs depending on the Linux distribution.

+

For Debian and Ubuntu, use this command:

+
$ apt-get install nfs-common
+ + +

For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:

+
$ yum install nfs-utils
+ + +

Installing curl

+

For Debian and Ubuntu, use this command:

+
$ apt-get install curl
+ + +

For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:

+
$ yum install curl
+ + +

Installing bc

+

For Debian and Ubuntu, use this command:

+
$ apt-get install bc
+ + +

For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:

+
$ yum install bc
+ + +

Hardware

+

Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here.

+
    +
  • RAM: 1G Minimum (we recommend at least 2GB)
  • +
  • CPU: 1 Minimum
  • +
+

This configuration only contains the minimum requirements that can meet the operation.

+

Disk

+

Drycc performance depends on the performance of the database. To ensure optimal speed, we recommend using an SSD when possible. Disk performance will vary on ARM devices utilizing an SD card or eMMC.

+

Domain Name

+

Drycc needs a root domain name under your full control and points this domain name to the server to be installed. +Suppose there is a wildcard domain pointing to the current server to install drycc, which is the name *.dryccdoman.com. +We need to set the PLATFORM_DOMAIN environment variables before installation.

+
$ export PLATFORM_DOMAIN=dryccdoman.co
+ + +

Of course, if it is a test environment, we can also use nip.io, an IP to domain name service. +For example, your host IP is 59.46.3.190, we will get the following domain name 59.46.3.190.nip.io

+
$ export PLATFORM_DOMAIN=59.46.3.190.nip.io
+ + +

Install

+

Before installation, please make sure whether your installation environment is a public network. +If it is an intranet environment and there is no public IP, you need to disable the automatic certificate.

+
$ export CERT_MANAGER_ENABLED=false
+ + +

Then you can use the installation script available at https://www.drycc.cc/install.sh to install drycc as a service on systemd and openrc based systems.

+
$ curl -sfL https://www.drycc.cc/install.sh | bash -
+ + +
+

Important

+

If you are in China, you need to use mirror acceleration:

+

$ curl -sfL https://www.drycc.cc/install.sh | INSTALL_DRYCC_MIRROR=cn bash -

+
+

Install Node

+

Node can be a simple agent or a server; Server has the function of agent. Multiple servers have high availability, but the number of servers should not +exceed 7 at most. There is no limit to the number of agents.

+
    +
  • First, check the cluster token of the master.
  • +
+
$ cat /var/lib/rancher/k3s/server/node-token
+K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa
+ + +

We assume that the IP address of the cluster master is 192.168.6.240, in that way.

+
    +
  • Then, Set the environment variable:
  • +
+
$ export K3S_URL=https://192.168.6.240:6443
+$ export K3S_TOKEN="K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa"
+ + +
+

Important

+

If you are in China, you need to use mirror acceleration:

+

$ export INSTALL_DRYCC_MIRROR=cn

+
+
    +
  • Join the cluster as server:
  • +
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server
+ + +
    +
  • Join the cluster as agent:
  • +
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent
+ + +

Install Options

+

When using this method to install drycc, the following environment variables can be used to configure the installation:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ENVIRONMENT VARIABLEDESCRIPTION
PLATFORM_DOMAINRequired item, specify drycc's domain name
DRYCC_ADMIN_USERNAMERequired item, specify drycc's admin username
DRYCC_ADMIN_PASSWORDRequired item, specify drycc's admin password
CERT_MANAGER_ENABLEDWhether to use automatic certificate. It is true by default
CHANNELBy default, stable channel will be installed. You can also specify testing
CONTAINERD_FILEThe config.yaml file path used by containerd
KUBE_API_SERVER_ADDRESSSet with the IP address of the loadbalancer that was in front of kube-apiserver, The default is the IP address of the current node
KUBE_API_SERVER_PORTSet with the PORT of the loadbalancer that was in front of kube-apiserver, which is 6443 by default
METALLB_CONFIG_FILEThe metallb config file path, layer 2 network is used by default
INSTALL_DRYCC_MIRRORSpecify the accelerated mirror location. Currently, only cn is supported
BUILDER_REPLICASNumber of builder replicas to deploy
CONTROLLER_API_REPLICASNumber of controller api replicas to deploy
CONTROLLER_CELERY_REPLICASNumber of controller celery replicas to deploy
CONTROLLER_WEBHOOK_REPLICASNumber of controller webhook replicas to deploy
CONTROLLER_APP_RUNTIME_CLASSRuntimeClass is a feature for selecting the container runtime configuration.
CONTROLLER_APP_STORAGE_CLASSStorageClass allocated by drycc volumes; default storageClass is used by default
REDIS_REPLICASNumber of redis replicas to deploy
REDIS_PERSISTENCE_SIZEThe size of the persistence space allocated to redis, which is 5Gi by default
REDIS_PERSISTENCE_STORAGE_CLASSStorangeClass of redis; default storangeclass is used by default
STORAGE_CSI_STATEFULSET_REPLICASNumber of storage csi controller replicas to deploy
STORAGE_MAINNODE_TIPD_REPLICASNumber of storage mainode tipd replicas to deploy
STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZEThe size of the persistence space allocated to mainnode tipd, which is 10Gi by default
STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode tipd; default storangeclass is used by default
STORAGE_MAINNODE_WEED_REPLICASNumber of storage mainode weed replicas to deploy
STORAGE_MAINNODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to mainnode weed, which is 10Gi by default
STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode weed; default storangeclass is used by default
STORAGE_METANODE_TIKV_REPLICASNumber of storage metanode tikv replicas to deploy
STORAGE_METANODE_TIKV_PERSISTENCE_SIZEThe size of the persistence space allocated to metanode tikv, which is 10Gi by default
STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode tikv; default storangeclass is used by default
STORAGE_METANODE_WEED_REPLICASNumber of storage metanode weed replicas to deploy
STORAGE_METANODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to metanode weed, which is 10Gi by default
STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of mainnode weed; default storangeclass is used by default
STORAGE_DATANODE_WEED_REPLICASNumber of storage datanode weed replicas to deploy
STORAGE_DATANODE_WEED_PERSISTENCE_SIZEThe size of the persistence space allocated to datanode weed, which is 20Gi by default
STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASSStorangeClass of datanode weed; default storangeclass is used by default
MONITOR_GRAFANA_PERSISTENCE_SIZEThe size of the persistence space allocated to monitor.grafana, which is 5Gi by default
MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASSStorangeClass of monitor grafana; default storangeclass is used by default
LOGGER_REPLICASNumber of logger replicas to deploy
RABBITMQ_REPLICASNumber of rabbitmq replicas to deploy
RABBITMQ_PERSISTENCE_SIZEThe size of the persistence space allocated to rabbitmq, which is 5Gi by default
RABBITMQ_PERSISTENCE_STORAGE_CLASSStorangeClass of rabbitmq; default storangeclass is used by default
DATABASE_REPLICASNumber of database replicas to deploy
DATABASE_PERSISTENCE_SIZEThe size of the persistence space allocated to database, which is 5Gi by default
DATABASE_PERSISTENCE_STORAGE_CLASSStorangeClass of database; default storangeclass is used by default
TIMESERIES_REPLICASNumber of timeseries replicas to deploy
TIMESERIES_PERSISTENCE_SIZEThe size of the persistence space allocated to timeseries, which is 5Gi by default
TIMESERIES_PERSISTENCE_STORAGE_CLASSStorangeClass of timeseries; default storangeclass is used by default
PASSPORT_REPLICASNumber of passport replicas to deploy
REGISTRY_REPLICASNumber of registry replicas to deploy
HELMBROKER_REPLICASNumber of helmbroker api replicas to deploy
HELMBROKER_CELERY_REPLICASNumber of helmbroker celery replicas to deploy
HELMBROKER_PERSISTENCE_SIZEThe size of the persistence space allocated to helmbroker, which is 5Gi by default
HELMBROKER_PERSISTENCE_STORAGE_CLASSStorangeClass of helmbroker; default storangeclass is used by default
PROMETHEUS_SERVER_RETENTIONPrometheus data retention period (default if not specified is 15 days)
PROMETHEUS_SERVER_PERSISTENCE_SIZEThe size of the persistence space allocated to prometheus-server, which is 10Gi by default
PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASSStorangeClass of prometheus-server; default storangeclass is used by default
K3S_DATA_DIRThe config of k3s data dir; If not set, the default path is used
ACME_SERVERACME Server url, default use letsencrypt
ACME_EAB_KEY_IDThe key ID of which your external account binding is indexed by the external account
ACME_EAB_KEY_SECRETThe key Secret of which your external account symmetric MAC key
+

Since the installation script will install k3s, other environment variables can refer to k3s installation environment variables.

+

Uninstall

+

If you installed drycc using an installation script, you can uninstall the entire drycc using this script.

+
$ curl -sfL https://www.drycc.cc/uninstall.sh | bash -
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reference-guide/controller-api/v2.0/index.html b/reference-guide/controller-api/v2.0/index.html new file mode 100644 index 000000000..494aa971d --- /dev/null +++ b/reference-guide/controller-api/v2.0/index.html @@ -0,0 +1,2009 @@ + + + + + + + + + + + + + + + + + + Controller API v2.0 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Controller API v2.0

+

This is the v2.0 REST API for the Controller.

+

What's New

+

New! format of POST /v2/apps/<app id>/run has changed.

+

Authentication

+

Register a New User

+

Example Request:

+
POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+    "username": "test",
+    "password": "opensesame",
+    "email": "test@example.com"
+}
+ + +

Optional Parameters:

+
{
+    "first_name": "test",
+    "last_name": "testerson"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "id": 1,
+    "last_login": "2014-10-19T22:01:00.601Z",
+    "is_superuser": true,
+    "username": "test",
+    "first_name": "test",
+    "last_name": "testerson",
+    "email": "test@example.com",
+    "is_staff": true,
+    "is_active": true,
+    "date_joined": "2014-10-19T22:01:00.601Z",
+    "groups": [],
+    "user_permissions": []
+}
+ + +

Log in

+

Example Request:

+
POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+ + +

Cancel Account

+

Example Request:

+
DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Regenerate Token

+
+

note

+

This command could require administrative privileges

+
+

Example Request:

+
POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional Parameters:

+
{
+    "username" : "test"
+    "all" : "true"
+}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+ + +

Change Password

+

Example Request:

+
POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "password": "foo",
+    "new_password": "bar"
+}
+ + +

Optional parameters:

+
{"username": "testuser"}
+ + +
+

note

+

Using the username parameter requires administrative privileges and makes the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Applications

+

List all Applications

+

Example Request:

+
GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "created": "2014-01-01T00:00:00UTC",
+            "id": "example-go",
+            "owner": "test",
+            "structure": {},
+            "updated": "2014-01-01T00:00:00UTC",
+            "url": "example-go.example.com",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Create an Application

+

Example Request:

+
POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+ + +

Optional parameters:

+
{"id": "example-go"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example-go",
+    "owner": "test",
+    "structure": {},
+    "updated": "2014-01-01T00:00:00UTC",
+    "url": "example-go.example.com",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Destroy an Application

+

Example Request:

+
DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

List Application Details

+

Example Request:

+
GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example-go",
+    "owner": "test",
+    "structure": {},
+    "updated": "2014-01-01T00:00:00UTC",
+    "url": "example-go.example.com",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Update Application Details

+

Example Request:

+
POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional parameters:

+
{
+  "owner": "test"
+}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+ + +

Retrieve Application Logs

+

Example Request:

+
GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional URL Query Parameters:

+
?log_lines=
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+ + +

Run one-off Commands

+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+ + +

Certificates

+

List all Certificates

+

Example Request:

+
GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+  "count": 1,
+  "next": null,
+  "previous": null,
+  "results": [
+    {
+      "id": 22,
+      "owner": "test",
+      "san": [],
+      "domains": [],
+      "created": "2016-06-22T22:24:20Z",
+      "updated": "2016-06-22T22:24:20Z",
+      "name": "foo",
+      "common_name": "bar.com",
+      "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+      "expires": "2017-01-14T23:57:57Z",
+      "starts": "2016-01-15T23:57:57Z",
+      "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+      "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+    }
+  ]
+}
+ + +

Get Certificate Details

+

Example Request:

+
GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+  "id": 22,
+  "owner": "test",
+  "san": [],
+  "domains": [],
+  "created": "2016-06-22T22:24:20Z",
+  "updated": "2016-06-22T22:24:20Z",
+  "name": "foo",
+  "common_name": "bar.com",
+  "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+  "expires": "2017-01-14T23:57:57Z",
+  "starts": "2016-01-15T23:57:57Z",
+  "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+  "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+ + +

Create Certificate

+

Example Request:

+
POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+    "name": "foo"
+    "certificate": "-----BEGIN CERTIFICATE-----",
+    "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+  "id": 22,
+  "owner": "test",
+  "san": [],
+  "domains": [],
+  "created": "2016-06-22T22:24:20Z",
+  "updated": "2016-06-22T22:24:20Z",
+  "name": "foo",
+  "common_name": "bar.com",
+  "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+  "expires": "2017-01-14T23:57:57Z",
+  "starts": "2016-01-15T23:57:57Z",
+  "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+  "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+ + +

Destroy a Certificate

+

Example Request:

+
DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Attach a Domain to a Certificate

+

Example Request:

+
POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "domain": "test.com"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Remove a Domain from a Certificate

+

Example Request:

+
DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Pods

+

List all Pods

+

Example Request:

+
GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "results": [
+        {
+            "name": "go-v2-web-e7dej",
+            "release": "v2",
+            "started": "2014-01-01T00:00:00Z",
+            "state": "up",
+            "type": "web"
+        }
+    ]
+}
+ + +

List all Pods by Type

+

Example Request:

+
GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "results": [
+        {
+            "name": "go-v2-web-e7dej",
+            "release": "v2",
+            "started": "2014-01-01T00:00:00Z",
+            "state": "up",
+            "type": "web"
+        }
+    ]
+}
+ + +

Restart All Pods

+

Example Request:

+
POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Restart Pods by Type

+

Example Request:

+
POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Restart Pods by Type and Name

+

Example Request:

+
POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Scale Pods

+

Example Request:

+
POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Configuration

+

List Application Configuration

+

Example Request:

+
GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+      "PLATFORM": "drycc"
+    },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Create new Config

+

Example Request:

+
POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 3
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+        "DRYCC_APP": "example-go",
+        "DRYCC_RELEASE": "v3",
+        "HELLO": "world",
+        "PLATFORM": "drycc"
+
+    },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Unset Config Variable

+

Example Request:

+
POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 4
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+        "DRYCC_APP": "example-go",
+        "DRYCC_RELEASE": "v4",
+        "PLATFORM": "drycc"
+   },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Domains

+

List Application Domains

+

Example Request:

+
GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "created": "2014-01-01T00:00:00UTC",
+            "domain": "example.example.com",
+            "owner": "test",
+            "updated": "2014-01-01T00:00:00UTC"
+        }
+    ]
+}
+ + +

Add Domain

+

Example Request:

+
POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "created": "2014-01-01T00:00:00UTC",
+    "domain": "example.example.com",
+    "owner": "test",
+    "updated": "2014-01-01T00:00:00UTC"
+}
+ + +

Remove Domain

+

Example Request:

+
DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Builds

+

List Application Builds

+

Example Request:

+
GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "created": "2014-01-01T00:00:00UTC",
+            "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+            "image": "example-go",
+            "owner": "test",
+            "procfile": {
+                "web": "example-go"
+            },
+            "sha": "060da68f",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Create Application Build

+

Example Request:

+
POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+ + +

Optional Parameters:

+
{
+    "procfile": {
+      "web": "./cmd"
+    }
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 4
+
+{
+    "app": "example-go",
+    "created": "2014-01-01T00:00:00UTC",
+    "dockerfile": "",
+    "image": "drycc/example-go:latest",
+    "owner": "test",
+    "procfile": {},
+    "sha": "",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Releases

+

List Application Releases

+

Example Request:

+
GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 3,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+            "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test changed nothing",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 3
+        },
+        {
+            "app": "example-go",
+            "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+            "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test deployed 060da68",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 2
+        },
+        {
+            "app": "example-go",
+            "build": null,
+            "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test created initial release",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 1
+        }
+    ]
+}
+ + +

List Release Details

+

Example Request:

+
GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "build": null,
+    "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+    "created": "2014-01-01T00:00:00UTC",
+    "owner": "test",
+    "summary": "test created initial release",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+    "version": 1
+}
+ + +

Rollback Release

+

Example Request:

+
POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"version": 5}
+ + +

Keys

+

List Keys

+

Example Request:

+
GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "created": "2014-01-01T00:00:00UTC",
+            "id": "test@example.com",
+            "owner": "test",
+            "public": "ssh-rsa <...>",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Add Key to User

+

Example Request:

+
POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "id": "example",
+    "public": "ssh-rsa <...>"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example",
+    "owner": "example",
+    "public": "ssh-rsa <...>",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Remove Key from User

+

Example Request:

+
DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Permissions

+

List Application Permissions

+
+

note

+

This does not include the app owner.

+
+

Example Request:

+
GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "users": [
+        "test",
+        "foo"
+    ]
+}
+ + +

Create Application Permission

+

Example Request:

+
POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Remove Application Permission

+

Example Request:

+
DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

List Administrators

+

Example Request:

+
GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 2,
+    "next": null
+    "previous": null,
+    "results": [
+        {
+            "username": "test",
+            "is_superuser": true
+        },
+        {
+            "username": "foo",
+            "is_superuser": true
+        }
+    ]
+}
+ + +

Grant User Administrative Privileges

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Remove User's Administrative Privileges

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Users

+

List all users

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "id": 1,
+            "last_login": "2014-10-19T22:01:00.601Z",
+            "is_superuser": true,
+            "username": "test",
+            "first_name": "test",
+            "last_name": "testerson",
+            "email": "test@example.com",
+            "is_staff": true,
+            "is_active": true,
+            "date_joined": "2014-10-19T22:01:00.601Z",
+            "groups": [],
+            "user_permissions": []
+        }
+    ]
+}
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reference-guide/controller-api/v2.1/index.html b/reference-guide/controller-api/v2.1/index.html new file mode 100644 index 000000000..35e2aba79 --- /dev/null +++ b/reference-guide/controller-api/v2.1/index.html @@ -0,0 +1,2008 @@ + + + + + + + + + + + + + + + + + + Controller API v2.1 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Controller API v2.1

+

This is the v2.1 REST API for the Controller.

+

What's New

+

New! healthcheck field in configuration, deprecates the HEALTHCHECK_* environment variables.

+

New! Unsetting a configuration variable that does not exist will return a 422.

+

New! Creating an identical sequential release returns a 409 rather than create a no-op release.

+

Authentication

+

Register a New User

+

Example Request:

+
POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+    "username": "test",
+    "password": "opensesame",
+    "email": "test@example.com"
+}
+ + +

Optional Parameters:

+
{
+    "first_name": "test",
+    "last_name": "testerson"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "id": 1,
+    "last_login": "2014-10-19T22:01:00.601Z",
+    "is_superuser": true,
+    "username": "test",
+    "first_name": "test",
+    "last_name": "testerson",
+    "email": "test@example.com",
+    "is_staff": true,
+    "is_active": true,
+    "date_joined": "2014-10-19T22:01:00.601Z",
+    "groups": [],
+    "user_permissions": []
+}
+ + +

Log in

+

Example Request:

+
POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+ + +

Cancel Account

+

Example Request:

+
DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Regenerate Token

+
+

note

+

This command could require administrative privileges

+
+

Example Request:

+
POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional Parameters:

+
{
+    "username" : "test"
+    "all" : "true"
+}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+ + +

Change Password

+

Example Request:

+
POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "password": "foo",
+    "new_password": "bar"
+}
+ + +

Optional parameters:

+
{"username": "testuser"}
+ + +
+

note

+

Using the username parameter requires administrative privileges and makes the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Applications

+

List all Applications

+

Example Request:

+
GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "created": "2014-01-01T00:00:00UTC",
+            "id": "example-go",
+            "owner": "test",
+            "structure": {},
+            "updated": "2014-01-01T00:00:00UTC",
+            "url": "example-go.example.com",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Create an Application

+

Example Request:

+
POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+ + +

Optional parameters:

+
{"id": "example-go"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example-go",
+    "owner": "test",
+    "structure": {},
+    "updated": "2014-01-01T00:00:00UTC",
+    "url": "example-go.example.com",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Destroy an Application

+

Example Request:

+
DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

List Application Details

+

Example Request:

+
GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example-go",
+    "owner": "test",
+    "structure": {},
+    "updated": "2014-01-01T00:00:00UTC",
+    "url": "example-go.example.com",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Update Application Details

+

Example Request:

+
POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional parameters:

+
{
+  "owner": "test"
+}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+ + +

Retrieve Application Logs

+

Example Request:

+
GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional URL Query Parameters:

+
?log_lines=
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+ + +

Run one-off Commands

+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+ + +

Certificates

+

List all Certificates

+

Example Request:

+
GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+  "count": 1,
+  "next": null,
+  "previous": null,
+  "results": [
+    {
+      "id": 22,
+      "owner": "test",
+      "san": [],
+      "domains": [],
+      "created": "2016-06-22T22:24:20Z",
+      "updated": "2016-06-22T22:24:20Z",
+      "name": "foo",
+      "common_name": "bar.com",
+      "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+      "expires": "2017-01-14T23:57:57Z",
+      "starts": "2016-01-15T23:57:57Z",
+      "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+      "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+    }
+  ]
+}
+ + +

Get Certificate Details

+

Example Request:

+
GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+  "id": 22,
+  "owner": "test",
+  "san": [],
+  "domains": [],
+  "created": "2016-06-22T22:24:20Z",
+  "updated": "2016-06-22T22:24:20Z",
+  "name": "foo",
+  "common_name": "bar.com",
+  "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+  "expires": "2017-01-14T23:57:57Z",
+  "starts": "2016-01-15T23:57:57Z",
+  "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+  "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+ + +

Create Certificate

+

Example Request:

+
POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+    "name": "foo"
+    "certificate": "-----BEGIN CERTIFICATE-----",
+    "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+  "id": 22,
+  "owner": "test",
+  "san": [],
+  "domains": [],
+  "created": "2016-06-22T22:24:20Z",
+  "updated": "2016-06-22T22:24:20Z",
+  "name": "foo",
+  "common_name": "bar.com",
+  "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+  "expires": "2017-01-14T23:57:57Z",
+  "starts": "2016-01-15T23:57:57Z",
+  "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+  "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+ + +

Destroy a Certificate

+

Example Request:

+
DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Attach a Domain to a Certificate

+

Example Request:

+
POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "domain": "test.com"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Remove a Domain from a Certificate

+

Example Request:

+
DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Pods

+

List all Pods

+

Example Request:

+
GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "results": [
+        {
+            "name": "go-v2-web-e7dej",
+            "release": "v2",
+            "started": "2014-01-01T00:00:00Z",
+            "state": "up",
+            "type": "web"
+        }
+    ]
+}
+ + +

List all Pods by Type

+

Example Request:

+
GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "results": [
+        {
+            "name": "go-v2-web-e7dej",
+            "release": "v2",
+            "started": "2014-01-01T00:00:00Z",
+            "state": "up",
+            "type": "web"
+        }
+    ]
+}
+ + +

Restart All Pods

+

Example Request:

+
POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Restart Pods by Type

+

Example Request:

+
POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Restart Pods by Type and Name

+

Example Request:

+
POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Scale Pods

+

Example Request:

+
POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Configuration

+

List Application Configuration

+

Example Request:

+
GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+      "PLATFORM": "drycc"
+    },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Create new Config

+

Example Request:

+
POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+        "DRYCC_APP": "example-go",
+        "DRYCC_RELEASE": "v3",
+        "HELLO": "world",
+        "PLATFORM": "drycc"
+
+    },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Unset Config Variable

+

Example Request:

+
POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+        "DRYCC_APP": "example-go",
+        "DRYCC_RELEASE": "v4",
+        "PLATFORM": "drycc"
+   },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Domains

+

List Application Domains

+

Example Request:

+
GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "created": "2014-01-01T00:00:00UTC",
+            "domain": "example.example.com",
+            "owner": "test",
+            "updated": "2014-01-01T00:00:00UTC"
+        }
+    ]
+}
+ + +

Add Domain

+

Example Request:

+
POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "created": "2014-01-01T00:00:00UTC",
+    "domain": "example.example.com",
+    "owner": "test",
+    "updated": "2014-01-01T00:00:00UTC"
+}
+ + +

Remove Domain

+

Example Request:

+
DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Builds

+

List Application Builds

+

Example Request:

+
GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "created": "2014-01-01T00:00:00UTC",
+            "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+            "image": "example-go",
+            "owner": "test",
+            "procfile": {
+                "web": "example-go"
+            },
+            "sha": "060da68f",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Create Application Build

+

Example Request:

+
POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+ + +

Optional Parameters:

+
{
+    "procfile": {
+      "web": "./cmd"
+    }
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "created": "2014-01-01T00:00:00UTC",
+    "dockerfile": "",
+    "image": "drycc/example-go:latest",
+    "owner": "test",
+    "procfile": {},
+    "sha": "",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Releases

+

List Application Releases

+

Example Request:

+
GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 3,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+            "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test changed nothing",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 3
+        },
+        {
+            "app": "example-go",
+            "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+            "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test deployed 060da68",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 2
+        },
+        {
+            "app": "example-go",
+            "build": null,
+            "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test created initial release",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 1
+        }
+    ]
+}
+ + +

List Release Details

+

Example Request:

+
GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "build": null,
+    "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+    "created": "2014-01-01T00:00:00UTC",
+    "owner": "test",
+    "summary": "test created initial release",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+    "version": 1
+}
+ + +

Rollback Release

+

Example Request:

+
POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"version": 5}
+ + +

Keys

+

List Keys

+

Example Request:

+
GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "created": "2014-01-01T00:00:00UTC",
+            "id": "test@example.com",
+            "owner": "test",
+            "public": "ssh-rsa <...>",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Add Key to User

+

Example Request:

+
POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "id": "example",
+    "public": "ssh-rsa <...>"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example",
+    "owner": "example",
+    "public": "ssh-rsa <...>",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Remove Key from User

+

Example Request:

+
DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Permissions

+

List Application Permissions

+
+

note

+

This does not include the app owner.

+
+

Example Request:

+
GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "users": [
+        "test",
+        "foo"
+    ]
+}
+ + +

Create Application Permission

+

Example Request:

+
POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Remove Application Permission

+

Example Request:

+
DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

List Administrators

+

Example Request:

+
GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 2,
+    "next": null
+    "previous": null,
+    "results": [
+        {
+            "username": "test",
+            "is_superuser": true
+        },
+        {
+            "username": "foo",
+            "is_superuser": true
+        }
+    ]
+}
+ + +

Grant User Administrative Privileges

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Remove User's Administrative Privileges

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+ + +

Users

+

List all users

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "id": 1,
+            "last_login": "2014-10-19T22:01:00.601Z",
+            "is_superuser": true,
+            "username": "test",
+            "first_name": "test",
+            "last_name": "testerson",
+            "email": "test@example.com",
+            "is_staff": true,
+            "is_active": true,
+            "date_joined": "2014-10-19T22:01:00.601Z",
+            "groups": [],
+            "user_permissions": []
+        }
+    ]
+}
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reference-guide/controller-api/v2.2/index.html b/reference-guide/controller-api/v2.2/index.html new file mode 100644 index 000000000..cdf058795 --- /dev/null +++ b/reference-guide/controller-api/v2.2/index.html @@ -0,0 +1,2035 @@ + + + + + + + + + + + + + + + + + + Controller API v2.2 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Controller API v2.2

+

This is the v2.2 REST API for the Controller.

+

What's New

+

New! /v2/auth/whoami endpoint

+

Authentication

+

Register a New User

+

Example Request:

+
POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+    "username": "test",
+    "password": "opensesame",
+    "email": "test@example.com"
+}
+ + +

Optional Parameters:

+
{
+    "first_name": "test",
+    "last_name": "testerson"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "id": 1,
+    "last_login": "2014-10-19T22:01:00.601Z",
+    "is_superuser": true,
+    "username": "test",
+    "first_name": "test",
+    "last_name": "testerson",
+    "email": "test@example.com",
+    "is_staff": true,
+    "is_active": true,
+    "date_joined": "2014-10-19T22:01:00.601Z",
+    "groups": [],
+    "user_permissions": []
+}
+ + +

Log in

+

Example Request:

+
POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"token": "abc123"}
+ + +

Cancel Account

+

Example Request:

+
DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Who Am I

+

Example Request:

+
GET /v2/auth/whoami/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "id": 1,
+    "last_login": "2014-10-19T22:01:00.601Z",
+    "is_superuser": true,
+    "username": "test",
+    "first_name": "test",
+    "last_name": "testerson",
+    "email": "test@example.com",
+    "is_staff": true,
+    "is_active": true,
+    "date_joined": "2014-10-19T22:01:00.601Z",
+    "groups": [],
+    "user_permissions": []
+}
+ + +

Regenerate Token

+
+

note

+

This command could require administrative privileges

+
+

Example Request:

+
POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional Parameters:

+
{
+    "username" : "test"
+    "all" : "true"
+}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"token": "abc123"}
+ + +

Change Password

+

Example Request:

+
POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "password": "foo",
+    "new_password": "bar"
+}
+ + +

Optional parameters:

+
{"username": "testuser"}
+ + +
+

note

+

Using the username parameter requires administrative privileges and makes the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Applications

+

List all Applications

+

Example Request:

+
GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "created": "2014-01-01T00:00:00UTC",
+            "id": "example-go",
+            "owner": "test",
+            "structure": {},
+            "updated": "2014-01-01T00:00:00UTC",
+            "url": "example-go.example.com",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Create an Application

+

Example Request:

+
POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+ + +

Optional parameters:

+
{"id": "example-go"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example-go",
+    "owner": "test",
+    "structure": {},
+    "updated": "2014-01-01T00:00:00UTC",
+    "url": "example-go.example.com",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Destroy an Application

+

Example Request:

+
DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

List Application Details

+

Example Request:

+
GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example-go",
+    "owner": "test",
+    "structure": {},
+    "updated": "2014-01-01T00:00:00UTC",
+    "url": "example-go.example.com",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Update Application Details

+

Example Request:

+
POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional parameters:

+
{
+  "owner": "test"
+}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+ + +

Retrieve Application Logs

+

Example Request:

+
GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional URL Query Parameters:

+
?log_lines=
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+ + +

Run one-off Commands

+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+ + +

Certificates

+

List all Certificates

+

Example Request:

+
GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+  "count": 1,
+  "next": null,
+  "previous": null,
+  "results": [
+    {
+      "id": 22,
+      "owner": "test",
+      "san": [],
+      "domains": [],
+      "created": "2016-06-22T22:24:20Z",
+      "updated": "2016-06-22T22:24:20Z",
+      "name": "foo",
+      "common_name": "bar.com",
+      "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+      "expires": "2017-01-14T23:57:57Z",
+      "starts": "2016-01-15T23:57:57Z",
+      "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+      "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+    }
+  ]
+}
+ + +

Get Certificate Details

+

Example Request:

+
GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+  "id": 22,
+  "owner": "test",
+  "san": [],
+  "domains": [],
+  "created": "2016-06-22T22:24:20Z",
+  "updated": "2016-06-22T22:24:20Z",
+  "name": "foo",
+  "common_name": "bar.com",
+  "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+  "expires": "2017-01-14T23:57:57Z",
+  "starts": "2016-01-15T23:57:57Z",
+  "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+  "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+ + +

Create Certificate

+

Example Request:

+
POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+    "name": "foo"
+    "certificate": "-----BEGIN CERTIFICATE-----",
+    "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+  "id": 22,
+  "owner": "test",
+  "san": [],
+  "domains": [],
+  "created": "2016-06-22T22:24:20Z",
+  "updated": "2016-06-22T22:24:20Z",
+  "name": "foo",
+  "common_name": "bar.com",
+  "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+  "expires": "2017-01-14T23:57:57Z",
+  "starts": "2016-01-15T23:57:57Z",
+  "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+  "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+ + +

Destroy a Certificate

+

Example Request:

+
DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Attach a Domain to a Certificate

+

Example Request:

+
POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "domain": "test.com"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Remove a Domain from a Certificate

+

Example Request:

+
DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Pods

+

List all Pods

+

Example Request:

+
GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "results": [
+        {
+            "name": "go-v2-web-e7dej",
+            "release": "v2",
+            "started": "2014-01-01T00:00:00Z",
+            "state": "up",
+            "type": "web"
+        }
+    ]
+}
+ + +

List all Pods by Type

+

Example Request:

+
GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "results": [
+        {
+            "name": "go-v2-web-e7dej",
+            "release": "v2",
+            "started": "2014-01-01T00:00:00Z",
+            "state": "up",
+            "type": "web"
+        }
+    ]
+}
+ + +

Restart All Pods

+

Example Request:

+
POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Restart Pods by Type

+

Example Request:

+
POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Restart Pods by Type and Name

+

Example Request:

+
POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Scale Pods

+

Example Request:

+
POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Configuration

+

List Application Configuration

+

Example Request:

+
GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+      "PLATFORM": "drycc"
+    },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Create new Config

+

Example Request:

+
POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+        "DRYCC_APP": "example-go",
+        "DRYCC_RELEASE": "v3",
+        "HELLO": "world",
+        "PLATFORM": "drycc"
+
+    },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Unset Config Variable

+

Example Request:

+
POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+        "DRYCC_APP": "example-go",
+        "DRYCC_RELEASE": "v4",
+        "PLATFORM": "drycc"
+   },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Domains

+

List Application Domains

+

Example Request:

+
GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "created": "2014-01-01T00:00:00UTC",
+            "domain": "example.example.com",
+            "owner": "test",
+            "updated": "2014-01-01T00:00:00UTC"
+        }
+    ]
+}
+ + +

Add Domain

+

Example Request:

+
POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "created": "2014-01-01T00:00:00UTC",
+    "domain": "example.example.com",
+    "owner": "test",
+    "updated": "2014-01-01T00:00:00UTC"
+}
+ + +

Remove Domain

+

Example Request:

+
DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Builds

+

List Application Builds

+

Example Request:

+
GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "created": "2014-01-01T00:00:00UTC",
+            "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+            "image": "example-go",
+            "owner": "test",
+            "procfile": {
+                "web": "example-go"
+            },
+            "sha": "060da68f",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Create Application Build

+

Example Request:

+
POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+ + +

Optional Parameters:

+
{
+    "procfile": {
+      "web": "./cmd"
+    }
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "created": "2014-01-01T00:00:00UTC",
+    "dockerfile": "",
+    "image": "drycc/example-go:latest",
+    "owner": "test",
+    "procfile": {},
+    "sha": "",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Releases

+

List Application Releases

+

Example Request:

+
GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "count": 3,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+            "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test changed nothing",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 3
+        },
+        {
+            "app": "example-go",
+            "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+            "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test deployed 060da68",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 2
+        },
+        {
+            "app": "example-go",
+            "build": null,
+            "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test created initial release",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 1
+        }
+    ]
+}
+ + +

List Release Details

+

Example Request:

+
GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "build": null,
+    "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+    "created": "2014-01-01T00:00:00UTC",
+    "owner": "test",
+    "summary": "test created initial release",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+    "version": 1
+}
+ + +

Rollback Release

+

Example Request:

+
POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"version": 5}
+ + +

Keys

+

List Keys

+

Example Request:

+
GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "created": "2014-01-01T00:00:00UTC",
+            "id": "test@example.com",
+            "owner": "test",
+            "public": "ssh-rsa <...>",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Add Key to User

+

Example Request:

+
POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "id": "example",
+    "public": "ssh-rsa <...>"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example",
+    "owner": "example",
+    "public": "ssh-rsa <...>",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Remove Key from User

+

Example Request:

+
DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Permissions

+

List Application Permissions

+
+

note

+

This does not include the app owner.

+
+

Example Request:

+
GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "users": [
+        "test",
+        "foo"
+    ]
+}
+ + +

Create Application Permission

+

Example Request:

+
POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Remove Application Permission

+

Example Request:

+
DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

List Administrators

+

Example Request:

+
GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "count": 2,
+    "next": null
+    "previous": null,
+    "results": [
+        {
+            "username": "test",
+            "is_superuser": true
+        },
+        {
+            "username": "foo",
+            "is_superuser": true
+        }
+    ]
+}
+ + +

Grant User Administrative Privileges

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Remove User's Administrative Privileges

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+ + +

Users

+

List all users

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "id": 1,
+            "last_login": "2014-10-19T22:01:00.601Z",
+            "is_superuser": true,
+            "username": "test",
+            "first_name": "test",
+            "last_name": "testerson",
+            "email": "test@example.com",
+            "is_staff": true,
+            "is_active": true,
+            "date_joined": "2014-10-19T22:01:00.601Z",
+            "groups": [],
+            "user_permissions": []
+        }
+    ]
+}
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reference-guide/controller-api/v2.3/index.html b/reference-guide/controller-api/v2.3/index.html new file mode 100644 index 000000000..392dc1756 --- /dev/null +++ b/reference-guide/controller-api/v2.3/index.html @@ -0,0 +1,2086 @@ + + + + + + + + + + + + + + + + + + Controller API v2.3 - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Controller API v2.3

+

This is the v2.3 REST API for the Controller.

+

What's New

+

New! /v2/apps/{name}/logs endpoint was fixed and no longer returns b'log data' and instead returns a normal string log data

+

Authentication

+

Register a New User

+

Example Request:

+
POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+    "username": "test",
+    "password": "opensesame",
+    "email": "test@example.com"
+}
+ + +

Optional Parameters:

+
{
+    "first_name": "test",
+    "last_name": "testerson"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "id": 1,
+    "last_login": "2014-10-19T22:01:00.601Z",
+    "is_superuser": true,
+    "username": "test",
+    "first_name": "test",
+    "last_name": "testerson",
+    "email": "test@example.com",
+    "is_staff": true,
+    "is_active": true,
+    "date_joined": "2014-10-19T22:01:00.601Z",
+    "groups": [],
+    "user_permissions": []
+}
+ + +

Log in

+

Example Request:

+
POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"token": "abc123"}
+ + +

Cancel Account

+

Example Request:

+
DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Who Am I

+

Example Request:

+
GET /v2/auth/whoami/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "id": 1,
+    "last_login": "2014-10-19T22:01:00.601Z",
+    "is_superuser": true,
+    "username": "test",
+    "first_name": "test",
+    "last_name": "testerson",
+    "email": "test@example.com",
+    "is_staff": true,
+    "is_active": true,
+    "date_joined": "2014-10-19T22:01:00.601Z",
+    "groups": [],
+    "user_permissions": []
+}
+ + +

Regenerate Token

+
+

note

+

This command could require administrative privileges

+
+

Example Request:

+
POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional Parameters:

+
{
+    "username" : "test"
+    "all" : "true"
+}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"token": "abc123"}
+ + +

Change Password

+

Example Request:

+
POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "password": "foo",
+    "new_password": "bar"
+}
+ + +

Optional parameters:

+
{"username": "testuser"}
+ + +
+

note

+

Using the username parameter requires administrative privileges and makes the password parameter optional.

+
+

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Applications

+

List all Applications

+

Example Request:

+
GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "created": "2014-01-01T00:00:00UTC",
+            "id": "example-go",
+            "owner": "test",
+            "structure": {},
+            "updated": "2014-01-01T00:00:00UTC",
+            "url": "example-go.example.com",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Create an Application

+

Example Request:

+
POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+ + +

Optional parameters:

+
{"id": "example-go"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example-go",
+    "owner": "test",
+    "structure": {},
+    "updated": "2014-01-01T00:00:00UTC",
+    "url": "example-go.example.com",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Destroy an Application

+

Example Request:

+
DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

List Application Details

+

Example Request:

+
GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example-go",
+    "owner": "test",
+    "structure": {},
+    "updated": "2014-01-01T00:00:00UTC",
+    "url": "example-go.example.com",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Update Application Details

+

Example Request:

+
POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional parameters:

+
{
+  "owner": "test"
+}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+ + +

Retrieve Application Logs

+

Example Request:

+
GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Optional URL Query Parameters:

+
?log_lines=
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+ + +

Run one-off Commands

+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+ + +

Certificates

+

List all Certificates

+

Example Request:

+
GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+  "count": 1,
+  "next": null,
+  "previous": null,
+  "results": [
+    {
+      "id": 22,
+      "owner": "test",
+      "san": [],
+      "domains": [],
+      "created": "2016-06-22.32.34:20Z",
+      "updated": "2016-06-22.32.34:20Z",
+      "name": "foo",
+      "common_name": "bar.com",
+      "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+      "expires": "2017-01-14T23:57:57Z",
+      "starts": "2016-01-15T23:57:57Z",
+      "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+      "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+    }
+  ]
+}
+ + +

Get Certificate Details

+

Example Request:

+
GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+  "id": 22,
+  "owner": "test",
+  "san": [],
+  "domains": [],
+  "created": "2016-06-22.32.34:20Z",
+  "updated": "2016-06-22.32.34:20Z",
+  "name": "foo",
+  "common_name": "bar.com",
+  "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+  "expires": "2017-01-14T23:57:57Z",
+  "starts": "2016-01-15T23:57:57Z",
+  "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+  "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+ + +

Create Certificate

+

Example Request:

+
POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+    "name": "foo"
+    "certificate": "-----BEGIN CERTIFICATE-----",
+    "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+  "id": 22,
+  "owner": "test",
+  "san": [],
+  "domains": [],
+  "created": "2016-06-22.32.34:20Z",
+  "updated": "2016-06-22.32.34:20Z",
+  "name": "foo",
+  "common_name": "bar.com",
+  "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+  "expires": "2017-01-14T23:57:57Z",
+  "starts": "2016-01-15T23:57:57Z",
+  "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+  "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+ + +

Destroy a Certificate

+

Example Request:

+
DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Attach a Domain to a Certificate

+

Example Request:

+
POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "domain": "test.com"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Remove a Domain from a Certificate

+

Example Request:

+
DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Enable or disable TLS

+

Example Request:

+
POST /v2/apps/example-go/tls/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+  "https_enforced": true
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "app": "example-go",
+    "owner": "test",
+    "https_enforced": true,
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Get TLS status

+

Example Request:

+
GET /v2/apps/example-go/tls/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "app": "example-go",
+    "owner": "test",
+    "https_enforced": false,
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Pods

+

List all Pods

+

Example Request:

+
GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "results": [
+        {
+            "name": "go-v2-web-e7dej",
+            "release": "v2",
+            "started": "2014-01-01T00:00:00Z",
+            "state": "up",
+            "type": "web"
+        }
+    ]
+}
+ + +

List all Pods by Type

+

Example Request:

+
GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "results": [
+        {
+            "name": "go-v2-web-e7dej",
+            "release": "v2",
+            "started": "2014-01-01T00:00:00Z",
+            "state": "up",
+            "type": "web"
+        }
+    ]
+}
+ + +

Restart All Pods

+

Example Request:

+
POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Restart Pods by Type

+

Example Request:

+
POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Restart Pods by Type and Name

+

Example Request:

+
POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+    {
+        "name": "go-v2-web-atots",
+        "release": "v2",
+        "started": "2016-04-11T21:07:54Z",
+        "state": "up",
+        "type": "web"
+    }
+]
+ + +

Scale Pods

+

Example Request:

+
POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Configuration

+

List Application Configuration

+

Example Request:

+
GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+      "PLATFORM": "drycc"
+    },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Create new Config

+

Example Request:

+
POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+        "DRYCC_APP": "example-go",
+        "DRYCC_RELEASE": "v3",
+        "HELLO": "world",
+        "PLATFORM": "drycc"
+
+    },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Unset Config Variable

+

Example Request:

+
POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "owner": "test",
+    "app": "example-go",
+    "values": {
+        "DRYCC_APP": "example-go",
+        "DRYCC_RELEASE": "v4",
+        "PLATFORM": "drycc"
+   },
+    "memory": {},
+    "cpu": {},
+    "tags": {},
+    "healthcheck": {},
+    "created": "2014-01-01T00:00:00UTC",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Domains

+

List Application Domains

+

Example Request:

+
GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "created": "2014-01-01T00:00:00UTC",
+            "domain": "example.example.com",
+            "owner": "test",
+            "updated": "2014-01-01T00:00:00UTC"
+        }
+    ]
+}
+ + +

Add Domain

+

Example Request:

+
POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "created": "2014-01-01T00:00:00UTC",
+    "domain": "example.example.com",
+    "owner": "test",
+    "updated": "2014-01-01T00:00:00UTC"
+}
+ + +

Remove Domain

+

Example Request:

+
DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Builds

+

List Application Builds

+

Example Request:

+
GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "created": "2014-01-01T00:00:00UTC",
+            "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+            "image": "example-go",
+            "owner": "test",
+            "procfile": {
+                "web": "example-go"
+            },
+            "sha": "060da68f",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Create Application Build

+

Example Request:

+
POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+ + +

Optional Parameters:

+
{
+    "procfile": {
+      "web": "./cmd"
+    }
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "created": "2014-01-01T00:00:00UTC",
+    "dockerfile": "",
+    "image": "drycc/example-go:latest",
+    "owner": "test",
+    "procfile": {},
+    "sha": "",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Releases

+

List Application Releases

+

Example Request:

+
GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "count": 3,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "app": "example-go",
+            "build": "2.3d8e4b-600e-4425-a85c-ffc7ea607f61",
+            "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test changed nothing",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 3
+        },
+        {
+            "app": "example-go",
+            "build": "2.3d8e4b-600e-4425-a85c-ffc7ea607f61",
+            "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test deployed 060da68",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 2
+        },
+        {
+            "app": "example-go",
+            "build": null,
+            "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+            "created": "2014-01-01T00:00:00UTC",
+            "owner": "test",
+            "summary": "test created initial release",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+            "version": 1
+        }
+    ]
+}
+ + +

List Release Details

+

Example Request:

+
GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "app": "example-go",
+    "build": null,
+    "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+    "created": "2014-01-01T00:00:00UTC",
+    "owner": "test",
+    "summary": "test created initial release",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+    "version": 1
+}
+ + +

Rollback Release

+

Example Request:

+
POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"version": 5}
+ + +

Keys

+

List Keys

+

Example Request:

+
GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "created": "2014-01-01T00:00:00UTC",
+            "id": "test@example.com",
+            "owner": "test",
+            "public": "ssh-rsa <...>",
+            "updated": "2014-01-01T00:00:00UTC",
+            "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+        }
+    ]
+}
+ + +

Add Key to User

+

Example Request:

+
POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+    "id": "example",
+    "public": "ssh-rsa <...>"
+}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "created": "2014-01-01T00:00:00UTC",
+    "id": "example",
+    "owner": "example",
+    "public": "ssh-rsa <...>",
+    "updated": "2014-01-01T00:00:00UTC",
+    "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+ + +

Remove Key from User

+

Example Request:

+
DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Permissions

+

List Application Permissions

+
+

note

+

This does not include the app owner.

+
+

Example Request:

+
GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "users": [
+        "test",
+        "foo"
+    ]
+}
+ + +

Create Application Permission

+

Example Request:

+
POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Remove Application Permission

+

Example Request:

+
DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

List Administrators

+

Example Request:

+
GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "count": 2,
+    "next": null
+    "previous": null,
+    "results": [
+        {
+            "username": "test",
+            "is_superuser": true
+        },
+        {
+            "username": "foo",
+            "is_superuser": true
+        }
+    ]
+}
+ + +

Grant User Administrative Privileges

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+ + +

Example Response:

+
HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Remove User's Administrative Privileges

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+ + +

Users

+

List all users

+
+

note

+

This command requires administrative privileges

+
+

Example Request:

+
GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+ + +

Example Response:

+
HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+    "count": 1,
+    "next": null,
+    "previous": null,
+    "results": [
+        {
+            "id": 1,
+            "last_login": "2014-10-19T22:01:00.601Z",
+            "is_superuser": true,
+            "username": "test",
+            "first_name": "test",
+            "last_name": "testerson",
+            "email": "test@example.com",
+            "is_staff": true,
+            "is_active": true,
+            "date_joined": "2014-10-19T22:01:00.601Z",
+            "groups": [],
+            "user_permissions": []
+        }
+    ]
+}
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reference-guide/creating-a-self-signed-ssl-certificate/index.html b/reference-guide/creating-a-self-signed-ssl-certificate/index.html new file mode 100644 index 000000000..caf01e93e --- /dev/null +++ b/reference-guide/creating-a-self-signed-ssl-certificate/index.html @@ -0,0 +1,909 @@ + + + + + + + + + + + + + + + + + + Creating a Self-Signed SSL Certificate - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Creating a Self-Signed SSL Certificate

+

When using the app ssl feature for non-production applications or when installing SSL for the platform, you can avoid the costs associated with the SSL certificate by using a self-signed SSL certificate. Though the certificate implements full encryption, visitors to your site will see a browser warning indicating that the certificate should not be trusted.

+

Prerequisites

+

The openssl library is required to generate your own certificate. Run the following command in your local environment to see if you already have openssl installed.

+
$ which openssl
+/usr/bin/openssl
+ + +

If the which command does not return a path then you will need to install openssl yourself:

+ + + + + + + + + + + + + + + + + + + + + +
If you have...Install with...
Mac OS XHomebrew: brew install openssl
Windowscomplete package .exe installed
Ubuntu Linuxapt-get install openssl
+

Generate Private Key and Certificate Signing Request

+

A private key and certificate signing request are required to create an SSL certificate. These can be generated with a few simple commands. When the openssl req command asks for a “challenge password”, just press return, leaving the password empty.

+
$ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
+...
+$ openssl rsa -passin pass:x -in server.pass.key -out server.key
+writing RSA key
+$ rm server.pass.key
+$ openssl req -new -key server.key -out server.csr
+...
+Country Name (2 letter code) [AU]:US
+State or Province Name (full name) [Some-State]:California
+...
+A challenge password []:
+...
+ + +

Generate SSL Certificate

+

The self-signed SSL certificate is generated from the server.key private key and server.csr files.

+
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
+ + +

The server.crt file is your site certificate suitable for use with Drycc's SSL endpoint along with the server.key private key.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reference-guide/terms/index.html b/reference-guide/terms/index.html new file mode 100644 index 000000000..75b0cc573 --- /dev/null +++ b/reference-guide/terms/index.html @@ -0,0 +1,901 @@ + + + + + + + + + + + + + + + + + + Terms - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Terms

+

Application

+

An application services requests and background jobs for a deployed git repository. Each application includes a set of Containers used to run isolated processes, and a Release that defines the current Build and Config deployed by containers.

+

Build

+

Drycc builds are created automatically on the controller when a developer uses git push drycc master. When a new build is created, a new Release is created automatically.

+

Config

+

Config refers to a set of environment variables used by Containers in as Application.

+

When Config is changed, a new Release is created automatically.

+

Container

+

Drycc containers are instances of containers used to run Applications. Containers perform the actual work of an Application by servicing requests or by running background tasks as part of the cluster.

+

Ephemeral Filesystem

+

Each container gets its own ephemeral filesystem, with a fresh copy of the most recently deployed code. During the container’s lifetime, its running processes can use the filesystem as a temporary scratchpad, but no files that are written are visible to processes in any other container. Any files written to the ephemeral filesystem will be discarded the moment the container is either stopped or restarted.

+

Container States

+

There are several states that a container can be in at any time. The states are:

+
    +
  • initialized - the state of the container before it is created
  • +
  • created - the container is built and ready for operation
  • +
  • up - the container is running
  • +
  • down - the container crashed or is stopped
  • +
  • destroyed - the container has been destroyed
  • +
+

Controller

+

The controller is the "brain" of the Drycc platform. A controller manages Applications and their lifecycle.

+

The controller is in charge of:

+
    +
  • Processing client API calls
  • +
  • Managing containers that perform work for applications
  • +
  • Managing proxies that route traffic to containers
  • +
  • Managing users, keys and other base configuration
  • +
+

The Controller stack includes:

+
    +
  • Django API Server for handling API calls
  • +
+

Key

+

Drycc keys are SSH Keys used during the git push process. Each user can use the client to manage a list of keys on the Controller.

+

Release

+

A Drycc release is a combination of a Build with a Config. Each Application is associated with one release at a time. Drycc releases are numbered and new releases always increment by one (e.g. v1, v2, v3).

+

Containers that host an application use these release versions to pull the correct code and configuration.

+

Scheduler

+

The Scheduler is responsible for creating, starting, stopping, and destroying Containers. For example, a command such as drycc scale cmd=10 tells the Scheduler to run ten Containers from the Container image for your Application.

+

The Scheduler must decide which machines are eligible to run these container jobs. Scheduler backends vary in the details of their job allocation policies and whether or not they are resource-aware, among other features.

+

The Drycc scheduler client is implemented in the Controller component.

+

Service

+

A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. In Workflow, a Service is used to load-balance an application's Containers internally through a virtual IP address.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/roadmap/planning-process/index.html b/roadmap/planning-process/index.html new file mode 100644 index 000000000..5c2739c2c --- /dev/null +++ b/roadmap/planning-process/index.html @@ -0,0 +1,872 @@ + + + + + + + + + + + + + + + + + + Planning Process - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Planning Process

+

Drycc features a lightweight process that emphasizes openness and ensures every community member can be an integral part of planning for the future.

+

The Role of Maintainers

+

Maintainers lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.

+

Open Roadmap

+

The Drycc Roadmap is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.

+

Contributing to the Roadmap

+

Proposals and issues can be opened by anyone. Every member of the community is welcome to participate in the discussion by providing feedback and/or offering counter-proposals.

+

Release Milestones

+

The Roadmap gets delivered progressively via the Release Schedule. Releases are defined during Release Planning Meetings and managed using GitHub Milestones which track specific deliverables and work-in-progress.

+

Release Planning Meetings

+

Major decisions affecting the Roadmap are discussed during Release Planning Meetings on the first Thursday of each month, aligned with the Release Schedule.

+

Release Planning Meetings are open to the public with access coordinated via the Drycc #community Slack channel. +Notes from past meetings are below, along with links to a recording of the entire meeting on YouTube.

+

Credits

+

Thanks to Amy Lindburg and our friends at Podman for their inspiration.

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/roadmap/releases/index.html b/roadmap/releases/index.html new file mode 100644 index 000000000..f0a55225b --- /dev/null +++ b/roadmap/releases/index.html @@ -0,0 +1,1052 @@ + + + + + + + + + + + + + + + + + + Releases - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Releases

+

Drycc uses a continuous delivery approach for creating releases. Every merged commit that passes +testing results in a deliverable that can be given a semantic version tag and shipped.

+

The master git branch of a project should always work. Only changes considered ready to be +released publicly are merged.

+

Components Release as Needed

+

Drycc components release new versions as often as needed. Fixing a high priority bug requires the +project maintainer to create a new patch release. Merging a backward-compatible feature implies +a minor release.

+

By releasing often, each component release becomes a safe and routine event. This makes it faster +and easier for users to obtain specific fixes. Continuous delivery also reduces the work +necessary to release a product such as Drycc Workflow, which integrates several components.

+

"Components" applies not just to Drycc Workflow projects, but also to development and release +tools, to Container base images, and to other Drycc projects that do semantic version releases.

+

See "How to Release a Component" for more detail.

+

Workflow Releases Each Month

+

Drycc Workflow has a regular, public release cadence. From v2.8.0 onward, new Workflow feature +releases arrive on the first Thursday of each month. Patch releases are created at any time, +as needed. GitHub milestones are used to communicate the content and timing of major and minor +releases, and longer-term planning is visible at the Roadmap.

+

Workflow release timing is not linked to specific features. If a feature is merged before the +release date, it is included in the next release.

+

See "How to Release Workflow" for more detail.

+

Semantic Versioning

+

Drycc releases comply with semantic versioning, with the "public API" broadly +defined as:

+
    +
  • REST, gRPC, or other API that is network-accessible
  • +
  • Library or framework API intended for public use
  • +
  • "Pluggable" socket-level protocols users can redirect
  • +
  • CLI commands and output formats
  • +
+

In general, changes to anything a user might reasonably link to, customize, or integrate with +should be backward-compatible, or else require a major release. Drycc users can be confident that +upgrading to a patch or to a minor release will not break anything.

+

How to Release a Component

+

Most Drycc projects are "components" which produce a Container image or binary executable as a +deliverable. This section leads a maintainer through creating a component release.

+

Step 1: Update Code and Run the Release Tool

+

Major or minor releases should happen on the master branch. Patch releases +should check out the previous release tag and cherry-pick specific commits from master.

+

Note: if a patch release, the release artifact will have to be manually promoted by triggering +the component-promote job with the following values:

+
COMPONENT_NAME=<component name>
+COMPONENT_SHA=<patch commit sha>
+ + +

Make sure you have the dryccrel release tool in your search $PATH.

+

Run dryccrel release once with a fake semver tag to proofread the changelog content. (If HEAD +of master is not what is intended for the release, add the --sha flag as described +in dryccrel release --help.)

+
$ dryccrel release controller v0.0.0
+Doing a dry run of the component release...
+skipping commit 943a49267eeb28546819a266654806cfcbae0e38
+
+Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38
+
+### v2.8.1 -> v0.0.0
+
+#### Fixes
+
+- [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output
+ + +

Based on the changelog content, determine whether the component deserves a minor or patch +release. Run the command again with that semver tag and --dry-run=false. You will still be +asked for confirmation before the release is created:

+
$ dryccrel release controller v2.8.2 --dry-run=false
+skipping commit 943a49267eeb28546819a266654806cfcbae0e38
+
+Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38
+
+### v2.8.1 -> v2.8.2
+
+
+#### Fixes
+
+- [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output
+
+
+Please review the above changelog contents and ensure:
+  1. All intended commits are mentioned
+  2. The changes agree with the semver release tag (major, minor, or patch)
+
+Create release for Drycc Controller v2.8.2? [y/n]: y
+New release is available at https://github.com/drycc/controller/releases/tag/v2.8.2
+ + +

Step 2: Verify the Component is Available

+

Tagging the component (see Step 1) +starts a CI job that eventually results in an artifact being made available for public download. +Please see the CI flow diagrams for details.

+

Double-check that the artifact is available, either by a podman pull command or by running the +appropriate installer script.

+

If the artifact can't be downloaded, ensure that its CI release jobs are still in progress, or +fix whatever issue arose in the pipeline. For example, the +master merge pipeline +may have failed to promote the :git-abc1d23 candidate image and needs to be restarted with +that component and commit.

+

If the component has a correlating Kubernetes Helm chart, +this chart will also be packaged, signed and uploaded to its production chart repo. Please +verify it can be fetched (and verified):

+
$ helm fetch oci://registry.drycc.cc/charts/controller --version 1.0.0
+Verification: &{0xc4207ec870 sha256:026e766e918ff28d2a7041bc3d560d149ee7eb0cb84165c9d9d00a3045ff45c3 controller-v1.0.1.tgz}
+ + +

How to Release Workflow

+

Drycc Workflow integrates multiple component releases together with a Kubernetes Helm chart +deliverable. This section leads a maintainer through creating a Workflow release.

+

Step 1: Set Environment Variables

+

Export two environment variables that will be used in later steps:

+
export WORKFLOW_RELEASE=v2.17.0 WORKFLOW_PREV_RELEASE=v2.16.0  # for example
+ + +

Step 2: Tag Supporting Repositories

+

Some Workflow components not in the Helm chart must also be tagged in sync with the release. +Follow the component release process above and ensure that +these components are tagged:

+ +

The version number for drycc/workflow-cli should always match the overall Workflow version +number.

+

Step 3: Create Helm Chart

+

To create and stage a release candidate chart for Workflow, we will build the workflow-chart-stage job with the following parameters:

+

RELEASE_TAG=$WORKFLOW_RELEASE

+

This job will gather all of the latest component release tags and use these to specify the versions of all component charts. +It will then package the Workflow chart, upload it to the staging chart repo and kick off an e2e run against said chart.

+

Step 4: Manual Testing

+

Now it's time to go above and beyond current CI tests. Create a testing matrix spreadsheet (copying +from the previous document is a good start) and sign up testers to cover all permutations.

+

Testers should pay special attention to the overall user experience, make sure upgrading from +earlier versions is smooth, and cover various storage configurations and Kubernetes versions and +infrastructure providers.

+

When showstopper-level bugs are found, the process is as follows:

+
    +
  1. Create a component PR that fixes the bug.
  2. +
  3. Once the PR passes and is reviewed, merge it and do a new + component release
  4. +
  5. Trigger the same workflow-chart-stage job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging.
  6. +
+

Step 5: Release the Chart

+

When testing has completed without uncovering any new showstopper bugs, kick off the workflow-chart-release job with the following parameter:

+

RELEASE_TAG=$WORKFLOW_RELEASE

+

This job will copy the release candidate chart (now approved by CI and manual testing) from the staging repo to the production repo, signing +it if it has not done so already.

+

Step 6: Assemble Master Changelog

+

Each component already updated its release notes on GitHub with CHANGELOG content. We'll now +generate the master changelog for the Workflow chart, consisting of all component and auxilliary repo changes.

+

We'll employ the requirements.lock file from the WORKFLOW_PREV_RELEASE chart, as well as a repo-to-chart-name mapping file, this time invoking dryccrel changelog global to get all component changes between +the chart versions existing in the WORKFLOW_PREV_RELEASE chart and the most recent releases existing in GitHub. +(Therefore, if there are any unreleased commits in a component repo, they will not appear here):

+
helm fetch --untar oci://registry.drycc.cc/charts/workflow --version $WORKFLOW_PREV_RELEASE
+dryccrel changelog global workflow/requirements.lock map.json > changelog-$WORKFLOW_RELEASE.md
+ + +

This master changelog should then be placed into a single gist. The file will also be added to the documentation +update PR created in the next step.

+

Step 7: Update Documentation

+

Create a new pull request at drycc/workflow that updates version references to the new release. +Use git grep $WORKFLOW_PREV_RELEASE to find any references, but be careful not to change +CHANGELOG.md.

+

Place the $WORKFLOW_RELEASE master changelog generated in Step 7 in the changelogs directory. +Make sure to add a header to the page to make it clear that this is for a Workflow release, e.g.:

+
## Workflow v2.16.0 -> v2.17.0
+ + +

Once the PR has been reviewed and merged, do a component release of +drycc/workflow itself. The version number for drycc/workflow should always match the +overall Workflow version number.

+

Step 8: Close GitHub Milestones

+

Create a pull request at seed-repo to close the release +milestone and create the next one. When changes are merged to seed-repo, milestones on all +relevant projects will be updated. If there are open issues attached to the milestone, move them +to the next upcoming milestone before merging the pull request.

+

Milestones map to Drycc Workflow releases in drycc/workflow. These milestones do not correspond +to individual component release tags.

+

Step 9: Release Workflow CLI Stable

+

Now that the $WORKFLOW_RELEASE version of Workflow CLI has been vetted, we can push stable artifacts based on this version.

+

Kick off https://ci.drycc.info/job/workflow-cli-build-stable/ with the TAG build parameter of $WORKFLOW_RELEASE +and then verify stable artifacts are available and appropriately updated after the job completes:

+
$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
+$ ./drycc version
+# (Should show $WORKFLOW_RELEASE)
+ + +

Step 10: Let Everyone Know

+

Let the rest of the team know they can start blogging and tweeting about the new Workflow release. +Post a message to the #company channel on Slack. Include a link to the released chart and to the +master CHANGELOG:

+
@here Drycc Workflow v2.17.0 is now live!
+Master CHANGELOG: https://drycc.info/docs/workflow/changelogs/v2.17.0/
+ + +

You're done with the release. Nice job!

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/roadmap/roadmap/index.html b/roadmap/roadmap/index.html new file mode 100644 index 000000000..2001773c4 --- /dev/null +++ b/roadmap/roadmap/index.html @@ -0,0 +1,900 @@ + + + + + + + + + + + + + + + + + + Roadmap - Drycc Workflow Documentation + + + + + + + +
+
+ + + + + + + +
+ +
+
+
+
+

Drycc Workflow Roadmap

+

The Drycc Workflow Roadmap is a community document created as part of the open +Planning Process. Each roadmap item describes a high-level capability or +grouping of features that are deemed important to the future of Drycc.

+

Given the project's rapid Release Schedule, roadmap +items are designed to provide a sense of direction over many releases.

+

Interactive drycc run /bin/bash

+

Provide the ability for developers to launch an interactive terminal session in +their application environment.

+

Related issues:

+ +

Log Streaming

+

Stream application logs via drycc logs -f https://github.com/drycc/drycc/issues/465

+

Teams and Permissions

+

Teams and Permissions represents a more flexible permissions model to allow +more nuanced control to applications, capabilities and resources on the +platform. There have been a number of proposals in this area which need to be +reconciled for Drycc Workflow before we begin implementation.

+

Related issues:

+ +

Monitoring

+ +

Workflow Addons/Services

+

Developers should be able to quickly and easily provision application +dependencies using a services or addon abstraction. +https://github.com/drycc/drycc/issues/231

+

Inbound/Outbound Webhooks

+

Drycc Workflow should be able to send and receive webhooks from external +systems. Facilitating integration with third party services like GitHub, +Gitlab, Slack, Hipchat.

+ +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/search/lunr.js b/search/lunr.js new file mode 100644 index 000000000..6aa370fbc --- /dev/null +++ b/search/lunr.js @@ -0,0 +1,3475 @@ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ + +;(function(){ + +/** + * A convenience function for configuring and constructing + * a new lunr Index. + * + * A lunr.Builder instance is created and the pipeline setup + * with a trimmer, stop word filter and stemmer. + * + * This builder object is yielded to the configuration function + * that is passed as a parameter, allowing the list of fields + * and other builder parameters to be customised. + * + * All documents _must_ be added within the passed config function. + * + * @example + * var idx = lunr(function () { + * this.field('title') + * this.field('body') + * this.ref('id') + * + * documents.forEach(function (doc) { + * this.add(doc) + * }, this) + * }) + * + * @see {@link lunr.Builder} + * @see {@link lunr.Pipeline} + * @see {@link lunr.trimmer} + * @see {@link lunr.stopWordFilter} + * @see {@link lunr.stemmer} + * @namespace {function} lunr + */ +var lunr = function (config) { + var builder = new lunr.Builder + + builder.pipeline.add( + lunr.trimmer, + lunr.stopWordFilter, + lunr.stemmer + ) + + builder.searchPipeline.add( + lunr.stemmer + ) + + config.call(builder, builder) + return builder.build() +} + +lunr.version = "2.3.9" +/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A namespace containing utils for the rest of the lunr library + * @namespace lunr.utils + */ +lunr.utils = {} + +/** + * Print a warning message to the console. + * + * @param {String} message The message to be printed. + * @memberOf lunr.utils + * @function + */ +lunr.utils.warn = (function (global) { + /* eslint-disable no-console */ + return function (message) { + if (global.console && console.warn) { + console.warn(message) + } + } + /* eslint-enable no-console */ +})(this) + +/** + * Convert an object to a string. + * + * In the case of `null` and `undefined` the function returns + * the empty string, in all other cases the result of calling + * `toString` on the passed object is returned. + * + * @param {Any} obj The object to convert to a string. + * @return {String} string representation of the passed object. + * @memberOf lunr.utils + */ +lunr.utils.asString = function (obj) { + if (obj === void 0 || obj === null) { + return "" + } else { + return obj.toString() + } +} + +/** + * Clones an object. + * + * Will create a copy of an existing object such that any mutations + * on the copy cannot affect the original. + * + * Only shallow objects are supported, passing a nested object to this + * function will cause a TypeError. + * + * Objects with primitives, and arrays of primitives are supported. + * + * @param {Object} obj The object to clone. + * @return {Object} a clone of the passed object. + * @throws {TypeError} when a nested object is passed. + * @memberOf Utils + */ +lunr.utils.clone = function (obj) { + if (obj === null || obj === undefined) { + return obj + } + + var clone = Object.create(null), + keys = Object.keys(obj) + + for (var i = 0; i < keys.length; i++) { + var key = keys[i], + val = obj[key] + + if (Array.isArray(val)) { + clone[key] = val.slice() + continue + } + + if (typeof val === 'string' || + typeof val === 'number' || + typeof val === 'boolean') { + clone[key] = val + continue + } + + throw new TypeError("clone is not deep and does not support nested objects") + } + + return clone +} +lunr.FieldRef = function (docRef, fieldName, stringValue) { + this.docRef = docRef + this.fieldName = fieldName + this._stringValue = stringValue +} + +lunr.FieldRef.joiner = "/" + +lunr.FieldRef.fromString = function (s) { + var n = s.indexOf(lunr.FieldRef.joiner) + + if (n === -1) { + throw "malformed field ref string" + } + + var fieldRef = s.slice(0, n), + docRef = s.slice(n + 1) + + return new lunr.FieldRef (docRef, fieldRef, s) +} + +lunr.FieldRef.prototype.toString = function () { + if (this._stringValue == undefined) { + this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef + } + + return this._stringValue +} +/*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A lunr set. + * + * @constructor + */ +lunr.Set = function (elements) { + this.elements = Object.create(null) + + if (elements) { + this.length = elements.length + + for (var i = 0; i < this.length; i++) { + this.elements[elements[i]] = true + } + } else { + this.length = 0 + } +} + +/** + * A complete set that contains all elements. + * + * @static + * @readonly + * @type {lunr.Set} + */ +lunr.Set.complete = { + intersect: function (other) { + return other + }, + + union: function () { + return this + }, + + contains: function () { + return true + } +} + +/** + * An empty set that contains no elements. + * + * @static + * @readonly + * @type {lunr.Set} + */ +lunr.Set.empty = { + intersect: function () { + return this + }, + + union: function (other) { + return other + }, + + contains: function () { + return false + } +} + +/** + * Returns true if this set contains the specified object. + * + * @param {object} object - Object whose presence in this set is to be tested. + * @returns {boolean} - True if this set contains the specified object. + */ +lunr.Set.prototype.contains = function (object) { + return !!this.elements[object] +} + +/** + * Returns a new set containing only the elements that are present in both + * this set and the specified set. + * + * @param {lunr.Set} other - set to intersect with this set. + * @returns {lunr.Set} a new set that is the intersection of this and the specified set. + */ + +lunr.Set.prototype.intersect = function (other) { + var a, b, elements, intersection = [] + + if (other === lunr.Set.complete) { + return this + } + + if (other === lunr.Set.empty) { + return other + } + + if (this.length < other.length) { + a = this + b = other + } else { + a = other + b = this + } + + elements = Object.keys(a.elements) + + for (var i = 0; i < elements.length; i++) { + var element = elements[i] + if (element in b.elements) { + intersection.push(element) + } + } + + return new lunr.Set (intersection) +} + +/** + * Returns a new set combining the elements of this and the specified set. + * + * @param {lunr.Set} other - set to union with this set. + * @return {lunr.Set} a new set that is the union of this and the specified set. + */ + +lunr.Set.prototype.union = function (other) { + if (other === lunr.Set.complete) { + return lunr.Set.complete + } + + if (other === lunr.Set.empty) { + return this + } + + return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements))) +} +/** + * A function to calculate the inverse document frequency for + * a posting. This is shared between the builder and the index + * + * @private + * @param {object} posting - The posting for a given term + * @param {number} documentCount - The total number of documents. + */ +lunr.idf = function (posting, documentCount) { + var documentsWithTerm = 0 + + for (var fieldName in posting) { + if (fieldName == '_index') continue // Ignore the term index, its not a field + documentsWithTerm += Object.keys(posting[fieldName]).length + } + + var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5) + + return Math.log(1 + Math.abs(x)) +} + +/** + * A token wraps a string representation of a token + * as it is passed through the text processing pipeline. + * + * @constructor + * @param {string} [str=''] - The string token being wrapped. + * @param {object} [metadata={}] - Metadata associated with this token. + */ +lunr.Token = function (str, metadata) { + this.str = str || "" + this.metadata = metadata || {} +} + +/** + * Returns the token string that is being wrapped by this object. + * + * @returns {string} + */ +lunr.Token.prototype.toString = function () { + return this.str +} + +/** + * A token update function is used when updating or optionally + * when cloning a token. + * + * @callback lunr.Token~updateFunction + * @param {string} str - The string representation of the token. + * @param {Object} metadata - All metadata associated with this token. + */ + +/** + * Applies the given function to the wrapped string token. + * + * @example + * token.update(function (str, metadata) { + * return str.toUpperCase() + * }) + * + * @param {lunr.Token~updateFunction} fn - A function to apply to the token string. + * @returns {lunr.Token} + */ +lunr.Token.prototype.update = function (fn) { + this.str = fn(this.str, this.metadata) + return this +} + +/** + * Creates a clone of this token. Optionally a function can be + * applied to the cloned token. + * + * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token. + * @returns {lunr.Token} + */ +lunr.Token.prototype.clone = function (fn) { + fn = fn || function (s) { return s } + return new lunr.Token (fn(this.str, this.metadata), this.metadata) +} +/*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A function for splitting a string into tokens ready to be inserted into + * the search index. Uses `lunr.tokenizer.separator` to split strings, change + * the value of this property to change how strings are split into tokens. + * + * This tokenizer will convert its parameter to a string by calling `toString` and + * then will split this string on the character in `lunr.tokenizer.separator`. + * Arrays will have their elements converted to strings and wrapped in a lunr.Token. + * + * Optional metadata can be passed to the tokenizer, this metadata will be cloned and + * added as metadata to every token that is created from the object to be tokenized. + * + * @static + * @param {?(string|object|object[])} obj - The object to convert into tokens + * @param {?object} metadata - Optional metadata to associate with every token + * @returns {lunr.Token[]} + * @see {@link lunr.Pipeline} + */ +lunr.tokenizer = function (obj, metadata) { + if (obj == null || obj == undefined) { + return [] + } + + if (Array.isArray(obj)) { + return obj.map(function (t) { + return new lunr.Token( + lunr.utils.asString(t).toLowerCase(), + lunr.utils.clone(metadata) + ) + }) + } + + var str = obj.toString().toLowerCase(), + len = str.length, + tokens = [] + + for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) { + var char = str.charAt(sliceEnd), + sliceLength = sliceEnd - sliceStart + + if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) { + + if (sliceLength > 0) { + var tokenMetadata = lunr.utils.clone(metadata) || {} + tokenMetadata["position"] = [sliceStart, sliceLength] + tokenMetadata["index"] = tokens.length + + tokens.push( + new lunr.Token ( + str.slice(sliceStart, sliceEnd), + tokenMetadata + ) + ) + } + + sliceStart = sliceEnd + 1 + } + + } + + return tokens +} + +/** + * The separator used to split a string into tokens. Override this property to change the behaviour of + * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens. + * + * @static + * @see lunr.tokenizer + */ +lunr.tokenizer.separator = /[\s\-]+/ +/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.Pipelines maintain an ordered list of functions to be applied to all + * tokens in documents entering the search index and queries being ran against + * the index. + * + * An instance of lunr.Index created with the lunr shortcut will contain a + * pipeline with a stop word filter and an English language stemmer. Extra + * functions can be added before or after either of these functions or these + * default functions can be removed. + * + * When run the pipeline will call each function in turn, passing a token, the + * index of that token in the original list of all tokens and finally a list of + * all the original tokens. + * + * The output of functions in the pipeline will be passed to the next function + * in the pipeline. To exclude a token from entering the index the function + * should return undefined, the rest of the pipeline will not be called with + * this token. + * + * For serialisation of pipelines to work, all functions used in an instance of + * a pipeline should be registered with lunr.Pipeline. Registered functions can + * then be loaded. If trying to load a serialised pipeline that uses functions + * that are not registered an error will be thrown. + * + * If not planning on serialising the pipeline then registering pipeline functions + * is not necessary. + * + * @constructor + */ +lunr.Pipeline = function () { + this._stack = [] +} + +lunr.Pipeline.registeredFunctions = Object.create(null) + +/** + * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token + * string as well as all known metadata. A pipeline function can mutate the token string + * or mutate (or add) metadata for a given token. + * + * A pipeline function can indicate that the passed token should be discarded by returning + * null, undefined or an empty string. This token will not be passed to any downstream pipeline + * functions and will not be added to the index. + * + * Multiple tokens can be returned by returning an array of tokens. Each token will be passed + * to any downstream pipeline functions and all will returned tokens will be added to the index. + * + * Any number of pipeline functions may be chained together using a lunr.Pipeline. + * + * @interface lunr.PipelineFunction + * @param {lunr.Token} token - A token from the document being processed. + * @param {number} i - The index of this token in the complete list of tokens for this document/field. + * @param {lunr.Token[]} tokens - All tokens for this document/field. + * @returns {(?lunr.Token|lunr.Token[])} + */ + +/** + * Register a function with the pipeline. + * + * Functions that are used in the pipeline should be registered if the pipeline + * needs to be serialised, or a serialised pipeline needs to be loaded. + * + * Registering a function does not add it to a pipeline, functions must still be + * added to instances of the pipeline for them to be used when running a pipeline. + * + * @param {lunr.PipelineFunction} fn - The function to check for. + * @param {String} label - The label to register this function with + */ +lunr.Pipeline.registerFunction = function (fn, label) { + if (label in this.registeredFunctions) { + lunr.utils.warn('Overwriting existing registered function: ' + label) + } + + fn.label = label + lunr.Pipeline.registeredFunctions[fn.label] = fn +} + +/** + * Warns if the function is not registered as a Pipeline function. + * + * @param {lunr.PipelineFunction} fn - The function to check for. + * @private + */ +lunr.Pipeline.warnIfFunctionNotRegistered = function (fn) { + var isRegistered = fn.label && (fn.label in this.registeredFunctions) + + if (!isRegistered) { + lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', fn) + } +} + +/** + * Loads a previously serialised pipeline. + * + * All functions to be loaded must already be registered with lunr.Pipeline. + * If any function from the serialised data has not been registered then an + * error will be thrown. + * + * @param {Object} serialised - The serialised pipeline to load. + * @returns {lunr.Pipeline} + */ +lunr.Pipeline.load = function (serialised) { + var pipeline = new lunr.Pipeline + + serialised.forEach(function (fnName) { + var fn = lunr.Pipeline.registeredFunctions[fnName] + + if (fn) { + pipeline.add(fn) + } else { + throw new Error('Cannot load unregistered function: ' + fnName) + } + }) + + return pipeline +} + +/** + * Adds new functions to the end of the pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline. + */ +lunr.Pipeline.prototype.add = function () { + var fns = Array.prototype.slice.call(arguments) + + fns.forEach(function (fn) { + lunr.Pipeline.warnIfFunctionNotRegistered(fn) + this._stack.push(fn) + }, this) +} + +/** + * Adds a single function after a function that already exists in the + * pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. + * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. + */ +lunr.Pipeline.prototype.after = function (existingFn, newFn) { + lunr.Pipeline.warnIfFunctionNotRegistered(newFn) + + var pos = this._stack.indexOf(existingFn) + if (pos == -1) { + throw new Error('Cannot find existingFn') + } + + pos = pos + 1 + this._stack.splice(pos, 0, newFn) +} + +/** + * Adds a single function before a function that already exists in the + * pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. + * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. + */ +lunr.Pipeline.prototype.before = function (existingFn, newFn) { + lunr.Pipeline.warnIfFunctionNotRegistered(newFn) + + var pos = this._stack.indexOf(existingFn) + if (pos == -1) { + throw new Error('Cannot find existingFn') + } + + this._stack.splice(pos, 0, newFn) +} + +/** + * Removes a function from the pipeline. + * + * @param {lunr.PipelineFunction} fn The function to remove from the pipeline. + */ +lunr.Pipeline.prototype.remove = function (fn) { + var pos = this._stack.indexOf(fn) + if (pos == -1) { + return + } + + this._stack.splice(pos, 1) +} + +/** + * Runs the current list of functions that make up the pipeline against the + * passed tokens. + * + * @param {Array} tokens The tokens to run through the pipeline. + * @returns {Array} + */ +lunr.Pipeline.prototype.run = function (tokens) { + var stackLength = this._stack.length + + for (var i = 0; i < stackLength; i++) { + var fn = this._stack[i] + var memo = [] + + for (var j = 0; j < tokens.length; j++) { + var result = fn(tokens[j], j, tokens) + + if (result === null || result === void 0 || result === '') continue + + if (Array.isArray(result)) { + for (var k = 0; k < result.length; k++) { + memo.push(result[k]) + } + } else { + memo.push(result) + } + } + + tokens = memo + } + + return tokens +} + +/** + * Convenience method for passing a string through a pipeline and getting + * strings out. This method takes care of wrapping the passed string in a + * token and mapping the resulting tokens back to strings. + * + * @param {string} str - The string to pass through the pipeline. + * @param {?object} metadata - Optional metadata to associate with the token + * passed to the pipeline. + * @returns {string[]} + */ +lunr.Pipeline.prototype.runString = function (str, metadata) { + var token = new lunr.Token (str, metadata) + + return this.run([token]).map(function (t) { + return t.toString() + }) +} + +/** + * Resets the pipeline by removing any existing processors. + * + */ +lunr.Pipeline.prototype.reset = function () { + this._stack = [] +} + +/** + * Returns a representation of the pipeline ready for serialisation. + * + * Logs a warning if the function has not been registered. + * + * @returns {Array} + */ +lunr.Pipeline.prototype.toJSON = function () { + return this._stack.map(function (fn) { + lunr.Pipeline.warnIfFunctionNotRegistered(fn) + + return fn.label + }) +} +/*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A vector is used to construct the vector space of documents and queries. These + * vectors support operations to determine the similarity between two documents or + * a document and a query. + * + * Normally no parameters are required for initializing a vector, but in the case of + * loading a previously dumped vector the raw elements can be provided to the constructor. + * + * For performance reasons vectors are implemented with a flat array, where an elements + * index is immediately followed by its value. E.g. [index, value, index, value]. This + * allows the underlying array to be as sparse as possible and still offer decent + * performance when being used for vector calculations. + * + * @constructor + * @param {Number[]} [elements] - The flat list of element index and element value pairs. + */ +lunr.Vector = function (elements) { + this._magnitude = 0 + this.elements = elements || [] +} + + +/** + * Calculates the position within the vector to insert a given index. + * + * This is used internally by insert and upsert. If there are duplicate indexes then + * the position is returned as if the value for that index were to be updated, but it + * is the callers responsibility to check whether there is a duplicate at that index + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @returns {Number} + */ +lunr.Vector.prototype.positionForIndex = function (index) { + // For an empty vector the tuple can be inserted at the beginning + if (this.elements.length == 0) { + return 0 + } + + var start = 0, + end = this.elements.length / 2, + sliceLength = end - start, + pivotPoint = Math.floor(sliceLength / 2), + pivotIndex = this.elements[pivotPoint * 2] + + while (sliceLength > 1) { + if (pivotIndex < index) { + start = pivotPoint + } + + if (pivotIndex > index) { + end = pivotPoint + } + + if (pivotIndex == index) { + break + } + + sliceLength = end - start + pivotPoint = start + Math.floor(sliceLength / 2) + pivotIndex = this.elements[pivotPoint * 2] + } + + if (pivotIndex == index) { + return pivotPoint * 2 + } + + if (pivotIndex > index) { + return pivotPoint * 2 + } + + if (pivotIndex < index) { + return (pivotPoint + 1) * 2 + } +} + +/** + * Inserts an element at an index within the vector. + * + * Does not allow duplicates, will throw an error if there is already an entry + * for this index. + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @param {Number} val - The value to be inserted into the vector. + */ +lunr.Vector.prototype.insert = function (insertIdx, val) { + this.upsert(insertIdx, val, function () { + throw "duplicate index" + }) +} + +/** + * Inserts or updates an existing index within the vector. + * + * @param {Number} insertIdx - The index at which the element should be inserted. + * @param {Number} val - The value to be inserted into the vector. + * @param {function} fn - A function that is called for updates, the existing value and the + * requested value are passed as arguments + */ +lunr.Vector.prototype.upsert = function (insertIdx, val, fn) { + this._magnitude = 0 + var position = this.positionForIndex(insertIdx) + + if (this.elements[position] == insertIdx) { + this.elements[position + 1] = fn(this.elements[position + 1], val) + } else { + this.elements.splice(position, 0, insertIdx, val) + } +} + +/** + * Calculates the magnitude of this vector. + * + * @returns {Number} + */ +lunr.Vector.prototype.magnitude = function () { + if (this._magnitude) return this._magnitude + + var sumOfSquares = 0, + elementsLength = this.elements.length + + for (var i = 1; i < elementsLength; i += 2) { + var val = this.elements[i] + sumOfSquares += val * val + } + + return this._magnitude = Math.sqrt(sumOfSquares) +} + +/** + * Calculates the dot product of this vector and another vector. + * + * @param {lunr.Vector} otherVector - The vector to compute the dot product with. + * @returns {Number} + */ +lunr.Vector.prototype.dot = function (otherVector) { + var dotProduct = 0, + a = this.elements, b = otherVector.elements, + aLen = a.length, bLen = b.length, + aVal = 0, bVal = 0, + i = 0, j = 0 + + while (i < aLen && j < bLen) { + aVal = a[i], bVal = b[j] + if (aVal < bVal) { + i += 2 + } else if (aVal > bVal) { + j += 2 + } else if (aVal == bVal) { + dotProduct += a[i + 1] * b[j + 1] + i += 2 + j += 2 + } + } + + return dotProduct +} + +/** + * Calculates the similarity between this vector and another vector. + * + * @param {lunr.Vector} otherVector - The other vector to calculate the + * similarity with. + * @returns {Number} + */ +lunr.Vector.prototype.similarity = function (otherVector) { + return this.dot(otherVector) / this.magnitude() || 0 +} + +/** + * Converts the vector to an array of the elements within the vector. + * + * @returns {Number[]} + */ +lunr.Vector.prototype.toArray = function () { + var output = new Array (this.elements.length / 2) + + for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) { + output[j] = this.elements[i] + } + + return output +} + +/** + * A JSON serializable representation of the vector. + * + * @returns {Number[]} + */ +lunr.Vector.prototype.toJSON = function () { + return this.elements +} +/* eslint-disable */ +/*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ + +/** + * lunr.stemmer is an english language stemmer, this is a JavaScript + * implementation of the PorterStemmer taken from http://tartarus.org/~martin + * + * @static + * @implements {lunr.PipelineFunction} + * @param {lunr.Token} token - The string to stem + * @returns {lunr.Token} + * @see {@link lunr.Pipeline} + * @function + */ +lunr.stemmer = (function(){ + var step2list = { + "ational" : "ate", + "tional" : "tion", + "enci" : "ence", + "anci" : "ance", + "izer" : "ize", + "bli" : "ble", + "alli" : "al", + "entli" : "ent", + "eli" : "e", + "ousli" : "ous", + "ization" : "ize", + "ation" : "ate", + "ator" : "ate", + "alism" : "al", + "iveness" : "ive", + "fulness" : "ful", + "ousness" : "ous", + "aliti" : "al", + "iviti" : "ive", + "biliti" : "ble", + "logi" : "log" + }, + + step3list = { + "icate" : "ic", + "ative" : "", + "alize" : "al", + "iciti" : "ic", + "ical" : "ic", + "ful" : "", + "ness" : "" + }, + + c = "[^aeiou]", // consonant + v = "[aeiouy]", // vowel + C = c + "[^aeiouy]*", // consonant sequence + V = v + "[aeiou]*", // vowel sequence + + mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0 + meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1 + mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1 + s_v = "^(" + C + ")?" + v; // vowel in stem + + var re_mgr0 = new RegExp(mgr0); + var re_mgr1 = new RegExp(mgr1); + var re_meq1 = new RegExp(meq1); + var re_s_v = new RegExp(s_v); + + var re_1a = /^(.+?)(ss|i)es$/; + var re2_1a = /^(.+?)([^s])s$/; + var re_1b = /^(.+?)eed$/; + var re2_1b = /^(.+?)(ed|ing)$/; + var re_1b_2 = /.$/; + var re2_1b_2 = /(at|bl|iz)$/; + var re3_1b_2 = new RegExp("([^aeiouylsz])\\1$"); + var re4_1b_2 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + + var re_1c = /^(.+?[^aeiou])y$/; + var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + + var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + + var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + var re2_4 = /^(.+?)(s|t)(ion)$/; + + var re_5 = /^(.+?)e$/; + var re_5_1 = /ll$/; + var re3_5 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + + var porterStemmer = function porterStemmer(w) { + var stem, + suffix, + firstch, + re, + re2, + re3, + re4; + + if (w.length < 3) { return w; } + + firstch = w.substr(0,1); + if (firstch == "y") { + w = firstch.toUpperCase() + w.substr(1); + } + + // Step 1a + re = re_1a + re2 = re2_1a; + + if (re.test(w)) { w = w.replace(re,"$1$2"); } + else if (re2.test(w)) { w = w.replace(re2,"$1$2"); } + + // Step 1b + re = re_1b; + re2 = re2_1b; + if (re.test(w)) { + var fp = re.exec(w); + re = re_mgr0; + if (re.test(fp[1])) { + re = re_1b_2; + w = w.replace(re,""); + } + } else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = re_s_v; + if (re2.test(stem)) { + w = stem; + re2 = re2_1b_2; + re3 = re3_1b_2; + re4 = re4_1b_2; + if (re2.test(w)) { w = w + "e"; } + else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,""); } + else if (re4.test(w)) { w = w + "e"; } + } + } + + // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say) + re = re_1c; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem + "i"; + } + + // Step 2 + re = re_2; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = re_mgr0; + if (re.test(stem)) { + w = stem + step2list[suffix]; + } + } + + // Step 3 + re = re_3; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = re_mgr0; + if (re.test(stem)) { + w = stem + step3list[suffix]; + } + } + + // Step 4 + re = re_4; + re2 = re2_4; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = re_mgr1; + if (re.test(stem)) { + w = stem; + } + } else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = re_mgr1; + if (re2.test(stem)) { + w = stem; + } + } + + // Step 5 + re = re_5; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = re_mgr1; + re2 = re_meq1; + re3 = re3_5; + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) { + w = stem; + } + } + + re = re_5_1; + re2 = re_mgr1; + if (re.test(w) && re2.test(w)) { + re = re_1b_2; + w = w.replace(re,""); + } + + // and turn initial Y back to y + + if (firstch == "y") { + w = firstch.toLowerCase() + w.substr(1); + } + + return w; + }; + + return function (token) { + return token.update(porterStemmer); + } +})(); + +lunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer') +/*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.generateStopWordFilter builds a stopWordFilter function from the provided + * list of stop words. + * + * The built in lunr.stopWordFilter is built using this generator and can be used + * to generate custom stopWordFilters for applications or non English languages. + * + * @function + * @param {Array} token The token to pass through the filter + * @returns {lunr.PipelineFunction} + * @see lunr.Pipeline + * @see lunr.stopWordFilter + */ +lunr.generateStopWordFilter = function (stopWords) { + var words = stopWords.reduce(function (memo, stopWord) { + memo[stopWord] = stopWord + return memo + }, {}) + + return function (token) { + if (token && words[token.toString()] !== token.toString()) return token + } +} + +/** + * lunr.stopWordFilter is an English language stop word list filter, any words + * contained in the list will not be passed through the filter. + * + * This is intended to be used in the Pipeline. If the token does not pass the + * filter then undefined will be returned. + * + * @function + * @implements {lunr.PipelineFunction} + * @params {lunr.Token} token - A token to check for being a stop word. + * @returns {lunr.Token} + * @see {@link lunr.Pipeline} + */ +lunr.stopWordFilter = lunr.generateStopWordFilter([ + 'a', + 'able', + 'about', + 'across', + 'after', + 'all', + 'almost', + 'also', + 'am', + 'among', + 'an', + 'and', + 'any', + 'are', + 'as', + 'at', + 'be', + 'because', + 'been', + 'but', + 'by', + 'can', + 'cannot', + 'could', + 'dear', + 'did', + 'do', + 'does', + 'either', + 'else', + 'ever', + 'every', + 'for', + 'from', + 'get', + 'got', + 'had', + 'has', + 'have', + 'he', + 'her', + 'hers', + 'him', + 'his', + 'how', + 'however', + 'i', + 'if', + 'in', + 'into', + 'is', + 'it', + 'its', + 'just', + 'least', + 'let', + 'like', + 'likely', + 'may', + 'me', + 'might', + 'most', + 'must', + 'my', + 'neither', + 'no', + 'nor', + 'not', + 'of', + 'off', + 'often', + 'on', + 'only', + 'or', + 'other', + 'our', + 'own', + 'rather', + 'said', + 'say', + 'says', + 'she', + 'should', + 'since', + 'so', + 'some', + 'than', + 'that', + 'the', + 'their', + 'them', + 'then', + 'there', + 'these', + 'they', + 'this', + 'tis', + 'to', + 'too', + 'twas', + 'us', + 'wants', + 'was', + 'we', + 'were', + 'what', + 'when', + 'where', + 'which', + 'while', + 'who', + 'whom', + 'why', + 'will', + 'with', + 'would', + 'yet', + 'you', + 'your' +]) + +lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter') +/*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.trimmer is a pipeline function for trimming non word + * characters from the beginning and end of tokens before they + * enter the index. + * + * This implementation may not work correctly for non latin + * characters and should either be removed or adapted for use + * with languages with non-latin characters. + * + * @static + * @implements {lunr.PipelineFunction} + * @param {lunr.Token} token The token to pass through the filter + * @returns {lunr.Token} + * @see lunr.Pipeline + */ +lunr.trimmer = function (token) { + return token.update(function (s) { + return s.replace(/^\W+/, '').replace(/\W+$/, '') + }) +} + +lunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer') +/*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * A token set is used to store the unique list of all tokens + * within an index. Token sets are also used to represent an + * incoming query to the index, this query token set and index + * token set are then intersected to find which tokens to look + * up in the inverted index. + * + * A token set can hold multiple tokens, as in the case of the + * index token set, or it can hold a single token as in the + * case of a simple query token set. + * + * Additionally token sets are used to perform wildcard matching. + * Leading, contained and trailing wildcards are supported, and + * from this edit distance matching can also be provided. + * + * Token sets are implemented as a minimal finite state automata, + * where both common prefixes and suffixes are shared between tokens. + * This helps to reduce the space used for storing the token set. + * + * @constructor + */ +lunr.TokenSet = function () { + this.final = false + this.edges = {} + this.id = lunr.TokenSet._nextId + lunr.TokenSet._nextId += 1 +} + +/** + * Keeps track of the next, auto increment, identifier to assign + * to a new tokenSet. + * + * TokenSets require a unique identifier to be correctly minimised. + * + * @private + */ +lunr.TokenSet._nextId = 1 + +/** + * Creates a TokenSet instance from the given sorted array of words. + * + * @param {String[]} arr - A sorted array of strings to create the set from. + * @returns {lunr.TokenSet} + * @throws Will throw an error if the input array is not sorted. + */ +lunr.TokenSet.fromArray = function (arr) { + var builder = new lunr.TokenSet.Builder + + for (var i = 0, len = arr.length; i < len; i++) { + builder.insert(arr[i]) + } + + builder.finish() + return builder.root +} + +/** + * Creates a token set from a query clause. + * + * @private + * @param {Object} clause - A single clause from lunr.Query. + * @param {string} clause.term - The query clause term. + * @param {number} [clause.editDistance] - The optional edit distance for the term. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.fromClause = function (clause) { + if ('editDistance' in clause) { + return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance) + } else { + return lunr.TokenSet.fromString(clause.term) + } +} + +/** + * Creates a token set representing a single string with a specified + * edit distance. + * + * Insertions, deletions, substitutions and transpositions are each + * treated as an edit distance of 1. + * + * Increasing the allowed edit distance will have a dramatic impact + * on the performance of both creating and intersecting these TokenSets. + * It is advised to keep the edit distance less than 3. + * + * @param {string} str - The string to create the token set from. + * @param {number} editDistance - The allowed edit distance to match. + * @returns {lunr.Vector} + */ +lunr.TokenSet.fromFuzzyString = function (str, editDistance) { + var root = new lunr.TokenSet + + var stack = [{ + node: root, + editsRemaining: editDistance, + str: str + }] + + while (stack.length) { + var frame = stack.pop() + + // no edit + if (frame.str.length > 0) { + var char = frame.str.charAt(0), + noEditNode + + if (char in frame.node.edges) { + noEditNode = frame.node.edges[char] + } else { + noEditNode = new lunr.TokenSet + frame.node.edges[char] = noEditNode + } + + if (frame.str.length == 1) { + noEditNode.final = true + } + + stack.push({ + node: noEditNode, + editsRemaining: frame.editsRemaining, + str: frame.str.slice(1) + }) + } + + if (frame.editsRemaining == 0) { + continue + } + + // insertion + if ("*" in frame.node.edges) { + var insertionNode = frame.node.edges["*"] + } else { + var insertionNode = new lunr.TokenSet + frame.node.edges["*"] = insertionNode + } + + if (frame.str.length == 0) { + insertionNode.final = true + } + + stack.push({ + node: insertionNode, + editsRemaining: frame.editsRemaining - 1, + str: frame.str + }) + + // deletion + // can only do a deletion if we have enough edits remaining + // and if there are characters left to delete in the string + if (frame.str.length > 1) { + stack.push({ + node: frame.node, + editsRemaining: frame.editsRemaining - 1, + str: frame.str.slice(1) + }) + } + + // deletion + // just removing the last character from the str + if (frame.str.length == 1) { + frame.node.final = true + } + + // substitution + // can only do a substitution if we have enough edits remaining + // and if there are characters left to substitute + if (frame.str.length >= 1) { + if ("*" in frame.node.edges) { + var substitutionNode = frame.node.edges["*"] + } else { + var substitutionNode = new lunr.TokenSet + frame.node.edges["*"] = substitutionNode + } + + if (frame.str.length == 1) { + substitutionNode.final = true + } + + stack.push({ + node: substitutionNode, + editsRemaining: frame.editsRemaining - 1, + str: frame.str.slice(1) + }) + } + + // transposition + // can only do a transposition if there are edits remaining + // and there are enough characters to transpose + if (frame.str.length > 1) { + var charA = frame.str.charAt(0), + charB = frame.str.charAt(1), + transposeNode + + if (charB in frame.node.edges) { + transposeNode = frame.node.edges[charB] + } else { + transposeNode = new lunr.TokenSet + frame.node.edges[charB] = transposeNode + } + + if (frame.str.length == 1) { + transposeNode.final = true + } + + stack.push({ + node: transposeNode, + editsRemaining: frame.editsRemaining - 1, + str: charA + frame.str.slice(2) + }) + } + } + + return root +} + +/** + * Creates a TokenSet from a string. + * + * The string may contain one or more wildcard characters (*) + * that will allow wildcard matching when intersecting with + * another TokenSet. + * + * @param {string} str - The string to create a TokenSet from. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.fromString = function (str) { + var node = new lunr.TokenSet, + root = node + + /* + * Iterates through all characters within the passed string + * appending a node for each character. + * + * When a wildcard character is found then a self + * referencing edge is introduced to continually match + * any number of any characters. + */ + for (var i = 0, len = str.length; i < len; i++) { + var char = str[i], + final = (i == len - 1) + + if (char == "*") { + node.edges[char] = node + node.final = final + + } else { + var next = new lunr.TokenSet + next.final = final + + node.edges[char] = next + node = next + } + } + + return root +} + +/** + * Converts this TokenSet into an array of strings + * contained within the TokenSet. + * + * This is not intended to be used on a TokenSet that + * contains wildcards, in these cases the results are + * undefined and are likely to cause an infinite loop. + * + * @returns {string[]} + */ +lunr.TokenSet.prototype.toArray = function () { + var words = [] + + var stack = [{ + prefix: "", + node: this + }] + + while (stack.length) { + var frame = stack.pop(), + edges = Object.keys(frame.node.edges), + len = edges.length + + if (frame.node.final) { + /* In Safari, at this point the prefix is sometimes corrupted, see: + * https://github.com/olivernn/lunr.js/issues/279 Calling any + * String.prototype method forces Safari to "cast" this string to what + * it's supposed to be, fixing the bug. */ + frame.prefix.charAt(0) + words.push(frame.prefix) + } + + for (var i = 0; i < len; i++) { + var edge = edges[i] + + stack.push({ + prefix: frame.prefix.concat(edge), + node: frame.node.edges[edge] + }) + } + } + + return words +} + +/** + * Generates a string representation of a TokenSet. + * + * This is intended to allow TokenSets to be used as keys + * in objects, largely to aid the construction and minimisation + * of a TokenSet. As such it is not designed to be a human + * friendly representation of the TokenSet. + * + * @returns {string} + */ +lunr.TokenSet.prototype.toString = function () { + // NOTE: Using Object.keys here as this.edges is very likely + // to enter 'hash-mode' with many keys being added + // + // avoiding a for-in loop here as it leads to the function + // being de-optimised (at least in V8). From some simple + // benchmarks the performance is comparable, but allowing + // V8 to optimize may mean easy performance wins in the future. + + if (this._str) { + return this._str + } + + var str = this.final ? '1' : '0', + labels = Object.keys(this.edges).sort(), + len = labels.length + + for (var i = 0; i < len; i++) { + var label = labels[i], + node = this.edges[label] + + str = str + label + node.id + } + + return str +} + +/** + * Returns a new TokenSet that is the intersection of + * this TokenSet and the passed TokenSet. + * + * This intersection will take into account any wildcards + * contained within the TokenSet. + * + * @param {lunr.TokenSet} b - An other TokenSet to intersect with. + * @returns {lunr.TokenSet} + */ +lunr.TokenSet.prototype.intersect = function (b) { + var output = new lunr.TokenSet, + frame = undefined + + var stack = [{ + qNode: b, + output: output, + node: this + }] + + while (stack.length) { + frame = stack.pop() + + // NOTE: As with the #toString method, we are using + // Object.keys and a for loop instead of a for-in loop + // as both of these objects enter 'hash' mode, causing + // the function to be de-optimised in V8 + var qEdges = Object.keys(frame.qNode.edges), + qLen = qEdges.length, + nEdges = Object.keys(frame.node.edges), + nLen = nEdges.length + + for (var q = 0; q < qLen; q++) { + var qEdge = qEdges[q] + + for (var n = 0; n < nLen; n++) { + var nEdge = nEdges[n] + + if (nEdge == qEdge || qEdge == '*') { + var node = frame.node.edges[nEdge], + qNode = frame.qNode.edges[qEdge], + final = node.final && qNode.final, + next = undefined + + if (nEdge in frame.output.edges) { + // an edge already exists for this character + // no need to create a new node, just set the finality + // bit unless this node is already final + next = frame.output.edges[nEdge] + next.final = next.final || final + + } else { + // no edge exists yet, must create one + // set the finality bit and insert it + // into the output + next = new lunr.TokenSet + next.final = final + frame.output.edges[nEdge] = next + } + + stack.push({ + qNode: qNode, + output: next, + node: node + }) + } + } + } + } + + return output +} +lunr.TokenSet.Builder = function () { + this.previousWord = "" + this.root = new lunr.TokenSet + this.uncheckedNodes = [] + this.minimizedNodes = {} +} + +lunr.TokenSet.Builder.prototype.insert = function (word) { + var node, + commonPrefix = 0 + + if (word < this.previousWord) { + throw new Error ("Out of order word insertion") + } + + for (var i = 0; i < word.length && i < this.previousWord.length; i++) { + if (word[i] != this.previousWord[i]) break + commonPrefix++ + } + + this.minimize(commonPrefix) + + if (this.uncheckedNodes.length == 0) { + node = this.root + } else { + node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child + } + + for (var i = commonPrefix; i < word.length; i++) { + var nextNode = new lunr.TokenSet, + char = word[i] + + node.edges[char] = nextNode + + this.uncheckedNodes.push({ + parent: node, + char: char, + child: nextNode + }) + + node = nextNode + } + + node.final = true + this.previousWord = word +} + +lunr.TokenSet.Builder.prototype.finish = function () { + this.minimize(0) +} + +lunr.TokenSet.Builder.prototype.minimize = function (downTo) { + for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) { + var node = this.uncheckedNodes[i], + childKey = node.child.toString() + + if (childKey in this.minimizedNodes) { + node.parent.edges[node.char] = this.minimizedNodes[childKey] + } else { + // Cache the key for this node since + // we know it can't change anymore + node.child._str = childKey + + this.minimizedNodes[childKey] = node.child + } + + this.uncheckedNodes.pop() + } +} +/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * An index contains the built index of all documents and provides a query interface + * to the index. + * + * Usually instances of lunr.Index will not be created using this constructor, instead + * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be + * used to load previously built and serialized indexes. + * + * @constructor + * @param {Object} attrs - The attributes of the built search index. + * @param {Object} attrs.invertedIndex - An index of term/field to document reference. + * @param {Object} attrs.fieldVectors - Field vectors + * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens. + * @param {string[]} attrs.fields - The names of indexed document fields. + * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms. + */ +lunr.Index = function (attrs) { + this.invertedIndex = attrs.invertedIndex + this.fieldVectors = attrs.fieldVectors + this.tokenSet = attrs.tokenSet + this.fields = attrs.fields + this.pipeline = attrs.pipeline +} + +/** + * A result contains details of a document matching a search query. + * @typedef {Object} lunr.Index~Result + * @property {string} ref - The reference of the document this result represents. + * @property {number} score - A number between 0 and 1 representing how similar this document is to the query. + * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match. + */ + +/** + * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple + * query language which itself is parsed into an instance of lunr.Query. + * + * For programmatically building queries it is advised to directly use lunr.Query, the query language + * is best used for human entered text rather than program generated text. + * + * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported + * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello' + * or 'world', though those that contain both will rank higher in the results. + * + * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can + * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding + * wildcards will increase the number of documents that will be found but can also have a negative + * impact on query performance, especially with wildcards at the beginning of a term. + * + * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term + * hello in the title field will match this query. Using a field not present in the index will lead + * to an error being thrown. + * + * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term + * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported + * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2. + * Avoid large values for edit distance to improve query performance. + * + * Each term also supports a presence modifier. By default a term's presence in document is optional, however + * this can be changed to either required or prohibited. For a term's presence to be required in a document the + * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and + * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not + * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'. + * + * To escape special characters the backslash character '\' can be used, this allows searches to include + * characters that would normally be considered modifiers, e.g. `foo\~2` will search for a term "foo~2" instead + * of attempting to apply a boost of 2 to the search term "foo". + * + * @typedef {string} lunr.Index~QueryString + * @example Simple single term query + * hello + * @example Multiple term query + * hello world + * @example term scoped to a field + * title:hello + * @example term with a boost of 10 + * hello^10 + * @example term with an edit distance of 2 + * hello~2 + * @example terms with presence modifiers + * -foo +bar baz + */ + +/** + * Performs a search against the index using lunr query syntax. + * + * Results will be returned sorted by their score, the most relevant results + * will be returned first. For details on how the score is calculated, please see + * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}. + * + * For more programmatic querying use lunr.Index#query. + * + * @param {lunr.Index~QueryString} queryString - A string containing a lunr query. + * @throws {lunr.QueryParseError} If the passed query string cannot be parsed. + * @returns {lunr.Index~Result[]} + */ +lunr.Index.prototype.search = function (queryString) { + return this.query(function (query) { + var parser = new lunr.QueryParser(queryString, query) + parser.parse() + }) +} + +/** + * A query builder callback provides a query object to be used to express + * the query to perform on the index. + * + * @callback lunr.Index~queryBuilder + * @param {lunr.Query} query - The query object to build up. + * @this lunr.Query + */ + +/** + * Performs a query against the index using the yielded lunr.Query object. + * + * If performing programmatic queries against the index, this method is preferred + * over lunr.Index#search so as to avoid the additional query parsing overhead. + * + * A query object is yielded to the supplied function which should be used to + * express the query to be run against the index. + * + * Note that although this function takes a callback parameter it is _not_ an + * asynchronous operation, the callback is just yielded a query object to be + * customized. + * + * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query. + * @returns {lunr.Index~Result[]} + */ +lunr.Index.prototype.query = function (fn) { + // for each query clause + // * process terms + // * expand terms from token set + // * find matching documents and metadata + // * get document vectors + // * score documents + + var query = new lunr.Query(this.fields), + matchingFields = Object.create(null), + queryVectors = Object.create(null), + termFieldCache = Object.create(null), + requiredMatches = Object.create(null), + prohibitedMatches = Object.create(null) + + /* + * To support field level boosts a query vector is created per + * field. An empty vector is eagerly created to support negated + * queries. + */ + for (var i = 0; i < this.fields.length; i++) { + queryVectors[this.fields[i]] = new lunr.Vector + } + + fn.call(query, query) + + for (var i = 0; i < query.clauses.length; i++) { + /* + * Unless the pipeline has been disabled for this term, which is + * the case for terms with wildcards, we need to pass the clause + * term through the search pipeline. A pipeline returns an array + * of processed terms. Pipeline functions may expand the passed + * term, which means we may end up performing multiple index lookups + * for a single query term. + */ + var clause = query.clauses[i], + terms = null, + clauseMatches = lunr.Set.empty + + if (clause.usePipeline) { + terms = this.pipeline.runString(clause.term, { + fields: clause.fields + }) + } else { + terms = [clause.term] + } + + for (var m = 0; m < terms.length; m++) { + var term = terms[m] + + /* + * Each term returned from the pipeline needs to use the same query + * clause object, e.g. the same boost and or edit distance. The + * simplest way to do this is to re-use the clause object but mutate + * its term property. + */ + clause.term = term + + /* + * From the term in the clause we create a token set which will then + * be used to intersect the indexes token set to get a list of terms + * to lookup in the inverted index + */ + var termTokenSet = lunr.TokenSet.fromClause(clause), + expandedTerms = this.tokenSet.intersect(termTokenSet).toArray() + + /* + * If a term marked as required does not exist in the tokenSet it is + * impossible for the search to return any matches. We set all the field + * scoped required matches set to empty and stop examining any further + * clauses. + */ + if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) { + for (var k = 0; k < clause.fields.length; k++) { + var field = clause.fields[k] + requiredMatches[field] = lunr.Set.empty + } + + break + } + + for (var j = 0; j < expandedTerms.length; j++) { + /* + * For each term get the posting and termIndex, this is required for + * building the query vector. + */ + var expandedTerm = expandedTerms[j], + posting = this.invertedIndex[expandedTerm], + termIndex = posting._index + + for (var k = 0; k < clause.fields.length; k++) { + /* + * For each field that this query term is scoped by (by default + * all fields are in scope) we need to get all the document refs + * that have this term in that field. + * + * The posting is the entry in the invertedIndex for the matching + * term from above. + */ + var field = clause.fields[k], + fieldPosting = posting[field], + matchingDocumentRefs = Object.keys(fieldPosting), + termField = expandedTerm + "/" + field, + matchingDocumentsSet = new lunr.Set(matchingDocumentRefs) + + /* + * if the presence of this term is required ensure that the matching + * documents are added to the set of required matches for this clause. + * + */ + if (clause.presence == lunr.Query.presence.REQUIRED) { + clauseMatches = clauseMatches.union(matchingDocumentsSet) + + if (requiredMatches[field] === undefined) { + requiredMatches[field] = lunr.Set.complete + } + } + + /* + * if the presence of this term is prohibited ensure that the matching + * documents are added to the set of prohibited matches for this field, + * creating that set if it does not yet exist. + */ + if (clause.presence == lunr.Query.presence.PROHIBITED) { + if (prohibitedMatches[field] === undefined) { + prohibitedMatches[field] = lunr.Set.empty + } + + prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet) + + /* + * Prohibited matches should not be part of the query vector used for + * similarity scoring and no metadata should be extracted so we continue + * to the next field + */ + continue + } + + /* + * The query field vector is populated using the termIndex found for + * the term and a unit value with the appropriate boost applied. + * Using upsert because there could already be an entry in the vector + * for the term we are working with. In that case we just add the scores + * together. + */ + queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b }) + + /** + * If we've already seen this term, field combo then we've already collected + * the matching documents and metadata, no need to go through all that again + */ + if (termFieldCache[termField]) { + continue + } + + for (var l = 0; l < matchingDocumentRefs.length; l++) { + /* + * All metadata for this term/field/document triple + * are then extracted and collected into an instance + * of lunr.MatchData ready to be returned in the query + * results + */ + var matchingDocumentRef = matchingDocumentRefs[l], + matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field), + metadata = fieldPosting[matchingDocumentRef], + fieldMatch + + if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) { + matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata) + } else { + fieldMatch.add(expandedTerm, field, metadata) + } + + } + + termFieldCache[termField] = true + } + } + } + + /** + * If the presence was required we need to update the requiredMatches field sets. + * We do this after all fields for the term have collected their matches because + * the clause terms presence is required in _any_ of the fields not _all_ of the + * fields. + */ + if (clause.presence === lunr.Query.presence.REQUIRED) { + for (var k = 0; k < clause.fields.length; k++) { + var field = clause.fields[k] + requiredMatches[field] = requiredMatches[field].intersect(clauseMatches) + } + } + } + + /** + * Need to combine the field scoped required and prohibited + * matching documents into a global set of required and prohibited + * matches + */ + var allRequiredMatches = lunr.Set.complete, + allProhibitedMatches = lunr.Set.empty + + for (var i = 0; i < this.fields.length; i++) { + var field = this.fields[i] + + if (requiredMatches[field]) { + allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field]) + } + + if (prohibitedMatches[field]) { + allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field]) + } + } + + var matchingFieldRefs = Object.keys(matchingFields), + results = [], + matches = Object.create(null) + + /* + * If the query is negated (contains only prohibited terms) + * we need to get _all_ fieldRefs currently existing in the + * index. This is only done when we know that the query is + * entirely prohibited terms to avoid any cost of getting all + * fieldRefs unnecessarily. + * + * Additionally, blank MatchData must be created to correctly + * populate the results. + */ + if (query.isNegated()) { + matchingFieldRefs = Object.keys(this.fieldVectors) + + for (var i = 0; i < matchingFieldRefs.length; i++) { + var matchingFieldRef = matchingFieldRefs[i] + var fieldRef = lunr.FieldRef.fromString(matchingFieldRef) + matchingFields[matchingFieldRef] = new lunr.MatchData + } + } + + for (var i = 0; i < matchingFieldRefs.length; i++) { + /* + * Currently we have document fields that match the query, but we + * need to return documents. The matchData and scores are combined + * from multiple fields belonging to the same document. + * + * Scores are calculated by field, using the query vectors created + * above, and combined into a final document score using addition. + */ + var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]), + docRef = fieldRef.docRef + + if (!allRequiredMatches.contains(docRef)) { + continue + } + + if (allProhibitedMatches.contains(docRef)) { + continue + } + + var fieldVector = this.fieldVectors[fieldRef], + score = queryVectors[fieldRef.fieldName].similarity(fieldVector), + docMatch + + if ((docMatch = matches[docRef]) !== undefined) { + docMatch.score += score + docMatch.matchData.combine(matchingFields[fieldRef]) + } else { + var match = { + ref: docRef, + score: score, + matchData: matchingFields[fieldRef] + } + matches[docRef] = match + results.push(match) + } + } + + /* + * Sort the results objects by score, highest first. + */ + return results.sort(function (a, b) { + return b.score - a.score + }) +} + +/** + * Prepares the index for JSON serialization. + * + * The schema for this JSON blob will be described in a + * separate JSON schema file. + * + * @returns {Object} + */ +lunr.Index.prototype.toJSON = function () { + var invertedIndex = Object.keys(this.invertedIndex) + .sort() + .map(function (term) { + return [term, this.invertedIndex[term]] + }, this) + + var fieldVectors = Object.keys(this.fieldVectors) + .map(function (ref) { + return [ref, this.fieldVectors[ref].toJSON()] + }, this) + + return { + version: lunr.version, + fields: this.fields, + fieldVectors: fieldVectors, + invertedIndex: invertedIndex, + pipeline: this.pipeline.toJSON() + } +} + +/** + * Loads a previously serialized lunr.Index + * + * @param {Object} serializedIndex - A previously serialized lunr.Index + * @returns {lunr.Index} + */ +lunr.Index.load = function (serializedIndex) { + var attrs = {}, + fieldVectors = {}, + serializedVectors = serializedIndex.fieldVectors, + invertedIndex = Object.create(null), + serializedInvertedIndex = serializedIndex.invertedIndex, + tokenSetBuilder = new lunr.TokenSet.Builder, + pipeline = lunr.Pipeline.load(serializedIndex.pipeline) + + if (serializedIndex.version != lunr.version) { + lunr.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + lunr.version + "' does not match serialized index '" + serializedIndex.version + "'") + } + + for (var i = 0; i < serializedVectors.length; i++) { + var tuple = serializedVectors[i], + ref = tuple[0], + elements = tuple[1] + + fieldVectors[ref] = new lunr.Vector(elements) + } + + for (var i = 0; i < serializedInvertedIndex.length; i++) { + var tuple = serializedInvertedIndex[i], + term = tuple[0], + posting = tuple[1] + + tokenSetBuilder.insert(term) + invertedIndex[term] = posting + } + + tokenSetBuilder.finish() + + attrs.fields = serializedIndex.fields + + attrs.fieldVectors = fieldVectors + attrs.invertedIndex = invertedIndex + attrs.tokenSet = tokenSetBuilder.root + attrs.pipeline = pipeline + + return new lunr.Index(attrs) +} +/*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + */ + +/** + * lunr.Builder performs indexing on a set of documents and + * returns instances of lunr.Index ready for querying. + * + * All configuration of the index is done via the builder, the + * fields to index, the document reference, the text processing + * pipeline and document scoring parameters are all set on the + * builder before indexing. + * + * @constructor + * @property {string} _ref - Internal reference to the document reference field. + * @property {string[]} _fields - Internal reference to the document fields to index. + * @property {object} invertedIndex - The inverted index maps terms to document fields. + * @property {object} documentTermFrequencies - Keeps track of document term frequencies. + * @property {object} documentLengths - Keeps track of the length of documents added to the index. + * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing. + * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing. + * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index. + * @property {number} documentCount - Keeps track of the total number of documents indexed. + * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75. + * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2. + * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space. + * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index. + */ +lunr.Builder = function () { + this._ref = "id" + this._fields = Object.create(null) + this._documents = Object.create(null) + this.invertedIndex = Object.create(null) + this.fieldTermFrequencies = {} + this.fieldLengths = {} + this.tokenizer = lunr.tokenizer + this.pipeline = new lunr.Pipeline + this.searchPipeline = new lunr.Pipeline + this.documentCount = 0 + this._b = 0.75 + this._k1 = 1.2 + this.termIndex = 0 + this.metadataWhitelist = [] +} + +/** + * Sets the document field used as the document reference. Every document must have this field. + * The type of this field in the document should be a string, if it is not a string it will be + * coerced into a string by calling toString. + * + * The default ref is 'id'. + * + * The ref should _not_ be changed during indexing, it should be set before any documents are + * added to the index. Changing it during indexing can lead to inconsistent results. + * + * @param {string} ref - The name of the reference field in the document. + */ +lunr.Builder.prototype.ref = function (ref) { + this._ref = ref +} + +/** + * A function that is used to extract a field from a document. + * + * Lunr expects a field to be at the top level of a document, if however the field + * is deeply nested within a document an extractor function can be used to extract + * the right field for indexing. + * + * @callback fieldExtractor + * @param {object} doc - The document being added to the index. + * @returns {?(string|object|object[])} obj - The object that will be indexed for this field. + * @example Extracting a nested field + * function (doc) { return doc.nested.field } + */ + +/** + * Adds a field to the list of document fields that will be indexed. Every document being + * indexed should have this field. Null values for this field in indexed documents will + * not cause errors but will limit the chance of that document being retrieved by searches. + * + * All fields should be added before adding documents to the index. Adding fields after + * a document has been indexed will have no effect on already indexed documents. + * + * Fields can be boosted at build time. This allows terms within that field to have more + * importance when ranking search results. Use a field boost to specify that matches within + * one field are more important than other fields. + * + * @param {string} fieldName - The name of a field to index in all documents. + * @param {object} attributes - Optional attributes associated with this field. + * @param {number} [attributes.boost=1] - Boost applied to all terms within this field. + * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document. + * @throws {RangeError} fieldName cannot contain unsupported characters '/' + */ +lunr.Builder.prototype.field = function (fieldName, attributes) { + if (/\//.test(fieldName)) { + throw new RangeError ("Field '" + fieldName + "' contains illegal character '/'") + } + + this._fields[fieldName] = attributes || {} +} + +/** + * A parameter to tune the amount of field length normalisation that is applied when + * calculating relevance scores. A value of 0 will completely disable any normalisation + * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b + * will be clamped to the range 0 - 1. + * + * @param {number} number - The value to set for this tuning parameter. + */ +lunr.Builder.prototype.b = function (number) { + if (number < 0) { + this._b = 0 + } else if (number > 1) { + this._b = 1 + } else { + this._b = number + } +} + +/** + * A parameter that controls the speed at which a rise in term frequency results in term + * frequency saturation. The default value is 1.2. Setting this to a higher value will give + * slower saturation levels, a lower value will result in quicker saturation. + * + * @param {number} number - The value to set for this tuning parameter. + */ +lunr.Builder.prototype.k1 = function (number) { + this._k1 = number +} + +/** + * Adds a document to the index. + * + * Before adding fields to the index the index should have been fully setup, with the document + * ref and all fields to index already having been specified. + * + * The document must have a field name as specified by the ref (by default this is 'id') and + * it should have all fields defined for indexing, though null or undefined values will not + * cause errors. + * + * Entire documents can be boosted at build time. Applying a boost to a document indicates that + * this document should rank higher in search results than other documents. + * + * @param {object} doc - The document to add to the index. + * @param {object} attributes - Optional attributes associated with this document. + * @param {number} [attributes.boost=1] - Boost applied to all terms within this document. + */ +lunr.Builder.prototype.add = function (doc, attributes) { + var docRef = doc[this._ref], + fields = Object.keys(this._fields) + + this._documents[docRef] = attributes || {} + this.documentCount += 1 + + for (var i = 0; i < fields.length; i++) { + var fieldName = fields[i], + extractor = this._fields[fieldName].extractor, + field = extractor ? extractor(doc) : doc[fieldName], + tokens = this.tokenizer(field, { + fields: [fieldName] + }), + terms = this.pipeline.run(tokens), + fieldRef = new lunr.FieldRef (docRef, fieldName), + fieldTerms = Object.create(null) + + this.fieldTermFrequencies[fieldRef] = fieldTerms + this.fieldLengths[fieldRef] = 0 + + // store the length of this field for this document + this.fieldLengths[fieldRef] += terms.length + + // calculate term frequencies for this field + for (var j = 0; j < terms.length; j++) { + var term = terms[j] + + if (fieldTerms[term] == undefined) { + fieldTerms[term] = 0 + } + + fieldTerms[term] += 1 + + // add to inverted index + // create an initial posting if one doesn't exist + if (this.invertedIndex[term] == undefined) { + var posting = Object.create(null) + posting["_index"] = this.termIndex + this.termIndex += 1 + + for (var k = 0; k < fields.length; k++) { + posting[fields[k]] = Object.create(null) + } + + this.invertedIndex[term] = posting + } + + // add an entry for this term/fieldName/docRef to the invertedIndex + if (this.invertedIndex[term][fieldName][docRef] == undefined) { + this.invertedIndex[term][fieldName][docRef] = Object.create(null) + } + + // store all whitelisted metadata about this token in the + // inverted index + for (var l = 0; l < this.metadataWhitelist.length; l++) { + var metadataKey = this.metadataWhitelist[l], + metadata = term.metadata[metadataKey] + + if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) { + this.invertedIndex[term][fieldName][docRef][metadataKey] = [] + } + + this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata) + } + } + + } +} + +/** + * Calculates the average document length for this index + * + * @private + */ +lunr.Builder.prototype.calculateAverageFieldLengths = function () { + + var fieldRefs = Object.keys(this.fieldLengths), + numberOfFields = fieldRefs.length, + accumulator = {}, + documentsWithField = {} + + for (var i = 0; i < numberOfFields; i++) { + var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), + field = fieldRef.fieldName + + documentsWithField[field] || (documentsWithField[field] = 0) + documentsWithField[field] += 1 + + accumulator[field] || (accumulator[field] = 0) + accumulator[field] += this.fieldLengths[fieldRef] + } + + var fields = Object.keys(this._fields) + + for (var i = 0; i < fields.length; i++) { + var fieldName = fields[i] + accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName] + } + + this.averageFieldLength = accumulator +} + +/** + * Builds a vector space model of every document using lunr.Vector + * + * @private + */ +lunr.Builder.prototype.createFieldVectors = function () { + var fieldVectors = {}, + fieldRefs = Object.keys(this.fieldTermFrequencies), + fieldRefsLength = fieldRefs.length, + termIdfCache = Object.create(null) + + for (var i = 0; i < fieldRefsLength; i++) { + var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), + fieldName = fieldRef.fieldName, + fieldLength = this.fieldLengths[fieldRef], + fieldVector = new lunr.Vector, + termFrequencies = this.fieldTermFrequencies[fieldRef], + terms = Object.keys(termFrequencies), + termsLength = terms.length + + + var fieldBoost = this._fields[fieldName].boost || 1, + docBoost = this._documents[fieldRef.docRef].boost || 1 + + for (var j = 0; j < termsLength; j++) { + var term = terms[j], + tf = termFrequencies[term], + termIndex = this.invertedIndex[term]._index, + idf, score, scoreWithPrecision + + if (termIdfCache[term] === undefined) { + idf = lunr.idf(this.invertedIndex[term], this.documentCount) + termIdfCache[term] = idf + } else { + idf = termIdfCache[term] + } + + score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf) + score *= fieldBoost + score *= docBoost + scoreWithPrecision = Math.round(score * 1000) / 1000 + // Converts 1.23456789 to 1.234. + // Reducing the precision so that the vectors take up less + // space when serialised. Doing it now so that they behave + // the same before and after serialisation. Also, this is + // the fastest approach to reducing a number's precision in + // JavaScript. + + fieldVector.insert(termIndex, scoreWithPrecision) + } + + fieldVectors[fieldRef] = fieldVector + } + + this.fieldVectors = fieldVectors +} + +/** + * Creates a token set of all tokens in the index using lunr.TokenSet + * + * @private + */ +lunr.Builder.prototype.createTokenSet = function () { + this.tokenSet = lunr.TokenSet.fromArray( + Object.keys(this.invertedIndex).sort() + ) +} + +/** + * Builds the index, creating an instance of lunr.Index. + * + * This completes the indexing process and should only be called + * once all documents have been added to the index. + * + * @returns {lunr.Index} + */ +lunr.Builder.prototype.build = function () { + this.calculateAverageFieldLengths() + this.createFieldVectors() + this.createTokenSet() + + return new lunr.Index({ + invertedIndex: this.invertedIndex, + fieldVectors: this.fieldVectors, + tokenSet: this.tokenSet, + fields: Object.keys(this._fields), + pipeline: this.searchPipeline + }) +} + +/** + * Applies a plugin to the index builder. + * + * A plugin is a function that is called with the index builder as its context. + * Plugins can be used to customise or extend the behaviour of the index + * in some way. A plugin is just a function, that encapsulated the custom + * behaviour that should be applied when building the index. + * + * The plugin function will be called with the index builder as its argument, additional + * arguments can also be passed when calling use. The function will be called + * with the index builder as its context. + * + * @param {Function} plugin The plugin to apply. + */ +lunr.Builder.prototype.use = function (fn) { + var args = Array.prototype.slice.call(arguments, 1) + args.unshift(this) + fn.apply(this, args) +} +/** + * Contains and collects metadata about a matching document. + * A single instance of lunr.MatchData is returned as part of every + * lunr.Index~Result. + * + * @constructor + * @param {string} term - The term this match data is associated with + * @param {string} field - The field in which the term was found + * @param {object} metadata - The metadata recorded about this term in this field + * @property {object} metadata - A cloned collection of metadata associated with this document. + * @see {@link lunr.Index~Result} + */ +lunr.MatchData = function (term, field, metadata) { + var clonedMetadata = Object.create(null), + metadataKeys = Object.keys(metadata || {}) + + // Cloning the metadata to prevent the original + // being mutated during match data combination. + // Metadata is kept in an array within the inverted + // index so cloning the data can be done with + // Array#slice + for (var i = 0; i < metadataKeys.length; i++) { + var key = metadataKeys[i] + clonedMetadata[key] = metadata[key].slice() + } + + this.metadata = Object.create(null) + + if (term !== undefined) { + this.metadata[term] = Object.create(null) + this.metadata[term][field] = clonedMetadata + } +} + +/** + * An instance of lunr.MatchData will be created for every term that matches a + * document. However only one instance is required in a lunr.Index~Result. This + * method combines metadata from another instance of lunr.MatchData with this + * objects metadata. + * + * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one. + * @see {@link lunr.Index~Result} + */ +lunr.MatchData.prototype.combine = function (otherMatchData) { + var terms = Object.keys(otherMatchData.metadata) + + for (var i = 0; i < terms.length; i++) { + var term = terms[i], + fields = Object.keys(otherMatchData.metadata[term]) + + if (this.metadata[term] == undefined) { + this.metadata[term] = Object.create(null) + } + + for (var j = 0; j < fields.length; j++) { + var field = fields[j], + keys = Object.keys(otherMatchData.metadata[term][field]) + + if (this.metadata[term][field] == undefined) { + this.metadata[term][field] = Object.create(null) + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k] + + if (this.metadata[term][field][key] == undefined) { + this.metadata[term][field][key] = otherMatchData.metadata[term][field][key] + } else { + this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key]) + } + + } + } + } +} + +/** + * Add metadata for a term/field pair to this instance of match data. + * + * @param {string} term - The term this match data is associated with + * @param {string} field - The field in which the term was found + * @param {object} metadata - The metadata recorded about this term in this field + */ +lunr.MatchData.prototype.add = function (term, field, metadata) { + if (!(term in this.metadata)) { + this.metadata[term] = Object.create(null) + this.metadata[term][field] = metadata + return + } + + if (!(field in this.metadata[term])) { + this.metadata[term][field] = metadata + return + } + + var metadataKeys = Object.keys(metadata) + + for (var i = 0; i < metadataKeys.length; i++) { + var key = metadataKeys[i] + + if (key in this.metadata[term][field]) { + this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key]) + } else { + this.metadata[term][field][key] = metadata[key] + } + } +} +/** + * A lunr.Query provides a programmatic way of defining queries to be performed + * against a {@link lunr.Index}. + * + * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method + * so the query object is pre-initialized with the right index fields. + * + * @constructor + * @property {lunr.Query~Clause[]} clauses - An array of query clauses. + * @property {string[]} allFields - An array of all available fields in a lunr.Index. + */ +lunr.Query = function (allFields) { + this.clauses = [] + this.allFields = allFields +} + +/** + * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause. + * + * This allows wildcards to be added to the beginning and end of a term without having to manually do any string + * concatenation. + * + * The wildcard constants can be bitwise combined to select both leading and trailing wildcards. + * + * @constant + * @default + * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour + * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists + * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists + * @see lunr.Query~Clause + * @see lunr.Query#clause + * @see lunr.Query#term + * @example query term with trailing wildcard + * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING }) + * @example query term with leading and trailing wildcard + * query.term('foo', { + * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING + * }) + */ + +lunr.Query.wildcard = new String ("*") +lunr.Query.wildcard.NONE = 0 +lunr.Query.wildcard.LEADING = 1 +lunr.Query.wildcard.TRAILING = 2 + +/** + * Constants for indicating what kind of presence a term must have in matching documents. + * + * @constant + * @enum {number} + * @see lunr.Query~Clause + * @see lunr.Query#clause + * @see lunr.Query#term + * @example query term with required presence + * query.term('foo', { presence: lunr.Query.presence.REQUIRED }) + */ +lunr.Query.presence = { + /** + * Term's presence in a document is optional, this is the default value. + */ + OPTIONAL: 1, + + /** + * Term's presence in a document is required, documents that do not contain + * this term will not be returned. + */ + REQUIRED: 2, + + /** + * Term's presence in a document is prohibited, documents that do contain + * this term will not be returned. + */ + PROHIBITED: 3 +} + +/** + * A single clause in a {@link lunr.Query} contains a term and details on how to + * match that term against a {@link lunr.Index}. + * + * @typedef {Object} lunr.Query~Clause + * @property {string[]} fields - The fields in an index this clause should be matched against. + * @property {number} [boost=1] - Any boost that should be applied when matching this clause. + * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be. + * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline. + * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended. + * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents. + */ + +/** + * Adds a {@link lunr.Query~Clause} to this query. + * + * Unless the clause contains the fields to be matched all fields will be matched. In addition + * a default boost of 1 is applied to the clause. + * + * @param {lunr.Query~Clause} clause - The clause to add to this query. + * @see lunr.Query~Clause + * @returns {lunr.Query} + */ +lunr.Query.prototype.clause = function (clause) { + if (!('fields' in clause)) { + clause.fields = this.allFields + } + + if (!('boost' in clause)) { + clause.boost = 1 + } + + if (!('usePipeline' in clause)) { + clause.usePipeline = true + } + + if (!('wildcard' in clause)) { + clause.wildcard = lunr.Query.wildcard.NONE + } + + if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) { + clause.term = "*" + clause.term + } + + if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) { + clause.term = "" + clause.term + "*" + } + + if (!('presence' in clause)) { + clause.presence = lunr.Query.presence.OPTIONAL + } + + this.clauses.push(clause) + + return this +} + +/** + * A negated query is one in which every clause has a presence of + * prohibited. These queries require some special processing to return + * the expected results. + * + * @returns boolean + */ +lunr.Query.prototype.isNegated = function () { + for (var i = 0; i < this.clauses.length; i++) { + if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) { + return false + } + } + + return true +} + +/** + * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause} + * to the list of clauses that make up this query. + * + * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion + * to a token or token-like string should be done before calling this method. + * + * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an + * array, each term in the array will share the same options. + * + * @param {object|object[]} term - The term(s) to add to the query. + * @param {object} [options] - Any additional properties to add to the query clause. + * @returns {lunr.Query} + * @see lunr.Query#clause + * @see lunr.Query~Clause + * @example adding a single term to a query + * query.term("foo") + * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard + * query.term("foo", { + * fields: ["title"], + * boost: 10, + * wildcard: lunr.Query.wildcard.TRAILING + * }) + * @example using lunr.tokenizer to convert a string to tokens before using them as terms + * query.term(lunr.tokenizer("foo bar")) + */ +lunr.Query.prototype.term = function (term, options) { + if (Array.isArray(term)) { + term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this) + return this + } + + var clause = options || {} + clause.term = term.toString() + + this.clause(clause) + + return this +} +lunr.QueryParseError = function (message, start, end) { + this.name = "QueryParseError" + this.message = message + this.start = start + this.end = end +} + +lunr.QueryParseError.prototype = new Error +lunr.QueryLexer = function (str) { + this.lexemes = [] + this.str = str + this.length = str.length + this.pos = 0 + this.start = 0 + this.escapeCharPositions = [] +} + +lunr.QueryLexer.prototype.run = function () { + var state = lunr.QueryLexer.lexText + + while (state) { + state = state(this) + } +} + +lunr.QueryLexer.prototype.sliceString = function () { + var subSlices = [], + sliceStart = this.start, + sliceEnd = this.pos + + for (var i = 0; i < this.escapeCharPositions.length; i++) { + sliceEnd = this.escapeCharPositions[i] + subSlices.push(this.str.slice(sliceStart, sliceEnd)) + sliceStart = sliceEnd + 1 + } + + subSlices.push(this.str.slice(sliceStart, this.pos)) + this.escapeCharPositions.length = 0 + + return subSlices.join('') +} + +lunr.QueryLexer.prototype.emit = function (type) { + this.lexemes.push({ + type: type, + str: this.sliceString(), + start: this.start, + end: this.pos + }) + + this.start = this.pos +} + +lunr.QueryLexer.prototype.escapeCharacter = function () { + this.escapeCharPositions.push(this.pos - 1) + this.pos += 1 +} + +lunr.QueryLexer.prototype.next = function () { + if (this.pos >= this.length) { + return lunr.QueryLexer.EOS + } + + var char = this.str.charAt(this.pos) + this.pos += 1 + return char +} + +lunr.QueryLexer.prototype.width = function () { + return this.pos - this.start +} + +lunr.QueryLexer.prototype.ignore = function () { + if (this.start == this.pos) { + this.pos += 1 + } + + this.start = this.pos +} + +lunr.QueryLexer.prototype.backup = function () { + this.pos -= 1 +} + +lunr.QueryLexer.prototype.acceptDigitRun = function () { + var char, charCode + + do { + char = this.next() + charCode = char.charCodeAt(0) + } while (charCode > 47 && charCode < 58) + + if (char != lunr.QueryLexer.EOS) { + this.backup() + } +} + +lunr.QueryLexer.prototype.more = function () { + return this.pos < this.length +} + +lunr.QueryLexer.EOS = 'EOS' +lunr.QueryLexer.FIELD = 'FIELD' +lunr.QueryLexer.TERM = 'TERM' +lunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE' +lunr.QueryLexer.BOOST = 'BOOST' +lunr.QueryLexer.PRESENCE = 'PRESENCE' + +lunr.QueryLexer.lexField = function (lexer) { + lexer.backup() + lexer.emit(lunr.QueryLexer.FIELD) + lexer.ignore() + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexTerm = function (lexer) { + if (lexer.width() > 1) { + lexer.backup() + lexer.emit(lunr.QueryLexer.TERM) + } + + lexer.ignore() + + if (lexer.more()) { + return lunr.QueryLexer.lexText + } +} + +lunr.QueryLexer.lexEditDistance = function (lexer) { + lexer.ignore() + lexer.acceptDigitRun() + lexer.emit(lunr.QueryLexer.EDIT_DISTANCE) + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexBoost = function (lexer) { + lexer.ignore() + lexer.acceptDigitRun() + lexer.emit(lunr.QueryLexer.BOOST) + return lunr.QueryLexer.lexText +} + +lunr.QueryLexer.lexEOS = function (lexer) { + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } +} + +// This matches the separator used when tokenising fields +// within a document. These should match otherwise it is +// not possible to search for some tokens within a document. +// +// It is possible for the user to change the separator on the +// tokenizer so it _might_ clash with any other of the special +// characters already used within the search string, e.g. :. +// +// This means that it is possible to change the separator in +// such a way that makes some words unsearchable using a search +// string. +lunr.QueryLexer.termSeparator = lunr.tokenizer.separator + +lunr.QueryLexer.lexText = function (lexer) { + while (true) { + var char = lexer.next() + + if (char == lunr.QueryLexer.EOS) { + return lunr.QueryLexer.lexEOS + } + + // Escape character is '\' + if (char.charCodeAt(0) == 92) { + lexer.escapeCharacter() + continue + } + + if (char == ":") { + return lunr.QueryLexer.lexField + } + + if (char == "~") { + lexer.backup() + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } + return lunr.QueryLexer.lexEditDistance + } + + if (char == "^") { + lexer.backup() + if (lexer.width() > 0) { + lexer.emit(lunr.QueryLexer.TERM) + } + return lunr.QueryLexer.lexBoost + } + + // "+" indicates term presence is required + // checking for length to ensure that only + // leading "+" are considered + if (char == "+" && lexer.width() === 1) { + lexer.emit(lunr.QueryLexer.PRESENCE) + return lunr.QueryLexer.lexText + } + + // "-" indicates term presence is prohibited + // checking for length to ensure that only + // leading "-" are considered + if (char == "-" && lexer.width() === 1) { + lexer.emit(lunr.QueryLexer.PRESENCE) + return lunr.QueryLexer.lexText + } + + if (char.match(lunr.QueryLexer.termSeparator)) { + return lunr.QueryLexer.lexTerm + } + } +} + +lunr.QueryParser = function (str, query) { + this.lexer = new lunr.QueryLexer (str) + this.query = query + this.currentClause = {} + this.lexemeIdx = 0 +} + +lunr.QueryParser.prototype.parse = function () { + this.lexer.run() + this.lexemes = this.lexer.lexemes + + var state = lunr.QueryParser.parseClause + + while (state) { + state = state(this) + } + + return this.query +} + +lunr.QueryParser.prototype.peekLexeme = function () { + return this.lexemes[this.lexemeIdx] +} + +lunr.QueryParser.prototype.consumeLexeme = function () { + var lexeme = this.peekLexeme() + this.lexemeIdx += 1 + return lexeme +} + +lunr.QueryParser.prototype.nextClause = function () { + var completedClause = this.currentClause + this.query.clause(completedClause) + this.currentClause = {} +} + +lunr.QueryParser.parseClause = function (parser) { + var lexeme = parser.peekLexeme() + + if (lexeme == undefined) { + return + } + + switch (lexeme.type) { + case lunr.QueryLexer.PRESENCE: + return lunr.QueryParser.parsePresence + case lunr.QueryLexer.FIELD: + return lunr.QueryParser.parseField + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expected either a field or a term, found " + lexeme.type + + if (lexeme.str.length >= 1) { + errorMessage += " with value '" + lexeme.str + "'" + } + + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } +} + +lunr.QueryParser.parsePresence = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + switch (lexeme.str) { + case "-": + parser.currentClause.presence = lunr.Query.presence.PROHIBITED + break + case "+": + parser.currentClause.presence = lunr.Query.presence.REQUIRED + break + default: + var errorMessage = "unrecognised presence operator'" + lexeme.str + "'" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + var errorMessage = "expecting term or field, found nothing" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.FIELD: + return lunr.QueryParser.parseField + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expecting term or field, found '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseField = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + if (parser.query.allFields.indexOf(lexeme.str) == -1) { + var possibleFields = parser.query.allFields.map(function (f) { return "'" + f + "'" }).join(', '), + errorMessage = "unrecognised field '" + lexeme.str + "', possible fields: " + possibleFields + + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.fields = [lexeme.str] + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + var errorMessage = "expecting term, found nothing" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + return lunr.QueryParser.parseTerm + default: + var errorMessage = "expecting term, found '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseTerm = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + parser.currentClause.term = lexeme.str.toLowerCase() + + if (lexeme.str.indexOf("*") != -1) { + parser.currentClause.usePipeline = false + } + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseEditDistance = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + var editDistance = parseInt(lexeme.str, 10) + + if (isNaN(editDistance)) { + var errorMessage = "edit distance must be numeric" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.editDistance = editDistance + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + +lunr.QueryParser.parseBoost = function (parser) { + var lexeme = parser.consumeLexeme() + + if (lexeme == undefined) { + return + } + + var boost = parseInt(lexeme.str, 10) + + if (isNaN(boost)) { + var errorMessage = "boost must be numeric" + throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) + } + + parser.currentClause.boost = boost + + var nextLexeme = parser.peekLexeme() + + if (nextLexeme == undefined) { + parser.nextClause() + return + } + + switch (nextLexeme.type) { + case lunr.QueryLexer.TERM: + parser.nextClause() + return lunr.QueryParser.parseTerm + case lunr.QueryLexer.FIELD: + parser.nextClause() + return lunr.QueryParser.parseField + case lunr.QueryLexer.EDIT_DISTANCE: + return lunr.QueryParser.parseEditDistance + case lunr.QueryLexer.BOOST: + return lunr.QueryParser.parseBoost + case lunr.QueryLexer.PRESENCE: + parser.nextClause() + return lunr.QueryParser.parsePresence + default: + var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" + throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) + } +} + + /** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ + ;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like enviroments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + root.lunr = factory() + } + }(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return lunr + })) +})(); diff --git a/search/main.js b/search/main.js new file mode 100644 index 000000000..a5e469d7c --- /dev/null +++ b/search/main.js @@ -0,0 +1,109 @@ +function getSearchTermFromLocation() { + var sPageURL = window.location.search.substring(1); + var sURLVariables = sPageURL.split('&'); + for (var i = 0; i < sURLVariables.length; i++) { + var sParameterName = sURLVariables[i].split('='); + if (sParameterName[0] == 'q') { + return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20')); + } + } +} + +function joinUrl (base, path) { + if (path.substring(0, 1) === "/") { + // path starts with `/`. Thus it is absolute. + return path; + } + if (base.substring(base.length-1) === "/") { + // base ends with `/` + return base + path; + } + return base + "/" + path; +} + +function escapeHtml (value) { + return value.replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +} + +function formatResult (location, title, summary) { + return ''; +} + +function displayResults (results) { + var search_results = document.getElementById("mkdocs-search-results"); + while (search_results.firstChild) { + search_results.removeChild(search_results.firstChild); + } + if (results.length > 0){ + for (var i=0; i < results.length; i++){ + var result = results[i]; + var html = formatResult(result.location, result.title, result.summary); + search_results.insertAdjacentHTML('beforeend', html); + } + } else { + var noResultsText = search_results.getAttribute('data-no-results-text'); + if (!noResultsText) { + noResultsText = "No results found"; + } + search_results.insertAdjacentHTML('beforeend', '

' + noResultsText + '

'); + } +} + +function doSearch () { + var query = document.getElementById('mkdocs-search-query').value; + if (query.length > min_search_length) { + if (!window.Worker) { + displayResults(search(query)); + } else { + searchWorker.postMessage({query: query}); + } + } else { + // Clear results for short queries + displayResults([]); + } +} + +function initSearch () { + var search_input = document.getElementById('mkdocs-search-query'); + if (search_input) { + search_input.addEventListener("keyup", doSearch); + } + var term = getSearchTermFromLocation(); + if (term) { + search_input.value = term; + doSearch(); + } +} + +function onWorkerMessage (e) { + if (e.data.allowSearch) { + initSearch(); + } else if (e.data.results) { + var results = e.data.results; + displayResults(results); + } else if (e.data.config) { + min_search_length = e.data.config.min_search_length-1; + } +} + +if (!window.Worker) { + console.log('Web Worker API not supported'); + // load index in main thread + $.getScript(joinUrl(base_url, "search/worker.js")).done(function () { + console.log('Loaded worker'); + init(); + window.postMessage = function (msg) { + onWorkerMessage({data: msg}); + }; + }).fail(function (jqxhr, settings, exception) { + console.error('Could not load worker.js'); + }); +} else { + // Wrap search in a web worker + var searchWorker = new Worker(joinUrl(base_url, "search/worker.js")); + searchWorker.postMessage({init: true}); + searchWorker.onmessage = onWorkerMessage; +} diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 000000000..a75b33624 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to Drycc \u00b6 Drycc Workflow is an open source container cloud platform. Usually we also call it Container as a Service(CaaS) that adds a developer-friendly layer to any Kubernetes cluster, making it easy to deploy and manage applications. Drycc Workflow includes capabilities for building and deploying from source via git push , simple application configuration, creating and rolling back releases, managing domain names and SSL certificates, providing seamless edge routing, aggregating logs, and sharing applications with teams. All of this is exposed through a simple REST API and command line interface. Getting Started \u00b6 To get started with Workflow, follow our Quick Start guide. Take a deep dive into Drycc Workflow in our Concepts , Architecture , and Components sections. Feel like contibuting some code or want to get started as a maintainer? Pick an issue tagged as an easy fix or help wanted and start contributing! Service and Support \u00b6 Coming soon.","title":"Home"},{"location":"#welcome-to-drycc","text":"Drycc Workflow is an open source container cloud platform. Usually we also call it Container as a Service(CaaS) that adds a developer-friendly layer to any Kubernetes cluster, making it easy to deploy and manage applications. Drycc Workflow includes capabilities for building and deploying from source via git push , simple application configuration, creating and rolling back releases, managing domain names and SSL certificates, providing seamless edge routing, aggregating logs, and sharing applications with teams. All of this is exposed through a simple REST API and command line interface.","title":"Welcome to Drycc"},{"location":"#getting-started","text":"To get started with Workflow, follow our Quick Start guide. Take a deep dive into Drycc Workflow in our Concepts , Architecture , and Components sections. Feel like contibuting some code or want to get started as a maintainer? Pick an issue tagged as an easy fix or help wanted and start contributing!","title":"Getting Started"},{"location":"#service-and-support","text":"Coming soon.","title":"Service and Support"},{"location":"_includes/install-workflow/","text":"Check Your Setup \u00b6 First check that the helm command is available and the version is v2.5.0 or newer. $ helm version Client: &version.Version{SemVer:\"v2.5.0\", GitCommit:\"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6\", GitTreeState:\"clean\"} Server: &version.Version{SemVer:\"v2.5.0\", GitCommit:\"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6\", GitTreeState:\"clean\"} Ensure the kubectl client is installed and can connect to your Kubernetes cluster. Install Drycc Workflow \u00b6 Now that Helm is installed and the repository has been added, install Workflow by running: $ helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc Helm will install a variety of Kubernetes resources in the drycc namespace. Wait for the pods that Helm launched to be ready. Monitor their status by running: $ kubectl --namespace=drycc get pods If it's preferred to have kubectl automatically update as the pod states change, run (type Ctrl-C to stop the watch): $ kubectl --namespace=drycc get pods -w Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will automatically restart it. Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start: $ kubectl --namespace=drycc get pods NAME READY STATUS RESTARTS AGE drycc-builder-hy3xv 1/1 Running 5 5m drycc-controller-g3cu8 1/1 Running 5 5m drycc-controller-celery-cmxxn 3/3 Running 0 5m drycc-database-rad1o 1/1 Running 0 5m drycc-logger-fluentbit-1v8uk 1/1 Running 0 5m drycc-logger-fluentbit-esm60 1/1 Running 0 5m drycc-logger-sm8b3 1/1 Running 0 5m drycc-storage-4ww3t 1/1 Running 0 5m drycc-registry-asozo 1/1 Running 1 5m drycc-rabbitmq-0 1/1 Running 0 5m Once all of the pods are in the READY state, Drycc Workflow is up and running!","title":"Install workflow"},{"location":"_includes/install-workflow/#check-your-setup","text":"First check that the helm command is available and the version is v2.5.0 or newer. $ helm version Client: &version.Version{SemVer:\"v2.5.0\", GitCommit:\"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6\", GitTreeState:\"clean\"} Server: &version.Version{SemVer:\"v2.5.0\", GitCommit:\"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6\", GitTreeState:\"clean\"} Ensure the kubectl client is installed and can connect to your Kubernetes cluster.","title":"Check Your Setup"},{"location":"_includes/install-workflow/#install-drycc-workflow","text":"Now that Helm is installed and the repository has been added, install Workflow by running: $ helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc Helm will install a variety of Kubernetes resources in the drycc namespace. Wait for the pods that Helm launched to be ready. Monitor their status by running: $ kubectl --namespace=drycc get pods If it's preferred to have kubectl automatically update as the pod states change, run (type Ctrl-C to stop the watch): $ kubectl --namespace=drycc get pods -w Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will automatically restart it. Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start: $ kubectl --namespace=drycc get pods NAME READY STATUS RESTARTS AGE drycc-builder-hy3xv 1/1 Running 5 5m drycc-controller-g3cu8 1/1 Running 5 5m drycc-controller-celery-cmxxn 3/3 Running 0 5m drycc-database-rad1o 1/1 Running 0 5m drycc-logger-fluentbit-1v8uk 1/1 Running 0 5m drycc-logger-fluentbit-esm60 1/1 Running 0 5m drycc-logger-sm8b3 1/1 Running 0 5m drycc-storage-4ww3t 1/1 Running 0 5m drycc-registry-asozo 1/1 Running 1 5m drycc-rabbitmq-0 1/1 Running 0 5m Once all of the pods are in the READY state, Drycc Workflow is up and running!","title":"Install Drycc Workflow"},{"location":"applications/deploying-apps/","text":"Deploying an Application \u00b6 An Application is deployed to Drycc using git push or the drycc client. Supported Applications \u00b6 Drycc Workflow can deploy any application or service that can run inside a container. In order to be scaled horizontally, applications must follow the Twelve-Factor App methodology and store any application state in external backing services. For example, if your application persists state to the local filesystem -- common with content management systems like Wordpress and Drupal -- it cannot be scaled horizontally using drycc scale . Fortunately, most modern applications feature a stateless application tier that can scale horizontally inside Drycc. Login to the Controller \u00b6 Important if you haven't yet, now is a good time to install the client and register . Before deploying an application, users must first authenticate against the Drycc Controller using the URL supplied by their Drycc administrator. $ drycc login http://drycc.example.com Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71 Waiting for login... .o.Logged in as admin Configuration file written to /root/.drycc/client.json Select a Build Process \u00b6 Drycc Workflow supports three different ways of building applications: Buildpacks \u00b6 Cloud Native Buildpacks are useful if you want to follow cnb's docs for building applications. Learn how to deploy applications using Buildpacks . Dockerfiles \u00b6 Dockerfiles are a powerful way to define a portable execution environment built on a base OS of your choosing. Learn how to deploy applications using Dockerfiles . Container Image \u00b6 Deploying a Container image onto Drycc allows you to take a Container image from either a public or a private registry and copy it over bit-for-bit, ensuring that you are running the same image in development or in your CI pipeline as you are in production. Learn how to deploy applications using Container images . Tuning Application Settings \u00b6 It is possible to configure a few of the globally tunable settings on per application basis using config:set . Setting Description DRYCC_DISABLE_CACHE if set, this will disable the [imagebuilder cache][] (default: not set) DRYCC_DEPLOY_BATCHES the number of pods to bring up and take down sequentially during a scale (default: number of available nodes) DRYCC_DEPLOY_TIMEOUT deploy timeout in seconds per deploy batch (default: 120) IMAGE_PULL_POLICY the kubernetes [image pull policy][pull-policy] for application images (default: \"IfNotPresent\") (allowed values: \"Always\", \"IfNotPresent\") KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT how many revisions Kubernetes keeps around of a given Deployment (default: all revisions) KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30) Deploy Timeout \u00b6 Deploy timeout in seconds - There are 2 deploy methods, Deployments (see below) and RC (versions prior to 2.4) and this setting affects those a bit differently. Deployments \u00b6 Deployments behave a little bit differently from the RC based deployment strategy. Kubernetes takes care of the entire deploy, doing rolling updates in the background. As a result, there is only an overall deployment timeout instead of a configurable per-batch timeout. The base timeout is multiplied with DRYCC_DEPLOY_BATCHES to create an overall timeout. This would be 240 (timeout) * 4 (batches) = 960 second overall timeout. RC deploy \u00b6 This deploy timeout defines how long to wait for each batch to complete in DRYCC_DEPLOY_BATCHES . Additions to the base timeout \u00b6 The base timeout is extended as well with healthchecks using initialDelaySeconds on liveness and readiness where the bigger of those two is applied. Additionally the timeout system accounts for slow image pulls by adding an additional 10 minutes when it has seen an image pull take over 1 minute. This allows the timeout values to be reasonable without having to account for image pull slowness in the base deploy timeout. Deployments \u00b6 Workflow uses Deployments for deploys. In prior versions ReplicationControllers were used with the ability to turn on Deployments via DRYCC_KUBERNETES_DEPLOYMENTS=1 . The advantage of Deployments is that rolling-updates will happen server-side in Kubernetes instead of in Drycc Workflow Controller, along with a few other Pod management related functionality. This allows a deploy to continue even when the CLI connection is interrupted. Behind the scenes your application deploy will be built up of a Deployment object per process type, each having multiple ReplicaSets (one per release) which in turn manage the Pods running your application. Drycc Workflow will behave the same way with DRYCC_KUBERNETES_DEPLOYMENTS enabled or disabled (only applicable to versions prior to 2.4). The changes are behind the scenes. Where you will see differences while using the CLI is drycc ps:list will output Pod names differently.","title":"Deploying Apps"},{"location":"applications/deploying-apps/#deploying-an-application","text":"An Application is deployed to Drycc using git push or the drycc client.","title":"Deploying an Application"},{"location":"applications/deploying-apps/#supported-applications","text":"Drycc Workflow can deploy any application or service that can run inside a container. In order to be scaled horizontally, applications must follow the Twelve-Factor App methodology and store any application state in external backing services. For example, if your application persists state to the local filesystem -- common with content management systems like Wordpress and Drupal -- it cannot be scaled horizontally using drycc scale . Fortunately, most modern applications feature a stateless application tier that can scale horizontally inside Drycc.","title":"Supported Applications"},{"location":"applications/deploying-apps/#login-to-the-controller","text":"Important if you haven't yet, now is a good time to install the client and register . Before deploying an application, users must first authenticate against the Drycc Controller using the URL supplied by their Drycc administrator. $ drycc login http://drycc.example.com Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71 Waiting for login... .o.Logged in as admin Configuration file written to /root/.drycc/client.json","title":"Login to the Controller"},{"location":"applications/deploying-apps/#select-a-build-process","text":"Drycc Workflow supports three different ways of building applications:","title":"Select a Build Process"},{"location":"applications/deploying-apps/#buildpacks","text":"Cloud Native Buildpacks are useful if you want to follow cnb's docs for building applications. Learn how to deploy applications using Buildpacks .","title":"Buildpacks"},{"location":"applications/deploying-apps/#dockerfiles","text":"Dockerfiles are a powerful way to define a portable execution environment built on a base OS of your choosing. Learn how to deploy applications using Dockerfiles .","title":"Dockerfiles"},{"location":"applications/deploying-apps/#container-image","text":"Deploying a Container image onto Drycc allows you to take a Container image from either a public or a private registry and copy it over bit-for-bit, ensuring that you are running the same image in development or in your CI pipeline as you are in production. Learn how to deploy applications using Container images .","title":"Container Image"},{"location":"applications/deploying-apps/#tuning-application-settings","text":"It is possible to configure a few of the globally tunable settings on per application basis using config:set . Setting Description DRYCC_DISABLE_CACHE if set, this will disable the [imagebuilder cache][] (default: not set) DRYCC_DEPLOY_BATCHES the number of pods to bring up and take down sequentially during a scale (default: number of available nodes) DRYCC_DEPLOY_TIMEOUT deploy timeout in seconds per deploy batch (default: 120) IMAGE_PULL_POLICY the kubernetes [image pull policy][pull-policy] for application images (default: \"IfNotPresent\") (allowed values: \"Always\", \"IfNotPresent\") KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT how many revisions Kubernetes keeps around of a given Deployment (default: all revisions) KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30)","title":"Tuning Application Settings"},{"location":"applications/deploying-apps/#deploy-timeout","text":"Deploy timeout in seconds - There are 2 deploy methods, Deployments (see below) and RC (versions prior to 2.4) and this setting affects those a bit differently.","title":"Deploy Timeout"},{"location":"applications/deploying-apps/#deployments","text":"Deployments behave a little bit differently from the RC based deployment strategy. Kubernetes takes care of the entire deploy, doing rolling updates in the background. As a result, there is only an overall deployment timeout instead of a configurable per-batch timeout. The base timeout is multiplied with DRYCC_DEPLOY_BATCHES to create an overall timeout. This would be 240 (timeout) * 4 (batches) = 960 second overall timeout.","title":"Deployments"},{"location":"applications/deploying-apps/#rc-deploy","text":"This deploy timeout defines how long to wait for each batch to complete in DRYCC_DEPLOY_BATCHES .","title":"RC deploy"},{"location":"applications/deploying-apps/#additions-to-the-base-timeout","text":"The base timeout is extended as well with healthchecks using initialDelaySeconds on liveness and readiness where the bigger of those two is applied. Additionally the timeout system accounts for slow image pulls by adding an additional 10 minutes when it has seen an image pull take over 1 minute. This allows the timeout values to be reasonable without having to account for image pull slowness in the base deploy timeout.","title":"Additions to the base timeout"},{"location":"applications/deploying-apps/#deployments_1","text":"Workflow uses Deployments for deploys. In prior versions ReplicationControllers were used with the ability to turn on Deployments via DRYCC_KUBERNETES_DEPLOYMENTS=1 . The advantage of Deployments is that rolling-updates will happen server-side in Kubernetes instead of in Drycc Workflow Controller, along with a few other Pod management related functionality. This allows a deploy to continue even when the CLI connection is interrupted. Behind the scenes your application deploy will be built up of a Deployment object per process type, each having multiple ReplicaSets (one per release) which in turn manage the Pods running your application. Drycc Workflow will behave the same way with DRYCC_KUBERNETES_DEPLOYMENTS enabled or disabled (only applicable to versions prior to 2.4). The changes are behind the scenes. Where you will see differences while using the CLI is drycc ps:list will output Pod names differently.","title":"Deployments"},{"location":"applications/domains-and-routing/","text":"Domains and Routing \u00b6 You can use drycc domains to add or remove custom domains to the application: $ drycc domains:add hello.bacongobbler.com Adding hello.bacongobbler.com to finest-woodshed... done Once that's done, you can go into a DNS registrar and set up a CNAME from the new appname to the old one: $ dig hello.dryccapp.com [...] ;; ANSWER SECTION: hello.bacongobbler.com. 1759 IN CNAME finest-woodshed.dryccapp.com. finest-woodshed.dryccapp.com. 270 IN A 172.17.8.100 Note Setting a CNAME for a root domain can cause issues. Setting an @ record to be a CNAME causes all traffic to go to the other domain, including mail and the SOA (\"start-of-authority\") records. It is highly recommended that you bind a subdomain to an application, however you can work around this by pointing the @ record to the address of the load balancer (if any). To add or remove the application from the routing mesh, use drycc routing : $ drycc routing:disable Disabling routing for finest-woodshed... done This will make the application unreachable through the Router , but the application is still reachable internally through its Kubernetes Service . To re-enable routing: $ drycc routing:enable Enabling routing for finest-woodshed... done","title":"Domains and Routing"},{"location":"applications/domains-and-routing/#domains-and-routing","text":"You can use drycc domains to add or remove custom domains to the application: $ drycc domains:add hello.bacongobbler.com Adding hello.bacongobbler.com to finest-woodshed... done Once that's done, you can go into a DNS registrar and set up a CNAME from the new appname to the old one: $ dig hello.dryccapp.com [...] ;; ANSWER SECTION: hello.bacongobbler.com. 1759 IN CNAME finest-woodshed.dryccapp.com. finest-woodshed.dryccapp.com. 270 IN A 172.17.8.100 Note Setting a CNAME for a root domain can cause issues. Setting an @ record to be a CNAME causes all traffic to go to the other domain, including mail and the SOA (\"start-of-authority\") records. It is highly recommended that you bind a subdomain to an application, however you can work around this by pointing the @ record to the address of the load balancer (if any). To add or remove the application from the routing mesh, use drycc routing : $ drycc routing:disable Disabling routing for finest-woodshed... done This will make the application unreachable through the Router , but the application is still reachable internally through its Kubernetes Service . To re-enable routing: $ drycc routing:enable Enabling routing for finest-woodshed... done","title":"Domains and Routing"},{"location":"applications/inter-app-communication/","text":"Inter-app Communication \u00b6 A common architecture pattern of multi-process applications is to have one process serve public requests while having multiple other processes supporting the public one to, for example, perform actions on a schedule or process work items from a queue. To implement this system of apps in Drycc Workflow, set up the apps to communicate using DNS resolution, as shown above, and hide the supporting processes from public view by removing them from the Drycc Workflow router. DNS Service Discovery \u00b6 Drycc Workflow supports deploying a single app composed of a system of processes. Each Drycc Workflow app communicates on a single port, so communicating with another Workflow app means finding that app's address and port. All Workflow apps are mapped to port 80 externally, so finding its IP address is the only challenge. Workflow creates a Kubernetes Service for each app, which effectively assigns a name and one cluster-internal IP address to an app. The DNS service running in the cluster adds and removes DNS records which point from the app name to its IP address as services are added and removed. Drycc Workflow apps, then, can simply send requests to the domain name given to the service, which is \"app-name.app-namespace\".","title":"Inter-app Communication"},{"location":"applications/inter-app-communication/#inter-app-communication","text":"A common architecture pattern of multi-process applications is to have one process serve public requests while having multiple other processes supporting the public one to, for example, perform actions on a schedule or process work items from a queue. To implement this system of apps in Drycc Workflow, set up the apps to communicate using DNS resolution, as shown above, and hide the supporting processes from public view by removing them from the Drycc Workflow router.","title":"Inter-app Communication"},{"location":"applications/inter-app-communication/#dns-service-discovery","text":"Drycc Workflow supports deploying a single app composed of a system of processes. Each Drycc Workflow app communicates on a single port, so communicating with another Workflow app means finding that app's address and port. All Workflow apps are mapped to port 80 externally, so finding its IP address is the only challenge. Workflow creates a Kubernetes Service for each app, which effectively assigns a name and one cluster-internal IP address to an app. The DNS service running in the cluster adds and removes DNS records which point from the app name to its IP address as services are added and removed. Drycc Workflow apps, then, can simply send requests to the domain name given to the service, which is \"app-name.app-namespace\".","title":"DNS Service Discovery"},{"location":"applications/managing-app-configuration/","text":"Configuring an Application \u00b6 A Drycc application stores config in environment variables . Setting Environment Variables \u00b6 Use drycc config to modify environment variables for a deployed application. $ drycc help config Valid commands for config: config:list list environment variables for an app config:set set environment variables for an app config:unset unset environment variables for an app config:pull extract environment variables to .env config:push set environment variables from .env Use `drycc help [command]` to learn more. When config is changed, a new release is created and deployed automatically. You can set multiple environment variables with one drycc config:set command, or with drycc config:push and a local .env file. $ drycc config:set FOO=1 BAR=baz && drycc config:pull $ cat .env FOO=1 BAR=baz $ echo \"TIDE=high\" >> .env $ drycc config:push Creating config... done, v4 === yuppie-earthman DRYCC_APP: yuppie-earthman FOO: 1 BAR: baz TIDE: high Attach to Backing Services \u00b6 Drycc treats backing services like databases, caches and queues as attached resources . Attachments are performed using environment variables. For example, use drycc config to set a DATABASE_URL that attaches the application to an external PostgreSQL database. $ drycc config:set DATABASE_URL=postgres://user:pass@example.com:5432/db === peachy-waxworks DATABASE_URL: postgres://user:pass@example.com:5432/db Detachments can be performed with drycc config:unset . Buildpacks Cache \u00b6 By default, apps using the [Imagebuilder][] will reuse the latest image data. When deploying applications that depend on third-party libraries that have to be fetched, this could speed up deployments a lot. In order to make use of this, the buildpack must implement the cache by writing to the cache directory. Most buildpacks already implement this, but when using custom buildpacks, it might need to be changed to make full use of the cache. Disabling and re-enabling the cache \u00b6 In some cases, cache might not speed up your application. To disable caching, you can set the DRYCC_DISABLE_CACHE variable with drycc config:set DRYCC_DISABLE_CACHE=1 . When you disable the cache, Drycc will clear up files it created to store the cache. After having it turned off, run drycc config:unset DRYCC_DISABLE_CACHE to re-enable the cache. Clearing the cache \u00b6 Use the following procedure to clear the cache: $ drycc config:set DRYCC_DISABLE_CACHE=1 $ git commit --allow-empty -m \"Clearing Drycc cache\" $ git push drycc # (if you use a different remote, you should use your remote name) $ drycc config:unset DRYCC_DISABLE_CACHE Custom Health Checks \u00b6 By default, Workflow only checks that the application starts in their Container. If it is preferred to have Kubernetes respond to application health, a health check may be added by configuring a health check probe for the application. The health checks are implemented as Kubernetes container probes . A liveness and a readiness probe can be configured, and each probe can be of type httpGet , exec , or tcpSocket depending on the type of probe the container requires. A liveness probe is useful for applications running for long periods of time, eventually transitioning to broken states and cannot recover except by restarting them. Other times, a readiness probe is useful when the container is only temporarily unable to serve, and will recover on its own. In this case, if a container fails its readiness probe, the container will not be shut down, but rather the container will stop receiving incoming requests. httpGet probes are just as it sounds: it performs a HTTP GET operation on the Container. A response code inside the 200-399 range is considered a pass. exec probes run a command inside the Container to determine its health, such as cat /var/run/myapp.pid or a script that determines when the application is ready. An exit code of zero is considered a pass, while a non-zero status code is considered a fail. tcpSocket probes attempt to open a socket in the Container. The Container is only considered healthy if the check can establish a connection. tcpSocket probes accept a port number to perform the socket connection on the Container. Health checks can be configured on a per-proctype basis for each application using drycc healthchecks:set . If no type is mentioned then the health checks are applied to default proc types, web or cmd, whichever is present. To configure a httpGet liveness probe: $ drycc healthchecks:set liveness httpGet 80 --type cmd === peachy-waxworks Healthchecks cmd: Liveness -------- Initial Delay (seconds): 50 Timeout (seconds): 50 Period (seconds): 10 Success Threshold: 1 Failure Threshold: 3 Exec Probe: N/A HTTP GET Probe: Path=\"/\" Port=80 HTTPHeaders=[] TCP Socket Probe: N/A Readiness --------- No readiness probe configured. If the application relies on certain headers being set (such as the Host header) or a specific URL path relative to the root, you can also send specific HTTP headers: $ drycc healthchecks:set liveness httpGet 80 \\ --path /welcome/index.html \\ --headers \"X-Client-Version:v1.0,X-Foo:bar\" === peachy-waxworks Healthchecks web/cmd: Liveness -------- Initial Delay (seconds): 50 Timeout (seconds): 50 Period (seconds): 10 Success Threshold: 1 Failure Threshold: 3 Exec Probe: N/A HTTP GET Probe: Path=\"/welcome/index.html\" Port=80 HTTPHeaders=[X-Client-Version=v1.0] TCP Socket Probe: N/A Readiness --------- No readiness probe configured. To configure an exec readiness probe: $ drycc healthchecks:set readiness exec -- /bin/echo -n hello --type cmd === peachy-waxworks Healthchecks cmd: Liveness -------- No liveness probe configured. Readiness --------- Initial Delay (seconds): 50 Timeout (seconds): 50 Period (seconds): 10 Success Threshold: 1 Failure Threshold: 3 Exec Probe: Command=[/bin/echo -n hello] HTTP GET Probe: N/A TCP Socket Probe: N/A You can overwrite a probe by running drycc healthchecks:set again: $ drycc healthchecks:set readiness httpGet 80 --type cmd === peachy-waxworks Healthchecks cmd: Liveness -------- No liveness probe configured. Readiness --------- Initial Delay (seconds): 50 Timeout (seconds): 50 Period (seconds): 10 Success Threshold: 1 Failure Threshold: 3 Exec Probe: N/A HTTP GET Probe: Path=\"/\" Port=80 HTTPHeaders=[] TCP Socket Probe: N/A Configured health checks also modify the default application deploy behavior. When starting a new Pod, Workflow will wait for the health check to pass before moving onto the next Pod. Isolate the Application \u00b6 Workflow supports isolating applications onto a set of nodes using drycc tags . Note In order to use tags, you must first launch your cluster with the proper node labels. If you do not, tag commands will fail. Learn more by reading \"Assigning Pods to Nodes\" . Once your nodes are configured with appropriate label selectors, use drycc tags:set to restrict the application to those nodes: $ drycc tags:set environ=prod Applying tags... done, v4 environ prod","title":"Managing App Configuration"},{"location":"applications/managing-app-configuration/#configuring-an-application","text":"A Drycc application stores config in environment variables .","title":"Configuring an Application"},{"location":"applications/managing-app-configuration/#setting-environment-variables","text":"Use drycc config to modify environment variables for a deployed application. $ drycc help config Valid commands for config: config:list list environment variables for an app config:set set environment variables for an app config:unset unset environment variables for an app config:pull extract environment variables to .env config:push set environment variables from .env Use `drycc help [command]` to learn more. When config is changed, a new release is created and deployed automatically. You can set multiple environment variables with one drycc config:set command, or with drycc config:push and a local .env file. $ drycc config:set FOO=1 BAR=baz && drycc config:pull $ cat .env FOO=1 BAR=baz $ echo \"TIDE=high\" >> .env $ drycc config:push Creating config... done, v4 === yuppie-earthman DRYCC_APP: yuppie-earthman FOO: 1 BAR: baz TIDE: high","title":"Setting Environment Variables"},{"location":"applications/managing-app-configuration/#attach-to-backing-services","text":"Drycc treats backing services like databases, caches and queues as attached resources . Attachments are performed using environment variables. For example, use drycc config to set a DATABASE_URL that attaches the application to an external PostgreSQL database. $ drycc config:set DATABASE_URL=postgres://user:pass@example.com:5432/db === peachy-waxworks DATABASE_URL: postgres://user:pass@example.com:5432/db Detachments can be performed with drycc config:unset .","title":"Attach to Backing Services"},{"location":"applications/managing-app-configuration/#buildpacks-cache","text":"By default, apps using the [Imagebuilder][] will reuse the latest image data. When deploying applications that depend on third-party libraries that have to be fetched, this could speed up deployments a lot. In order to make use of this, the buildpack must implement the cache by writing to the cache directory. Most buildpacks already implement this, but when using custom buildpacks, it might need to be changed to make full use of the cache.","title":"Buildpacks Cache"},{"location":"applications/managing-app-configuration/#disabling-and-re-enabling-the-cache","text":"In some cases, cache might not speed up your application. To disable caching, you can set the DRYCC_DISABLE_CACHE variable with drycc config:set DRYCC_DISABLE_CACHE=1 . When you disable the cache, Drycc will clear up files it created to store the cache. After having it turned off, run drycc config:unset DRYCC_DISABLE_CACHE to re-enable the cache.","title":"Disabling and re-enabling the cache"},{"location":"applications/managing-app-configuration/#clearing-the-cache","text":"Use the following procedure to clear the cache: $ drycc config:set DRYCC_DISABLE_CACHE=1 $ git commit --allow-empty -m \"Clearing Drycc cache\" $ git push drycc # (if you use a different remote, you should use your remote name) $ drycc config:unset DRYCC_DISABLE_CACHE","title":"Clearing the cache"},{"location":"applications/managing-app-configuration/#custom-health-checks","text":"By default, Workflow only checks that the application starts in their Container. If it is preferred to have Kubernetes respond to application health, a health check may be added by configuring a health check probe for the application. The health checks are implemented as Kubernetes container probes . A liveness and a readiness probe can be configured, and each probe can be of type httpGet , exec , or tcpSocket depending on the type of probe the container requires. A liveness probe is useful for applications running for long periods of time, eventually transitioning to broken states and cannot recover except by restarting them. Other times, a readiness probe is useful when the container is only temporarily unable to serve, and will recover on its own. In this case, if a container fails its readiness probe, the container will not be shut down, but rather the container will stop receiving incoming requests. httpGet probes are just as it sounds: it performs a HTTP GET operation on the Container. A response code inside the 200-399 range is considered a pass. exec probes run a command inside the Container to determine its health, such as cat /var/run/myapp.pid or a script that determines when the application is ready. An exit code of zero is considered a pass, while a non-zero status code is considered a fail. tcpSocket probes attempt to open a socket in the Container. The Container is only considered healthy if the check can establish a connection. tcpSocket probes accept a port number to perform the socket connection on the Container. Health checks can be configured on a per-proctype basis for each application using drycc healthchecks:set . If no type is mentioned then the health checks are applied to default proc types, web or cmd, whichever is present. To configure a httpGet liveness probe: $ drycc healthchecks:set liveness httpGet 80 --type cmd === peachy-waxworks Healthchecks cmd: Liveness -------- Initial Delay (seconds): 50 Timeout (seconds): 50 Period (seconds): 10 Success Threshold: 1 Failure Threshold: 3 Exec Probe: N/A HTTP GET Probe: Path=\"/\" Port=80 HTTPHeaders=[] TCP Socket Probe: N/A Readiness --------- No readiness probe configured. If the application relies on certain headers being set (such as the Host header) or a specific URL path relative to the root, you can also send specific HTTP headers: $ drycc healthchecks:set liveness httpGet 80 \\ --path /welcome/index.html \\ --headers \"X-Client-Version:v1.0,X-Foo:bar\" === peachy-waxworks Healthchecks web/cmd: Liveness -------- Initial Delay (seconds): 50 Timeout (seconds): 50 Period (seconds): 10 Success Threshold: 1 Failure Threshold: 3 Exec Probe: N/A HTTP GET Probe: Path=\"/welcome/index.html\" Port=80 HTTPHeaders=[X-Client-Version=v1.0] TCP Socket Probe: N/A Readiness --------- No readiness probe configured. To configure an exec readiness probe: $ drycc healthchecks:set readiness exec -- /bin/echo -n hello --type cmd === peachy-waxworks Healthchecks cmd: Liveness -------- No liveness probe configured. Readiness --------- Initial Delay (seconds): 50 Timeout (seconds): 50 Period (seconds): 10 Success Threshold: 1 Failure Threshold: 3 Exec Probe: Command=[/bin/echo -n hello] HTTP GET Probe: N/A TCP Socket Probe: N/A You can overwrite a probe by running drycc healthchecks:set again: $ drycc healthchecks:set readiness httpGet 80 --type cmd === peachy-waxworks Healthchecks cmd: Liveness -------- No liveness probe configured. Readiness --------- Initial Delay (seconds): 50 Timeout (seconds): 50 Period (seconds): 10 Success Threshold: 1 Failure Threshold: 3 Exec Probe: N/A HTTP GET Probe: Path=\"/\" Port=80 HTTPHeaders=[] TCP Socket Probe: N/A Configured health checks also modify the default application deploy behavior. When starting a new Pod, Workflow will wait for the health check to pass before moving onto the next Pod.","title":"Custom Health Checks"},{"location":"applications/managing-app-configuration/#isolate-the-application","text":"Workflow supports isolating applications onto a set of nodes using drycc tags . Note In order to use tags, you must first launch your cluster with the proper node labels. If you do not, tag commands will fail. Learn more by reading \"Assigning Pods to Nodes\" . Once your nodes are configured with appropriate label selectors, use drycc tags:set to restrict the application to those nodes: $ drycc tags:set environ=prod Applying tags... done, v4 environ prod","title":"Isolate the Application"},{"location":"applications/managing-app-gateway/","text":"About gateway for an Application \u00b6 A Gateway describes how traffic can be translated to Services within the cluster. That is, it defines a request for a way to translate traffic from somewhere that does not know about Kubernetes to somewhere that does. For example, traffic sent to a Kubernetes Service by a cloud load balancer, an in-cluster proxy, or an external hardware load balancer. While many use cases have client traffic originating \u201coutside\u201d the cluster, this is not a requirement. Create Gateway for an Application \u00b6 Gateway is a way of exposing services externally, which generates an external IP address to connect route and service. Create service for an Application \u00b6 Service is a way of exposing services internally, creating a service generates an internal DNS that can access procfile_type . Create Route for an Application \u00b6 A Gateway may be attached to one or more Route references which serve to direct traffic for a subset of traffic to a specific service.","title":"Managing App Gateway"},{"location":"applications/managing-app-gateway/#about-gateway-for-an-application","text":"A Gateway describes how traffic can be translated to Services within the cluster. That is, it defines a request for a way to translate traffic from somewhere that does not know about Kubernetes to somewhere that does. For example, traffic sent to a Kubernetes Service by a cloud load balancer, an in-cluster proxy, or an external hardware load balancer. While many use cases have client traffic originating \u201coutside\u201d the cluster, this is not a requirement.","title":"About gateway for an Application"},{"location":"applications/managing-app-gateway/#create-gateway-for-an-application","text":"Gateway is a way of exposing services externally, which generates an external IP address to connect route and service.","title":"Create Gateway for an Application"},{"location":"applications/managing-app-gateway/#create-service-for-an-application","text":"Service is a way of exposing services internally, creating a service generates an internal DNS that can access procfile_type .","title":"Create service for an Application"},{"location":"applications/managing-app-gateway/#create-route-for-an-application","text":"A Gateway may be attached to one or more Route references which serve to direct traffic for a subset of traffic to a specific service.","title":"Create Route for an Application"},{"location":"applications/managing-app-lifecycle/","text":"Managing an Application \u00b6 Track Application Changes \u00b6 Drycc Workflow tracks all changes to your application. Application changes are the result of either new application code pushed to the platform (via git push drycc master ), or an update to application configuration (via drycc config:set KEY=VAL ). Each time a build or config change is made to your application a new release is created. These release numbers increase monotonically. You can see a record of changes to your application using drycc releases : $ drycc releases === peachy-waxworks Releases v4 3 minutes ago gabrtv deployed d3ccc05 v3 1 hour 17 minutes ago gabrtv added DATABASE_URL v2 6 hours 2 minutes ago gabrtv deployed 7cb3321 v1 6 hours 2 minutes ago gabrtv deployed drycc/helloworld Rollback a Release \u00b6 Drycc Workflow also supports rolling back go previous releases. If buggy code or an errant configuration change is pushed to your application, you may rollback to a previously known, good release. Note All rollbacks create a new, numbered release. But will reference the build/code and configuration from the desired rollback point. In this example, the application is currently running release v4. Using drycc rollback v2 tells Workflow to deploy the build and configuration that was used for release v2. This creates a new release named v5 whose contents are the source and configuration from release v2: $ drycc releases === folksy-offshoot Releases v4 4 minutes ago gabrtv deployed d3ccc05 v3 1 hour 18 minutes ago gabrtv added DATABASE_URL v2 6 hours 2 minutes ago gabrtv deployed 7cb3321 v1 6 hours 3 minutes ago gabrtv deployed drycc/helloworld $ drycc rollback v2 Rolled back to v2 $ drycc releases === folksy-offshoot Releases v5 Just now gabrtv rolled back to v2 v4 4 minutes ago gabrtv deployed d3ccc05 v3 1 hour 18 minutes ago gabrtv added DATABASE_URL v2 6 hours 2 minutes ago gabrtv deployed 7cb3321 v1 6 hours 3 minutes ago gabrtv deployed drycc/helloworld Run One-off Administration Tasks \u00b6 Drycc applications use one-off processes for admin tasks like database migrations and other commands that must run against the live application. Use drycc run to execute commands on the deployed application. $ drycc run 'ls -l' Running `ls -l`... total 28 -rw-r--r-- 1 root root 553 Dec 2 23:59 LICENSE -rw-r--r-- 1 root root 60 Dec 2 23:59 Procfile -rw-r--r-- 1 root root 33 Dec 2 23:59 README.md -rw-r--r-- 1 root root 1622 Dec 2 23:59 pom.xml drwxr-xr-x 3 root root 4096 Dec 2 23:59 src -rw-r--r-- 1 root root 25 Dec 2 23:59 system.properties drwxr-xr-x 6 root root 4096 Dec 3 00:00 target Share an Application \u00b6 Use drycc perms:create to allow another Drycc user to collaborate on your application. $ drycc perms:create otheruser Adding otheruser to peachy-waxworks collaborators... done Use drycc perms to see who an application is currently shared with, and drycc perms:delete to remove a collaborator. Note Collaborators can do anything with an application that its owner can do, except delete the application. When working with an application that has been shared with you, clone the original repository and add Drycc' git remote entry before attempting to git push any changes to Drycc. $ git clone https://github.com/drycc/example-java-jetty.git Cloning into 'example-java-jetty'... done $ cd example-java-jetty $ git remote add -f drycc ssh://git@local3.dryccapp.com:2222/peachy-waxworks.git Updating drycc From drycc-controller.local:peachy-waxworks * [new branch] master -> drycc/master Application Troubleshooting \u00b6 Applications deployed on Drycc Workflow treat logs as event streams . Drycc Workflow aggregates stdout and stderr from every Container making it easy to troubleshoot problems with your application. Use drycc logs to view the log output from your deployed application. $ drycc logs -f Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null} Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.Server:jetty-7.6.0.v20120127 Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10005 Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null} Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null} Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10006 Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null} Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10007 Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10008","title":"Managing App Lifecycle"},{"location":"applications/managing-app-lifecycle/#managing-an-application","text":"","title":"Managing an Application"},{"location":"applications/managing-app-lifecycle/#track-application-changes","text":"Drycc Workflow tracks all changes to your application. Application changes are the result of either new application code pushed to the platform (via git push drycc master ), or an update to application configuration (via drycc config:set KEY=VAL ). Each time a build or config change is made to your application a new release is created. These release numbers increase monotonically. You can see a record of changes to your application using drycc releases : $ drycc releases === peachy-waxworks Releases v4 3 minutes ago gabrtv deployed d3ccc05 v3 1 hour 17 minutes ago gabrtv added DATABASE_URL v2 6 hours 2 minutes ago gabrtv deployed 7cb3321 v1 6 hours 2 minutes ago gabrtv deployed drycc/helloworld","title":"Track Application Changes"},{"location":"applications/managing-app-lifecycle/#rollback-a-release","text":"Drycc Workflow also supports rolling back go previous releases. If buggy code or an errant configuration change is pushed to your application, you may rollback to a previously known, good release. Note All rollbacks create a new, numbered release. But will reference the build/code and configuration from the desired rollback point. In this example, the application is currently running release v4. Using drycc rollback v2 tells Workflow to deploy the build and configuration that was used for release v2. This creates a new release named v5 whose contents are the source and configuration from release v2: $ drycc releases === folksy-offshoot Releases v4 4 minutes ago gabrtv deployed d3ccc05 v3 1 hour 18 minutes ago gabrtv added DATABASE_URL v2 6 hours 2 minutes ago gabrtv deployed 7cb3321 v1 6 hours 3 minutes ago gabrtv deployed drycc/helloworld $ drycc rollback v2 Rolled back to v2 $ drycc releases === folksy-offshoot Releases v5 Just now gabrtv rolled back to v2 v4 4 minutes ago gabrtv deployed d3ccc05 v3 1 hour 18 minutes ago gabrtv added DATABASE_URL v2 6 hours 2 minutes ago gabrtv deployed 7cb3321 v1 6 hours 3 minutes ago gabrtv deployed drycc/helloworld","title":"Rollback a Release"},{"location":"applications/managing-app-lifecycle/#run-one-off-administration-tasks","text":"Drycc applications use one-off processes for admin tasks like database migrations and other commands that must run against the live application. Use drycc run to execute commands on the deployed application. $ drycc run 'ls -l' Running `ls -l`... total 28 -rw-r--r-- 1 root root 553 Dec 2 23:59 LICENSE -rw-r--r-- 1 root root 60 Dec 2 23:59 Procfile -rw-r--r-- 1 root root 33 Dec 2 23:59 README.md -rw-r--r-- 1 root root 1622 Dec 2 23:59 pom.xml drwxr-xr-x 3 root root 4096 Dec 2 23:59 src -rw-r--r-- 1 root root 25 Dec 2 23:59 system.properties drwxr-xr-x 6 root root 4096 Dec 3 00:00 target","title":"Run One-off Administration Tasks"},{"location":"applications/managing-app-lifecycle/#share-an-application","text":"Use drycc perms:create to allow another Drycc user to collaborate on your application. $ drycc perms:create otheruser Adding otheruser to peachy-waxworks collaborators... done Use drycc perms to see who an application is currently shared with, and drycc perms:delete to remove a collaborator. Note Collaborators can do anything with an application that its owner can do, except delete the application. When working with an application that has been shared with you, clone the original repository and add Drycc' git remote entry before attempting to git push any changes to Drycc. $ git clone https://github.com/drycc/example-java-jetty.git Cloning into 'example-java-jetty'... done $ cd example-java-jetty $ git remote add -f drycc ssh://git@local3.dryccapp.com:2222/peachy-waxworks.git Updating drycc From drycc-controller.local:peachy-waxworks * [new branch] master -> drycc/master","title":"Share an Application"},{"location":"applications/managing-app-lifecycle/#application-troubleshooting","text":"Applications deployed on Drycc Workflow treat logs as event streams . Drycc Workflow aggregates stdout and stderr from every Container making it easy to troubleshoot problems with your application. Use drycc logs to view the log output from your deployed application. $ drycc logs -f Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null} Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.Server:jetty-7.6.0.v20120127 Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10005 Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null} Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null} Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10006 Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null} Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10007 Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10008","title":"Application Troubleshooting"},{"location":"applications/managing-app-processes/","text":"Managing Application Processes \u00b6 Drycc Workflow manages your application as a set of processes that can be named, scaled and configured according to their role. This gives you the flexibility to easily manage the different facets of your application. For example, you may have web-facing processes that handle HTTP traffic, background worker processes that do async work, and a helper process that streams from the Twitter API. By using a Procfile, either checked in to your application or provided via the CLI you can specify the name of the type and the application command that should run. To spawn other process types, use drycc scale = to scale those types accordingly. Default Process Types \u00b6 In the absence of a Procfile, a single, default process type is assumed for each application. Applications built using Buildpacks via git push implicitly receive a web process type, which starts the application server. Rails 4, for example, has the following process type: web: bundle exec rails server -p $PORT All applications utilizing Dockerfiles have an implied cmd process type, which runs the Dockerfile's CMD directive unmodified: $ cat Dockerfile FROM centos:latest COPY . /app WORKDIR /app CMD python -m SimpleHTTPServer 5000 EXPOSE 5000 For the above Dockerfile-based application, the cmd process type would run the Container CMD of python -m SimpleHTTPServer 5000 . Applications utilizing remote Container images , a cmd process type is also implied, and runs the CMD specified in the Container image. Note The web and cmd process types are special as they\u2019re the only process types that will receive HTTP traffic from Workflow\u2019s routers. Other process types can be named arbitrarily. Declaring Process Types \u00b6 If you use Buildpack or Dockerfile builds and want to override or specify additional process types, simply include a file named Procfile in the root of your application's source tree. The format of a Procfile is one process type per line, with each line containing the command to invoke: : The syntax is defined as: \u2013 a lowercase alphanumeric string, is a name for your command, such as web, worker, urgentworker, clock, etc. \u2013 a command line to launch the process, such as rake jobs:work . This example Procfile specifies two types, web and sleeper . The web process launches a web server on port 5000 and a simple process which sleeps for 900 seconds and exits. $ cat Procfile web: bundle exec ruby web.rb -p ${PORT:-5000} sleeper: sleep 900 If you are using remote Container images , you may define process types by either running drycc pull with a Procfile in your working directory, or by passing a stringified Procfile to the --procfile CLI option. For example, passing process types inline: $ drycc pull drycc/example-go:latest --procfile=\"cmd: /app/bin/boot\" Read a Procfile in another directory: $ drycc pull drycc/example-go:latest --procfile=\"$(cat deploy/Procfile)\" Or via a Procfile located in your current, working directory: $ cat Procfile cmd: /bin/boot sleeper: echo \"sleeping\"; sleep 900 $ drycc pull -a steely-mainsail drycc/example-go Creating build... done $ drycc scale sleeper=1 -a steely-mainsail Scaling processes... but first, coffee! done in 0s === steely-mainsail Processes --- cmd (started): 1 steely-mainsail-cmd-3291896318-nyrim up (v3) --- sleeper (started): 1 steely-mainsail-sleeper-3291896318-oq1jr up (v3) Note Only process types of web and cmd will be scaled to 1 automatically. If you have additional process types remember to scale the process counts after creation. To remove a process type simply scale it to 0: $ drycc scale sleeper=0 -a steely-mainsail Scaling processes... but first, coffee! done in 3s === steely-mainsail Processes --- cmd (started): 1 steely-mainsail-cmd-3291896318-nyrim up (v3) --- sleeper (started): 0 Scaling Processes \u00b6 Applications deployed on Drycc Workflow scale out via the process model . Use drycc scale to control the number of containers that power your app. $ drycc scale cmd=5 -a iciest-waggoner Scaling processes... but first, coffee! done in 3s === iciest-waggoner Processes --- cmd (started): 5 iciest-waggoner-web-3291896318-09j0o up (v2) iciest-waggoner-web-3291896318-3r7kp up (v2) iciest-waggoner-web-3291896318-gc4xv up (v2) iciest-waggoner-web-3291896318-lviwo up (v2) iciest-waggoner-web-3291896318-kt7vu up (v2) If you have multiple process types for your application you may scale the process count for each type separately. For example, this allows you to manage web process independently from background workers. For more information on process types see our documentation for Managing App Processes . In this example, we are scaling the process type web to 5 but leaving the process type background with one worker. $ drycc scale web=5 Scaling processes... but first, coffee! done in 4s === scenic-icehouse Processes --- web (started): 5 scenic-icehouse-web-3291896318-7lord up (v2) scenic-icehouse-web-3291896318-jn957 up (v2) scenic-icehouse-web-3291896318-rsekj up (v2) scenic-icehouse-web-3291896318-vwhnh up (v2) scenic-icehouse-web-3291896318-vokg7 up (v2) --- background (started): 1 scenic-icehouse-web-3291896318-background-yf8kh up (v2) Note The default process type for Dockerfile and Container Image applications is 'cmd' rather than 'web'. Scaling a process down, by reducing the process count, sends a TERM signal to the processes, followed by a SIGKILL if they have not exited within 30 seconds. Depending on your application, scaling down may interrupt long-running HTTP client connections. For example, scaling from 5 processes to 3: $ drycc scale web=3 Scaling processes... but first, coffee! done in 1s === scenic-icehouse Processes --- background (started): 1 scenic-icehouse-web-3291896318-background-yf8kh up (v2) --- web (started): 3 scenic-icehouse-web-3291896318-7lord up (v2) scenic-icehouse-web-3291896318-rsekj up (v2) scenic-icehouse-web-3291896318-vokg7 up (v2) Get a Shell to a Running Container \u00b6 Verify that the container is running: # drycc ps === python-getting-started Processes --- web: python-getting-started-web-69b7d4bfdc-kl4xf up (v2) Get a shell to the running container: # drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -it -- bash In your shell, list the root directory: # Run this inside the container ls / Running individual commands in a container # drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -- date Use \"drycc ps --help\" for a list of global command-line (applies to all commands). Autoscale \u00b6 Autoscale allows adding a minimum and maximum number of pods on a per process type basis. This is accomplished by specifying a target CPU usage across all available pods. This feature is built on top of Horizontal Pod Autoscaling in Kubernetes or HPA for short. Note This is an alpha feature. It is recommended to be on the latest Kubernetes when using this feature. $ drycc autoscale:set web --min=3 --max=8 --cpu-percent=75 Applying autoscale settings for process type web on scenic-icehouse... done And then review the scaling rule that was created for web $ drycc autoscale:list === scenic-icehouse Autoscale --- web: Min Replicas: 3 Max Replicas: 8 CPU: 75% Remove scaling rule $ drycc autoscale:unset web Removing autoscale for process type web on scenic-icehouse... done For autoscaling to work CPU requests have to be specified on each application Pod (can be done via drycc limits --cpu ). This allows the autoscale policies to do the appropriate calculations and make decisions on when to scale up and down. Scale up can only happen if there was no rescaling within the last 3 minutes. Scale down will wait for 5 minutes from the last rescaling. That information and more can be found at HPA algorithm page . Web vs Cmd Process Types \u00b6 When deploying to Drycc Workflow using a Heroku Buildpack, Workflow boots the web process type to boot the application server. When you deploy an application that has a Dockerfile or uses Container images , Workflow boots the cmd process type. Both act similarly in that they are exposed to the router as web applications. However, the cmd process type is special because, if left undefined, it is equivalent to running the container without any additional arguments. (i.e. The process specified by the Dockerfile or Container image's CMD directive will be used.) If migrating an application from Heroku Buildpacks to a Container-based deployment, Workflow will not automatically convert the web process type to cmd . To do this, you'll have to manually scale down the old process type and scale the new process type up. Restarting an Application Processes \u00b6 If you need to restart an application process, you may use drycc ps:restart . Behind the scenes, Drycc Workflow instructs Kubernetes to terminate the old process and launch a new one in its place. $ drycc ps === scenic-icehouse Processes --- web (started): 3 scenic-icehouse-web-3291896318-7lord up (v2) scenic-icehouse-web-3291896318-rsekj up (v2) scenic-icehouse-web-3291896318-vokg7 up (v2) --- background (started): 1 scenic-icehouse-background-3291896318-yf8kh up (v2) $ drycc ps:restart scenic-icehouse-background-3291896318-yf8kh Restarting processes... but first, coffee! done in 6s === scenic-icehouse Processes --- background (started): 1 scenic-icehouse-background-3291896318-yd87g up (v2) Notice that the process name has changed from scenic-icehouse-background-3291896318-yf8kh to scenic-icehouse-background-3291896318-yd87g . In a multi-node Kubernetes cluster, this may also have the effect of scheduling the Pod to a new node.","title":"Managing App Processes"},{"location":"applications/managing-app-processes/#managing-application-processes","text":"Drycc Workflow manages your application as a set of processes that can be named, scaled and configured according to their role. This gives you the flexibility to easily manage the different facets of your application. For example, you may have web-facing processes that handle HTTP traffic, background worker processes that do async work, and a helper process that streams from the Twitter API. By using a Procfile, either checked in to your application or provided via the CLI you can specify the name of the type and the application command that should run. To spawn other process types, use drycc scale = to scale those types accordingly.","title":"Managing Application Processes"},{"location":"applications/managing-app-processes/#default-process-types","text":"In the absence of a Procfile, a single, default process type is assumed for each application. Applications built using Buildpacks via git push implicitly receive a web process type, which starts the application server. Rails 4, for example, has the following process type: web: bundle exec rails server -p $PORT All applications utilizing Dockerfiles have an implied cmd process type, which runs the Dockerfile's CMD directive unmodified: $ cat Dockerfile FROM centos:latest COPY . /app WORKDIR /app CMD python -m SimpleHTTPServer 5000 EXPOSE 5000 For the above Dockerfile-based application, the cmd process type would run the Container CMD of python -m SimpleHTTPServer 5000 . Applications utilizing remote Container images , a cmd process type is also implied, and runs the CMD specified in the Container image. Note The web and cmd process types are special as they\u2019re the only process types that will receive HTTP traffic from Workflow\u2019s routers. Other process types can be named arbitrarily.","title":"Default Process Types"},{"location":"applications/managing-app-processes/#declaring-process-types","text":"If you use Buildpack or Dockerfile builds and want to override or specify additional process types, simply include a file named Procfile in the root of your application's source tree. The format of a Procfile is one process type per line, with each line containing the command to invoke: : The syntax is defined as: \u2013 a lowercase alphanumeric string, is a name for your command, such as web, worker, urgentworker, clock, etc. \u2013 a command line to launch the process, such as rake jobs:work . This example Procfile specifies two types, web and sleeper . The web process launches a web server on port 5000 and a simple process which sleeps for 900 seconds and exits. $ cat Procfile web: bundle exec ruby web.rb -p ${PORT:-5000} sleeper: sleep 900 If you are using remote Container images , you may define process types by either running drycc pull with a Procfile in your working directory, or by passing a stringified Procfile to the --procfile CLI option. For example, passing process types inline: $ drycc pull drycc/example-go:latest --procfile=\"cmd: /app/bin/boot\" Read a Procfile in another directory: $ drycc pull drycc/example-go:latest --procfile=\"$(cat deploy/Procfile)\" Or via a Procfile located in your current, working directory: $ cat Procfile cmd: /bin/boot sleeper: echo \"sleeping\"; sleep 900 $ drycc pull -a steely-mainsail drycc/example-go Creating build... done $ drycc scale sleeper=1 -a steely-mainsail Scaling processes... but first, coffee! done in 0s === steely-mainsail Processes --- cmd (started): 1 steely-mainsail-cmd-3291896318-nyrim up (v3) --- sleeper (started): 1 steely-mainsail-sleeper-3291896318-oq1jr up (v3) Note Only process types of web and cmd will be scaled to 1 automatically. If you have additional process types remember to scale the process counts after creation. To remove a process type simply scale it to 0: $ drycc scale sleeper=0 -a steely-mainsail Scaling processes... but first, coffee! done in 3s === steely-mainsail Processes --- cmd (started): 1 steely-mainsail-cmd-3291896318-nyrim up (v3) --- sleeper (started): 0","title":"Declaring Process Types"},{"location":"applications/managing-app-processes/#scaling-processes","text":"Applications deployed on Drycc Workflow scale out via the process model . Use drycc scale to control the number of containers that power your app. $ drycc scale cmd=5 -a iciest-waggoner Scaling processes... but first, coffee! done in 3s === iciest-waggoner Processes --- cmd (started): 5 iciest-waggoner-web-3291896318-09j0o up (v2) iciest-waggoner-web-3291896318-3r7kp up (v2) iciest-waggoner-web-3291896318-gc4xv up (v2) iciest-waggoner-web-3291896318-lviwo up (v2) iciest-waggoner-web-3291896318-kt7vu up (v2) If you have multiple process types for your application you may scale the process count for each type separately. For example, this allows you to manage web process independently from background workers. For more information on process types see our documentation for Managing App Processes . In this example, we are scaling the process type web to 5 but leaving the process type background with one worker. $ drycc scale web=5 Scaling processes... but first, coffee! done in 4s === scenic-icehouse Processes --- web (started): 5 scenic-icehouse-web-3291896318-7lord up (v2) scenic-icehouse-web-3291896318-jn957 up (v2) scenic-icehouse-web-3291896318-rsekj up (v2) scenic-icehouse-web-3291896318-vwhnh up (v2) scenic-icehouse-web-3291896318-vokg7 up (v2) --- background (started): 1 scenic-icehouse-web-3291896318-background-yf8kh up (v2) Note The default process type for Dockerfile and Container Image applications is 'cmd' rather than 'web'. Scaling a process down, by reducing the process count, sends a TERM signal to the processes, followed by a SIGKILL if they have not exited within 30 seconds. Depending on your application, scaling down may interrupt long-running HTTP client connections. For example, scaling from 5 processes to 3: $ drycc scale web=3 Scaling processes... but first, coffee! done in 1s === scenic-icehouse Processes --- background (started): 1 scenic-icehouse-web-3291896318-background-yf8kh up (v2) --- web (started): 3 scenic-icehouse-web-3291896318-7lord up (v2) scenic-icehouse-web-3291896318-rsekj up (v2) scenic-icehouse-web-3291896318-vokg7 up (v2)","title":"Scaling Processes"},{"location":"applications/managing-app-processes/#get-a-shell-to-a-running-container","text":"Verify that the container is running: # drycc ps === python-getting-started Processes --- web: python-getting-started-web-69b7d4bfdc-kl4xf up (v2) Get a shell to the running container: # drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -it -- bash In your shell, list the root directory: # Run this inside the container ls / Running individual commands in a container # drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -- date Use \"drycc ps --help\" for a list of global command-line (applies to all commands).","title":"Get a Shell to a Running Container"},{"location":"applications/managing-app-processes/#autoscale","text":"Autoscale allows adding a minimum and maximum number of pods on a per process type basis. This is accomplished by specifying a target CPU usage across all available pods. This feature is built on top of Horizontal Pod Autoscaling in Kubernetes or HPA for short. Note This is an alpha feature. It is recommended to be on the latest Kubernetes when using this feature. $ drycc autoscale:set web --min=3 --max=8 --cpu-percent=75 Applying autoscale settings for process type web on scenic-icehouse... done And then review the scaling rule that was created for web $ drycc autoscale:list === scenic-icehouse Autoscale --- web: Min Replicas: 3 Max Replicas: 8 CPU: 75% Remove scaling rule $ drycc autoscale:unset web Removing autoscale for process type web on scenic-icehouse... done For autoscaling to work CPU requests have to be specified on each application Pod (can be done via drycc limits --cpu ). This allows the autoscale policies to do the appropriate calculations and make decisions on when to scale up and down. Scale up can only happen if there was no rescaling within the last 3 minutes. Scale down will wait for 5 minutes from the last rescaling. That information and more can be found at HPA algorithm page .","title":"Autoscale"},{"location":"applications/managing-app-processes/#web-vs-cmd-process-types","text":"When deploying to Drycc Workflow using a Heroku Buildpack, Workflow boots the web process type to boot the application server. When you deploy an application that has a Dockerfile or uses Container images , Workflow boots the cmd process type. Both act similarly in that they are exposed to the router as web applications. However, the cmd process type is special because, if left undefined, it is equivalent to running the container without any additional arguments. (i.e. The process specified by the Dockerfile or Container image's CMD directive will be used.) If migrating an application from Heroku Buildpacks to a Container-based deployment, Workflow will not automatically convert the web process type to cmd . To do this, you'll have to manually scale down the old process type and scale the new process type up.","title":"Web vs Cmd Process Types"},{"location":"applications/managing-app-processes/#restarting-an-application-processes","text":"If you need to restart an application process, you may use drycc ps:restart . Behind the scenes, Drycc Workflow instructs Kubernetes to terminate the old process and launch a new one in its place. $ drycc ps === scenic-icehouse Processes --- web (started): 3 scenic-icehouse-web-3291896318-7lord up (v2) scenic-icehouse-web-3291896318-rsekj up (v2) scenic-icehouse-web-3291896318-vokg7 up (v2) --- background (started): 1 scenic-icehouse-background-3291896318-yf8kh up (v2) $ drycc ps:restart scenic-icehouse-background-3291896318-yf8kh Restarting processes... but first, coffee! done in 6s === scenic-icehouse Processes --- background (started): 1 scenic-icehouse-background-3291896318-yd87g up (v2) Notice that the process name has changed from scenic-icehouse-background-3291896318-yf8kh to scenic-icehouse-background-3291896318-yd87g . In a multi-node Kubernetes cluster, this may also have the effect of scheduling the Pod to a new node.","title":"Restarting an Application Processes"},{"location":"applications/managing-app-resources/","text":"Managing resources for an Application \u00b6 We can use blow command to create resources and bind which resource is created. This command depend on service-catalog . Use drycc resources to create and bind a resource for a deployed application. $ drycc help resources Valid commands for resources: resources:services list all available resource services resources:plans list all available plans for an resource services resources:create create a resource for the application resources:list list resources in the application resources:describe get a resource detail info in the application resources:update update a resource from the application resources:destroy delete a resource from the applicationa resources:bind bind a resource to servicebroker resources:unbind unbind a resource from servicebroker Use 'drycc help [command]' to learn more. List all available resource services \u00b6 You can list available resource services with one drycc resources:services command $ drycc resources:services +------------+------------+ | NAME | UPDATEABLE | +------------+------------+ | mysql | true | | postgresql | true | | memcached | true | | redis | true | +------------+------------+ List all available plans for an resource services \u00b6 You can list all available plans for an resource services with one drycc resources:plans command $ drycc resources:plans redis +-------+--------------------------------+ | NAME | DESCRIPTION | +-------+--------------------------------+ | 40000 | Redis 40000 plan which limit | | | resources memory size 40Gi. | | 250 | Redis 250 plan which limit | | | resources memory size 250Mi. | | 20000 | Redis 20000 plan which limit | | | resources memory size 20Gi. | | 5000 | Redis 5000 plan which limit | | | resources memory size 5Gi. | | 500 | Redis 500 plan which limit | | | resources memory size 500Mi. | | 128 | Redis 128 plan which limit | | | resources memory size 128Mi. | | 50000 | Redis 50000 plan which limit | | | resources memory size 50Gi. | | 2500 | Redis 2500 plan which limit | | | resources memory size 2.5Gi. | | 30000 | Redis 30000 plan which limit | | | resources memory size 30Gi. | | 10000 | Redis 10000 plan which limit | | | resources memory size 10Gi. | | 1000 | Redis 1000 plan which limit | | | resources memory size 1Gi. | +-------+--------------------------------+ Create resource in application \u00b6 You can create a resource with one drycc resources:create command $ drycc resources:create redis:1000 redis Creating redis to scenic-icehouse... done After resources are created, you can list the resources in this application. $ drycc resources:list === scenic-icehouse resources redis redis:1000 Bind resources \u00b6 The resource which is named redis is created, you can bind the redis to the application, use the command of drycc resources:bind redis . $ drycc resources:bind redis Binding resource... done Describe resources \u00b6 And use drycc resources:describe show the binding detail. If the binding is successful, this command will show the information of connect to the resource. $ drycc resources:describe redis === scenic-icehouse resource redis plan: redis:1000 status: Ready binding: Ready REDISPORT: 6379 REDIS_PASSWORD: RzG87SJWG1 SENTINELHOST: 172.16.0.2 SENTINELPORT: 26379 Update resources \u00b6 You can use the drycc resources:update command to upgrade a new plan. An example of how to upgrade the plan's capacity to 100MB: $ drycc resources:update redis:10000 redis Updating redis to scenic-icehouse... done Remove the resource \u00b6 If you don't need resources, use drycc resources:unbind to unbind the resource and then use drycc resources:destroy to delete the resource from the application. Before deleting the resource, the resource must be unbinded. $ drycc resources:unbind redis Unbinding resource... done $ drycc resources:destroy redis Deleting redis from scenic-icehouse... done","title":"Managing App Resources"},{"location":"applications/managing-app-resources/#managing-resources-for-an-application","text":"We can use blow command to create resources and bind which resource is created. This command depend on service-catalog . Use drycc resources to create and bind a resource for a deployed application. $ drycc help resources Valid commands for resources: resources:services list all available resource services resources:plans list all available plans for an resource services resources:create create a resource for the application resources:list list resources in the application resources:describe get a resource detail info in the application resources:update update a resource from the application resources:destroy delete a resource from the applicationa resources:bind bind a resource to servicebroker resources:unbind unbind a resource from servicebroker Use 'drycc help [command]' to learn more.","title":"Managing resources for an Application"},{"location":"applications/managing-app-resources/#list-all-available-resource-services","text":"You can list available resource services with one drycc resources:services command $ drycc resources:services +------------+------------+ | NAME | UPDATEABLE | +------------+------------+ | mysql | true | | postgresql | true | | memcached | true | | redis | true | +------------+------------+","title":"List all available resource services"},{"location":"applications/managing-app-resources/#list-all-available-plans-for-an-resource-services","text":"You can list all available plans for an resource services with one drycc resources:plans command $ drycc resources:plans redis +-------+--------------------------------+ | NAME | DESCRIPTION | +-------+--------------------------------+ | 40000 | Redis 40000 plan which limit | | | resources memory size 40Gi. | | 250 | Redis 250 plan which limit | | | resources memory size 250Mi. | | 20000 | Redis 20000 plan which limit | | | resources memory size 20Gi. | | 5000 | Redis 5000 plan which limit | | | resources memory size 5Gi. | | 500 | Redis 500 plan which limit | | | resources memory size 500Mi. | | 128 | Redis 128 plan which limit | | | resources memory size 128Mi. | | 50000 | Redis 50000 plan which limit | | | resources memory size 50Gi. | | 2500 | Redis 2500 plan which limit | | | resources memory size 2.5Gi. | | 30000 | Redis 30000 plan which limit | | | resources memory size 30Gi. | | 10000 | Redis 10000 plan which limit | | | resources memory size 10Gi. | | 1000 | Redis 1000 plan which limit | | | resources memory size 1Gi. | +-------+--------------------------------+","title":"List all available plans for an resource services"},{"location":"applications/managing-app-resources/#create-resource-in-application","text":"You can create a resource with one drycc resources:create command $ drycc resources:create redis:1000 redis Creating redis to scenic-icehouse... done After resources are created, you can list the resources in this application. $ drycc resources:list === scenic-icehouse resources redis redis:1000","title":"Create resource in application"},{"location":"applications/managing-app-resources/#bind-resources","text":"The resource which is named redis is created, you can bind the redis to the application, use the command of drycc resources:bind redis . $ drycc resources:bind redis Binding resource... done","title":"Bind resources"},{"location":"applications/managing-app-resources/#describe-resources","text":"And use drycc resources:describe show the binding detail. If the binding is successful, this command will show the information of connect to the resource. $ drycc resources:describe redis === scenic-icehouse resource redis plan: redis:1000 status: Ready binding: Ready REDISPORT: 6379 REDIS_PASSWORD: RzG87SJWG1 SENTINELHOST: 172.16.0.2 SENTINELPORT: 26379","title":"Describe resources"},{"location":"applications/managing-app-resources/#update-resources","text":"You can use the drycc resources:update command to upgrade a new plan. An example of how to upgrade the plan's capacity to 100MB: $ drycc resources:update redis:10000 redis Updating redis to scenic-icehouse... done","title":"Update resources"},{"location":"applications/managing-app-resources/#remove-the-resource","text":"If you don't need resources, use drycc resources:unbind to unbind the resource and then use drycc resources:destroy to delete the resource from the application. Before deleting the resource, the resource must be unbinded. $ drycc resources:unbind redis Unbinding resource... done $ drycc resources:destroy redis Deleting redis from scenic-icehouse... done","title":"Remove the resource"},{"location":"applications/managing-app-volumes/","text":"Mounting volumes for an Application \u00b6 We can use the blow command to create volumes and mount the created volumes. Drycc create volume support ReadWriteMany , so before deploying drycc, you need to have a StorageClass ready which can support ReadWriteMany. Deploying drycc, set controller.appStorageClass to this StorageClass. Use drycc volumes to mount a volume for a deployed application's processes. $ drycc help volumes Valid commands for volumes: volumes:create create a volume for the application volumes:list list volumes in the application volumes:delete delete a volume from the application volumes:mount mount a volume to process of the application volumes:unmount unmount a volume from process of the application Use 'drycc help [command]' to learn more. Create a volume for the application \u00b6 You can create a volume with the drycc volumes:create command $ drycc volumes:create myvolume 200M Creating myvolumes to scenic-icehouse... done List volumes in the application \u00b6 After volume is created, you can list the volumes in this application. $ drycc volumes:list === scenic-icehouse volumes --- myvolumes 200M Mount a volume \u00b6 The volume which is named myvolumes is created, you can mount the volume with process of the application, use the command of drycc volumes:mount . When volume is mounted, a new release will be created and deployed automatically. $ drycc volumes:mount myvolumes web=/data/web Mounting volume... done And use drycc volumes:list show mount detail. $ drycc volumes:list === scenic-icehouse volumes --- myvolumes 200M web /data/web If you don't need the volume, use drycc volumes:unmount to unmount the volume and then use drycc volumes:delete to delete the volume from the application. Before deleting volume, the volume has to be unmounted. $ drycc volumes:unmount myvolumes web Unmounting volume... done $ drycc volumes:delete myvolumes Deleting myvolumes from scenic-icehouse... done","title":"Managing App Volumes"},{"location":"applications/managing-app-volumes/#mounting-volumes-for-an-application","text":"We can use the blow command to create volumes and mount the created volumes. Drycc create volume support ReadWriteMany , so before deploying drycc, you need to have a StorageClass ready which can support ReadWriteMany. Deploying drycc, set controller.appStorageClass to this StorageClass. Use drycc volumes to mount a volume for a deployed application's processes. $ drycc help volumes Valid commands for volumes: volumes:create create a volume for the application volumes:list list volumes in the application volumes:delete delete a volume from the application volumes:mount mount a volume to process of the application volumes:unmount unmount a volume from process of the application Use 'drycc help [command]' to learn more.","title":"Mounting volumes for an Application"},{"location":"applications/managing-app-volumes/#create-a-volume-for-the-application","text":"You can create a volume with the drycc volumes:create command $ drycc volumes:create myvolume 200M Creating myvolumes to scenic-icehouse... done","title":"Create a volume for the application"},{"location":"applications/managing-app-volumes/#list-volumes-in-the-application","text":"After volume is created, you can list the volumes in this application. $ drycc volumes:list === scenic-icehouse volumes --- myvolumes 200M","title":"List volumes in the application"},{"location":"applications/managing-app-volumes/#mount-a-volume","text":"The volume which is named myvolumes is created, you can mount the volume with process of the application, use the command of drycc volumes:mount . When volume is mounted, a new release will be created and deployed automatically. $ drycc volumes:mount myvolumes web=/data/web Mounting volume... done And use drycc volumes:list show mount detail. $ drycc volumes:list === scenic-icehouse volumes --- myvolumes 200M web /data/web If you don't need the volume, use drycc volumes:unmount to unmount the volume and then use drycc volumes:delete to delete the volume from the application. Before deleting volume, the volume has to be unmounted. $ drycc volumes:unmount myvolumes web Unmounting volume... done $ drycc volumes:delete myvolumes Deleting myvolumes from scenic-icehouse... done","title":"Mount a volume"},{"location":"applications/managing-resource-limits/","text":"Managing Application Resource Limits \u00b6 Drycc Workflow supports restricting memory and CPU shares of each process. Requests/Limits set on a per-process type are given to Kubernetes as a requests and limits. Which means you guarantee amount of resource for a process as well as limit the process from using more than . By default, Kubernetes will set equal to if we don't explicitly set value. Please keep in mind that 0 <= requests <= limits . Limiting Memory \u00b6 If you set a requests/limits that is out of range for your cluster, Kubernetes will be unable to schedule your application processes into the cluster! Available units for memory are: Unit Amount B Bytes K KiB (Power of 2) M MiB (Power of 2) G GiB (Power of 2) Important The minimum memory limit allowed is 4MiB. Use drycc limits:set = to restrict memory by process type, where value can be or / format : $ drycc limits:set web=64M Applying limits... done === indoor-whitecap Limits --- Memory web 64M --- CPU Unlimited $ drycc limits:set cmd=32M/64M Applying limits... done === outdoor-whitecap Limits --- Memory cmd 32M/64M --- CPU Unlimited If you would like to remove any configured memory limits use drycc limits:unset web : $ drycc limits:unset web Applying limits... done === indoor-whitecap Limits --- Memory Unlimited --- CPU Unlimited Limiting CPU \u00b6 You can also use drycc limits:set = --cpu to restrict CPU shares, where value can be or / format. CPU shares are tracked in milli-cores. One CPU core is equivalent to 1000 milli-cores. To dedicate half a core to your process, you would need 500 milli-cores or 500m. Unit Amount 1000m 1000 milli-cores == 100% CPU core 500m 500 milli-cores == 50% CPU core 250m 250 milli-cores == 25% CPU core 100m 100 milli-cores == 10% CPU core $ drycc limits:set web=250m --cpu Applying limits... done === indoor-whitecap Limits --- Memory web 64M --- CPU web 250m $ drycc limits:set web=1500m/2000m --cpu Applying limits... done === indoor-whitecap Limits --- Memory web 64M --- CPU web 1500m/2000m You can verify the CPU and memory limits by inspecting the application process Pod with kubectl : $ drycc ps === indoor-whitecap Processes --- web (started): 1 indoor-whitecap-v14-web-8slcj up (v14) $ kubectl --namespace=indoor-whitecap describe po indoor-whitecap-v14-web-8slcj Name: indoor-whitecap-v14-web-8slcj Containers: QoS Tier: cpu: Guaranteed memory: Guaranteed Limits: cpu: 2000m memory: 64Mi Requests: memory: 64Mi cpu: 1500m Important If you restrict resources to the point where containers do not start, the limits:set command will hang. If this happens, use CTRL-C to break out of limits:set and use limits:unset to revert. To unset a CPU limit use drycc limits:unset web --cpu : $ drycc limits:unset web --cpu Applying limits... done === indoor-whitecap Limits --- Memory Unlimited --- CPU Unlimited","title":"Resource Limits"},{"location":"applications/managing-resource-limits/#managing-application-resource-limits","text":"Drycc Workflow supports restricting memory and CPU shares of each process. Requests/Limits set on a per-process type are given to Kubernetes as a requests and limits. Which means you guarantee amount of resource for a process as well as limit the process from using more than . By default, Kubernetes will set equal to if we don't explicitly set value. Please keep in mind that 0 <= requests <= limits .","title":"Managing Application Resource Limits"},{"location":"applications/managing-resource-limits/#limiting-memory","text":"If you set a requests/limits that is out of range for your cluster, Kubernetes will be unable to schedule your application processes into the cluster! Available units for memory are: Unit Amount B Bytes K KiB (Power of 2) M MiB (Power of 2) G GiB (Power of 2) Important The minimum memory limit allowed is 4MiB. Use drycc limits:set = to restrict memory by process type, where value can be or / format : $ drycc limits:set web=64M Applying limits... done === indoor-whitecap Limits --- Memory web 64M --- CPU Unlimited $ drycc limits:set cmd=32M/64M Applying limits... done === outdoor-whitecap Limits --- Memory cmd 32M/64M --- CPU Unlimited If you would like to remove any configured memory limits use drycc limits:unset web : $ drycc limits:unset web Applying limits... done === indoor-whitecap Limits --- Memory Unlimited --- CPU Unlimited","title":"Limiting Memory"},{"location":"applications/managing-resource-limits/#limiting-cpu","text":"You can also use drycc limits:set = --cpu to restrict CPU shares, where value can be or / format. CPU shares are tracked in milli-cores. One CPU core is equivalent to 1000 milli-cores. To dedicate half a core to your process, you would need 500 milli-cores or 500m. Unit Amount 1000m 1000 milli-cores == 100% CPU core 500m 500 milli-cores == 50% CPU core 250m 250 milli-cores == 25% CPU core 100m 100 milli-cores == 10% CPU core $ drycc limits:set web=250m --cpu Applying limits... done === indoor-whitecap Limits --- Memory web 64M --- CPU web 250m $ drycc limits:set web=1500m/2000m --cpu Applying limits... done === indoor-whitecap Limits --- Memory web 64M --- CPU web 1500m/2000m You can verify the CPU and memory limits by inspecting the application process Pod with kubectl : $ drycc ps === indoor-whitecap Processes --- web (started): 1 indoor-whitecap-v14-web-8slcj up (v14) $ kubectl --namespace=indoor-whitecap describe po indoor-whitecap-v14-web-8slcj Name: indoor-whitecap-v14-web-8slcj Containers: QoS Tier: cpu: Guaranteed memory: Guaranteed Limits: cpu: 2000m memory: 64Mi Requests: memory: 64Mi cpu: 1500m Important If you restrict resources to the point where containers do not start, the limits:set command will hang. If this happens, use CTRL-C to break out of limits:set and use limits:unset to revert. To unset a CPU limit use drycc limits:unset web --cpu : $ drycc limits:unset web --cpu Applying limits... done === indoor-whitecap Limits --- Memory Unlimited --- CPU Unlimited","title":"Limiting CPU"},{"location":"applications/ssl-certificates/","text":"Application SSL Certificates \u00b6 SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web requests. Apps that transmit sensitive data should enable SSL to ensure all information is transmitted securely. To enable SSL on a custom domain, e.g., www.example.com , use the SSL endpoint. Note drycc certs is only useful for custom domains. Default application domains are SSL-enabled already and can be accessed simply by using https, e.g. https://foo.dryccapp.com (provided that you have installed your wildcard certificate on the routers or on the load balancer). Overview \u00b6 Because of the unique nature of SSL validation, provisioning SSL for your domain is a multi-step process that involves several third-parties. You will need to: Purchase an SSL certificate from your SSL provider Upload the cert to Drycc Acquire SSL Certificate \u00b6 Purchasing an SSL cert varies in cost and process depending on the vendor. RapidSSL offers a simple way to purchase a certificate and is a recommended solution. If you\u2019re able to use this provider, see buy an SSL certificate with RapidSSL for instructions. DNS and Domain Configuration \u00b6 Once the SSL certificate is provisioned and your cert is confirmed, you must route requests for your domain through Drycc. Unless you've already done so, add the domain specified when generating the CSR to your app with: $ drycc domains:add www.example.com -a foo Adding www.example.com to foo... done Add a Certificate \u00b6 Add your certificate, any intermediate certificates, and private key to the endpoint with the certs:add command. $ drycc certs:add example-com server.crt server.key Adding SSL endpoint... done www.example.com Note The name given to the certificate can only contain a-z (lowercase), 0-9 and hyphens The Drycc platform will investigate the certificate and extract any relevant information from it such as the Common Name, Subject Alt Names (SAN), fingerprint and more. This allows for wildcard certificates and multiple domains in the SAN without uploading duplicates. Add a Certificate Chain \u00b6 Sometimes, your certificates (such as a self-signed or a cheap certificate) need additional certificates to establish the chain of trust. What you need to do is bundle all the certificates into one file and give that to Drycc. Importantly, your site\u2019s certificate must be the first one: $ cat server.crt server.ca > server.bundle After that, you can add them to Drycc with the certs:add command: $ drycc certs:add example-com server.bundle server.key Adding SSL endpoint... done www.example.com Attach SSL certificate to a domain \u00b6 Certificates are not automagically connected up to domains, instead you will have to attach a certificate to a domain $ drycc certs:attach example-com example.com Each certificate can be connected to many domains. There is no need to upload duplicates. To remove an association $ drycc certs:detach example-com example.com Endpoint overview \u00b6 You can verify the details of your domain's SSL configuration with drycc certs . $ drycc certs Name | Common Name | SubjectAltName | Expires | Fingerprint | Domains | Updated | Created +-------------+-------------------+-------------------+-------------------------+-----------------+--------------+-------------+-------------+ example-com | example.com | blog.example.com | 31 Dec 2017 (in 1 year) | 8F:8E[...]CD:EB | example.com | 30 Jan 2016 | 29 Jan 2016 or by looking at at each certificates detailed information $ drycc certs:info example-com === bar-com Certificate Common Name(s): example.com Expires At: 2017-01-14 23:57:57 +0000 UTC Starts At: 2016-01-15 23:57:57 +0000 UTC Fingerprint: 7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0 Subject Alt Name: blog.example.com Issuer: /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc Subject: /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc Connected Domains: example.com Owner: admin-user Created: 2016-01-28 19:07:41 +0000 UTC Updated: 2016-01-30 00:10:02 +0000 UTC Testing SSL \u00b6 Use a command line utility like curl to test that everything is configured correctly for your secure domain. Note The -k option flag tells curl to ignore untrusted certificates. Pay attention to the output. It should print SSL certificate verify ok . If it prints something like common name: www.example.com (does not match 'www.somedomain.com') then something is not configured correctly. Enforcing SSL at the Router \u00b6 To enforce all HTTP requests be redirected to HTTPS, TLS can be enforced at the router level by running $ drycc tls:force:enable -a foo Enabling https-only requests for foo... done Users hitting the HTTP endpoint for the application will now receive a 301 redirect to the HTTPS endpoint. To disable enforced TLS, run $ drycc tls:force:disable -a foo Disabling https-only requests for foo... done Automated Certificate Management \u00b6 With Automated Certificate Management (ACM), Drycc automatically manages TLS certificates for apps with Hobby and Professional dynos on the Common Runtime, and for apps in Private Spaces that enable the feature. Certificates handled by ACM automatically renew one month before they expire, and new certificates are created automatically whenever you add or remove a custom domain. All applications with paid dynos include ACM for free. Automated Certificate Management uses Let\u2019s Encrypt, the free, automated, and open certificate authority for managing your application\u2019s TLS certificates. Let\u2019s Encrypt is run for the public benefit by the Internet Security Research Group (ISRG). To enable ACM with the following command: $ drycc tls:auto:enable -a foo To disable ACM with the following command: $ drycc tls:auto:disable -a foo Remove Certificate \u00b6 You can remove a certificate using the certs:remove command: $ drycc certs:remove my-cert Removing www.example.com... Done. Swapping out certificates \u00b6 Over the lifetime of an application an operator will have to acquire certificates with new expire dates and apply it to all relevant applications, below is the recommended way to swap out certificates. Be intentional with certificate names, name them example-com-2017 when possible, where the year signifies the expiry year. This allows for example-com-2018 when a new certificate is purchased. Assuming all applications are already using example-com-2017 the following commands can be ran, chained together or otherwise: $ drycc certs:detach example-com-2017 example.com $ drycc certs:attach example-com-2018 example.com This will take care of a singular domain which allows the operator to verify everything went as planned and slowly roll it out to any other application using the same method. Troubleshooting \u00b6 Here are some steps you can follow if your SSL endpoint is not working as you'd expect. Untrusted Certificate \u00b6 In some cases when accessing the SSL endpoint, it may list your certificate as untrusted. If this occurs, it may be because it is not trusted by Mozilla\u2019s list of root CAs . If this is the case, your certificate may be considered untrusted for many browsers. If you have uploaded a certificate that was signed by a root authority but you get the message that it is not trusted, then something is wrong with the certificate. For example, it may be missing intermediary certificates . If so, download the intermediary certificates from your SSL provider, remove the certificate from Drycc and re-run the certs:add command.","title":"SSL Certificates"},{"location":"applications/ssl-certificates/#application-ssl-certificates","text":"SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web requests. Apps that transmit sensitive data should enable SSL to ensure all information is transmitted securely. To enable SSL on a custom domain, e.g., www.example.com , use the SSL endpoint. Note drycc certs is only useful for custom domains. Default application domains are SSL-enabled already and can be accessed simply by using https, e.g. https://foo.dryccapp.com (provided that you have installed your wildcard certificate on the routers or on the load balancer).","title":"Application SSL Certificates"},{"location":"applications/ssl-certificates/#overview","text":"Because of the unique nature of SSL validation, provisioning SSL for your domain is a multi-step process that involves several third-parties. You will need to: Purchase an SSL certificate from your SSL provider Upload the cert to Drycc","title":"Overview"},{"location":"applications/ssl-certificates/#acquire-ssl-certificate","text":"Purchasing an SSL cert varies in cost and process depending on the vendor. RapidSSL offers a simple way to purchase a certificate and is a recommended solution. If you\u2019re able to use this provider, see buy an SSL certificate with RapidSSL for instructions.","title":"Acquire SSL Certificate"},{"location":"applications/ssl-certificates/#dns-and-domain-configuration","text":"Once the SSL certificate is provisioned and your cert is confirmed, you must route requests for your domain through Drycc. Unless you've already done so, add the domain specified when generating the CSR to your app with: $ drycc domains:add www.example.com -a foo Adding www.example.com to foo... done","title":"DNS and Domain Configuration"},{"location":"applications/ssl-certificates/#add-a-certificate","text":"Add your certificate, any intermediate certificates, and private key to the endpoint with the certs:add command. $ drycc certs:add example-com server.crt server.key Adding SSL endpoint... done www.example.com Note The name given to the certificate can only contain a-z (lowercase), 0-9 and hyphens The Drycc platform will investigate the certificate and extract any relevant information from it such as the Common Name, Subject Alt Names (SAN), fingerprint and more. This allows for wildcard certificates and multiple domains in the SAN without uploading duplicates.","title":"Add a Certificate"},{"location":"applications/ssl-certificates/#add-a-certificate-chain","text":"Sometimes, your certificates (such as a self-signed or a cheap certificate) need additional certificates to establish the chain of trust. What you need to do is bundle all the certificates into one file and give that to Drycc. Importantly, your site\u2019s certificate must be the first one: $ cat server.crt server.ca > server.bundle After that, you can add them to Drycc with the certs:add command: $ drycc certs:add example-com server.bundle server.key Adding SSL endpoint... done www.example.com","title":"Add a Certificate Chain"},{"location":"applications/ssl-certificates/#attach-ssl-certificate-to-a-domain","text":"Certificates are not automagically connected up to domains, instead you will have to attach a certificate to a domain $ drycc certs:attach example-com example.com Each certificate can be connected to many domains. There is no need to upload duplicates. To remove an association $ drycc certs:detach example-com example.com","title":"Attach SSL certificate to a domain"},{"location":"applications/ssl-certificates/#endpoint-overview","text":"You can verify the details of your domain's SSL configuration with drycc certs . $ drycc certs Name | Common Name | SubjectAltName | Expires | Fingerprint | Domains | Updated | Created +-------------+-------------------+-------------------+-------------------------+-----------------+--------------+-------------+-------------+ example-com | example.com | blog.example.com | 31 Dec 2017 (in 1 year) | 8F:8E[...]CD:EB | example.com | 30 Jan 2016 | 29 Jan 2016 or by looking at at each certificates detailed information $ drycc certs:info example-com === bar-com Certificate Common Name(s): example.com Expires At: 2017-01-14 23:57:57 +0000 UTC Starts At: 2016-01-15 23:57:57 +0000 UTC Fingerprint: 7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0 Subject Alt Name: blog.example.com Issuer: /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc Subject: /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc Connected Domains: example.com Owner: admin-user Created: 2016-01-28 19:07:41 +0000 UTC Updated: 2016-01-30 00:10:02 +0000 UTC","title":"Endpoint overview"},{"location":"applications/ssl-certificates/#testing-ssl","text":"Use a command line utility like curl to test that everything is configured correctly for your secure domain. Note The -k option flag tells curl to ignore untrusted certificates. Pay attention to the output. It should print SSL certificate verify ok . If it prints something like common name: www.example.com (does not match 'www.somedomain.com') then something is not configured correctly.","title":"Testing SSL"},{"location":"applications/ssl-certificates/#enforcing-ssl-at-the-router","text":"To enforce all HTTP requests be redirected to HTTPS, TLS can be enforced at the router level by running $ drycc tls:force:enable -a foo Enabling https-only requests for foo... done Users hitting the HTTP endpoint for the application will now receive a 301 redirect to the HTTPS endpoint. To disable enforced TLS, run $ drycc tls:force:disable -a foo Disabling https-only requests for foo... done","title":"Enforcing SSL at the Router"},{"location":"applications/ssl-certificates/#automated-certificate-management","text":"With Automated Certificate Management (ACM), Drycc automatically manages TLS certificates for apps with Hobby and Professional dynos on the Common Runtime, and for apps in Private Spaces that enable the feature. Certificates handled by ACM automatically renew one month before they expire, and new certificates are created automatically whenever you add or remove a custom domain. All applications with paid dynos include ACM for free. Automated Certificate Management uses Let\u2019s Encrypt, the free, automated, and open certificate authority for managing your application\u2019s TLS certificates. Let\u2019s Encrypt is run for the public benefit by the Internet Security Research Group (ISRG). To enable ACM with the following command: $ drycc tls:auto:enable -a foo To disable ACM with the following command: $ drycc tls:auto:disable -a foo","title":"Automated Certificate Management"},{"location":"applications/ssl-certificates/#remove-certificate","text":"You can remove a certificate using the certs:remove command: $ drycc certs:remove my-cert Removing www.example.com... Done.","title":"Remove Certificate"},{"location":"applications/ssl-certificates/#swapping-out-certificates","text":"Over the lifetime of an application an operator will have to acquire certificates with new expire dates and apply it to all relevant applications, below is the recommended way to swap out certificates. Be intentional with certificate names, name them example-com-2017 when possible, where the year signifies the expiry year. This allows for example-com-2018 when a new certificate is purchased. Assuming all applications are already using example-com-2017 the following commands can be ran, chained together or otherwise: $ drycc certs:detach example-com-2017 example.com $ drycc certs:attach example-com-2018 example.com This will take care of a singular domain which allows the operator to verify everything went as planned and slowly roll it out to any other application using the same method.","title":"Swapping out certificates"},{"location":"applications/ssl-certificates/#troubleshooting","text":"Here are some steps you can follow if your SSL endpoint is not working as you'd expect.","title":"Troubleshooting"},{"location":"applications/ssl-certificates/#untrusted-certificate","text":"In some cases when accessing the SSL endpoint, it may list your certificate as untrusted. If this occurs, it may be because it is not trusted by Mozilla\u2019s list of root CAs . If this is the case, your certificate may be considered untrusted for many browsers. If you have uploaded a certificate that was signed by a root authority but you get the message that it is not trusted, then something is wrong with the certificate. For example, it may be missing intermediary certificates . If so, download the intermediary certificates from your SSL provider, remove the certificate from Drycc and re-run the certs:add command.","title":"Untrusted Certificate"},{"location":"applications/using-buildpacks/","text":"Using Buildpacks \u00b6 Drycc supports deploying applications via Cloud Native Buildpacks . Cloud Native Buildpacks are useful if you want to follow cnb's docs for building applications. Add SSH Key \u00b6 For Buildpack based application deploys via git push , Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user. See this document for instructions on how to generate an SSH key. Run drycc keys:add to upload your SSH key to Drycc Workflow. $ drycc keys:add ~/.ssh/id_drycc.pub Uploading id_drycc.pub to drycc... done Read more about adding/removing SSH Keys here . Prepare an Application \u00b6 If you do not have an existing application, you can clone an example application that demonstrates the Heroku Buildpack workflow. $ git clone https://github.com/drycc/example-go.git $ cd example-go Create an Application \u00b6 Use drycc create to create an application on the Controller . $ drycc create Creating application... done, created skiing-keypunch Git remote drycc added Push to Deploy \u00b6 Use git push drycc master to deploy your application. $ git push drycc master Counting objects: 75, done. Delta compression using up to 8 threads. Compressing objects: 100% (48/48), done. Writing objects: 100% (75/75), 18.28 KiB | 0 bytes/s, done. Total 75 (delta 30), reused 58 (delta 22) remote: ---> Starting build... but first, coffee! ---> Waiting podman running. ---> Process podman started. ---> Waiting caddy running. ---> Process caddy started. ---> Building pack ---> Using builder registry.drycc.cc/drycc/buildpacks:bookworm Builder 'registry.drycc.cc/drycc/buildpacks:bookworm' is trusted Pulling image 'registry.drycc.cc/drycc/buildpacks:bookworm' Resolving \"drycc/buildpacks\" using unqualified-search registries (/etc/containers/registries.conf) Trying to pull registry.drycc.cc/drycc/buildpacks:bookworm... Getting image source signatures ... ---> Skip generate base layer ---> Python Buildpack ---> Downloading and extracting Python 3.10.0 ---> Installing requirements with pip Collecting Django==3.2.8 Downloading Django-3.2.8-py3-none-any.whl (7.9 MB) Collecting gunicorn==20.1.0 Downloading gunicorn-20.1.0-py3-none-any.whl (79 kB) Collecting sqlparse>=0.2.2 Downloading sqlparse-0.4.2-py3-none-any.whl (42 kB) Collecting pytz Downloading pytz-2021.3-py2.py3-none-any.whl (503 kB) Collecting asgiref<4,>=3.3.2 Downloading asgiref-3.4.1-py3-none-any.whl (25 kB) Requirement already satisfied: setuptools>=3.0 in /layers/drycc_python/python/lib/python3.10/site-packages (from gunicorn==20.1.0->-r requirements.txt (line 2)) (57.5.0) Installing collected packages: sqlparse, pytz, asgiref, gunicorn, Django Successfully installed Django-3.2.8 asgiref-3.4.1 gunicorn-20.1.0 pytz-2021.3 sqlparse-0.4.2 ---> Generate Launcher ... Build complete. Launching App... ... Done, skiing-keypunch:v2 deployed to Workflow Use 'drycc open' to view this application in your browser To learn more, use 'drycc help' or visit https://www.drycc.cc To ssh://git@drycc.staging-2.drycc.cc:2222/skiing-keypunch.git * [new branch] master -> master $ curl -s http://skiing-keypunch.example.com Powered by Drycc Release v2 on skiing-keypunch-v2-web-02zb9 Because a Buildpacks-style application is detected, the web process type is automatically scaled to 1 on first deploy. Use drycc scale web=3 to increase web processes to 3, for example. Scaling a process type directly changes the number of pods running that process. Included Buildpacks \u00b6 For convenience, a number of buildpacks come bundled with Drycc: Go Buildpack Java Buildpack Nodejs Buildpack PHP Buildpack Python Buildpack Ruby Buildpack Rust Buildpack Drycc will cycle through the bin/detect script of each buildpack to match the code you are pushing. Note If you're testing against the [Scala Buildpack][], the Builder requires at least 512MB of free memory to execute the Scala Build Tool. Using a Custom Buildpack \u00b6 To use a custom buildpack, you need create a .pack_builder file in your root path app. $ tee > .pack_builder << EOF > registry.drycc.cc/drycc/buildpacks:bookworm > EOF On your next git push , the custom buildpack will be used. Using Private Repositories \u00b6 To pull code from private repositories, set the SSH_KEY environment variable to a private key which has access. Use either the path of a private key file or the raw key material: $ drycc config:set SSH_KEY=/home/user/.ssh/id_rsa $ drycc config:set SSH_KEY=\"\"\"-----BEGIN RSA PRIVATE KEY----- (...) -----END RSA PRIVATE KEY-----\"\"\" For example, to use a custom buildpack hosted at a private GitHub URL, ensure that an SSH public key exists in your GitHub settings . Then set SSH_KEY to the corresponding SSH private key and set .pack_builder to the builder image: $ tee > .pack_builder << EOF > registry.drycc.cc/drycc/buildpacks:bookworm > EOF $ git add .buildpack $ git commit -m \"chore(buildpack): modify the pack_builder\" $ git push drycc master Builder selector \u00b6 Which way to build a project conforms to the following principles: If Dockerfile exists in the project, the stack uses container If Procfile exists in the project, the stack uses buildpack If both exist, container is used by default You can also set the DRYCC_STACK to container or buildpack determine which stack to use.","title":"Buildpacks"},{"location":"applications/using-buildpacks/#using-buildpacks","text":"Drycc supports deploying applications via Cloud Native Buildpacks . Cloud Native Buildpacks are useful if you want to follow cnb's docs for building applications.","title":"Using Buildpacks"},{"location":"applications/using-buildpacks/#add-ssh-key","text":"For Buildpack based application deploys via git push , Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user. See this document for instructions on how to generate an SSH key. Run drycc keys:add to upload your SSH key to Drycc Workflow. $ drycc keys:add ~/.ssh/id_drycc.pub Uploading id_drycc.pub to drycc... done Read more about adding/removing SSH Keys here .","title":"Add SSH Key"},{"location":"applications/using-buildpacks/#prepare-an-application","text":"If you do not have an existing application, you can clone an example application that demonstrates the Heroku Buildpack workflow. $ git clone https://github.com/drycc/example-go.git $ cd example-go","title":"Prepare an Application"},{"location":"applications/using-buildpacks/#create-an-application","text":"Use drycc create to create an application on the Controller . $ drycc create Creating application... done, created skiing-keypunch Git remote drycc added","title":"Create an Application"},{"location":"applications/using-buildpacks/#push-to-deploy","text":"Use git push drycc master to deploy your application. $ git push drycc master Counting objects: 75, done. Delta compression using up to 8 threads. Compressing objects: 100% (48/48), done. Writing objects: 100% (75/75), 18.28 KiB | 0 bytes/s, done. Total 75 (delta 30), reused 58 (delta 22) remote: ---> Starting build... but first, coffee! ---> Waiting podman running. ---> Process podman started. ---> Waiting caddy running. ---> Process caddy started. ---> Building pack ---> Using builder registry.drycc.cc/drycc/buildpacks:bookworm Builder 'registry.drycc.cc/drycc/buildpacks:bookworm' is trusted Pulling image 'registry.drycc.cc/drycc/buildpacks:bookworm' Resolving \"drycc/buildpacks\" using unqualified-search registries (/etc/containers/registries.conf) Trying to pull registry.drycc.cc/drycc/buildpacks:bookworm... Getting image source signatures ... ---> Skip generate base layer ---> Python Buildpack ---> Downloading and extracting Python 3.10.0 ---> Installing requirements with pip Collecting Django==3.2.8 Downloading Django-3.2.8-py3-none-any.whl (7.9 MB) Collecting gunicorn==20.1.0 Downloading gunicorn-20.1.0-py3-none-any.whl (79 kB) Collecting sqlparse>=0.2.2 Downloading sqlparse-0.4.2-py3-none-any.whl (42 kB) Collecting pytz Downloading pytz-2021.3-py2.py3-none-any.whl (503 kB) Collecting asgiref<4,>=3.3.2 Downloading asgiref-3.4.1-py3-none-any.whl (25 kB) Requirement already satisfied: setuptools>=3.0 in /layers/drycc_python/python/lib/python3.10/site-packages (from gunicorn==20.1.0->-r requirements.txt (line 2)) (57.5.0) Installing collected packages: sqlparse, pytz, asgiref, gunicorn, Django Successfully installed Django-3.2.8 asgiref-3.4.1 gunicorn-20.1.0 pytz-2021.3 sqlparse-0.4.2 ---> Generate Launcher ... Build complete. Launching App... ... Done, skiing-keypunch:v2 deployed to Workflow Use 'drycc open' to view this application in your browser To learn more, use 'drycc help' or visit https://www.drycc.cc To ssh://git@drycc.staging-2.drycc.cc:2222/skiing-keypunch.git * [new branch] master -> master $ curl -s http://skiing-keypunch.example.com Powered by Drycc Release v2 on skiing-keypunch-v2-web-02zb9 Because a Buildpacks-style application is detected, the web process type is automatically scaled to 1 on first deploy. Use drycc scale web=3 to increase web processes to 3, for example. Scaling a process type directly changes the number of pods running that process.","title":"Push to Deploy"},{"location":"applications/using-buildpacks/#included-buildpacks","text":"For convenience, a number of buildpacks come bundled with Drycc: Go Buildpack Java Buildpack Nodejs Buildpack PHP Buildpack Python Buildpack Ruby Buildpack Rust Buildpack Drycc will cycle through the bin/detect script of each buildpack to match the code you are pushing. Note If you're testing against the [Scala Buildpack][], the Builder requires at least 512MB of free memory to execute the Scala Build Tool.","title":"Included Buildpacks"},{"location":"applications/using-buildpacks/#using-a-custom-buildpack","text":"To use a custom buildpack, you need create a .pack_builder file in your root path app. $ tee > .pack_builder << EOF > registry.drycc.cc/drycc/buildpacks:bookworm > EOF On your next git push , the custom buildpack will be used.","title":"Using a Custom Buildpack"},{"location":"applications/using-buildpacks/#using-private-repositories","text":"To pull code from private repositories, set the SSH_KEY environment variable to a private key which has access. Use either the path of a private key file or the raw key material: $ drycc config:set SSH_KEY=/home/user/.ssh/id_rsa $ drycc config:set SSH_KEY=\"\"\"-----BEGIN RSA PRIVATE KEY----- (...) -----END RSA PRIVATE KEY-----\"\"\" For example, to use a custom buildpack hosted at a private GitHub URL, ensure that an SSH public key exists in your GitHub settings . Then set SSH_KEY to the corresponding SSH private key and set .pack_builder to the builder image: $ tee > .pack_builder << EOF > registry.drycc.cc/drycc/buildpacks:bookworm > EOF $ git add .buildpack $ git commit -m \"chore(buildpack): modify the pack_builder\" $ git push drycc master","title":"Using Private Repositories"},{"location":"applications/using-buildpacks/#builder-selector","text":"Which way to build a project conforms to the following principles: If Dockerfile exists in the project, the stack uses container If Procfile exists in the project, the stack uses buildpack If both exist, container is used by default You can also set the DRYCC_STACK to container or buildpack determine which stack to use.","title":"Builder selector"},{"location":"applications/using-container-images/","text":"Using Docker Images \u00b6 Drycc supports deploying applications via an existing Docker Image . This is useful for integrating Drycc into Docker-based CI/CD pipelines. Prepare an Application \u00b6 Start by cloning an example application: $ git clone https://github.com/drycc/example-dockerfile-http.git $ cd example-dockerfile-http Next use your local docker client to build the image and push it to DockerHub . $ docker build -t /example-dockerfile-http . $ docker push /example-dockerfile-http Docker Image Requirements \u00b6 In order to deploy Docker images, they must conform to the following requirements: The Dockerfile must use the EXPOSE directive to expose exactly one port. That port must be listening for an HTTP connection. The Dockerfile must use the CMD directive to define the default process that will run within the container. The Docker image must contain bash to run processes. Note Note that if you are using a private registry of any kind ( gcr or other) the application environment must include a $PORT config variable that matches the EXPOSE 'd port, example: drycc config:set PORT=5000 . See Configuring Registry for more info. Create an Application \u00b6 Use drycc create to create an application on the controller . $ mkdir -p /tmp/example-dockerfile-http && cd /tmp/example-dockerfile-http $ drycc create example-dockerfile-http --no-remote Creating application... done, created example-dockerfile-http Note For all commands except for drycc create , the drycc client uses the name of the current directory as the app name if you don't specify it explicitly with --app . Deploy the Application \u00b6 Use drycc pull to deploy your application from DockerHub or a public registry. $ drycc pull /example-dockerfile-http:latest Creating build... done, v2 $ curl -s http://example-dockerfile-http.local3.dryccapp.com Powered by Drycc Because you are deploying a Docker image, the cmd process type is automatically scaled to 1 on first deploy. Use drycc scale cmd=3 to increase cmd processes to 3, for example. Scaling a process type directly changes the number of Containers running that process. Private Registry \u00b6 To deploy Docker images from a private registry or from a private repository, use drycc registry to attach credentials to your application. These credentials are the same as you'd use when running docker login at your private registry. To deploy private Docker images, take the following steps: Gather the username and password for the registry, such as a Quay.io Robot Account or a GCR.io Long Lived Token Run drycc registry:set username= password= -a Now perform drycc pull as normal, against an image in the private registry When using a GCR.io Long Lived Token , the JSON blob will have to be compacted first using a tool like jq and then used in the password field in drycc registry:set . For the username, use _json_key . For example: drycc registry:set username=_json_key password=\"$(cat google_cloud_cred.json | jq -c .)\" When using a private registry the docker images are no longer pulled into the Drycc Internal Registry via the Drycc Workflow Controller but rather is managed by Kubernetes. This will increase security and overall speed, however the application port information can no longer be discovered. Instead the application port information can be set via drycc config:set PORT=80 prior to setting the registry information. Note Currently GCR.io and ECR in short lived auth token mode are not supported.","title":"Container Images"},{"location":"applications/using-container-images/#using-docker-images","text":"Drycc supports deploying applications via an existing Docker Image . This is useful for integrating Drycc into Docker-based CI/CD pipelines.","title":"Using Docker Images"},{"location":"applications/using-container-images/#prepare-an-application","text":"Start by cloning an example application: $ git clone https://github.com/drycc/example-dockerfile-http.git $ cd example-dockerfile-http Next use your local docker client to build the image and push it to DockerHub . $ docker build -t /example-dockerfile-http . $ docker push /example-dockerfile-http","title":"Prepare an Application"},{"location":"applications/using-container-images/#docker-image-requirements","text":"In order to deploy Docker images, they must conform to the following requirements: The Dockerfile must use the EXPOSE directive to expose exactly one port. That port must be listening for an HTTP connection. The Dockerfile must use the CMD directive to define the default process that will run within the container. The Docker image must contain bash to run processes. Note Note that if you are using a private registry of any kind ( gcr or other) the application environment must include a $PORT config variable that matches the EXPOSE 'd port, example: drycc config:set PORT=5000 . See Configuring Registry for more info.","title":"Docker Image Requirements"},{"location":"applications/using-container-images/#create-an-application","text":"Use drycc create to create an application on the controller . $ mkdir -p /tmp/example-dockerfile-http && cd /tmp/example-dockerfile-http $ drycc create example-dockerfile-http --no-remote Creating application... done, created example-dockerfile-http Note For all commands except for drycc create , the drycc client uses the name of the current directory as the app name if you don't specify it explicitly with --app .","title":"Create an Application"},{"location":"applications/using-container-images/#deploy-the-application","text":"Use drycc pull to deploy your application from DockerHub or a public registry. $ drycc pull /example-dockerfile-http:latest Creating build... done, v2 $ curl -s http://example-dockerfile-http.local3.dryccapp.com Powered by Drycc Because you are deploying a Docker image, the cmd process type is automatically scaled to 1 on first deploy. Use drycc scale cmd=3 to increase cmd processes to 3, for example. Scaling a process type directly changes the number of Containers running that process.","title":"Deploy the Application"},{"location":"applications/using-container-images/#private-registry","text":"To deploy Docker images from a private registry or from a private repository, use drycc registry to attach credentials to your application. These credentials are the same as you'd use when running docker login at your private registry. To deploy private Docker images, take the following steps: Gather the username and password for the registry, such as a Quay.io Robot Account or a GCR.io Long Lived Token Run drycc registry:set username= password= -a Now perform drycc pull as normal, against an image in the private registry When using a GCR.io Long Lived Token , the JSON blob will have to be compacted first using a tool like jq and then used in the password field in drycc registry:set . For the username, use _json_key . For example: drycc registry:set username=_json_key password=\"$(cat google_cloud_cred.json | jq -c .)\" When using a private registry the docker images are no longer pulled into the Drycc Internal Registry via the Drycc Workflow Controller but rather is managed by Kubernetes. This will increase security and overall speed, however the application port information can no longer be discovered. Instead the application port information can be set via drycc config:set PORT=80 prior to setting the registry information. Note Currently GCR.io and ECR in short lived auth token mode are not supported.","title":"Private Registry"},{"location":"applications/using-dockerfiles/","text":"Using Dockerfiles \u00b6 Drycc supports deploying applications via Dockerfiles. A Dockerfile automates the steps for crafting a [Container Image][]. Dockerfiles are incredibly powerful but require some extra work to define your exact application runtime environment. Add SSH Key \u00b6 For Dockerfile based application deploys via git push , Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user. See this document for instructions on how to generate an SSH key. Run drycc keys:add to upload your SSH key to Drycc Workflow. $ drycc keys:add ~/.ssh/id_drycc.pub Uploading id_drycc.pub to drycc... done Read more about adding/removing SSH Keys here . Prepare an Application \u00b6 If you do not have an existing application, you can clone an example application that demonstrates the Dockerfile workflow. $ git clone https://github.com/drycc/helloworld.git $ cd helloworld Dockerfile Requirements \u00b6 In order to deploy Dockerfile applications, they must conform to the following requirements: The Dockerfile must use the EXPOSE directive to expose exactly one port. That port must be listening for an HTTP connection. The Dockerfile must use the CMD directive to define the default process that will run within the container. The Container image must contain bash to run processes. Note Note that if you are using a private registry of any kind ( gcr or other) the application environment must include a $PORT config variable that matches the EXPOSE 'd port, example: drycc config:set PORT=5000 . See Configuring Registry for more info. Create an Application \u00b6 Use drycc create to create an application on the Controller . $ drycc create Creating application... done, created folksy-offshoot Git remote drycc added Push to Deploy \u00b6 Use git push drycc master to deploy your application. $ git push drycc master Counting objects: 13, done. Delta compression using up to 8 threads. Compressing objects: 100% (13/13), done. Writing objects: 100% (13/13), 1.99 KiB | 0 bytes/s, done. Total 13 (delta 2), reused 0 (delta 0) -----> Building Docker image Uploading context 4.096 kB Uploading context Step 0 : FROM drycc/base:latest ---> 60024338bc63 Step 1 : RUN wget -O /tmp/go1.2.1.linux-amd64.tar.gz -q https://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz ---> Using cache ---> cf9ef8c5caa7 Step 2 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz ---> Using cache ---> 515b1faf3bd8 Step 3 : RUN mkdir -p /go ---> Using cache ---> ebf4927a00e9 Step 4 : ENV GOPATH /go ---> Using cache ---> c6a276eded37 Step 5 : ENV PATH /usr/local/go/bin:/go/bin:$PATH ---> Using cache ---> 2ba6f6c9f108 Step 6 : ADD . /go/src/github.com/drycc/helloworld ---> 94ab7f4b977b Removing intermediate container 171b7d9fdb34 Step 7 : RUN cd /go/src/github.com/drycc/helloworld && go install -v . ---> Running in 0c8fbb2d2812 github.com/drycc/helloworld ---> 13b5af931393 Removing intermediate container 0c8fbb2d2812 Step 8 : ENV PORT 80 ---> Running in 9b07da36a272 ---> 2dce83167874 Removing intermediate container 9b07da36a272 Step 9 : CMD [\"/go/bin/helloworld\"] ---> Running in f7b215199940 ---> b1e55ce5195a Removing intermediate container f7b215199940 Step 10 : EXPOSE 80 ---> Running in 7eb8ec45dcb0 ---> ea1a8cc93ca3 Removing intermediate container 7eb8ec45dcb0 Successfully built ea1a8cc93ca3 -----> Pushing image to private registry Launching... done, v2 -----> folksy-offshoot deployed to Drycc http://folksy-offshoot.local3.dryccapp.com To learn more, use `drycc help` or visit https://www.drycc.cc To ssh://git@local3.dryccapp.com:2222/folksy-offshoot.git * [new branch] master -> master $ curl -s http://folksy-offshoot.local3.dryccapp.com Welcome to Drycc! See the documentation at http://docs.drycc.cc/ for more information. Because a Dockerfile application is detected, the cmd process type is automatically scaled to 1 on first deploy. Use drycc scale cmd=3 to increase cmd processes to 3, for example. Scaling a process type directly changes the number of containers running that process. Container Build Arguments \u00b6 As of Workflow v2.13.0, users can inject their application config into the Container image using Container build arguments . To opt into this, users must add a new environment variable to their application: $ drycc config:set DRYCC_DOCKER_BUILD_ARGS_ENABLED=1 Every environment variable set with drycc config:set will then be available for use inside the user's Dockerfile. For example, if a user runs drycc config:set POWERED_BY=Workflow , the user can utilize that build argument in their Dockerfile: ARG POWERED_BY RUN echo \"Powered by $POWERED_BY\" > /etc/motd","title":"Dockerfiles"},{"location":"applications/using-dockerfiles/#using-dockerfiles","text":"Drycc supports deploying applications via Dockerfiles. A Dockerfile automates the steps for crafting a [Container Image][]. Dockerfiles are incredibly powerful but require some extra work to define your exact application runtime environment.","title":"Using Dockerfiles"},{"location":"applications/using-dockerfiles/#add-ssh-key","text":"For Dockerfile based application deploys via git push , Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user. See this document for instructions on how to generate an SSH key. Run drycc keys:add to upload your SSH key to Drycc Workflow. $ drycc keys:add ~/.ssh/id_drycc.pub Uploading id_drycc.pub to drycc... done Read more about adding/removing SSH Keys here .","title":"Add SSH Key"},{"location":"applications/using-dockerfiles/#prepare-an-application","text":"If you do not have an existing application, you can clone an example application that demonstrates the Dockerfile workflow. $ git clone https://github.com/drycc/helloworld.git $ cd helloworld","title":"Prepare an Application"},{"location":"applications/using-dockerfiles/#dockerfile-requirements","text":"In order to deploy Dockerfile applications, they must conform to the following requirements: The Dockerfile must use the EXPOSE directive to expose exactly one port. That port must be listening for an HTTP connection. The Dockerfile must use the CMD directive to define the default process that will run within the container. The Container image must contain bash to run processes. Note Note that if you are using a private registry of any kind ( gcr or other) the application environment must include a $PORT config variable that matches the EXPOSE 'd port, example: drycc config:set PORT=5000 . See Configuring Registry for more info.","title":"Dockerfile Requirements"},{"location":"applications/using-dockerfiles/#create-an-application","text":"Use drycc create to create an application on the Controller . $ drycc create Creating application... done, created folksy-offshoot Git remote drycc added","title":"Create an Application"},{"location":"applications/using-dockerfiles/#push-to-deploy","text":"Use git push drycc master to deploy your application. $ git push drycc master Counting objects: 13, done. Delta compression using up to 8 threads. Compressing objects: 100% (13/13), done. Writing objects: 100% (13/13), 1.99 KiB | 0 bytes/s, done. Total 13 (delta 2), reused 0 (delta 0) -----> Building Docker image Uploading context 4.096 kB Uploading context Step 0 : FROM drycc/base:latest ---> 60024338bc63 Step 1 : RUN wget -O /tmp/go1.2.1.linux-amd64.tar.gz -q https://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz ---> Using cache ---> cf9ef8c5caa7 Step 2 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz ---> Using cache ---> 515b1faf3bd8 Step 3 : RUN mkdir -p /go ---> Using cache ---> ebf4927a00e9 Step 4 : ENV GOPATH /go ---> Using cache ---> c6a276eded37 Step 5 : ENV PATH /usr/local/go/bin:/go/bin:$PATH ---> Using cache ---> 2ba6f6c9f108 Step 6 : ADD . /go/src/github.com/drycc/helloworld ---> 94ab7f4b977b Removing intermediate container 171b7d9fdb34 Step 7 : RUN cd /go/src/github.com/drycc/helloworld && go install -v . ---> Running in 0c8fbb2d2812 github.com/drycc/helloworld ---> 13b5af931393 Removing intermediate container 0c8fbb2d2812 Step 8 : ENV PORT 80 ---> Running in 9b07da36a272 ---> 2dce83167874 Removing intermediate container 9b07da36a272 Step 9 : CMD [\"/go/bin/helloworld\"] ---> Running in f7b215199940 ---> b1e55ce5195a Removing intermediate container f7b215199940 Step 10 : EXPOSE 80 ---> Running in 7eb8ec45dcb0 ---> ea1a8cc93ca3 Removing intermediate container 7eb8ec45dcb0 Successfully built ea1a8cc93ca3 -----> Pushing image to private registry Launching... done, v2 -----> folksy-offshoot deployed to Drycc http://folksy-offshoot.local3.dryccapp.com To learn more, use `drycc help` or visit https://www.drycc.cc To ssh://git@local3.dryccapp.com:2222/folksy-offshoot.git * [new branch] master -> master $ curl -s http://folksy-offshoot.local3.dryccapp.com Welcome to Drycc! See the documentation at http://docs.drycc.cc/ for more information. Because a Dockerfile application is detected, the cmd process type is automatically scaled to 1 on first deploy. Use drycc scale cmd=3 to increase cmd processes to 3, for example. Scaling a process type directly changes the number of containers running that process.","title":"Push to Deploy"},{"location":"applications/using-dockerfiles/#container-build-arguments","text":"As of Workflow v2.13.0, users can inject their application config into the Container image using Container build arguments . To opt into this, users must add a new environment variable to their application: $ drycc config:set DRYCC_DOCKER_BUILD_ARGS_ENABLED=1 Every environment variable set with drycc config:set will then be available for use inside the user's Dockerfile. For example, if a user runs drycc config:set POWERED_BY=Workflow , the user can utilize that build argument in their Dockerfile: ARG POWERED_BY RUN echo \"Powered by $POWERED_BY\" > /etc/motd","title":"Container Build Arguments"},{"location":"changelogs/v1.0.1/","text":"The time has come for major release! We are proud to present Drycc Workflow 1.0.1 to the world. In this release, we've added a lot of new features. You can download one of our pre-built binaries from our downloads page - make sure to select the correct platform! For further details on how to install, follow our installation guide. We\u2019d like to thank all of our backers on Open Collective, who are helping us deliver a better piece of software. With that out of the way, here\u2019s what\u2019s new in Drycc version 1.0.1: substituting minio-mc for object-storage using wal-g instead of wal-e some scenarios use dep instead of glide minio adds gateway mode adding aliyun oss support In the future, we have many exciting plans, for example: Use kubernetes ingress instead of drycc-router Automatic certificate generation using cert-manager Replace golang's package management glide with dep Support for the latest version of the kubernetes API Coming soon...","title":"v1.0.1"},{"location":"changelogs/v1.1.0/","text":"Workflow ## v1.0.0 -> v1.1.0 \u00b6 Releases \u00b6 builder v1.0.0 -> v1.0.1 controller v1.0.0 -> v1.1.0 database v1.0.0 -> v1.0.1 monitor v1.0.0 -> v1.0.1 registry-proxy v1.0.0 -> v1.0.1 Features \u00b6 69c8e12 (controller) - docker: use python:3.7-alpine replace drycc/base 6a3e70c (controller) - gunicorn: use process replace threads e63cbb5 (controller) - ingress: Improving the configuration of ingress 76f75dc (controller) - charts: add rbac to cert-manager 6807b2c (controller) - certificate: add cert-manager certificate api Fixes \u00b6 f53d89e (controller) - controller: check_image_access only when using docker 896775a (controller) - docker: multiprocess should not be used in docker ecdaf9f (controller) - app: can't create app e00af7e (controller) - tls: add migrations for certs_auto_enabled Style \u00b6 bdbb7e6 (controller) - pep8: Use pep8-compliant code style Test case \u00b6 c5b5a9d (controller) - ingress: add tests to ingress Maintenance \u00b6 62a9b7d (builder) - workflow: change experimental_native_ingress to use_native_ingress 39e9cec (builder) - ingress: renmae use_native_ingress to use_ingress 7fa8134 (builder) - ingress: change global.use_ingress to ingress.enabled e245c31 (builder) - ingress: use ingressClass 18b330d (builder) - service: no longer dependent on ingress switches 95f4d3d (controller) - django: upgrade to django version 1.11.20 latest patch 6bcd79b (controller) - workflow: change experimental_native_ingress to use_native_ingress 781229a (controller) - ingress: renmae use_native_ingress to use_ingress b96b4db (controller) - ingress: change global.use_ingress to ingress.enabled e1b124f (controller) - ingress: use ingressClass fee0554 (controller) - ingress: delete ingress judgment 5cd10f3 (controller) - ingress: Ingress_class can be empty fa312bb (database) - postgres: set max_connections = 1024 c1ee2a4 (monitor) - monitor: remove copyrights.tar.gz e088da3 (registry-proxy) - ingress: renmae use_native_ingress to use_ingress","title":"v1.1.0"},{"location":"changelogs/v1.1.0/#workflow-v100-v110","text":"","title":"Workflow ## v1.0.0 -> v1.1.0"},{"location":"changelogs/v1.1.0/#releases","text":"builder v1.0.0 -> v1.0.1 controller v1.0.0 -> v1.1.0 database v1.0.0 -> v1.0.1 monitor v1.0.0 -> v1.0.1 registry-proxy v1.0.0 -> v1.0.1","title":"Releases"},{"location":"changelogs/v1.1.0/#features","text":"69c8e12 (controller) - docker: use python:3.7-alpine replace drycc/base 6a3e70c (controller) - gunicorn: use process replace threads e63cbb5 (controller) - ingress: Improving the configuration of ingress 76f75dc (controller) - charts: add rbac to cert-manager 6807b2c (controller) - certificate: add cert-manager certificate api","title":"Features"},{"location":"changelogs/v1.1.0/#fixes","text":"f53d89e (controller) - controller: check_image_access only when using docker 896775a (controller) - docker: multiprocess should not be used in docker ecdaf9f (controller) - app: can't create app e00af7e (controller) - tls: add migrations for certs_auto_enabled","title":"Fixes"},{"location":"changelogs/v1.1.0/#style","text":"bdbb7e6 (controller) - pep8: Use pep8-compliant code style","title":"Style"},{"location":"changelogs/v1.1.0/#test-case","text":"c5b5a9d (controller) - ingress: add tests to ingress","title":"Test case"},{"location":"changelogs/v1.1.0/#maintenance","text":"62a9b7d (builder) - workflow: change experimental_native_ingress to use_native_ingress 39e9cec (builder) - ingress: renmae use_native_ingress to use_ingress 7fa8134 (builder) - ingress: change global.use_ingress to ingress.enabled e245c31 (builder) - ingress: use ingressClass 18b330d (builder) - service: no longer dependent on ingress switches 95f4d3d (controller) - django: upgrade to django version 1.11.20 latest patch 6bcd79b (controller) - workflow: change experimental_native_ingress to use_native_ingress 781229a (controller) - ingress: renmae use_native_ingress to use_ingress b96b4db (controller) - ingress: change global.use_ingress to ingress.enabled e1b124f (controller) - ingress: use ingressClass fee0554 (controller) - ingress: delete ingress judgment 5cd10f3 (controller) - ingress: Ingress_class can be empty fa312bb (database) - postgres: set max_connections = 1024 c1ee2a4 (monitor) - monitor: remove copyrights.tar.gz e088da3 (registry-proxy) - ingress: renmae use_native_ingress to use_ingress","title":"Maintenance"},{"location":"changelogs/v1.2.0/","text":"Workflow ## v1.1.0 -> v1.2.0 \u00b6 Releases \u00b6 builder v1.0.1 -> v1.0.2 slugbuilder v1.0.0 -> v1.1.0 imagebuilder v1.0.0 -> v1.1.0 controller v1.1.0 -> v1.2.0 slugrunner v1.0.0 -> v1.1.0 registry v1.0.0 -> v1.0.1 registry-proxy v1.0.1 -> v1.0.2 Features \u00b6 e5584e3 (controller) - controller: add STACK support ad34dc1 (imagebuilder) - kaniko: use kaniko replace docker-py b81430e (imagebuilder) - imagebuilder: change image to image.json format 60dde96 (slugbuilder) - slugbuilder: add STACK support fe8b6e5 (slugrunner) - slugrunner: add STACK support Maintenance \u00b6 942f050 (builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORT ff7a16f (builder) - registry: remove ecr and gcr registry ad13683 (builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK 6def637 (builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY 5044e22 (builder) - registry: remove registrySecretPrefix 2ea39cc (builder) - controller-go-sdk: upgrade controller-go-sdk 6aee0d7 (builder) - registry: optimizing variable naming f9c62d9 (controller) - domain: added reserved domain check f5a135b (controller) - migrations: clean old migrations 4369b2c (controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY 1057ca5 (controller) - registry: remove registrySecretPrefix d114b3e (controller) - docker: update docker client edbe963 (imagebuilder) - dockerfile: change base image to alpine fb35baf (imagebuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY 946dbf6 (imagebuilder) - docker: remove insecure support 628d853 (imagebuilder) - proxy: add registry proxy ff27cbd (registry) - env: remove unused env 7204d72 (registry-proxy) - registry: optimizing variable naming","title":"v1.2.0"},{"location":"changelogs/v1.2.0/#workflow-v110-v120","text":"","title":"Workflow ## v1.1.0 -> v1.2.0"},{"location":"changelogs/v1.2.0/#releases","text":"builder v1.0.1 -> v1.0.2 slugbuilder v1.0.0 -> v1.1.0 imagebuilder v1.0.0 -> v1.1.0 controller v1.1.0 -> v1.2.0 slugrunner v1.0.0 -> v1.1.0 registry v1.0.0 -> v1.0.1 registry-proxy v1.0.1 -> v1.0.2","title":"Releases"},{"location":"changelogs/v1.2.0/#features","text":"e5584e3 (controller) - controller: add STACK support ad34dc1 (imagebuilder) - kaniko: use kaniko replace docker-py b81430e (imagebuilder) - imagebuilder: change image to image.json format 60dde96 (slugbuilder) - slugbuilder: add STACK support fe8b6e5 (slugrunner) - slugrunner: add STACK support","title":"Features"},{"location":"changelogs/v1.2.0/#maintenance","text":"942f050 (builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORT ff7a16f (builder) - registry: remove ecr and gcr registry ad13683 (builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK 6def637 (builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY 5044e22 (builder) - registry: remove registrySecretPrefix 2ea39cc (builder) - controller-go-sdk: upgrade controller-go-sdk 6aee0d7 (builder) - registry: optimizing variable naming f9c62d9 (controller) - domain: added reserved domain check f5a135b (controller) - migrations: clean old migrations 4369b2c (controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY 1057ca5 (controller) - registry: remove registrySecretPrefix d114b3e (controller) - docker: update docker client edbe963 (imagebuilder) - dockerfile: change base image to alpine fb35baf (imagebuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY 946dbf6 (imagebuilder) - docker: remove insecure support 628d853 (imagebuilder) - proxy: add registry proxy ff27cbd (registry) - env: remove unused env 7204d72 (registry-proxy) - registry: optimizing variable naming","title":"Maintenance"},{"location":"changelogs/v1.3.0/","text":"Workflow ## v1.2.0 -> v1.3.0 \u00b6 Releases \u00b6 builder v1.0.2 -> v1.1.0 slugbuilder v1.1.0 -> v1.1.1 imagebuilder v1.1.0 -> v1.1.1 controller v1.2.0 -> v1.2.1 slugrunner v1.1.0 -> v1.1.1 database v1.0.0 -> v1.0.1 fluentd v1.0.0 -> v1.0.1 minio v1.0.0 -> v1.0.1 monitor v1.0.0 -> v1.0.1 registry v1.0.1 -> v1.0.2 Features \u00b6 9c7cceb (builder) - builder: add app config to env Fixes \u00b6 7fe44fa (controller) - docker: docker timeout must be an int, float or None b196550 (controller) - controller: revert release.check_image_access for now Maintenance \u00b6 ef932c4 (builder) - controller-sdk-go: upgrade controller-sdk-go 4654cf6 (controller) - django-rest-framework: upgrade to 3.9.3 14121f1 (controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs 385acdc (controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfs fa312bb (database) - postgres: set max_connections = 1024 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z b8878f6 (imagebuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z b097451 (fluentd) - fluent: upgrade fluent to v1.4 4341f9a (minio) - mc: upgrade mc and minio c1ee2a4 (monitor) - monitor: remove copyrights.tar.gz 9854260 (registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z acc5627 (slugbuilder) - slugbuilder: internal support for multi buildpack d58907e (slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z b39a0c2 (slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z","title":"v1.3.0"},{"location":"changelogs/v1.3.0/#workflow-v120-v130","text":"","title":"Workflow ## v1.2.0 -> v1.3.0"},{"location":"changelogs/v1.3.0/#releases","text":"builder v1.0.2 -> v1.1.0 slugbuilder v1.1.0 -> v1.1.1 imagebuilder v1.1.0 -> v1.1.1 controller v1.2.0 -> v1.2.1 slugrunner v1.1.0 -> v1.1.1 database v1.0.0 -> v1.0.1 fluentd v1.0.0 -> v1.0.1 minio v1.0.0 -> v1.0.1 monitor v1.0.0 -> v1.0.1 registry v1.0.1 -> v1.0.2","title":"Releases"},{"location":"changelogs/v1.3.0/#features","text":"9c7cceb (builder) - builder: add app config to env","title":"Features"},{"location":"changelogs/v1.3.0/#fixes","text":"7fe44fa (controller) - docker: docker timeout must be an int, float or None b196550 (controller) - controller: revert release.check_image_access for now","title":"Fixes"},{"location":"changelogs/v1.3.0/#maintenance","text":"ef932c4 (builder) - controller-sdk-go: upgrade controller-sdk-go 4654cf6 (controller) - django-rest-framework: upgrade to 3.9.3 14121f1 (controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs 385acdc (controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfs fa312bb (database) - postgres: set max_connections = 1024 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z b8878f6 (imagebuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z b097451 (fluentd) - fluent: upgrade fluent to v1.4 4341f9a (minio) - mc: upgrade mc and minio c1ee2a4 (monitor) - monitor: remove copyrights.tar.gz 9854260 (registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z acc5627 (slugbuilder) - slugbuilder: internal support for multi buildpack d58907e (slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z b39a0c2 (slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z","title":"Maintenance"},{"location":"changelogs/v1.4.0/","text":"Workflow ## v1.3.0 -> v1.4.0 \u00b6 Releases \u00b6 builder v1.1.0 -> v1.2.0 slugbuilder v1.1.1 -> v1.2.0 imagebuilder v1.1.1 -> v1.1.2 controller v1.2.1 -> v1.3.0 slugrunner v1.1.1 -> v1.1.2 database v1.0.1 -> v1.0.2 fluentd v1.0.1 -> v1.1.0 redis v1.0.0 -> v1.1.0 logger v1.0.0 -> v1.1.0 minio v1.0.1 -> v1.1.0 monitor v1.0.1 -> v1.1.0 nsqd v1.0.0 -> v1.1.0 registry v1.0.2 -> v1.0.3 registry-proxy v1.0.0 -> v1.0.1 Features \u00b6 fc7d93f (builder) - builder: use go-dev 0c2159e (builder) - builder: fmt code and add create_bucket script 1b88340 (controller) - controller: remove deprecated api a92fdeb (controller) - routable: ingress support routable 1e3eab3 (controller) - maintenance: add maintenance support for ingress 56b9dd0 (controller) - crt: support containerd-ctr 5fc3b46 (controller) - controller: add ephemeral-storage restriction d677e52 (controller) - controller: add a volume command 5f1323a (controller) - controller:drycc run cmd add --mount para 74c36a5 (controller) - tasks: add distributed async task 139c3ca (controller) - tasks: change nsq reader to async f237d74 (controller) - controller:add drycc resource cmd 41b46d0 (controller) - controller:add drycc resource cmd improvement c26f7d8 (controller) - controller: add LimitRanges support 45b5d1b (controller) - users: add users status api 4e16f9b (controller) - ps:add ps:stop/start command c659fa9 (controller) - k8s: add k8s cluster domain 31a625d (controller) - ps:add ps:stop/start command 00a779a (fluentd) - fluentd: support containerd log format f3f1bd4 (fluentd) - nsqd: add stateless nsqd cluster support db7147c (fluentd) - mirrors: delete aliyun mirrors 689c12e (logger) - nsqd: add stateless nsqd cluster support 78ccc5d (logger) - redis: add redis client cluster support 9843f2c (logger) - k8s: add k8s cluster domain 6ba122e (minio) - minio: add pvc support 6973550 (monitor) - monitor: add ingress for monitor cd73305 (monitor) - charts: add volumeName support 4769fe9 (monitor) - nsqd: add stateless nsqd cluster support 87806df (monitor) - k8s: add k8s cluster domain 4db40c4 (nsqd) - nsqd: add stateless nsqd cluster support b6f3d4f (nsqd) - nsqd: add stateless nsqd cluster support 74b85bb (redis) - redis: change redis to statefulset ff98b50 (slugbuilder) - slugbuilder: delete build hook b201c2f (slugbuilder) - buildpacks: use drycc buildpacks Fixes \u00b6 0ec042d (builder) - test: fix test case error 4fb113b (builder) - build: base image replace by alpine 443df48 (builder) - minio: fix not bucket error 3dab5b0 (builder) - minio: create bucket error 734fca6 (controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scaling a7dcd10 (controller) - controller: test pass 93f0f2e (controller) - controller: fix migrations error 4724375 (controller) - controller: fix test error 7bacf29 (controller) - charts: fix clusterrole 90957f7 (controller) - pod: sort events error 440b13e (controller) - controller: review table structure 0a470a6 (controller) - controller: bump tornado 5.1.1 e39218b (controller) - pynsq: no current event loop in thread 1d8630e (controller) - tests: fix test_task.py run error 1ff1202 (controller) - controller: fix test case d8c0da3 (controller) - settings: fix env name 6d8fd36 (database) - 003_restore_from_backup.sh: ignore script exit 1 e0394a9 (database) - minio: fix not bucket error f35f252 (database) - mc: fix create_bucket error 74d6886 (database) - postgres: recovery mode not run e50d0c1 (imagebuilder) - caddy: fix caddy not start f3bec7a (fluentd) - influxdb: fix influxdb host and port bc19f27 (fluentd) - charts: skipped value for daemonEnvironment: Not a table 338d623 (logger) - logger: logger not run in alpine 7788302 (minio) - minio: bump minio version 619eed0 (minio) - fix: use go mod replace dep 3b42122 (monitor) - monitor: fix host error 67998ef (monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api 2cc361c (registry) - registry: fix test case 548297a (registry) - minio: fix not bucket error 5412ddb (registry) - minio: create bucket error d0d629e (slugbuilder) - slugbuilder:fix normalize_storage path d76ecbe (slugbuilder) - slugbuilder: use v3 api c505e18 (slugbuilder) - shellcheck: SC2039 Style \u00b6 c893a17 (builder) - builder: fmt code bba5795 (controller) - controller: format code d36082b (controller) - controller: fix pep8 66026f2 (controller) - resource: standardize the naming of resource 03d7e2c (controller) - servicecatalog: change servicecatalog to svcat 49dbb6d (controller) - controller: flake8 upgrade cbfc108 (monitor) - monitor: format charts and dashboard ee85954 (slugbuilder) - slugbuilder: use shellcheck 3afed2e (slugbuilder) - docker: simplify dockerfile 36b7f68 (slugrunner) - docker: simplify dockerfile Maintenance \u00b6 61bb0ef (builder) - aws: upgrade aws sdk version 0f2e074 (builder) - chore: use go mode replace dep e9a2219 (builder) - builder: delete glide up bb8c518 (builder) - registry: del quay.io fa6d02f (builder) - builder: upgrade go.sum 9d61e8d (builder) - build: upgrade go.mod d763a98 (builder) - charts: upgrade k8s newer API versions d1bc1aa (builder) - pkg: upgrade to new drycc/pkg 02b1e98 (builder) - builder: update go mod 8e17d65 (builder) - builder: change alpine repositories f32b723 (builder) - mirrors: delete aliyun mirrors e33dc61 (builder) - minio: use bin mc replace docker images 3ab4f1c (builder) - builder: update controller-sdk-go b2adfac (builder) - heroku: remove heroku-16 support f429ac8 (builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes 7197c83 (builder) - go.mod:upgrade require pkg controller-sdk-go 5f3e22d (controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs 1db645a (controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfs fbe8067 (controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs 537d667 (controller) - registry: del quay.io a23c65b (controller) - deps: update all deps to the latest version 546337e (controller) - charts: upgrade k8s newer API versions 06023f8 (controller) - workflow-manager: del workflow-manager bba5736 (controller) - controller: change cluster-issuer location 6c43661 (controller) - Certificatechange cluster-issuer location 39a4728 (controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml 9e96d3f (controller) - Certificate:upgrade version cert-manager.io/v1alpha2 8e68049 (controller) - docker: use INDEX_URL replace index.docker.io 8fda205 (controller) - cert_manager: change certManagerEnabled to global 6fefb6d (controller) - charts: change platformDomain to global 064b2ad (controller) - maintenance: remove maintenance support b8797c9 (controller) - workflow: remove namespace 1b20d76 (controller) - quota: add kube quota config d780075 (controller) - pod: add pod default resources support 3d72c08 (controller) - rename: rename ingress name 0aa6ab9 (controller) - mirrors: delete aliyun mirrors 7533a65 (controller) - heroku: remove heroku-16 support e5a885d (controller) - controller:check mount volume path 9014e74 (controller) - test: optimization Dockerfile.test 0b6ebb2 (controller) - tasks: change apply_async parameters 835f009 (controller) - wsgi: add tornado 6 support 67a4ad7 (controller) - utils: use threads replace asyncio a28949b (controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUP a903209 (controller) - charts: add custom controller environment variables support e0e783e (controller) - ldap: change filter style d760825 (controller) - scheduler: remove debug log a25928e (controller) - wsgi: remove a wsgi.py file 7b2696e (controller) - log: disable nsq.client info log 8d5c07b (controller) - charts: add default environment 025f4a2 (controller) - controller: change quota name ebda60e (controller) - controller: review pvc code 8832ba9 (controller) - controller: change status\\binding model type and mount path check container_types 7148d04 (controller) - controller: add overcommit cpu and ram support 4d2087c (controller) - limits: modify limits unit verification af36970 (controller) - api: check cpu/memory range for api 329355b (controller) - volumes: modify the volume size 9dfee09 (controller) - LimitRanges: modify the default limits 5205bca (controller) - controller: improve the details of certificate 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z 6415e2c (database) - postgres: upgrade to pg13 12e6806 (database) - charts: upgrade k8s newer API versions d294509 (database) - minio: use canary minio test 1bad02e (database) - mirrors: delete aliyun mirrors d51420b (database) - minio: use bin mc replace docker images 4133d05 (imagebuilder) - imagebuilder: update caddy and kaniko 6b4dd18 (imagebuilder) - minio: use bin mc replace docker images 6df9b7c (fluentd) - deps-dev: update rake requirement from ~> 10.0 to ~> 12.3 c2490f8 (fluentd) - fluentd: upgrade fluentd be4a56a (fluentd) - fluentd: add Gemfile.lock 2237f75 (fluentd) - charts: upgrade k8s newer API versions c574065 (fluentd) - charts: upgrade k8s newer API versions 52b8084 (fluentd) - router: delete obsolete router code 3b3cceb (fluentd) - fluentd: remove manifests dir 25c6702 (fluentd) - nsqd: change var name bd571be (fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS 72aa4e6 (fluentd) - influxdb: change influxdb service name bd61903 (logger) - logger: use go mod replace dep 69c63a1 (logger) - logger: update go.mod 3aa9cd7 (logger) - registry: del quay.io f058496 (logger) - nsqd: change var name 6d9787c (logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS 85ed307 (logger) - logger: standard naming d88e7b6 (minio) - minio: update minio api to v7 43715d2 (minio) - minio: upgrade minio 0e1239b (minio) - minio: use docker.io replace quay.io f7f047b (minio) - registry: del quay.io afa7128 (minio) - build: upgrade go.mod aff2db5 (minio) - charts: upgrade k8s newer API versions 4547f14 (minio) - pkg: upgrade to new drycc/pkg 2769b85 (minio) - minio: use bin mc replace docker images 35dde8d (monitor) - monitor: update grafana influxdb telegraf 9e3a949 (monitor) - charts: upgrade k8s newer API versions 6af0432 (monitor) - workflow-manager: remove workflow-manager 0611c07 (monitor) - router: delete obsolete router code be04824 (monitor) - cert_manager: change certManagerEnabled to global 3780165 (monitor) - charts: change platformDomain to global 50b04e1 (monitor) - influxdb: remove influxdb admin ui 6ab4d68 (monitor) - influxdb: remove unuse port f1510bd (monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetes f36de2c (monitor) - pvc: upgrade to new format fc78a0a (monitor) - workflow: remove namespace e85890f (monitor) - monitor: monitoring nsqd and redis separately 694f6b1 (monitor) - mirrors: delete aliyun mirrors 4aea36a (monitor) - grafana: add ldap support for grafana 68fc30f (nsqd) - nsq: update nsq 16f32aa (nsqd) - charts: upgrade k8s newer API versions 04db389 (redis) - reids: update to redis 6 3f01bab (redis) - charts: upgrade k8s newer API versions 647e4be (registry) - registry: del quay.io 0bbce99 (registry) - charts: upgrade k8s newer API versions a982b50 (registry) - minio: use bin mc replace docker images e088da3 (registry-proxy) - ingress: renmae use_native_ingress to use_ingress 7e88337 (registry-proxy) - nginx: upgrade nginx to mainline 7204d72 (registry-proxy) - registry: optimizing variable naming 2eafc59 (registry-proxy) - registry-proxy: update nginx 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions c72db96 (registry-proxy) - registry-proxy: change travis icon url ca9f962 (slugbuilder) - slugbuilder: del BUILDPACK_URL support 1b74dd5 (slugbuilder) - slugbuilder: add heroku-20 support 54d4ad2 (slugbuilder) - slugbuilder: del quay.io a78f37e (slugbuilder) - slugbuilder: add heroku-20 stack 94ac94a (slugbuilder) - minio: use bin mc replace docker images 53b4b8b (slugbuilder) - slugbuilder: modify stack priority 58e2bd2 (slugbuilder) - dockerfile: add WORKDIR /tmp b29cd04 (slugbuilder) - slugbuilder: add pre_build.sh 9d319f6 (slugbuilder) - slugbuilder: silent mc command output d1ec3c9 (slugbuilder) - heroku: remove heroku-16 support 5048534 (slugbuilder) - slugbuilder: use drycc stack-images a116537 (slugrunner) - slugrunner: add heroku-20 support a1196bf (slugrunner) - slugrunner: del quay.io 64c96d7 (slugrunner) - slugrunner: add heroku-20 stack cc3e226 (slugrunner) - minio: use bin mc replace docker images 9130bde (slugrunner) - shellcheck: shellcheck installer 4ea33e1 (slugrunner) - slugrunner: modify stack priority 5514e8b (slugrunner) - heroku: remove heroku-16 support be829fb (slugrunner) - slugrunner: use drycc stack-images e1e06be (slugrunner) - slugrunner: remove Dockerfile.heroku-16","title":"v1.4.0"},{"location":"changelogs/v1.4.0/#workflow-v130-v140","text":"","title":"Workflow ## v1.3.0 -> v1.4.0"},{"location":"changelogs/v1.4.0/#releases","text":"builder v1.1.0 -> v1.2.0 slugbuilder v1.1.1 -> v1.2.0 imagebuilder v1.1.1 -> v1.1.2 controller v1.2.1 -> v1.3.0 slugrunner v1.1.1 -> v1.1.2 database v1.0.1 -> v1.0.2 fluentd v1.0.1 -> v1.1.0 redis v1.0.0 -> v1.1.0 logger v1.0.0 -> v1.1.0 minio v1.0.1 -> v1.1.0 monitor v1.0.1 -> v1.1.0 nsqd v1.0.0 -> v1.1.0 registry v1.0.2 -> v1.0.3 registry-proxy v1.0.0 -> v1.0.1","title":"Releases"},{"location":"changelogs/v1.4.0/#features","text":"fc7d93f (builder) - builder: use go-dev 0c2159e (builder) - builder: fmt code and add create_bucket script 1b88340 (controller) - controller: remove deprecated api a92fdeb (controller) - routable: ingress support routable 1e3eab3 (controller) - maintenance: add maintenance support for ingress 56b9dd0 (controller) - crt: support containerd-ctr 5fc3b46 (controller) - controller: add ephemeral-storage restriction d677e52 (controller) - controller: add a volume command 5f1323a (controller) - controller:drycc run cmd add --mount para 74c36a5 (controller) - tasks: add distributed async task 139c3ca (controller) - tasks: change nsq reader to async f237d74 (controller) - controller:add drycc resource cmd 41b46d0 (controller) - controller:add drycc resource cmd improvement c26f7d8 (controller) - controller: add LimitRanges support 45b5d1b (controller) - users: add users status api 4e16f9b (controller) - ps:add ps:stop/start command c659fa9 (controller) - k8s: add k8s cluster domain 31a625d (controller) - ps:add ps:stop/start command 00a779a (fluentd) - fluentd: support containerd log format f3f1bd4 (fluentd) - nsqd: add stateless nsqd cluster support db7147c (fluentd) - mirrors: delete aliyun mirrors 689c12e (logger) - nsqd: add stateless nsqd cluster support 78ccc5d (logger) - redis: add redis client cluster support 9843f2c (logger) - k8s: add k8s cluster domain 6ba122e (minio) - minio: add pvc support 6973550 (monitor) - monitor: add ingress for monitor cd73305 (monitor) - charts: add volumeName support 4769fe9 (monitor) - nsqd: add stateless nsqd cluster support 87806df (monitor) - k8s: add k8s cluster domain 4db40c4 (nsqd) - nsqd: add stateless nsqd cluster support b6f3d4f (nsqd) - nsqd: add stateless nsqd cluster support 74b85bb (redis) - redis: change redis to statefulset ff98b50 (slugbuilder) - slugbuilder: delete build hook b201c2f (slugbuilder) - buildpacks: use drycc buildpacks","title":"Features"},{"location":"changelogs/v1.4.0/#fixes","text":"0ec042d (builder) - test: fix test case error 4fb113b (builder) - build: base image replace by alpine 443df48 (builder) - minio: fix not bucket error 3dab5b0 (builder) - minio: create bucket error 734fca6 (controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scaling a7dcd10 (controller) - controller: test pass 93f0f2e (controller) - controller: fix migrations error 4724375 (controller) - controller: fix test error 7bacf29 (controller) - charts: fix clusterrole 90957f7 (controller) - pod: sort events error 440b13e (controller) - controller: review table structure 0a470a6 (controller) - controller: bump tornado 5.1.1 e39218b (controller) - pynsq: no current event loop in thread 1d8630e (controller) - tests: fix test_task.py run error 1ff1202 (controller) - controller: fix test case d8c0da3 (controller) - settings: fix env name 6d8fd36 (database) - 003_restore_from_backup.sh: ignore script exit 1 e0394a9 (database) - minio: fix not bucket error f35f252 (database) - mc: fix create_bucket error 74d6886 (database) - postgres: recovery mode not run e50d0c1 (imagebuilder) - caddy: fix caddy not start f3bec7a (fluentd) - influxdb: fix influxdb host and port bc19f27 (fluentd) - charts: skipped value for daemonEnvironment: Not a table 338d623 (logger) - logger: logger not run in alpine 7788302 (minio) - minio: bump minio version 619eed0 (minio) - fix: use go mod replace dep 3b42122 (monitor) - monitor: fix host error 67998ef (monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api 2cc361c (registry) - registry: fix test case 548297a (registry) - minio: fix not bucket error 5412ddb (registry) - minio: create bucket error d0d629e (slugbuilder) - slugbuilder:fix normalize_storage path d76ecbe (slugbuilder) - slugbuilder: use v3 api c505e18 (slugbuilder) - shellcheck: SC2039","title":"Fixes"},{"location":"changelogs/v1.4.0/#style","text":"c893a17 (builder) - builder: fmt code bba5795 (controller) - controller: format code d36082b (controller) - controller: fix pep8 66026f2 (controller) - resource: standardize the naming of resource 03d7e2c (controller) - servicecatalog: change servicecatalog to svcat 49dbb6d (controller) - controller: flake8 upgrade cbfc108 (monitor) - monitor: format charts and dashboard ee85954 (slugbuilder) - slugbuilder: use shellcheck 3afed2e (slugbuilder) - docker: simplify dockerfile 36b7f68 (slugrunner) - docker: simplify dockerfile","title":"Style"},{"location":"changelogs/v1.4.0/#maintenance","text":"61bb0ef (builder) - aws: upgrade aws sdk version 0f2e074 (builder) - chore: use go mode replace dep e9a2219 (builder) - builder: delete glide up bb8c518 (builder) - registry: del quay.io fa6d02f (builder) - builder: upgrade go.sum 9d61e8d (builder) - build: upgrade go.mod d763a98 (builder) - charts: upgrade k8s newer API versions d1bc1aa (builder) - pkg: upgrade to new drycc/pkg 02b1e98 (builder) - builder: update go mod 8e17d65 (builder) - builder: change alpine repositories f32b723 (builder) - mirrors: delete aliyun mirrors e33dc61 (builder) - minio: use bin mc replace docker images 3ab4f1c (builder) - builder: update controller-sdk-go b2adfac (builder) - heroku: remove heroku-16 support f429ac8 (builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes 7197c83 (builder) - go.mod:upgrade require pkg controller-sdk-go 5f3e22d (controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs 1db645a (controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfs fbe8067 (controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs 537d667 (controller) - registry: del quay.io a23c65b (controller) - deps: update all deps to the latest version 546337e (controller) - charts: upgrade k8s newer API versions 06023f8 (controller) - workflow-manager: del workflow-manager bba5736 (controller) - controller: change cluster-issuer location 6c43661 (controller) - Certificatechange cluster-issuer location 39a4728 (controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml 9e96d3f (controller) - Certificate:upgrade version cert-manager.io/v1alpha2 8e68049 (controller) - docker: use INDEX_URL replace index.docker.io 8fda205 (controller) - cert_manager: change certManagerEnabled to global 6fefb6d (controller) - charts: change platformDomain to global 064b2ad (controller) - maintenance: remove maintenance support b8797c9 (controller) - workflow: remove namespace 1b20d76 (controller) - quota: add kube quota config d780075 (controller) - pod: add pod default resources support 3d72c08 (controller) - rename: rename ingress name 0aa6ab9 (controller) - mirrors: delete aliyun mirrors 7533a65 (controller) - heroku: remove heroku-16 support e5a885d (controller) - controller:check mount volume path 9014e74 (controller) - test: optimization Dockerfile.test 0b6ebb2 (controller) - tasks: change apply_async parameters 835f009 (controller) - wsgi: add tornado 6 support 67a4ad7 (controller) - utils: use threads replace asyncio a28949b (controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUP a903209 (controller) - charts: add custom controller environment variables support e0e783e (controller) - ldap: change filter style d760825 (controller) - scheduler: remove debug log a25928e (controller) - wsgi: remove a wsgi.py file 7b2696e (controller) - log: disable nsq.client info log 8d5c07b (controller) - charts: add default environment 025f4a2 (controller) - controller: change quota name ebda60e (controller) - controller: review pvc code 8832ba9 (controller) - controller: change status\\binding model type and mount path check container_types 7148d04 (controller) - controller: add overcommit cpu and ram support 4d2087c (controller) - limits: modify limits unit verification af36970 (controller) - api: check cpu/memory range for api 329355b (controller) - volumes: modify the volume size 9dfee09 (controller) - LimitRanges: modify the default limits 5205bca (controller) - controller: improve the details of certificate 7ebecdf (database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z 6415e2c (database) - postgres: upgrade to pg13 12e6806 (database) - charts: upgrade k8s newer API versions d294509 (database) - minio: use canary minio test 1bad02e (database) - mirrors: delete aliyun mirrors d51420b (database) - minio: use bin mc replace docker images 4133d05 (imagebuilder) - imagebuilder: update caddy and kaniko 6b4dd18 (imagebuilder) - minio: use bin mc replace docker images 6df9b7c (fluentd) - deps-dev: update rake requirement from ~> 10.0 to ~> 12.3 c2490f8 (fluentd) - fluentd: upgrade fluentd be4a56a (fluentd) - fluentd: add Gemfile.lock 2237f75 (fluentd) - charts: upgrade k8s newer API versions c574065 (fluentd) - charts: upgrade k8s newer API versions 52b8084 (fluentd) - router: delete obsolete router code 3b3cceb (fluentd) - fluentd: remove manifests dir 25c6702 (fluentd) - nsqd: change var name bd571be (fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS 72aa4e6 (fluentd) - influxdb: change influxdb service name bd61903 (logger) - logger: use go mod replace dep 69c63a1 (logger) - logger: update go.mod 3aa9cd7 (logger) - registry: del quay.io f058496 (logger) - nsqd: change var name 6d9787c (logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS 85ed307 (logger) - logger: standard naming d88e7b6 (minio) - minio: update minio api to v7 43715d2 (minio) - minio: upgrade minio 0e1239b (minio) - minio: use docker.io replace quay.io f7f047b (minio) - registry: del quay.io afa7128 (minio) - build: upgrade go.mod aff2db5 (minio) - charts: upgrade k8s newer API versions 4547f14 (minio) - pkg: upgrade to new drycc/pkg 2769b85 (minio) - minio: use bin mc replace docker images 35dde8d (monitor) - monitor: update grafana influxdb telegraf 9e3a949 (monitor) - charts: upgrade k8s newer API versions 6af0432 (monitor) - workflow-manager: remove workflow-manager 0611c07 (monitor) - router: delete obsolete router code be04824 (monitor) - cert_manager: change certManagerEnabled to global 3780165 (monitor) - charts: change platformDomain to global 50b04e1 (monitor) - influxdb: remove influxdb admin ui 6ab4d68 (monitor) - influxdb: remove unuse port f1510bd (monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetes f36de2c (monitor) - pvc: upgrade to new format fc78a0a (monitor) - workflow: remove namespace e85890f (monitor) - monitor: monitoring nsqd and redis separately 694f6b1 (monitor) - mirrors: delete aliyun mirrors 4aea36a (monitor) - grafana: add ldap support for grafana 68fc30f (nsqd) - nsq: update nsq 16f32aa (nsqd) - charts: upgrade k8s newer API versions 04db389 (redis) - reids: update to redis 6 3f01bab (redis) - charts: upgrade k8s newer API versions 647e4be (registry) - registry: del quay.io 0bbce99 (registry) - charts: upgrade k8s newer API versions a982b50 (registry) - minio: use bin mc replace docker images e088da3 (registry-proxy) - ingress: renmae use_native_ingress to use_ingress 7e88337 (registry-proxy) - nginx: upgrade nginx to mainline 7204d72 (registry-proxy) - registry: optimizing variable naming 2eafc59 (registry-proxy) - registry-proxy: update nginx 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions c72db96 (registry-proxy) - registry-proxy: change travis icon url ca9f962 (slugbuilder) - slugbuilder: del BUILDPACK_URL support 1b74dd5 (slugbuilder) - slugbuilder: add heroku-20 support 54d4ad2 (slugbuilder) - slugbuilder: del quay.io a78f37e (slugbuilder) - slugbuilder: add heroku-20 stack 94ac94a (slugbuilder) - minio: use bin mc replace docker images 53b4b8b (slugbuilder) - slugbuilder: modify stack priority 58e2bd2 (slugbuilder) - dockerfile: add WORKDIR /tmp b29cd04 (slugbuilder) - slugbuilder: add pre_build.sh 9d319f6 (slugbuilder) - slugbuilder: silent mc command output d1ec3c9 (slugbuilder) - heroku: remove heroku-16 support 5048534 (slugbuilder) - slugbuilder: use drycc stack-images a116537 (slugrunner) - slugrunner: add heroku-20 support a1196bf (slugrunner) - slugrunner: del quay.io 64c96d7 (slugrunner) - slugrunner: add heroku-20 stack cc3e226 (slugrunner) - minio: use bin mc replace docker images 9130bde (slugrunner) - shellcheck: shellcheck installer 4ea33e1 (slugrunner) - slugrunner: modify stack priority 5514e8b (slugrunner) - heroku: remove heroku-16 support be829fb (slugrunner) - slugrunner: use drycc stack-images e1e06be (slugrunner) - slugrunner: remove Dockerfile.heroku-16","title":"Maintenance"},{"location":"changelogs/v1.5.0/","text":"Workflow ## v1.4.0 -> v1.5.0 \u00b6 Releases \u00b6 passport v1.0.0 rabbitmq v1.0.0 imagebuilder v1.0.0 builder v1.2.0 -> v1.3.0 controller v1.3.0 -> v1.4.0 database v1.0.2 -> v1.1.0 fluentd v1.1.0 -> v1.2.0 redis v1.1.0 -> v1.2.0 influxdb v1.0.1 -> v1.1.0 logger v1.1.0 -> v1.2.0 minio v1.1.0 -> v1.2.0 monitor v1.1.0 -> v1.2.0 nsqd v1.1.0 -> v1.2.0 registry v1.0.3 -> v1.1.0 registry-proxy v1.0.2 -> v1.1.0 Features \u00b6 0f5f8e4 (builder) - builder: multi-platform support f269d06 (builder) - build: add buildx supportjkjkk:q 5e72fe8 (builder) - registry: use docker build 25d8a4c (builder) - docker: dealing with the change of docker in kubenetes 1.20 7a3e1c5 (builder) - charts: set the default chart version 46b75ff (builder) - builder: add cloud native buildpacks support 2db2054 (builder) - builder: unified build model 4b7f9d9 (builder) - builder: add initContainers b78c936 (controller) - token: add get token api bac52a5 (controller) - tasks: use celery replace nsqd b9b0c58 (controller) - build: add buildx support 205dcb3 (controller) - influxdb: add influxdb client ff15849 (controller) - influxdb: upgrade to influxdb 2.x 4016244 (controller) - controller: push data to influx fcfce2e (controller) - workflow-manager: add workflow-manager support 00e9bfb (controller) - influxdb: review influxdb code dd644d5 (controller) - docker: dealing with the change of docker in kubenetes 1.20 118278b (controller) - charts: set the default chart version 122a9cd (controller) - oauth2: add oauth2 support 559a5b6 (controller) - controller: use cncf buildpacks replace slugrunner 96130e6 (controller) - charts: database configuration optimization of passport and controller 2ea8508 (controller) - oauth: using passport authentication 868c437 (database) - database: multi-platform support eadd5da (database) - build: add buildx support b6eea4c (database) - docker: dealing with the change of docker in kubenetes 1.20 04a88db (database) - charts: set the default chart version 92ed309 (database) - database: add initContainer ee6b78f (fluentd) - build: add buildx support f523e30 (fluentd) - docker: dealing with the change of docker in kubenetes 1.20 ee47b53 (fluentd) - charts: set the default chart version 80a51af (influxdb) - influxdb: modify influxdb naming rules fb10030 (influxdb) - influxdb: use influxdb v2 0e87ad8 (influxdb) - docker: dealing with the change of docker in kubenetes 1.20 9d10801 (influxdb) - charts: set the default chart version d825c9f (logger) - build: add buildx support b139576 (logger) - docker: dealing with the change of docker in kubenetes 1.20 88f84ea (logger) - charts: set the default chart version 5ccae3e (logger) - dockerfile: remove chmod cmd 193aefc (logger) - logger: add initContainers baee330 (minio) - minio: multi-platform support ad5d055 (minio) - build: add buildx support 19868d4 (minio) - docker: dealing with the change of docker in kubenetes 1.20 4bd84b8 (minio) - charts: set the default chart version 79d1f2f (monitor) - database: multi-platform support 88e5a7f (monitor) - build: add buildx support 5672e99 (monitor) - influxdb: modify influxdb naming rules 8672103 (monitor) - influxdb: use influxdb v2 66cb4c8 (monitor) - docker: dealing with the change of docker in kubenetes 1.20 9576eb3 (monitor) - charts: set the default chart version 30809c9 (monitor) - monitor: add initContainers 70d140c (nsqd) - nsqd: using self compiled nsq binary 1073d4f (nsqd) - nsqd: use GOPATH replace /go e498480 (nsqd) - build: add buildx support cf9b7d5 (nsqd) - docker: dealing with the change of docker in kubenetes 1.20 c335856 (nsqd) - charts: set the default chart version efba713 (redis) - build: add buildx support c7a3b53 (redis) - docker: dealing with the change of docker in kubenetes 1.20 4cdad7b (redis) - charts: set the default chart version 652b443 (registry) - registry: multi-platform support 4060176 (registry) - registry: use docker build 7102a03 (registry) - docker: dealing with the change of docker in kubenetes 1.20 6c8600d (registry) - charts: set the default chart version 33a51c9 (registry) - registry: add initContainers bef70dc (registry-proxy) - build: add buildx support d2319c1 (registry-proxy) - docker: dealing with the change of docker in kubenetes 1.20 02fafed (registry-proxy) - charts: set the default chart version Fixes \u00b6 5499c9a (controller) - gunicorn: gunicorn not running 06e9e88 (controller) - controller: error loading shared library 01b5bd0 (controller) - controller: upgrade celery config 6e32d55 (controller) - controller: fix update resources bug 0e0d53f (controller) - chart: set the domain depends certManagerEnabled 2ac4ca8 (controller) - passport: error loading shared library libexpat.so.1 a0dd517 (fluentd) - fluentd: drone build 6eca2a3 (logger) - logger: golang lint 63b0aa0 (registry) - drone: charts url error Docs \u00b6 472cfcc (controller) - controller organize README.md document d9d6e29 (redis) - redis: delete links that do not exist Test case \u00b6 1468f57 (controller) - controller: add command unittest Maintenance \u00b6 9999bfd (builder) - builder:replace the special words cda8b58 (builder) - builder: remove docker keyword from charts dc575dd (builder) - builder: use imagebuilder replace dockerbuilder d3bb183 (builder) - docker: use the full name of registry 5fe34d1 (builder) - travis: add DEV_REGISTRY 7e36453 (builder) - CICD: use drone 52b8d9d (builder) - drone: add image_registries volumes 65963f4 (builder) - k8s: add privileged to dind d345fcf (builder) - LICENSE: revert modifications to Apache license 7975c99 (builder) - drone: always pull image 59633dd (builder) - builder: modify launch imagebuild pod 8d14e67 (builder) - builder: use Procfile in anywhere 5357fa8 (builder) - go: bump go mod 8d26ac0 (builder) - k8s: k8s deprecated api migration 0af620d (builder) - chars: change org to imageTag ae84303 (builder) - builder: run imagebuider replace pod with job 3b2c496 (builder) - builder: change docs website 5679a4c (builder) - builder: upgrade to golang1.17 a214503 (controller) - controller:replace whitelist with allowlist 375ddcc (controller) - ps:drycc ps:list show autoscale num c32e409 (controller) - ldap: canot register when ldap is enabled c46580a (controller) - controller:modify redis config fa9e87b (controller) - chart:modify controller charts 6f9fd08 (controller) - nsq: remove nsq 994b2dc (controller) - docker-buildx: add check-docker a720c3a (controller) - controller: remove docker keyword from charts e9a5c84 (controller) - docker: use the full name of registry a26614a (controller) - controller: add rabbitmq env 3df229d (controller) - controller: modify database config && remove redis port config && add env prefix with DRYCC 257e94b (controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjob f4d6ec3 (controller) - chart: pretty chart format 63e6195 (controller) - influxdb: modify influxdb code 0f6d408 (controller) - CICD: use drone 87bad28 (controller) - python: upgrade to python3.9 e8f7560 (controller) - volumes: modify mount summary 6cf6c6b (controller) - drone: add image_registries volumes a9397e8 (controller) - oauth: modify token Authentication c7f8c8b (controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfs a1a08aa (controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfs efd78b4 (controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs 649b044 (controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs 41b742b (controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs 22ffe5d (controller) - LICENSE: revert modifications to Apache license c98b468 (controller) - drone: always pull image 20e6edb (controller) - chart: modify the problem of using buildpack db16879 (controller) - controller: pretty pods list print ba6f456 (controller) - test: pretty pods list print 5fce4b7 (controller) - k8s: k8s deprecated api migration e9e0bcb (controller) - oauth: using passport authentication 0311172 (controller) - chars: change org to imageTag 150eff1 (controller) - charts: update cert-manager api version de8545a (controller) - controller: update requirements 1442207 (controller) - controller: using django native JSONFiled ab4e836 (controller) - oauth: modify passport api 5c54e06 (controller) - controller: eliminate pip warnings 870328d (controller) - controller: remove entrypoint 5e5e6ae (controller) - controller: upgrade celery config 607778f (controller) - controller: add initContainer 23dc016 (controller) - chart: set the domain depends certManagerEnabled f3cf20b (controller) - controller: remove default bash env 73f2636 (controller) - controller: modify alpinelinux repositories 498e9f2 (controller) - chart: change certManagerEnabled to boolean type 27f5308 (controller) - passport: exclude cryptography 370b75d (controller) - controller: use sh env 07585b4 (database) - postgres:replace the special words 20172dc (database) - database: remove docker keyword from charts abb9b88 (database) - docker: use the full name of registry e72f58f (database) - chart: modify the off-cluster database a91f64f (database) - travis: add DEV_REGISTRY 614fb76 (database) - tests: use add-host replace link a3428f3 (database) - CICD: use drone 239fef1 (database) - drone: add image_registries volumes 42858e1 (database) - LICENSE: revert modifications to Apache license d0fe850 (database) - drone: always pull image 34a36ad (database) - charts: Nn secret is generated during off-cluster 064ccf4 (database) - database: create database 9228992 (database) - chars: change org to imageTag 9f7810c (database) - database: upgrade to wal-g v1.1 05783f4 (fluentd) - fluentd:replace the special words 0739809 (fluentd) - influxdb:replace monitor-influx with influx f02487c (fluentd) - fluentd: remove docker keyword from charts 2c96cc0 (fluentd) - docker: use the full name of registry b20c429 (fluentd) - charts: remove port config 6dd0197 (fluentd) - travis: add DEV_REGISTRY c5bec51 (fluentd) - CICD: use drone f8524b7 (fluentd) - drone: add image_registries volumes a50878a (fluentd) - LICENSE: revert modifications to Apache license 14fe20e (fluentd) - drone: always pull image 4a2f660 (fluentd) - k8s: k8s deprecated api migration de2dd91 (fluentd) - chars: change org to imageTag a9f1944 (fluentd) - fluentd: upgrade to fluentd1.14 7cb4e95 (influxdb) - influxdb: change username to user 0fdc21b (influxdb) - influxdb: remove docker keyword from charts b2acddb (influxdb) - influxdb: change default path ba88919 (influxdb) - influxdb: add check_env function 9117401 (influxdb) - influxdb: modify init_influxdb has_bucket 092a3e6 (influxdb) - chart: pod not readiness 51de380 (influxdb) - travis: add DEV_REGISTRY 66d7667 (influxdb) - docker: replace influxdb base image 3aa3094 (influxdb) - CICD: use drone 14b9c24 (influxdb) - drone: add image_registries volumes 02b4cd1 (logger) - logger:replace the special words 114b5d5 (logger) - reids: delete the logger prefix of redis 639278a (logger) - redis: remove logger from redis conf 90195e2 (logger) - go: remove GOOS and GOARCH 31e2e27 (logger) - logger: remove docker keyword from charts 8fbd9fa (logger) - docker: use the full name of registry b39df2d (logger) - charts: remove redis\\nsqd port config 35d6d07 (logger) - travis: add DEV_REGISTRY 69aabf5 (logger) - tests: remove docker link e916644 (logger) - CICD: use drone d6872b7 (logger) - drone: add image_registries volumes 37801da (logger) - LICENSE: revert modifications to Apache license cfb4b38 (logger) - drone: always pull image 8bda3bf (logger) - go: bump go mod e13ebfc (logger) - chars: change org to imageTag 38e6d8d (minio) - minio:replace the special words d6925dd (minio) - minio: remove docker keyword from charts d56bc39 (minio) - docker: use the full name of registry e4696cc (minio) - travis: add DEV_REGISTRY 70c5c79 (minio) - minio: use latest version 773cf6c (minio) - Makefile: remove DEV_REGISTRY ?= 5ce5bc6 (minio) - CICD: use drone 5da8be3 (minio) - drone: add image_registries volumes c1f0611 (minio) - LICENSE: revert modifications to Apache license b73f792 (minio) - drone: always pull image 79d1c93 (minio) - go: bump go mod c448899 (minio) - chars: change org to imageTag 15ee49e (minio) - minio: migrate deprecated warning 9968a1a (minio) - minio: upgrade to golang1.7 14fedd2 (monitor) - monitor:replace the special works 52c431a (monitor) - reids: delete the logger prefix of redis 2c95b47 (monitor) - redis: remove logger from redis conf da9bc56 (monitor) - monitor:remove influxdb 53f47b9 (monitor) - grafana: use grafana docker image 5bdb188 (monitor) - grafana: use grafana docker image c0586dd (monitor) - monitor: remove docker keyword from charts 87d02b6 (monitor) - charts: add nodes and persistentvolumes rule 1b5598f (monitor) - monitor: modify grafana dashboard with FLUX and pretty config.toml bcbc0d5 (monitor) - docker: use the full name of registry 9418c9e (monitor) - monitor: fix upload dashboard error and modify INFLUXDB input 589f29a (monitor) - travis: add DEV_REGISTRY f776f8a (monitor) - CICD: use drone 6ca3060 (monitor) - drone: add image_registries volumes 6a9ffb2 (monitor) - LICENSE: revert modifications to Apache license 45e41ed (monitor) - drone: always pull image 654d407 (monitor) - k8s: k8s deprecated api migration 41e9b9c (monitor) - chars: change org to imageTag 99c10d3 (monitor) - charts: update cert-manager api version 9bf83c4 (monitor) - oauth: user oauth passport a128f6d (monitor) - chart: change certManagerEnabled to boolean type 8f897fe (monitor) - chart: set the domain depends certManagerEnabled ba6d793 (nsqd) - README:update travis build status 49879c4 (nsqd) - nsqd: minimum git clone code c5e2680 (nsqd) - nsqd: remove docker keyword from charts 21dd17b (nsqd) - docker: use the full name of registry 7d86b3c (nsqd) - charts: remove port config c073d95 (nsqd) - travis: add DEV_REGISTRY 55c297c (nsqd) - CICD: use drone 165c2ae (nsqd) - drone: add image_registries volumes 9c6a1f8 (nsqd) - LICENSE: revert modifications to Apache license 9283098 (nsqd) - drone: always pull image 46acf8a (nsqd) - k8s: k8s deprecated api migration 43caf80 (nsqd) - chars: change org to imageTag 6897471 (nsqd) - nsqd: use official image 297bc05 (redis) - redis:replace the special words f5f8b5e (redis) - reids: delete the logger prefix of redis af7b657 (redis) - redis: change logger-redis to redis 8dca154 (redis) - redis: remove logger from redis conf eaeda2d (redis) - redis: remove docker keyword from charts 53c6358 (redis) - docker: use the full name of registry ae37416 (redis) - charts: remove port config e985656 (redis) - travis: add DEV_REGISTRY 423336a (redis) - CICD: use drone be64ab4 (redis) - drone: add image_registries volumes 3bec735 (redis) - LICENSE: revert modifications to Apache license 4f934f6 (redis) - drone: always pull image 359b878 (redis) - chars: change org to imageTag 83b8ac2 (registry) - workflow:replace the special words 869b280 (registry) - registry: remove docker keyword from charts 999c1e9 (registry) - docker: use the full name of registry 5652da9 (registry) - travis: add DEV_REGISTRY cc8c6c2 (registry) - CICD: use drone c7bdbd0 (registry) - CICD: pretty .drone.yaml format 5c55a38 (registry) - test: use add-host replace link f8866f3 (registry) - drone: add image_registries volumes 6c8292f (registry) - LICENSE: revert modifications to Apache license 1d50f2c (registry) - drone: always pull image efbca6d (registry) - chars: change org to imageTag 2eafc59 (registry-proxy) - registry-proxy: update nginx 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions c72db96 (registry-proxy) - registry-proxy: change travis icon url 63ffb92 (registry-proxy) - registry-proxy:replace the special works 1d904a6 (registry-proxy) - registry-proxy: remove docker keyword from charts c8200b1 (registry-proxy) - docker: use the full name of registry d3fa939 (registry-proxy) - travis: add DEV_REGISTRY 5a8b353 (registry-proxy) - CICD: use drone 703d05a (registry-proxy) - drone: add image_registries volumes aa71db1 (registry-proxy) - LICENSE: revert modifications to Apache license 710c126 (registry-proxy) - drone: always pull image 2dcc5e6 (registry-proxy) - chars: change org to imageTag","title":"v1.5.0"},{"location":"changelogs/v1.5.0/#workflow-v140-v150","text":"","title":"Workflow ## v1.4.0 -> v1.5.0"},{"location":"changelogs/v1.5.0/#releases","text":"passport v1.0.0 rabbitmq v1.0.0 imagebuilder v1.0.0 builder v1.2.0 -> v1.3.0 controller v1.3.0 -> v1.4.0 database v1.0.2 -> v1.1.0 fluentd v1.1.0 -> v1.2.0 redis v1.1.0 -> v1.2.0 influxdb v1.0.1 -> v1.1.0 logger v1.1.0 -> v1.2.0 minio v1.1.0 -> v1.2.0 monitor v1.1.0 -> v1.2.0 nsqd v1.1.0 -> v1.2.0 registry v1.0.3 -> v1.1.0 registry-proxy v1.0.2 -> v1.1.0","title":"Releases"},{"location":"changelogs/v1.5.0/#features","text":"0f5f8e4 (builder) - builder: multi-platform support f269d06 (builder) - build: add buildx supportjkjkk:q 5e72fe8 (builder) - registry: use docker build 25d8a4c (builder) - docker: dealing with the change of docker in kubenetes 1.20 7a3e1c5 (builder) - charts: set the default chart version 46b75ff (builder) - builder: add cloud native buildpacks support 2db2054 (builder) - builder: unified build model 4b7f9d9 (builder) - builder: add initContainers b78c936 (controller) - token: add get token api bac52a5 (controller) - tasks: use celery replace nsqd b9b0c58 (controller) - build: add buildx support 205dcb3 (controller) - influxdb: add influxdb client ff15849 (controller) - influxdb: upgrade to influxdb 2.x 4016244 (controller) - controller: push data to influx fcfce2e (controller) - workflow-manager: add workflow-manager support 00e9bfb (controller) - influxdb: review influxdb code dd644d5 (controller) - docker: dealing with the change of docker in kubenetes 1.20 118278b (controller) - charts: set the default chart version 122a9cd (controller) - oauth2: add oauth2 support 559a5b6 (controller) - controller: use cncf buildpacks replace slugrunner 96130e6 (controller) - charts: database configuration optimization of passport and controller 2ea8508 (controller) - oauth: using passport authentication 868c437 (database) - database: multi-platform support eadd5da (database) - build: add buildx support b6eea4c (database) - docker: dealing with the change of docker in kubenetes 1.20 04a88db (database) - charts: set the default chart version 92ed309 (database) - database: add initContainer ee6b78f (fluentd) - build: add buildx support f523e30 (fluentd) - docker: dealing with the change of docker in kubenetes 1.20 ee47b53 (fluentd) - charts: set the default chart version 80a51af (influxdb) - influxdb: modify influxdb naming rules fb10030 (influxdb) - influxdb: use influxdb v2 0e87ad8 (influxdb) - docker: dealing with the change of docker in kubenetes 1.20 9d10801 (influxdb) - charts: set the default chart version d825c9f (logger) - build: add buildx support b139576 (logger) - docker: dealing with the change of docker in kubenetes 1.20 88f84ea (logger) - charts: set the default chart version 5ccae3e (logger) - dockerfile: remove chmod cmd 193aefc (logger) - logger: add initContainers baee330 (minio) - minio: multi-platform support ad5d055 (minio) - build: add buildx support 19868d4 (minio) - docker: dealing with the change of docker in kubenetes 1.20 4bd84b8 (minio) - charts: set the default chart version 79d1f2f (monitor) - database: multi-platform support 88e5a7f (monitor) - build: add buildx support 5672e99 (monitor) - influxdb: modify influxdb naming rules 8672103 (monitor) - influxdb: use influxdb v2 66cb4c8 (monitor) - docker: dealing with the change of docker in kubenetes 1.20 9576eb3 (monitor) - charts: set the default chart version 30809c9 (monitor) - monitor: add initContainers 70d140c (nsqd) - nsqd: using self compiled nsq binary 1073d4f (nsqd) - nsqd: use GOPATH replace /go e498480 (nsqd) - build: add buildx support cf9b7d5 (nsqd) - docker: dealing with the change of docker in kubenetes 1.20 c335856 (nsqd) - charts: set the default chart version efba713 (redis) - build: add buildx support c7a3b53 (redis) - docker: dealing with the change of docker in kubenetes 1.20 4cdad7b (redis) - charts: set the default chart version 652b443 (registry) - registry: multi-platform support 4060176 (registry) - registry: use docker build 7102a03 (registry) - docker: dealing with the change of docker in kubenetes 1.20 6c8600d (registry) - charts: set the default chart version 33a51c9 (registry) - registry: add initContainers bef70dc (registry-proxy) - build: add buildx support d2319c1 (registry-proxy) - docker: dealing with the change of docker in kubenetes 1.20 02fafed (registry-proxy) - charts: set the default chart version","title":"Features"},{"location":"changelogs/v1.5.0/#fixes","text":"5499c9a (controller) - gunicorn: gunicorn not running 06e9e88 (controller) - controller: error loading shared library 01b5bd0 (controller) - controller: upgrade celery config 6e32d55 (controller) - controller: fix update resources bug 0e0d53f (controller) - chart: set the domain depends certManagerEnabled 2ac4ca8 (controller) - passport: error loading shared library libexpat.so.1 a0dd517 (fluentd) - fluentd: drone build 6eca2a3 (logger) - logger: golang lint 63b0aa0 (registry) - drone: charts url error","title":"Fixes"},{"location":"changelogs/v1.5.0/#docs","text":"472cfcc (controller) - controller organize README.md document d9d6e29 (redis) - redis: delete links that do not exist","title":"Docs"},{"location":"changelogs/v1.5.0/#test-case","text":"1468f57 (controller) - controller: add command unittest","title":"Test case"},{"location":"changelogs/v1.5.0/#maintenance","text":"9999bfd (builder) - builder:replace the special words cda8b58 (builder) - builder: remove docker keyword from charts dc575dd (builder) - builder: use imagebuilder replace dockerbuilder d3bb183 (builder) - docker: use the full name of registry 5fe34d1 (builder) - travis: add DEV_REGISTRY 7e36453 (builder) - CICD: use drone 52b8d9d (builder) - drone: add image_registries volumes 65963f4 (builder) - k8s: add privileged to dind d345fcf (builder) - LICENSE: revert modifications to Apache license 7975c99 (builder) - drone: always pull image 59633dd (builder) - builder: modify launch imagebuild pod 8d14e67 (builder) - builder: use Procfile in anywhere 5357fa8 (builder) - go: bump go mod 8d26ac0 (builder) - k8s: k8s deprecated api migration 0af620d (builder) - chars: change org to imageTag ae84303 (builder) - builder: run imagebuider replace pod with job 3b2c496 (builder) - builder: change docs website 5679a4c (builder) - builder: upgrade to golang1.17 a214503 (controller) - controller:replace whitelist with allowlist 375ddcc (controller) - ps:drycc ps:list show autoscale num c32e409 (controller) - ldap: canot register when ldap is enabled c46580a (controller) - controller:modify redis config fa9e87b (controller) - chart:modify controller charts 6f9fd08 (controller) - nsq: remove nsq 994b2dc (controller) - docker-buildx: add check-docker a720c3a (controller) - controller: remove docker keyword from charts e9a5c84 (controller) - docker: use the full name of registry a26614a (controller) - controller: add rabbitmq env 3df229d (controller) - controller: modify database config && remove redis port config && add env prefix with DRYCC 257e94b (controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjob f4d6ec3 (controller) - chart: pretty chart format 63e6195 (controller) - influxdb: modify influxdb code 0f6d408 (controller) - CICD: use drone 87bad28 (controller) - python: upgrade to python3.9 e8f7560 (controller) - volumes: modify mount summary 6cf6c6b (controller) - drone: add image_registries volumes a9397e8 (controller) - oauth: modify token Authentication c7f8c8b (controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfs a1a08aa (controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfs efd78b4 (controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs 649b044 (controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs 41b742b (controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs 22ffe5d (controller) - LICENSE: revert modifications to Apache license c98b468 (controller) - drone: always pull image 20e6edb (controller) - chart: modify the problem of using buildpack db16879 (controller) - controller: pretty pods list print ba6f456 (controller) - test: pretty pods list print 5fce4b7 (controller) - k8s: k8s deprecated api migration e9e0bcb (controller) - oauth: using passport authentication 0311172 (controller) - chars: change org to imageTag 150eff1 (controller) - charts: update cert-manager api version de8545a (controller) - controller: update requirements 1442207 (controller) - controller: using django native JSONFiled ab4e836 (controller) - oauth: modify passport api 5c54e06 (controller) - controller: eliminate pip warnings 870328d (controller) - controller: remove entrypoint 5e5e6ae (controller) - controller: upgrade celery config 607778f (controller) - controller: add initContainer 23dc016 (controller) - chart: set the domain depends certManagerEnabled f3cf20b (controller) - controller: remove default bash env 73f2636 (controller) - controller: modify alpinelinux repositories 498e9f2 (controller) - chart: change certManagerEnabled to boolean type 27f5308 (controller) - passport: exclude cryptography 370b75d (controller) - controller: use sh env 07585b4 (database) - postgres:replace the special words 20172dc (database) - database: remove docker keyword from charts abb9b88 (database) - docker: use the full name of registry e72f58f (database) - chart: modify the off-cluster database a91f64f (database) - travis: add DEV_REGISTRY 614fb76 (database) - tests: use add-host replace link a3428f3 (database) - CICD: use drone 239fef1 (database) - drone: add image_registries volumes 42858e1 (database) - LICENSE: revert modifications to Apache license d0fe850 (database) - drone: always pull image 34a36ad (database) - charts: Nn secret is generated during off-cluster 064ccf4 (database) - database: create database 9228992 (database) - chars: change org to imageTag 9f7810c (database) - database: upgrade to wal-g v1.1 05783f4 (fluentd) - fluentd:replace the special words 0739809 (fluentd) - influxdb:replace monitor-influx with influx f02487c (fluentd) - fluentd: remove docker keyword from charts 2c96cc0 (fluentd) - docker: use the full name of registry b20c429 (fluentd) - charts: remove port config 6dd0197 (fluentd) - travis: add DEV_REGISTRY c5bec51 (fluentd) - CICD: use drone f8524b7 (fluentd) - drone: add image_registries volumes a50878a (fluentd) - LICENSE: revert modifications to Apache license 14fe20e (fluentd) - drone: always pull image 4a2f660 (fluentd) - k8s: k8s deprecated api migration de2dd91 (fluentd) - chars: change org to imageTag a9f1944 (fluentd) - fluentd: upgrade to fluentd1.14 7cb4e95 (influxdb) - influxdb: change username to user 0fdc21b (influxdb) - influxdb: remove docker keyword from charts b2acddb (influxdb) - influxdb: change default path ba88919 (influxdb) - influxdb: add check_env function 9117401 (influxdb) - influxdb: modify init_influxdb has_bucket 092a3e6 (influxdb) - chart: pod not readiness 51de380 (influxdb) - travis: add DEV_REGISTRY 66d7667 (influxdb) - docker: replace influxdb base image 3aa3094 (influxdb) - CICD: use drone 14b9c24 (influxdb) - drone: add image_registries volumes 02b4cd1 (logger) - logger:replace the special words 114b5d5 (logger) - reids: delete the logger prefix of redis 639278a (logger) - redis: remove logger from redis conf 90195e2 (logger) - go: remove GOOS and GOARCH 31e2e27 (logger) - logger: remove docker keyword from charts 8fbd9fa (logger) - docker: use the full name of registry b39df2d (logger) - charts: remove redis\\nsqd port config 35d6d07 (logger) - travis: add DEV_REGISTRY 69aabf5 (logger) - tests: remove docker link e916644 (logger) - CICD: use drone d6872b7 (logger) - drone: add image_registries volumes 37801da (logger) - LICENSE: revert modifications to Apache license cfb4b38 (logger) - drone: always pull image 8bda3bf (logger) - go: bump go mod e13ebfc (logger) - chars: change org to imageTag 38e6d8d (minio) - minio:replace the special words d6925dd (minio) - minio: remove docker keyword from charts d56bc39 (minio) - docker: use the full name of registry e4696cc (minio) - travis: add DEV_REGISTRY 70c5c79 (minio) - minio: use latest version 773cf6c (minio) - Makefile: remove DEV_REGISTRY ?= 5ce5bc6 (minio) - CICD: use drone 5da8be3 (minio) - drone: add image_registries volumes c1f0611 (minio) - LICENSE: revert modifications to Apache license b73f792 (minio) - drone: always pull image 79d1c93 (minio) - go: bump go mod c448899 (minio) - chars: change org to imageTag 15ee49e (minio) - minio: migrate deprecated warning 9968a1a (minio) - minio: upgrade to golang1.7 14fedd2 (monitor) - monitor:replace the special works 52c431a (monitor) - reids: delete the logger prefix of redis 2c95b47 (monitor) - redis: remove logger from redis conf da9bc56 (monitor) - monitor:remove influxdb 53f47b9 (monitor) - grafana: use grafana docker image 5bdb188 (monitor) - grafana: use grafana docker image c0586dd (monitor) - monitor: remove docker keyword from charts 87d02b6 (monitor) - charts: add nodes and persistentvolumes rule 1b5598f (monitor) - monitor: modify grafana dashboard with FLUX and pretty config.toml bcbc0d5 (monitor) - docker: use the full name of registry 9418c9e (monitor) - monitor: fix upload dashboard error and modify INFLUXDB input 589f29a (monitor) - travis: add DEV_REGISTRY f776f8a (monitor) - CICD: use drone 6ca3060 (monitor) - drone: add image_registries volumes 6a9ffb2 (monitor) - LICENSE: revert modifications to Apache license 45e41ed (monitor) - drone: always pull image 654d407 (monitor) - k8s: k8s deprecated api migration 41e9b9c (monitor) - chars: change org to imageTag 99c10d3 (monitor) - charts: update cert-manager api version 9bf83c4 (monitor) - oauth: user oauth passport a128f6d (monitor) - chart: change certManagerEnabled to boolean type 8f897fe (monitor) - chart: set the domain depends certManagerEnabled ba6d793 (nsqd) - README:update travis build status 49879c4 (nsqd) - nsqd: minimum git clone code c5e2680 (nsqd) - nsqd: remove docker keyword from charts 21dd17b (nsqd) - docker: use the full name of registry 7d86b3c (nsqd) - charts: remove port config c073d95 (nsqd) - travis: add DEV_REGISTRY 55c297c (nsqd) - CICD: use drone 165c2ae (nsqd) - drone: add image_registries volumes 9c6a1f8 (nsqd) - LICENSE: revert modifications to Apache license 9283098 (nsqd) - drone: always pull image 46acf8a (nsqd) - k8s: k8s deprecated api migration 43caf80 (nsqd) - chars: change org to imageTag 6897471 (nsqd) - nsqd: use official image 297bc05 (redis) - redis:replace the special words f5f8b5e (redis) - reids: delete the logger prefix of redis af7b657 (redis) - redis: change logger-redis to redis 8dca154 (redis) - redis: remove logger from redis conf eaeda2d (redis) - redis: remove docker keyword from charts 53c6358 (redis) - docker: use the full name of registry ae37416 (redis) - charts: remove port config e985656 (redis) - travis: add DEV_REGISTRY 423336a (redis) - CICD: use drone be64ab4 (redis) - drone: add image_registries volumes 3bec735 (redis) - LICENSE: revert modifications to Apache license 4f934f6 (redis) - drone: always pull image 359b878 (redis) - chars: change org to imageTag 83b8ac2 (registry) - workflow:replace the special words 869b280 (registry) - registry: remove docker keyword from charts 999c1e9 (registry) - docker: use the full name of registry 5652da9 (registry) - travis: add DEV_REGISTRY cc8c6c2 (registry) - CICD: use drone c7bdbd0 (registry) - CICD: pretty .drone.yaml format 5c55a38 (registry) - test: use add-host replace link f8866f3 (registry) - drone: add image_registries volumes 6c8292f (registry) - LICENSE: revert modifications to Apache license 1d50f2c (registry) - drone: always pull image efbca6d (registry) - chars: change org to imageTag 2eafc59 (registry-proxy) - registry-proxy: update nginx 071bd86 (registry-proxy) - charts: upgrade k8s newer API versions c72db96 (registry-proxy) - registry-proxy: change travis icon url 63ffb92 (registry-proxy) - registry-proxy:replace the special works 1d904a6 (registry-proxy) - registry-proxy: remove docker keyword from charts c8200b1 (registry-proxy) - docker: use the full name of registry d3fa939 (registry-proxy) - travis: add DEV_REGISTRY 5a8b353 (registry-proxy) - CICD: use drone 703d05a (registry-proxy) - drone: add image_registries volumes aa71db1 (registry-proxy) - LICENSE: revert modifications to Apache license 710c126 (registry-proxy) - drone: always pull image 2dcc5e6 (registry-proxy) - chars: change org to imageTag","title":"Maintenance"},{"location":"changelogs/v1.6.0/","text":"Workflow ## v1.5.0 -> v1.6.0 \u00b6 Releases \u00b6 builder v1.3.0 -> v1.4.0 controller v1.4.0 -> v1.5.0 passport v1.0.0 -> v1.1.0 database v1.1.0 -> v1.2.0 imagebuilder v1.0.1 -> v1.1.0 fluentd v1.2.0 -> v1.3.0 logger v1.2.0 -> v1.3.0 storage v1.2.0 -> v1.3.0 monitor v1.2.0 -> v1.3.0 redis v1.2.0 -> v1.3.0 influxdb v1.1.0 -> v1.2.0 rabbitmq v1.0.0 -> v1.1.0 registry v1.1.0 -> v1.2.0 registry-proxy v1.1.0 -> v1.2.0 Features \u00b6 52517d9 (builder) - builder: update controller-sdk-go 1d78ca0 (builder) - builder: add affinity 26b6980 (builder) - builder: switch charts to oci bfd4385 (controller) - controller: add get manager user status 874208d (controller) - controller: unified measurement model cadf98f (controller) - controller: add admission webhook e0050c2 (controller) - controller: new measurement model a11ba58 (controller) - controller: multi pod restart uses async fb3c15d (controller) - controller: add check app owner status 3d78b76 (controller) - controller: add resource services api 3d6a201 (controller) - controller: add search apps api 01c443a (controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter 7c26232 (controller) - controller: add volume size limit 3bee749 (controller) - controller: add annotations support 23cd97c (controller) - controller: traefik v2 support e37b7db (controller) - controller: add affinity b3b367b (controller) - controller: add volume expand support a4e154a (controller) - controller: add database replica support 2f37216 (controller) - controller: switch wsgi to asgi b3314a5 (controller) - controller: add pod exec api 75df2dc (controller) - controller: add stream support for app logs 4229bad (controller) - ccontroller: switch charts to oci 89bb19b (database) - database: upgrade to pg14 9f45a5d (database) - database: add hugepages support c4008c9 (database) - database: add affinity 411a7b2 (database) - postgres: use patroni 64e5cb0 (database) - database: switch charts to oci 2bab823 (fluentd) - fluentd: switch charts to oci 337ba62 (imagebuilder) - imagebuilder: run podman as rootless 4396ffa (imagebuilder) - imagebuilder: switch to oci charts f37ae09 (influxdb) - influxdb: add affinity 04503b2 (influxdb) - influxdb: add influxdb ha 41ddad5 (influxdb) - influxdb: switch charts to oci 2006480 (logger) - logger: use redis stream replace nsqd ab23d17 (logger) - logger: add affinity 81d4e9d (logger) - logger: switch charts to oci c3d9796 (monitor) - monitor: add affinity cd9de3c (monitor) - monitor: switch to oci charts 318a73f (passport) - passport: add change user confirm 79ef100 (passport) - passport: add re login at authorize 6927bb5 (passport) - passport: add affinity 3146a09 (passport) - passport: add google reCAPTCHA 802abcd (passport) - passport: add replica database support a0dcd1b (passport) - passport: switch wsgi to asgi 4c9dbba (passport) - passport: switch charts to oci 74825f7 (rabbitmq) - rabbitmq: add rabbitmq managentment ingress 12cf7d6 (rabbitmq) - rabbitmq: add affinity 103417d (rabbitmq) - rabbitmq: switch charts to oci 5d428bb (redis) - redis: add affinity a88c1a9 (redis) - redis: switch charts to oci 541585d (registry) - registry: add affinity e9ca9d4 (registry) - registry: add garbage-collect cronjob ec62a59 (registry) - registry: switch charts to oci fde0b07 (registry-proxy) - registry-proxy: switch charts to oci be14eb4 (storage) - minio: add affinity 51af696 (storage) - storage: add k8s csi support 76a75d9 (storage) - storage: add cluster health checker a17dc8c (storage) - storage: switch charts to oci Fixes \u00b6 e4f44fb (builder) - builder: no error return e38dfc7 (builder) - builderControllerHost/ControllerPort init error ff9069f (controller) - controller: influxdb query error f7f5069 (controller) - controller: authentication 500 7e297a8 (controller) - controller: add check remote user status 9db28e1 (controller) - controller: celery MaxRetriesExceededError 4bcff08 (controller) - controller: wrong name d69fde2 (controller) - controller: traefik ingress create error a3ad743 (controller) - fixup(controller: user login error 662c8dd (controller) - controller: change influxdb port 957bdf6 (controller) - controller: validate rsa key pairing before storage 419ec4c (controller) - controller: kubernetes pod/exec cluster role a67edaa (controller) - controller: Cannot routing:disable e09e214 (controller) - controller: allowlist cannot remove 318b126 (controller) - controller: domains update error 92855eb (database) - database: premission denied bde945a (database) - fixup(postgres: support arm, fix Failed to build psutil 7854d45 (database) - fixup(postgres: user name converted to lowercase letters 57b2a07 (fluentd) - fluentd: ifconfig_path not found 20e72b9 (imagebuilder) - imagebuilder: upgrade pack version 651db8a (imagebuilder) - imagebuilder: chown uid gid order d2e9164 (influxdb) - influxdb: proxy not running 3a1d361 (monitor) - monitor: charts naming d754ae0 (monitor) - monitor: telegraf init error 63f9e34 (monitor) - monitor: affinity error 95ae1e5 (passport) - passport: yarn build fail 3f5365e (passport) - passport: wrong name 907f17b (passport) - passport: change uid gid to 1001 e3911e0 (passport) - passport: 'registration_done' not found 2ace5f0 (passport) - passport: ui style b3ba1e1 (passport) - passport privacy policy link 172e9c8 (passport) - passport: check databaseReplicaUrl error a3aeb70 (rabbitmq) - passport: change uid gid to 1001 5c73dcf (redis) - reids: DRYCC_REGISTY misspelling d7e3baf (redis) - redis: env miss cadaa91 (registry) - registry: set gid uid to 1001 d524217 (registry) - registry: storage run error 854f912 (registry) - registry: chown uid gid order e642bb7 (registry-proxy) - registry-proxy: containerPort error 8dfd029 (registry-proxy) - registry-proxy: chown uid gid order bbea364 (storage) - minio: premission denied 97deba1 (storage) - storage: node unimplemented error b9bdeff (storage) - storage: pd can not connect each other Style \u00b6 1edb10c (controller) - controller: database convention over configuration 1960cc3 (database) - database: database name convention over configuration 06d1f5d (imagebuilder) - imagebuilder: URL to Url b8a8941 (passport) - passport: database convention over configuration Maintenance \u00b6 8e9a199 (builder) - builder: upgrade controller-sdk-go 4840151 (builder) - builder: use exec runner replace docker runner 68ccfb1 (builder) - builder: canonical charts naming 8f971cb (builder) - builder: provide any additional service annotations fe2c55d (builder) - dockerfile: use drycc/base image 2b5e706 (builder) - dockerfile: change user and workdir 7a6c8d3 (builder) - builder: set gid uid to 1001 fe494f7 (builder) - dockerfile: use uid gid a7c8752 (builder) - builder: change nodes to pod affinity eb2e94c (builder) - database: bump mc 2022.04.01.23.44.48 cfaae66 (builder) - builder: use registry.drycc.cc replace docker.io d7d2890 (builder) - builder: change default imagebuilder registry ecfdb19 (builder) - imagebuilder: change python-dev registry 6da17f4 (builder) - builder: https://github.com/minio/minio/issues/14331 1a57e5b (builder) - builder: https://github.com/minio/minio/issues/14331 f1464fa (builder) - builder: https://github.com/minio/minio/issues/13799 b1e1c4f (builder) - builder: use env replace creds volume 71a4145 (builder) - builder: bump go.mod 3567688 (builder) - builder: fine management affinity 73ea38b (builder) - builder: change storage to minio 1f91321 (builder) - builder: use testify replace assert d148b9c (builder) - builder: add check storage health b768101 (builder) - builder: change initContainers 1b3bec3 (builder) - builder: add replicas 5cb0d61 (builder) - builder: upgrade to latest controller-sdk-go 98b9d58 (builder) - builder: upgrade new require 65817c3 (builder) - builder: change drycc.cc to www.drycc.cc 4e3f9d0 (controller) - controller: add celery retry mechanism f6716fe (controller) - controller: change cronjob name eb60693 (controller) - controller: refine celery task priority 66905e9 (controller) - controller: change manager auth ea20c41 (controller) - controller: remove start/stop api 4c8fc80 (controller) - controller: improve tasks error handling cf7402e (controller) - controller: add blocklist api 80f14dd (controller) - controller: use get_user_model replace auth.User ffc7bb7 (controller) - controller: use JSONField replace ArrayField 370df8c (controller) - controller: add validate metric 29084ce (controller) - controller: use user id request manager api 718fe12 (controller) - controller change urlpatterns order 71f4042 (controller) - controller: measurements uses lowercase letters e5123ea (controller) - controller: change resource unit to number 18fee9a (controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfs ffca6c1 (controller) - controller: use exec runner replace docker runner 9ec12e1 (controller) - controller: simplify drone configuration 4b4749e (controller) - controller: set default CSRF_COOKIE_SECURE false 2ef6338 (controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfs c7570d0 (controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs 8b17bc1 (controller) - controller: canonical charts naming c928fb0 (controller) - controller: use rabbitmq cluster f917185 (controller) - controller: provide any additional service annotations 22a8f63 (controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs 3cc3b00 (controller) - dockerfile: use drycc/base image ee274f6 (controller) - controller: set venv profile ce6b069 (controller) - controller: set gid uid to 1001 3a105d3 (controller) - dockerfile: use uid gid 15f9b0e (controller) - controller: code review 01e6fd9 (controller) - controller: use passport user id 893ee31 (controller) - oauth2: update user info pipline 3028fb4 (controller) - user: set AnonymousUser username 5daf82d (controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss 61f2c53 (controller) - controller: change nodes to pod affinity 88feb1d (controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14 914e03f (controller) - controller: use registry.drycc.cc replace docker.io a5bb548 (controller) - controller: change python-dev registry 3ecdd7c (controller) - controller: add a separate rabbitmqUrl configuration 967cb11 (controller) - controller: remove APP_STORAGE 473d2b5 (controller) - controller: use env replace creds volume e410d4c (controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfs c6ef777 (controller) - controller: simplified passport config 0fd3233 (controller) - controller: remove settings hardcode a64e99c (controller) - controller: change passport config 62aba25 (controller) - controller: set cronjob timezone to utc 760b70b (controller) - controller: change default ratio 8dffc3a (controller) - controller: fine management affinity 26043c4 (controller) - controller: change default app storage 608bd8d (controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs 18ed0c2 (controller) - controller: remove conjob affinity add6712 (controller) - controller: add volume expand support use patch cc1ad13 (controller) - controller: add startupProbe 0e9a603 (controller) - controller: add clearsocial cronjob eb6f05d (controller) - controller: change initContainers 762c676 (controller) - controller: change replicas abd7e8c (controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs 07fdf1b (controller) - controller: remove database conn_max_age ef8e41f (controller) - controller: add database replica check 79143f2 (controller) - controller: upgrade new require a624048 (controller) - controller: add app.refresh func annotation b22d367 (controller) - controller: optimize app refresh timing fe98f0c (database) - database: use exec runner replace docker runner 5e00c11 (database) - database: canonical charts naming d2cb860 (database) - database: disable huge_pages 197d80d (database) - database: add persistence 1c3e645 (database) - database: provide any additional service annotations 37730ab (database) - dockerfile: use drycc/base image 5014112 (database) - dockerfile: change entrypoint 29b538e (database) - database: change nodes to pod affinity c2bb074 (database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48 077a4e9 (database) - database: use registry.drycc.cc replace docker.io 560bdb9 (database) - database: change python-dev registry 1e54b55 (database) - database: https://github.com/minio/minio/issues/14331 d646672 (database) - database: https://github.com/minio/minio/issues/13799 a6ac4e3 (database) - database: use env replace creds volume 9618d87 (database) - database: fine management affinity b823273 (database) - database: change minio to storage 7bd5a90 (database) - database: add check storage health 20c6d96 (database) - database: fix storage run error 8bde830 (database) - database: upgrade to pg 14.5 a33b5e5 (fluentd) - fluentd: update plugins eed7a78 (fluentd) - fluentd: update filter kubernetes setting cc83dd8 (fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logs ba2feb2 (fluentd) - fluentd: use exec runner replace docker runner d528676 (fluentd) - fluentd: simplify drone configuration dece82d (fluentd) - fluentd: canonical charts naming 4e0a802 (fluentd) - fluend: replace nsqd with redis 15ceca0 (fluentd) - dockerfile: use drycc/base image a7f619f (fluentd) - dockerfile: change workdir 9adf5ed (fluentd) - database: bump fluentd 1.14.6 50c14c2 (fluentd) - fluentd: use registry.drycc.cc replace docker.io 83171b1 (fluentd) - fluentd: change python-dev registry ec83581 (fluentd) - fluentd: unified reids declaration 07c63e2 (fluentd) - fluentd: upgrade fluentd 1.15.2 65df9be (imagebuilder) - imagebuilder: update pack version 66cab35 (imagebuilder) - imagebuilder: use dind replace go-dev 0c82060 (imagebuilder) - imagebuilder: use exec runner replace docker runner 8146da9 (imagebuilder) - imagebuilder: canonical charts naming 7d97241 (imagebuilder) - dockerfile: use drycc/base image 07e805c (imagebuilder) - imagebuilder: change default buildpack 8d1038d (imagebuilder) - imagebuilder: upgrade podman to 4.0.1 62d3687 (imagebuilder) - imagebuilder: change workdir to /workspace da8bfb0 (imagebuilder) - imagebuilder: change uid gid to 1001 d44e3bc (imagebuilder) - imagebuilder: upgrade stack 5b0c7e6 (imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.io f74cbf6 (imagebuilder) - imagebuilder: add defaultBuildpacksURL 941d493 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/14331 449be91 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/13799 63b0523 (imagebuilder) - imagebuilder: use env replace creds volume 4e8a6e5 (imagebuilder) - imagebuilder: add imagebuilder config 2d891f5 (imagebuilder) - imagebuilder: change minio to storage addceda (imagebuilder) - imagebuilder: upgrade new require a6e569f (imagebuilder) - imagebuilder: pack_build add --env-file parameter 6191ff5 (influxdb) - influxdb: use exec runner replace docker runner dc3f8c7 (influxdb) - influxdb: canonical charts naming 6b5c819 (influxdb) - influxdb: new ingress style 68b381d (influxdb) - influxdb: provide any additional service annotations ea20eb8 (influxdb) - dockerfile: use drycc/base image 64c0a71 (influxdb) - influxdb: set gid uid to 1001 a709ca1 (influxdb) - influxdb: use DRYCC_UID DRYCC_GID env 740dff0 (influxdb) - influxdb: use common affinity template e035673 (influxdb) - influxdb: change nodes to pod affinity f1cefbd (influxdb) - influxdb: use registry.drycc.cc replace docker.io a00100e (influxdb) - influxdb: fine management affinity 9d165ef (influxdb) - influxdb: add probe bee7fff (influxdb) - influxdb: upgrade to influxdb 2.4.0 254914c (logger) - logger: use exec runner replace docker runner 8d91c68 (logger) - logger: canonical charts naming b6d2182 (logger) - logger: provide any additional service annotations c35e59a (logger) - dockerfile: use drycc/base image a63c070 (logger) - logger: change workdir to /workspace a594b28 (logger) - logger: set gid uid to 1001 9a90e22 (logger) - dockerfile: use uid gid 36493b4 (logger) - logger: use common affinity template 897a3a5 (logger) - logger: change nodes to pod affinity 03b32ab (logger) - logger: use registry.drycc.cc replace docker.io a50ba5f (logger) - logger: change python-dev registry 23187a3 (logger) - logger: unified reids declaration aaa129a (logger) - logger: fine management affinity be4f656 (logger) - logger: add replicas 7c25459 (logger) - charts: add NetworkPolicy 6810149 (logger) - logger: remove memory storage a918c50 (logger) - logger: add .vscode to .gitignore a415210 (logger) - logger: add log follow support 59b1da3 (logger) - logger: upgrade new require 27cc151 (monitor) - monitor: use exec runner replace docker runner 07d6a9d (monitor) - monitor: canonical charts naming 1054357 (monitor) - monitor: use redis default port e3673df (monitor) - monitor: remove nsqd fc9dd3e (monitor) - monitor: new ingress style 856a898 (monitor) - monitor: add default user env 9857535 (monitor) - monitor: add random user 38b5a04 (monitor) - grafana: oauth auto login 5dfc579 (monitor) - monitor: upgrade version e121b5a (monitor) - monitor: provide any additional service annotations 84462a0 (monitor) - dockerfile: use drycc/base image b9e8ce8 (monitor) - monitor: chore(imagebuilder): change uid gid to 1001 05ee8ab (monitor) - dockerfile: use uid gid e1fa68e (monitor) - monitor: use common affinity template b8f302b (monitor) - monitor: change nodes to pod affinity 4fc991f (monitor) - database: bump telegraf 1.22.0 and grafana 8.4.5 21a2f6a (monitor) - monitor: use registry.drycc.cc replace docker.io acc976f (monitor) - monitor: change python-dev registry 62d76c1 (monitor) - monitor: unified reids declaration b3c57ad (monitor) - monitor: optimize oauth2 configuration 70af6b0 (monitor) - monitor: change passport config 69f9a88 (monitor) - monitor: fine management affinity 2fb278f (monitor) - monitor: rename influxdb port 17548ff (monitor) - grafana: update dashborad 69d7bbd (monitor) - grafana: influx dashborad disk size 75db1b0 (monitor) - monitor: upgrade new grafana/telegraf 80504a1 (monitor) - grafana: update influx and redis dashboard f7078cb (monitor) - monitor:chown use env 91ae0dd (passport) - passport: optimize login display 2d3bbbc (passport) - passport: change drycc logo 59790a7 (passport) - passport: make user email unique faea034 (passport) - passport: use strtobool 1fbf2bc (passport) - passport: use yarn replace npm 119cac8 (passport) - passport: use exec runner replace docker runner cff5062 (passport) - passport: set default CSRF_COOKIE_SECURE false 9cc0210 (passport) - passport: canonical charts naming 9ab3896 (passport) - passport: new ingress style 259ccc9 (passport) - passport: provide any additional service annotations af1bbcd (passport) - dockerfile: use drycc/base image 9ae5373 (passport) - passport: set venv profile 8f61090 (passport) - dockerfile: use uid gid fcaf72d (passport) - passport: upgrade npm package 546dcd5 (passport) - passport: add license 4bda2d6 (passport) - passport: use minify 73b0fd1 (passport) - passport: use common affinity template 278fe7a (passport) - passport: change nodes to pod affinity 3cd93d3 (passport) - passport: add reactive 370b493 (passport) - passport: add footer 483cbd6 (passport) - passport: use h_captcha replace re_captcha 3d1675e (passport) - database: bump python 3.10.4 and node 16.14.2 86a7835 (passport) - passport: use registry.drycc.cc replace docker.io 2d65355 (passport) - passport: change python-dev registry 90c1444 (passport) - passport: unified reids declaration 2e0e417 (passport) - passport: fix firefox footer ad274be (passport) - passport: use bulecss f986d8b (passport) - passport: add main footer 3e52867 (passport) - passport: dynamic settings for vue 38adabc (passport) - passport: change passport config f8d6b60 (passport) - passport: fine management affinity 2cbd79d (passport) - passport: remove database conn_max_age 7122797 (passport) - passport: change drycc.cc to www.drycc.cc 8cc84cd (rabbitmq) - rabbitmq: use exec runner replace docker runner f35930f (rabbitmq) - rabbitmq: add rabbitmq cluster support fbfa3ba (rabbitmq) - rabbitmq: canonical charts naming ca60701 (rabbitmq) - rabbitmq: use volumeClaimTemplates fe5d1b4 (rabbitmq) - rabbitmq: add sharding support 9c4ab97 (rabbitmq) - rabbitmq: provide any additional service annotations 348a88a (rabbitmq) - dockerfile: use drycc/base image 2388be1 (rabbitmq) - rabbitmq: upgrade erlang to 24.2.2 db2eaa5 (rabbitmq) - dockerfile: use uid gid 772afd1 (rabbitmq) - rabbitmq: change to wait pid file 2bfc25e (rabbitmq) - rabbitmq: use common affinity template 11d505e (rabbitmq) - rabbitmq: change nodes to pod affinity 69d63f1 (rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.14 8380299 (rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.io b3f69f1 (rabbitmq) - rabbitmq: add check rabbitmqLocaltion 5327c76 (rabbitmq) - rabbitmq: fine management affinity 5c66b5a (rabbitmq) - rabbitmq: change probe 27bebf9 (rabbitmq) - rabbitmq: add start-rabbitmq script 86ee6a7 (rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.7 1f29683 (redis) - redis: use exec runner replace docker runner a5041fc (redis) - redis: canonical charts naming 64468c2 (redis) - redis: add redis persistence de5d753 (redis) - redis: provide any additional service annotations f644639 (redis) - dockerfile: use drycc/base image 98051d2 (redis) - redis: premission denied bcb548e (redis) - dockerfile: use uid gid 524aa41 (redis) - redis: use common affinity template 26c9466 (redis) - redis: change nodes to pod affinity b67d7a2 (redis) - redis: use registry.drycc.cc replace docker.io 839ec50 (redis) - redis: use env replace creds volume 237ca86 (redis) - redis: fine management affinity bdd968d (redis) - redis: upgrade neew require 8b2910f (registry) - registry: use exec runner replace docker runner eedbe78 (registry) - registry: canonical charts naming 0241615 (registry) - registry: provide any additional service annotations 9b58da4 (registry) - dockerfile: use drycc/base image ab6acb7 (registry) - registry: change workdir to /workspace f368bf7 (registry) - registry: use DRYCC_UID DRYCC_GID env f4b9041 (registry) - registry: use common affinity template c2e87ca (registry) - registry: change nodes to pod affinity feb6aba (registry) - database: bump mc 2022.04.01.23.44.48 956932b (registry) - rregistry: use registry.drycc.cc replace docker.io deda8d8 (registry) - registry: move registry-secret.yaml from workflow to registry f52c7bf (registry) - registry: change python-dev registry 007fe03 (registry) - registry: https://github.com/minio/minio/issues/14331 d620c6d (registry) - registry: https://github.com/minio/minio/issues/13799 85e6b73 (registry) - registry: use env replace creds volume 6a1155d (registry) - registry: fine management affinity 7b8ebae (registry) - registry: change minio to storage 1338951 (registry) - registry: add check storage health 2fa769d (registry) - registry: change probe f187cbf (registry) - registry: add replicas 09d8a7b (registry) - registry: upgrade to mc 2022.08.28.20.08.11 4b187b8 (registry-proxy) - registry-proxy: use exec runner replace docker runner 29ffbbe (registry-proxy) - registry-proxy: canonical charts naming 6d783ba (registry-proxy) - registry-proxy: remove use_cni 8cf05cf (registry-proxy) - dockerfile: use drycc/base image 090e286 (registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 1001 7cf6120 (registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env 3a00697 (registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io 30e69e8 (registry-proxy) - registry-proxy: add registry basic auth proxy 942abce (registry-proxy) - registry-proxy: upgrade to nginx 1.23.1 5ea3297 (storage) - minio: use exec runner replace docker runner 8306add (storage) - minio: canonical charts naming c917e9f (storage) - minio: provide any additional service annotations 042c732 (storage) - dockerfile: use drycc/base image 7b47b82 (storage) - minio: change workdir to /workspace 6f3531e (storage) - minio: use DRYCC_UID DRYCC_GID env 9795fb1 (storage) - minio: use common affinity template a7b09c5 (storage) - minio: change nodes to pod affinity 7607342 (storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39 ea2b2f1 (storage) - minio: use registry.drycc.cc replace docker.io 445b501 (storage) - minio: https://github.com/minio/minio/issues/14331 f19fbc7 (storage) - minio: use env replace creds volume 8982e2e (storage) - minio: use minio to distributed 06bec73 (storage) - minio: fine management affinity 9b8f006 (storage) - storage: remove assert 59d64b9 (storage) - storage: change listen to POD_IP 60044ee (storage) - storage: add juicefs mount options 189f944 (storage) - storage: remove volumeName 302fe89 (storage) - storage: mv to minio dir 6ec586d (storage) - storage: change readinessProbee andlivenessProbe 0e028df (storage) - storage: add minio pdb cf9bd2d (storage) - storage: add check storage health svc 2dd5c9f (storage) - storage: add volumeBindingMode fa2effc (storage) - storage: remove databaseBucket d166cc7 (storage) - charts: format network-policy name d06bcce (storage) - storage: upgrade to golang 1.19 c2ca05c (storage) - storage: upgrade new require","title":"V1.6.0"},{"location":"changelogs/v1.6.0/#workflow-v150-v160","text":"","title":"Workflow ## v1.5.0 -> v1.6.0"},{"location":"changelogs/v1.6.0/#releases","text":"builder v1.3.0 -> v1.4.0 controller v1.4.0 -> v1.5.0 passport v1.0.0 -> v1.1.0 database v1.1.0 -> v1.2.0 imagebuilder v1.0.1 -> v1.1.0 fluentd v1.2.0 -> v1.3.0 logger v1.2.0 -> v1.3.0 storage v1.2.0 -> v1.3.0 monitor v1.2.0 -> v1.3.0 redis v1.2.0 -> v1.3.0 influxdb v1.1.0 -> v1.2.0 rabbitmq v1.0.0 -> v1.1.0 registry v1.1.0 -> v1.2.0 registry-proxy v1.1.0 -> v1.2.0","title":"Releases"},{"location":"changelogs/v1.6.0/#features","text":"52517d9 (builder) - builder: update controller-sdk-go 1d78ca0 (builder) - builder: add affinity 26b6980 (builder) - builder: switch charts to oci bfd4385 (controller) - controller: add get manager user status 874208d (controller) - controller: unified measurement model cadf98f (controller) - controller: add admission webhook e0050c2 (controller) - controller: new measurement model a11ba58 (controller) - controller: multi pod restart uses async fb3c15d (controller) - controller: add check app owner status 3d78b76 (controller) - controller: add resource services api 3d6a201 (controller) - controller: add search apps api 01c443a (controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter 7c26232 (controller) - controller: add volume size limit 3bee749 (controller) - controller: add annotations support 23cd97c (controller) - controller: traefik v2 support e37b7db (controller) - controller: add affinity b3b367b (controller) - controller: add volume expand support a4e154a (controller) - controller: add database replica support 2f37216 (controller) - controller: switch wsgi to asgi b3314a5 (controller) - controller: add pod exec api 75df2dc (controller) - controller: add stream support for app logs 4229bad (controller) - ccontroller: switch charts to oci 89bb19b (database) - database: upgrade to pg14 9f45a5d (database) - database: add hugepages support c4008c9 (database) - database: add affinity 411a7b2 (database) - postgres: use patroni 64e5cb0 (database) - database: switch charts to oci 2bab823 (fluentd) - fluentd: switch charts to oci 337ba62 (imagebuilder) - imagebuilder: run podman as rootless 4396ffa (imagebuilder) - imagebuilder: switch to oci charts f37ae09 (influxdb) - influxdb: add affinity 04503b2 (influxdb) - influxdb: add influxdb ha 41ddad5 (influxdb) - influxdb: switch charts to oci 2006480 (logger) - logger: use redis stream replace nsqd ab23d17 (logger) - logger: add affinity 81d4e9d (logger) - logger: switch charts to oci c3d9796 (monitor) - monitor: add affinity cd9de3c (monitor) - monitor: switch to oci charts 318a73f (passport) - passport: add change user confirm 79ef100 (passport) - passport: add re login at authorize 6927bb5 (passport) - passport: add affinity 3146a09 (passport) - passport: add google reCAPTCHA 802abcd (passport) - passport: add replica database support a0dcd1b (passport) - passport: switch wsgi to asgi 4c9dbba (passport) - passport: switch charts to oci 74825f7 (rabbitmq) - rabbitmq: add rabbitmq managentment ingress 12cf7d6 (rabbitmq) - rabbitmq: add affinity 103417d (rabbitmq) - rabbitmq: switch charts to oci 5d428bb (redis) - redis: add affinity a88c1a9 (redis) - redis: switch charts to oci 541585d (registry) - registry: add affinity e9ca9d4 (registry) - registry: add garbage-collect cronjob ec62a59 (registry) - registry: switch charts to oci fde0b07 (registry-proxy) - registry-proxy: switch charts to oci be14eb4 (storage) - minio: add affinity 51af696 (storage) - storage: add k8s csi support 76a75d9 (storage) - storage: add cluster health checker a17dc8c (storage) - storage: switch charts to oci","title":"Features"},{"location":"changelogs/v1.6.0/#fixes","text":"e4f44fb (builder) - builder: no error return e38dfc7 (builder) - builderControllerHost/ControllerPort init error ff9069f (controller) - controller: influxdb query error f7f5069 (controller) - controller: authentication 500 7e297a8 (controller) - controller: add check remote user status 9db28e1 (controller) - controller: celery MaxRetriesExceededError 4bcff08 (controller) - controller: wrong name d69fde2 (controller) - controller: traefik ingress create error a3ad743 (controller) - fixup(controller: user login error 662c8dd (controller) - controller: change influxdb port 957bdf6 (controller) - controller: validate rsa key pairing before storage 419ec4c (controller) - controller: kubernetes pod/exec cluster role a67edaa (controller) - controller: Cannot routing:disable e09e214 (controller) - controller: allowlist cannot remove 318b126 (controller) - controller: domains update error 92855eb (database) - database: premission denied bde945a (database) - fixup(postgres: support arm, fix Failed to build psutil 7854d45 (database) - fixup(postgres: user name converted to lowercase letters 57b2a07 (fluentd) - fluentd: ifconfig_path not found 20e72b9 (imagebuilder) - imagebuilder: upgrade pack version 651db8a (imagebuilder) - imagebuilder: chown uid gid order d2e9164 (influxdb) - influxdb: proxy not running 3a1d361 (monitor) - monitor: charts naming d754ae0 (monitor) - monitor: telegraf init error 63f9e34 (monitor) - monitor: affinity error 95ae1e5 (passport) - passport: yarn build fail 3f5365e (passport) - passport: wrong name 907f17b (passport) - passport: change uid gid to 1001 e3911e0 (passport) - passport: 'registration_done' not found 2ace5f0 (passport) - passport: ui style b3ba1e1 (passport) - passport privacy policy link 172e9c8 (passport) - passport: check databaseReplicaUrl error a3aeb70 (rabbitmq) - passport: change uid gid to 1001 5c73dcf (redis) - reids: DRYCC_REGISTY misspelling d7e3baf (redis) - redis: env miss cadaa91 (registry) - registry: set gid uid to 1001 d524217 (registry) - registry: storage run error 854f912 (registry) - registry: chown uid gid order e642bb7 (registry-proxy) - registry-proxy: containerPort error 8dfd029 (registry-proxy) - registry-proxy: chown uid gid order bbea364 (storage) - minio: premission denied 97deba1 (storage) - storage: node unimplemented error b9bdeff (storage) - storage: pd can not connect each other","title":"Fixes"},{"location":"changelogs/v1.6.0/#style","text":"1edb10c (controller) - controller: database convention over configuration 1960cc3 (database) - database: database name convention over configuration 06d1f5d (imagebuilder) - imagebuilder: URL to Url b8a8941 (passport) - passport: database convention over configuration","title":"Style"},{"location":"changelogs/v1.6.0/#maintenance","text":"8e9a199 (builder) - builder: upgrade controller-sdk-go 4840151 (builder) - builder: use exec runner replace docker runner 68ccfb1 (builder) - builder: canonical charts naming 8f971cb (builder) - builder: provide any additional service annotations fe2c55d (builder) - dockerfile: use drycc/base image 2b5e706 (builder) - dockerfile: change user and workdir 7a6c8d3 (builder) - builder: set gid uid to 1001 fe494f7 (builder) - dockerfile: use uid gid a7c8752 (builder) - builder: change nodes to pod affinity eb2e94c (builder) - database: bump mc 2022.04.01.23.44.48 cfaae66 (builder) - builder: use registry.drycc.cc replace docker.io d7d2890 (builder) - builder: change default imagebuilder registry ecfdb19 (builder) - imagebuilder: change python-dev registry 6da17f4 (builder) - builder: https://github.com/minio/minio/issues/14331 1a57e5b (builder) - builder: https://github.com/minio/minio/issues/14331 f1464fa (builder) - builder: https://github.com/minio/minio/issues/13799 b1e1c4f (builder) - builder: use env replace creds volume 71a4145 (builder) - builder: bump go.mod 3567688 (builder) - builder: fine management affinity 73ea38b (builder) - builder: change storage to minio 1f91321 (builder) - builder: use testify replace assert d148b9c (builder) - builder: add check storage health b768101 (builder) - builder: change initContainers 1b3bec3 (builder) - builder: add replicas 5cb0d61 (builder) - builder: upgrade to latest controller-sdk-go 98b9d58 (builder) - builder: upgrade new require 65817c3 (builder) - builder: change drycc.cc to www.drycc.cc 4e3f9d0 (controller) - controller: add celery retry mechanism f6716fe (controller) - controller: change cronjob name eb60693 (controller) - controller: refine celery task priority 66905e9 (controller) - controller: change manager auth ea20c41 (controller) - controller: remove start/stop api 4c8fc80 (controller) - controller: improve tasks error handling cf7402e (controller) - controller: add blocklist api 80f14dd (controller) - controller: use get_user_model replace auth.User ffc7bb7 (controller) - controller: use JSONField replace ArrayField 370df8c (controller) - controller: add validate metric 29084ce (controller) - controller: use user id request manager api 718fe12 (controller) - controller change urlpatterns order 71f4042 (controller) - controller: measurements uses lowercase letters e5123ea (controller) - controller: change resource unit to number 18fee9a (controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfs ffca6c1 (controller) - controller: use exec runner replace docker runner 9ec12e1 (controller) - controller: simplify drone configuration 4b4749e (controller) - controller: set default CSRF_COOKIE_SECURE false 2ef6338 (controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfs c7570d0 (controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs 8b17bc1 (controller) - controller: canonical charts naming c928fb0 (controller) - controller: use rabbitmq cluster f917185 (controller) - controller: provide any additional service annotations 22a8f63 (controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs 3cc3b00 (controller) - dockerfile: use drycc/base image ee274f6 (controller) - controller: set venv profile ce6b069 (controller) - controller: set gid uid to 1001 3a105d3 (controller) - dockerfile: use uid gid 15f9b0e (controller) - controller: code review 01e6fd9 (controller) - controller: use passport user id 893ee31 (controller) - oauth2: update user info pipline 3028fb4 (controller) - user: set AnonymousUser username 5daf82d (controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss 61f2c53 (controller) - controller: change nodes to pod affinity 88feb1d (controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14 914e03f (controller) - controller: use registry.drycc.cc replace docker.io a5bb548 (controller) - controller: change python-dev registry 3ecdd7c (controller) - controller: add a separate rabbitmqUrl configuration 967cb11 (controller) - controller: remove APP_STORAGE 473d2b5 (controller) - controller: use env replace creds volume e410d4c (controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfs c6ef777 (controller) - controller: simplified passport config 0fd3233 (controller) - controller: remove settings hardcode a64e99c (controller) - controller: change passport config 62aba25 (controller) - controller: set cronjob timezone to utc 760b70b (controller) - controller: change default ratio 8dffc3a (controller) - controller: fine management affinity 26043c4 (controller) - controller: change default app storage 608bd8d (controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs 18ed0c2 (controller) - controller: remove conjob affinity add6712 (controller) - controller: add volume expand support use patch cc1ad13 (controller) - controller: add startupProbe 0e9a603 (controller) - controller: add clearsocial cronjob eb6f05d (controller) - controller: change initContainers 762c676 (controller) - controller: change replicas abd7e8c (controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs 07fdf1b (controller) - controller: remove database conn_max_age ef8e41f (controller) - controller: add database replica check 79143f2 (controller) - controller: upgrade new require a624048 (controller) - controller: add app.refresh func annotation b22d367 (controller) - controller: optimize app refresh timing fe98f0c (database) - database: use exec runner replace docker runner 5e00c11 (database) - database: canonical charts naming d2cb860 (database) - database: disable huge_pages 197d80d (database) - database: add persistence 1c3e645 (database) - database: provide any additional service annotations 37730ab (database) - dockerfile: use drycc/base image 5014112 (database) - dockerfile: change entrypoint 29b538e (database) - database: change nodes to pod affinity c2bb074 (database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48 077a4e9 (database) - database: use registry.drycc.cc replace docker.io 560bdb9 (database) - database: change python-dev registry 1e54b55 (database) - database: https://github.com/minio/minio/issues/14331 d646672 (database) - database: https://github.com/minio/minio/issues/13799 a6ac4e3 (database) - database: use env replace creds volume 9618d87 (database) - database: fine management affinity b823273 (database) - database: change minio to storage 7bd5a90 (database) - database: add check storage health 20c6d96 (database) - database: fix storage run error 8bde830 (database) - database: upgrade to pg 14.5 a33b5e5 (fluentd) - fluentd: update plugins eed7a78 (fluentd) - fluentd: update filter kubernetes setting cc83dd8 (fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logs ba2feb2 (fluentd) - fluentd: use exec runner replace docker runner d528676 (fluentd) - fluentd: simplify drone configuration dece82d (fluentd) - fluentd: canonical charts naming 4e0a802 (fluentd) - fluend: replace nsqd with redis 15ceca0 (fluentd) - dockerfile: use drycc/base image a7f619f (fluentd) - dockerfile: change workdir 9adf5ed (fluentd) - database: bump fluentd 1.14.6 50c14c2 (fluentd) - fluentd: use registry.drycc.cc replace docker.io 83171b1 (fluentd) - fluentd: change python-dev registry ec83581 (fluentd) - fluentd: unified reids declaration 07c63e2 (fluentd) - fluentd: upgrade fluentd 1.15.2 65df9be (imagebuilder) - imagebuilder: update pack version 66cab35 (imagebuilder) - imagebuilder: use dind replace go-dev 0c82060 (imagebuilder) - imagebuilder: use exec runner replace docker runner 8146da9 (imagebuilder) - imagebuilder: canonical charts naming 7d97241 (imagebuilder) - dockerfile: use drycc/base image 07e805c (imagebuilder) - imagebuilder: change default buildpack 8d1038d (imagebuilder) - imagebuilder: upgrade podman to 4.0.1 62d3687 (imagebuilder) - imagebuilder: change workdir to /workspace da8bfb0 (imagebuilder) - imagebuilder: change uid gid to 1001 d44e3bc (imagebuilder) - imagebuilder: upgrade stack 5b0c7e6 (imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.io f74cbf6 (imagebuilder) - imagebuilder: add defaultBuildpacksURL 941d493 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/14331 449be91 (imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/13799 63b0523 (imagebuilder) - imagebuilder: use env replace creds volume 4e8a6e5 (imagebuilder) - imagebuilder: add imagebuilder config 2d891f5 (imagebuilder) - imagebuilder: change minio to storage addceda (imagebuilder) - imagebuilder: upgrade new require a6e569f (imagebuilder) - imagebuilder: pack_build add --env-file parameter 6191ff5 (influxdb) - influxdb: use exec runner replace docker runner dc3f8c7 (influxdb) - influxdb: canonical charts naming 6b5c819 (influxdb) - influxdb: new ingress style 68b381d (influxdb) - influxdb: provide any additional service annotations ea20eb8 (influxdb) - dockerfile: use drycc/base image 64c0a71 (influxdb) - influxdb: set gid uid to 1001 a709ca1 (influxdb) - influxdb: use DRYCC_UID DRYCC_GID env 740dff0 (influxdb) - influxdb: use common affinity template e035673 (influxdb) - influxdb: change nodes to pod affinity f1cefbd (influxdb) - influxdb: use registry.drycc.cc replace docker.io a00100e (influxdb) - influxdb: fine management affinity 9d165ef (influxdb) - influxdb: add probe bee7fff (influxdb) - influxdb: upgrade to influxdb 2.4.0 254914c (logger) - logger: use exec runner replace docker runner 8d91c68 (logger) - logger: canonical charts naming b6d2182 (logger) - logger: provide any additional service annotations c35e59a (logger) - dockerfile: use drycc/base image a63c070 (logger) - logger: change workdir to /workspace a594b28 (logger) - logger: set gid uid to 1001 9a90e22 (logger) - dockerfile: use uid gid 36493b4 (logger) - logger: use common affinity template 897a3a5 (logger) - logger: change nodes to pod affinity 03b32ab (logger) - logger: use registry.drycc.cc replace docker.io a50ba5f (logger) - logger: change python-dev registry 23187a3 (logger) - logger: unified reids declaration aaa129a (logger) - logger: fine management affinity be4f656 (logger) - logger: add replicas 7c25459 (logger) - charts: add NetworkPolicy 6810149 (logger) - logger: remove memory storage a918c50 (logger) - logger: add .vscode to .gitignore a415210 (logger) - logger: add log follow support 59b1da3 (logger) - logger: upgrade new require 27cc151 (monitor) - monitor: use exec runner replace docker runner 07d6a9d (monitor) - monitor: canonical charts naming 1054357 (monitor) - monitor: use redis default port e3673df (monitor) - monitor: remove nsqd fc9dd3e (monitor) - monitor: new ingress style 856a898 (monitor) - monitor: add default user env 9857535 (monitor) - monitor: add random user 38b5a04 (monitor) - grafana: oauth auto login 5dfc579 (monitor) - monitor: upgrade version e121b5a (monitor) - monitor: provide any additional service annotations 84462a0 (monitor) - dockerfile: use drycc/base image b9e8ce8 (monitor) - monitor: chore(imagebuilder): change uid gid to 1001 05ee8ab (monitor) - dockerfile: use uid gid e1fa68e (monitor) - monitor: use common affinity template b8f302b (monitor) - monitor: change nodes to pod affinity 4fc991f (monitor) - database: bump telegraf 1.22.0 and grafana 8.4.5 21a2f6a (monitor) - monitor: use registry.drycc.cc replace docker.io acc976f (monitor) - monitor: change python-dev registry 62d76c1 (monitor) - monitor: unified reids declaration b3c57ad (monitor) - monitor: optimize oauth2 configuration 70af6b0 (monitor) - monitor: change passport config 69f9a88 (monitor) - monitor: fine management affinity 2fb278f (monitor) - monitor: rename influxdb port 17548ff (monitor) - grafana: update dashborad 69d7bbd (monitor) - grafana: influx dashborad disk size 75db1b0 (monitor) - monitor: upgrade new grafana/telegraf 80504a1 (monitor) - grafana: update influx and redis dashboard f7078cb (monitor) - monitor:chown use env 91ae0dd (passport) - passport: optimize login display 2d3bbbc (passport) - passport: change drycc logo 59790a7 (passport) - passport: make user email unique faea034 (passport) - passport: use strtobool 1fbf2bc (passport) - passport: use yarn replace npm 119cac8 (passport) - passport: use exec runner replace docker runner cff5062 (passport) - passport: set default CSRF_COOKIE_SECURE false 9cc0210 (passport) - passport: canonical charts naming 9ab3896 (passport) - passport: new ingress style 259ccc9 (passport) - passport: provide any additional service annotations af1bbcd (passport) - dockerfile: use drycc/base image 9ae5373 (passport) - passport: set venv profile 8f61090 (passport) - dockerfile: use uid gid fcaf72d (passport) - passport: upgrade npm package 546dcd5 (passport) - passport: add license 4bda2d6 (passport) - passport: use minify 73b0fd1 (passport) - passport: use common affinity template 278fe7a (passport) - passport: change nodes to pod affinity 3cd93d3 (passport) - passport: add reactive 370b493 (passport) - passport: add footer 483cbd6 (passport) - passport: use h_captcha replace re_captcha 3d1675e (passport) - database: bump python 3.10.4 and node 16.14.2 86a7835 (passport) - passport: use registry.drycc.cc replace docker.io 2d65355 (passport) - passport: change python-dev registry 90c1444 (passport) - passport: unified reids declaration 2e0e417 (passport) - passport: fix firefox footer ad274be (passport) - passport: use bulecss f986d8b (passport) - passport: add main footer 3e52867 (passport) - passport: dynamic settings for vue 38adabc (passport) - passport: change passport config f8d6b60 (passport) - passport: fine management affinity 2cbd79d (passport) - passport: remove database conn_max_age 7122797 (passport) - passport: change drycc.cc to www.drycc.cc 8cc84cd (rabbitmq) - rabbitmq: use exec runner replace docker runner f35930f (rabbitmq) - rabbitmq: add rabbitmq cluster support fbfa3ba (rabbitmq) - rabbitmq: canonical charts naming ca60701 (rabbitmq) - rabbitmq: use volumeClaimTemplates fe5d1b4 (rabbitmq) - rabbitmq: add sharding support 9c4ab97 (rabbitmq) - rabbitmq: provide any additional service annotations 348a88a (rabbitmq) - dockerfile: use drycc/base image 2388be1 (rabbitmq) - rabbitmq: upgrade erlang to 24.2.2 db2eaa5 (rabbitmq) - dockerfile: use uid gid 772afd1 (rabbitmq) - rabbitmq: change to wait pid file 2bfc25e (rabbitmq) - rabbitmq: use common affinity template 11d505e (rabbitmq) - rabbitmq: change nodes to pod affinity 69d63f1 (rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.14 8380299 (rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.io b3f69f1 (rabbitmq) - rabbitmq: add check rabbitmqLocaltion 5327c76 (rabbitmq) - rabbitmq: fine management affinity 5c66b5a (rabbitmq) - rabbitmq: change probe 27bebf9 (rabbitmq) - rabbitmq: add start-rabbitmq script 86ee6a7 (rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.7 1f29683 (redis) - redis: use exec runner replace docker runner a5041fc (redis) - redis: canonical charts naming 64468c2 (redis) - redis: add redis persistence de5d753 (redis) - redis: provide any additional service annotations f644639 (redis) - dockerfile: use drycc/base image 98051d2 (redis) - redis: premission denied bcb548e (redis) - dockerfile: use uid gid 524aa41 (redis) - redis: use common affinity template 26c9466 (redis) - redis: change nodes to pod affinity b67d7a2 (redis) - redis: use registry.drycc.cc replace docker.io 839ec50 (redis) - redis: use env replace creds volume 237ca86 (redis) - redis: fine management affinity bdd968d (redis) - redis: upgrade neew require 8b2910f (registry) - registry: use exec runner replace docker runner eedbe78 (registry) - registry: canonical charts naming 0241615 (registry) - registry: provide any additional service annotations 9b58da4 (registry) - dockerfile: use drycc/base image ab6acb7 (registry) - registry: change workdir to /workspace f368bf7 (registry) - registry: use DRYCC_UID DRYCC_GID env f4b9041 (registry) - registry: use common affinity template c2e87ca (registry) - registry: change nodes to pod affinity feb6aba (registry) - database: bump mc 2022.04.01.23.44.48 956932b (registry) - rregistry: use registry.drycc.cc replace docker.io deda8d8 (registry) - registry: move registry-secret.yaml from workflow to registry f52c7bf (registry) - registry: change python-dev registry 007fe03 (registry) - registry: https://github.com/minio/minio/issues/14331 d620c6d (registry) - registry: https://github.com/minio/minio/issues/13799 85e6b73 (registry) - registry: use env replace creds volume 6a1155d (registry) - registry: fine management affinity 7b8ebae (registry) - registry: change minio to storage 1338951 (registry) - registry: add check storage health 2fa769d (registry) - registry: change probe f187cbf (registry) - registry: add replicas 09d8a7b (registry) - registry: upgrade to mc 2022.08.28.20.08.11 4b187b8 (registry-proxy) - registry-proxy: use exec runner replace docker runner 29ffbbe (registry-proxy) - registry-proxy: canonical charts naming 6d783ba (registry-proxy) - registry-proxy: remove use_cni 8cf05cf (registry-proxy) - dockerfile: use drycc/base image 090e286 (registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 1001 7cf6120 (registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env 3a00697 (registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io 30e69e8 (registry-proxy) - registry-proxy: add registry basic auth proxy 942abce (registry-proxy) - registry-proxy: upgrade to nginx 1.23.1 5ea3297 (storage) - minio: use exec runner replace docker runner 8306add (storage) - minio: canonical charts naming c917e9f (storage) - minio: provide any additional service annotations 042c732 (storage) - dockerfile: use drycc/base image 7b47b82 (storage) - minio: change workdir to /workspace 6f3531e (storage) - minio: use DRYCC_UID DRYCC_GID env 9795fb1 (storage) - minio: use common affinity template a7b09c5 (storage) - minio: change nodes to pod affinity 7607342 (storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39 ea2b2f1 (storage) - minio: use registry.drycc.cc replace docker.io 445b501 (storage) - minio: https://github.com/minio/minio/issues/14331 f19fbc7 (storage) - minio: use env replace creds volume 8982e2e (storage) - minio: use minio to distributed 06bec73 (storage) - minio: fine management affinity 9b8f006 (storage) - storage: remove assert 59d64b9 (storage) - storage: change listen to POD_IP 60044ee (storage) - storage: add juicefs mount options 189f944 (storage) - storage: remove volumeName 302fe89 (storage) - storage: mv to minio dir 6ec586d (storage) - storage: change readinessProbee andlivenessProbe 0e028df (storage) - storage: add minio pdb cf9bd2d (storage) - storage: add check storage health svc 2dd5c9f (storage) - storage: add volumeBindingMode fa2effc (storage) - storage: remove databaseBucket d166cc7 (storage) - charts: format network-policy name d06bcce (storage) - storage: upgrade to golang 1.19 c2ca05c (storage) - storage: upgrade new require","title":"Maintenance"},{"location":"contributing/community/","text":"Community \u00b6 Drycc software is fully open source. As such, the \"Drycc community\" consists of anyone who uses the Drycc software and participates in its evolution, whether by answering questions, finding bugs, suggesting enhancements, or writing documentation or code. Drycc development is coordinated through numerous project repositories on GitHub . Anyone can check out the source code for any Drycc component, fork it, make improvements, and create a pull request to offer those changes back to the Drycc community. Engine Yard maintains the numerous Drycc projects, and as such, decides what ends up in the official GitHub repositories. Drycc depends on the contributions of the community; the maintainers will not ignore pull requests or issues. Drycc uses the timeless, highly efficient, and totally unfair system known as \"Benevolent Dictator for Life\" ( BDFL ). Gabriel Monroy , the creator of Drycc, is our BDFL and has final say over all decisions related to Drycc. Open Source Bounties \u00b6 Drycc projects are bounty-friendly. We believe open source bounty sites can be constructive tools in the development of open source software. Community members are encouraged to a) offer bounties and b) receive bounties for open source contributions that benefit everyone. The Drycc maintainers, however, will not accept bounties on this project but are more than happy to help community members attempting bounties.","title":"Community"},{"location":"contributing/community/#community","text":"Drycc software is fully open source. As such, the \"Drycc community\" consists of anyone who uses the Drycc software and participates in its evolution, whether by answering questions, finding bugs, suggesting enhancements, or writing documentation or code. Drycc development is coordinated through numerous project repositories on GitHub . Anyone can check out the source code for any Drycc component, fork it, make improvements, and create a pull request to offer those changes back to the Drycc community. Engine Yard maintains the numerous Drycc projects, and as such, decides what ends up in the official GitHub repositories. Drycc depends on the contributions of the community; the maintainers will not ignore pull requests or issues. Drycc uses the timeless, highly efficient, and totally unfair system known as \"Benevolent Dictator for Life\" ( BDFL ). Gabriel Monroy , the creator of Drycc, is our BDFL and has final say over all decisions related to Drycc.","title":"Community"},{"location":"contributing/community/#open-source-bounties","text":"Drycc projects are bounty-friendly. We believe open source bounty sites can be constructive tools in the development of open source software. Community members are encouraged to a) offer bounties and b) receive bounties for open source contributions that benefit everyone. The Drycc maintainers, however, will not accept bounties on this project but are more than happy to help community members attempting bounties.","title":"Open Source Bounties"},{"location":"contributing/conduct/","text":"Conduct \u00b6 The Drycc community welcomes and encourages participation by everyone . No matter how you identify yourself or how others perceive you: we welcome you. We welcome contributions from everyone as long as they interact constructively with our community. The Drycc developer community continues to grow, and it is inevitable that disagreements and conflict will arise. We ask that participants conduct themselves according to these principles: Be welcoming, friendly, and patient. Be considerate. Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language. Be respectful. Not all of us will agree all the time, but disagreement is no excuse for poor behavior and bad manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It\u2019s important to remember that a community where people feel uncomfortable or threatened is not a productive one. Be careful in the words that you choose. Be kind to others. Do not insult or put down other participants. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are never appropriate for the community. (Thanks to the Debian and Django communities for their text and their inspiration.)","title":"Conduct"},{"location":"contributing/conduct/#conduct","text":"The Drycc community welcomes and encourages participation by everyone . No matter how you identify yourself or how others perceive you: we welcome you. We welcome contributions from everyone as long as they interact constructively with our community. The Drycc developer community continues to grow, and it is inevitable that disagreements and conflict will arise. We ask that participants conduct themselves according to these principles: Be welcoming, friendly, and patient. Be considerate. Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language. Be respectful. Not all of us will agree all the time, but disagreement is no excuse for poor behavior and bad manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It\u2019s important to remember that a community where people feel uncomfortable or threatened is not a productive one. Be careful in the words that you choose. Be kind to others. Do not insult or put down other participants. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are never appropriate for the community. (Thanks to the Debian and Django communities for their text and their inspiration.)","title":"Conduct"},{"location":"contributing/design-documents/","text":"Design Documents \u00b6 Before submitting a pull request which will significantly alter the behavior of any Drycc component, such as a new feature or major refactoring, contributors should first open an issue representing a design document. Goals \u00b6 Design documents help ensure project contributors: Involve stakeholders as early as possible in a feature's development Ensure code changes accomplish the original motivations and design goals Establish clear acceptance criteria for a feature or change Enforce test-driven design methodology and automated test coverage Contents \u00b6 Design document issues should be named Design Doc: and contain the following sections: Goal \u00b6 This section should briefly describe the proposed change and the motivations behind it. Tests will be written to ensure this design goal is met by the change. This section should also reference a separate GitHub issue tracking the feature or change, which will typically be assigned to a release milestone. Code Changes \u00b6 This section should detail the code changes necessary to accomplish the change, as well as the proposed implementation. This should be as detailed as necessary to help reviewers understand the change. Tests \u00b6 All changes should be covered by automated tests, either unit or integration tests (ideally both). This section should detail how tests will be written to validate that the change accomplishes the design goals and doesn't introduce any regressions. If a change cannot be sufficiently covered by automated testing, the design should be reconsidered. If there is no test coverage whatsoever for an affected section of code, a separate issue should be filed to integrate automated testing with that section of the codebase. The tests described here also form the acceptance criteria for the change, so that when it's completed maintainers can merge the pull request after confirming the tests pass CI. Approval \u00b6 A design document follows the same merge approval review process as final pull requests do, and maintainers will take extra care to ensure that any stakeholders for the change are included in the discussion and review of the design document. Once the design is accepted, the author can complete the change and submit a pull request for review. The pull request should close both the design document for the change as well as any issues that either track the issue or are closed as a result of the change. See Submitting a Pull Request for more information on pull request and commit message formatting.","title":"Design Documents"},{"location":"contributing/design-documents/#design-documents","text":"Before submitting a pull request which will significantly alter the behavior of any Drycc component, such as a new feature or major refactoring, contributors should first open an issue representing a design document.","title":"Design Documents"},{"location":"contributing/design-documents/#goals","text":"Design documents help ensure project contributors: Involve stakeholders as early as possible in a feature's development Ensure code changes accomplish the original motivations and design goals Establish clear acceptance criteria for a feature or change Enforce test-driven design methodology and automated test coverage","title":"Goals"},{"location":"contributing/design-documents/#contents","text":"Design document issues should be named Design Doc: and contain the following sections:","title":"Contents"},{"location":"contributing/design-documents/#goal","text":"This section should briefly describe the proposed change and the motivations behind it. Tests will be written to ensure this design goal is met by the change. This section should also reference a separate GitHub issue tracking the feature or change, which will typically be assigned to a release milestone.","title":"Goal"},{"location":"contributing/design-documents/#code-changes","text":"This section should detail the code changes necessary to accomplish the change, as well as the proposed implementation. This should be as detailed as necessary to help reviewers understand the change.","title":"Code Changes"},{"location":"contributing/design-documents/#tests","text":"All changes should be covered by automated tests, either unit or integration tests (ideally both). This section should detail how tests will be written to validate that the change accomplishes the design goals and doesn't introduce any regressions. If a change cannot be sufficiently covered by automated testing, the design should be reconsidered. If there is no test coverage whatsoever for an affected section of code, a separate issue should be filed to integrate automated testing with that section of the codebase. The tests described here also form the acceptance criteria for the change, so that when it's completed maintainers can merge the pull request after confirming the tests pass CI.","title":"Tests"},{"location":"contributing/design-documents/#approval","text":"A design document follows the same merge approval review process as final pull requests do, and maintainers will take extra care to ensure that any stakeholders for the change are included in the discussion and review of the design document. Once the design is accepted, the author can complete the change and submit a pull request for review. The pull request should close both the design document for the change as well as any issues that either track the issue or are closed as a result of the change. See Submitting a Pull Request for more information on pull request and commit message formatting.","title":"Approval"},{"location":"contributing/development-environment/","text":"Development Environment \u00b6 This document is for developers who are interested in working directly on the Drycc codebase. In this guide, we walk you through the process of setting up a development environment that is suitable for hacking on most Drycc components. We try to make it simple to hack on Drycc components. However, there are necessarily several moving pieces and some setup required. We welcome any suggestions for automating or simplifying this process. Note The Drycc team is actively engaged in containerizing Go and Python based development environments tailored specifically for Drycc development in order to minimize the setup required. This work is ongoing. Refer to the drycc/router project for a working example of a fully containerized development environment. If you're just getting into the Drycc codebase, look for GitHub issues with the label easy-fix . These are more straightforward or low-risk issues and are a great way to become more familiar with Drycc. Prerequisites \u00b6 In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required: git Go 1.5 or later, with support for compiling to linux/amd64 glide golint shellcheck Podman (in a non-Linux environment, you will additionally want [Podman Machine][machine]) For drycc/controller , in particular, you will also need: Python 2.7 or later (with pip ) virtualenv ( sudo pip install virtualenv ) In most cases, you should simply install according to the instructions. There are a few special cases, though. We cover these below. Configuring Go \u00b6 If your local workstation does not support the linux/amd64 target environment, you will have to install Go from source with cross-compile support for that environment. This is because some of the components are built on your local machine and then injected into a container. Homebrew users can just install with cross compiling support: $ brew install go --with-cc-common It is also straightforward to build Go from source: $ sudo su $ curl -sSL https://golang.org/dl/go1.5.src.tar.gz | tar -v -C /usr/local -xz $ cd /usr/local/go/src $ # compile Go for our default platform first, then add cross-compile support $ ./make.bash --no-clean $ GOOS=linux GOARCH=amd64 ./make.bash --no-clean Once you can compile to linux/amd64 , you should be able to compile Drycc components as normal. Fork the Repository \u00b6 Once the prerequisites have been met, we can begin to work with Drycc components. Begin at Github by forking whichever Drycc project you would like to contribute to, then clone that fork locally. Since Drycc is predominantly written in Go, the best place to put it is under $GOPATH/src/github.com/drycc/ . $ mkdir -p $GOPATH/src/github.com/drycc $ cd $GOPATH/src/github.com/drycc $ git clone git@github.com:/.git $ cd Note By checking out the forked copy into the namespace github.com/drycc/ , we are tricking the Go toolchain into seeing our fork as the \"official\" source tree. If you are going to be issuing pull requests to the upstream repository from which you forked, we suggest configuring Git such that you can easily rebase your code to the upstream repository's main branch. There are various strategies for doing this, but the most common is to add an upstream remote: $ git remote add upstream https://github.com/drycc/.git For the sake of simplicity, you may want to point an environment variable to your Drycc code - the directory containing one or more Drycc components: $ export DRYCC=$GOPATH/src/github.com/drycc Throughout the rest of this document, $DRYCC refers to that location. Alternative: Forking with a Pushurl \u00b6 A number of Drycc contributors prefer to pull directly from drycc/ , but push to / . If that workflow suits you better, you can set it up this way: $ git clone git@github.com:drycc/.git $ cd drycc $ git config remote.origin.pushurl git@github.com:/.git In this setup, fetching and pulling code will work directly with the upstream repository, while pushing code will send changes to your fork. This makes it easy to stay up to date, but also make changes and then issue pull requests. Make Your Changes \u00b6 With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes. Test Your Changes \u00b6 Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See testing for instructions on running the tests. Deploying Your Changes \u00b6 Although writing and executing tests are critical to ensuring code quality, most contributors will also want to deploy their changes to a live environment, whether to make use of those changes or to test them further. The remainder of this section documents the procedure for running officially released Drycc components in a development cluster and replacing any one of those with your customizations. Running a Kubernetes Cluster for Development \u00b6 To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions here . Using a Development Registry \u00b6 To facilitate deploying Container images containing your changes to your Kubernetes cluster, you will need to make use of a Container registry. This is a location to where you can push your custom-built images and from where your Kubernetes cluster can retrieve those same images. If your development cluster runs locally (in Minikube, for instance), the most efficient and economical means of achieving this is to run a Container registry locally as a Container container. To facilitate this, most Drycc components provide a make target to create such a registry: $ make dev-registry In a Linux environment, to begin using the registry: export DRYCC_REGISTRY=:5000 In non-Linux environments: export DRYCC_REGISTRY=:5000 If your development cluster runs on a cloud provider such as Google Container Engine, a local registry such as the one above will not be accessible to your Kubernetes nodes. In such cases, a public registry such as [DockerHub][dh] or quay.io will suffice. To use DockerHub for this purpose, for instance: $ export DRYCC_REGISTRY=\"registry.drycc.cc\" $ export IMAGE_PREFIX= To use quay.io: $ export DRYCC_REGISTRY=quay.io $ export IMAGE_PREFIX= Note the importance of the trailing slash. Dev / Deployment Workflow \u00b6 With a functioning Kubernetes cluster and the officially released Drycc components installed onto it, deployment and further testing of any Drycc component you have made changes to is facilitated by replacing the officially released component with a custom built image that contains your changes. Most Drycc components include Makefiles with targets specifically intended to facilitate this workflow with minimal friction. In the general case, this workflow looks like this: Update source code and commit your changes using git Use make build to build a new Container image Use make dev-release to generate Kubernetes manifest(s) Use make deploy to restart the component using the updated manifest This can be shortened to a one-liner using just the deploy target: $ make deploy Useful Commands \u00b6 Once your customized Drycc component has been deployed, here are some helpful commands that will allow you to inspect your cluster and to troubleshoot, if necessary: See All Drycc Pods \u00b6 $ kubectl --namespace=drycc get pods Describe a Pod \u00b6 This is often useful for troubleshooting pods that are in pending or crashed states: $ kubectl --namespace=drycc describe -f Tail Logs \u00b6 $ kubectl --namespace=drycc logs -f Django Shell \u00b6 Specific to drycc/controller $ kubectl --namespace=drycc exec -it -- python manage.py shell Have commands other Drycc contributors might find useful? Send us a PR! Pull Requests \u00b6 Satisfied with your changes? Share them! Please read Submitting a Pull Request . It contains a checklist of things you should do when proposing a change to any Drycc component.","title":"Development Environment"},{"location":"contributing/development-environment/#development-environment","text":"This document is for developers who are interested in working directly on the Drycc codebase. In this guide, we walk you through the process of setting up a development environment that is suitable for hacking on most Drycc components. We try to make it simple to hack on Drycc components. However, there are necessarily several moving pieces and some setup required. We welcome any suggestions for automating or simplifying this process. Note The Drycc team is actively engaged in containerizing Go and Python based development environments tailored specifically for Drycc development in order to minimize the setup required. This work is ongoing. Refer to the drycc/router project for a working example of a fully containerized development environment. If you're just getting into the Drycc codebase, look for GitHub issues with the label easy-fix . These are more straightforward or low-risk issues and are a great way to become more familiar with Drycc.","title":"Development Environment"},{"location":"contributing/development-environment/#prerequisites","text":"In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required: git Go 1.5 or later, with support for compiling to linux/amd64 glide golint shellcheck Podman (in a non-Linux environment, you will additionally want [Podman Machine][machine]) For drycc/controller , in particular, you will also need: Python 2.7 or later (with pip ) virtualenv ( sudo pip install virtualenv ) In most cases, you should simply install according to the instructions. There are a few special cases, though. We cover these below.","title":"Prerequisites"},{"location":"contributing/development-environment/#configuring-go","text":"If your local workstation does not support the linux/amd64 target environment, you will have to install Go from source with cross-compile support for that environment. This is because some of the components are built on your local machine and then injected into a container. Homebrew users can just install with cross compiling support: $ brew install go --with-cc-common It is also straightforward to build Go from source: $ sudo su $ curl -sSL https://golang.org/dl/go1.5.src.tar.gz | tar -v -C /usr/local -xz $ cd /usr/local/go/src $ # compile Go for our default platform first, then add cross-compile support $ ./make.bash --no-clean $ GOOS=linux GOARCH=amd64 ./make.bash --no-clean Once you can compile to linux/amd64 , you should be able to compile Drycc components as normal.","title":"Configuring Go"},{"location":"contributing/development-environment/#fork-the-repository","text":"Once the prerequisites have been met, we can begin to work with Drycc components. Begin at Github by forking whichever Drycc project you would like to contribute to, then clone that fork locally. Since Drycc is predominantly written in Go, the best place to put it is under $GOPATH/src/github.com/drycc/ . $ mkdir -p $GOPATH/src/github.com/drycc $ cd $GOPATH/src/github.com/drycc $ git clone git@github.com:/.git $ cd Note By checking out the forked copy into the namespace github.com/drycc/ , we are tricking the Go toolchain into seeing our fork as the \"official\" source tree. If you are going to be issuing pull requests to the upstream repository from which you forked, we suggest configuring Git such that you can easily rebase your code to the upstream repository's main branch. There are various strategies for doing this, but the most common is to add an upstream remote: $ git remote add upstream https://github.com/drycc/.git For the sake of simplicity, you may want to point an environment variable to your Drycc code - the directory containing one or more Drycc components: $ export DRYCC=$GOPATH/src/github.com/drycc Throughout the rest of this document, $DRYCC refers to that location.","title":"Fork the Repository"},{"location":"contributing/development-environment/#alternative-forking-with-a-pushurl","text":"A number of Drycc contributors prefer to pull directly from drycc/ , but push to / . If that workflow suits you better, you can set it up this way: $ git clone git@github.com:drycc/.git $ cd drycc $ git config remote.origin.pushurl git@github.com:/.git In this setup, fetching and pulling code will work directly with the upstream repository, while pushing code will send changes to your fork. This makes it easy to stay up to date, but also make changes and then issue pull requests.","title":"Alternative: Forking with a Pushurl"},{"location":"contributing/development-environment/#make-your-changes","text":"With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.","title":"Make Your Changes"},{"location":"contributing/development-environment/#test-your-changes","text":"Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See testing for instructions on running the tests.","title":"Test Your Changes"},{"location":"contributing/development-environment/#deploying-your-changes","text":"Although writing and executing tests are critical to ensuring code quality, most contributors will also want to deploy their changes to a live environment, whether to make use of those changes or to test them further. The remainder of this section documents the procedure for running officially released Drycc components in a development cluster and replacing any one of those with your customizations.","title":"Deploying Your Changes"},{"location":"contributing/development-environment/#running-a-kubernetes-cluster-for-development","text":"To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions here .","title":"Running a Kubernetes Cluster for Development"},{"location":"contributing/development-environment/#using-a-development-registry","text":"To facilitate deploying Container images containing your changes to your Kubernetes cluster, you will need to make use of a Container registry. This is a location to where you can push your custom-built images and from where your Kubernetes cluster can retrieve those same images. If your development cluster runs locally (in Minikube, for instance), the most efficient and economical means of achieving this is to run a Container registry locally as a Container container. To facilitate this, most Drycc components provide a make target to create such a registry: $ make dev-registry In a Linux environment, to begin using the registry: export DRYCC_REGISTRY=:5000 In non-Linux environments: export DRYCC_REGISTRY=:5000 If your development cluster runs on a cloud provider such as Google Container Engine, a local registry such as the one above will not be accessible to your Kubernetes nodes. In such cases, a public registry such as [DockerHub][dh] or quay.io will suffice. To use DockerHub for this purpose, for instance: $ export DRYCC_REGISTRY=\"registry.drycc.cc\" $ export IMAGE_PREFIX= To use quay.io: $ export DRYCC_REGISTRY=quay.io $ export IMAGE_PREFIX= Note the importance of the trailing slash.","title":"Using a Development Registry"},{"location":"contributing/development-environment/#dev-deployment-workflow","text":"With a functioning Kubernetes cluster and the officially released Drycc components installed onto it, deployment and further testing of any Drycc component you have made changes to is facilitated by replacing the officially released component with a custom built image that contains your changes. Most Drycc components include Makefiles with targets specifically intended to facilitate this workflow with minimal friction. In the general case, this workflow looks like this: Update source code and commit your changes using git Use make build to build a new Container image Use make dev-release to generate Kubernetes manifest(s) Use make deploy to restart the component using the updated manifest This can be shortened to a one-liner using just the deploy target: $ make deploy","title":"Dev / Deployment Workflow"},{"location":"contributing/development-environment/#useful-commands","text":"Once your customized Drycc component has been deployed, here are some helpful commands that will allow you to inspect your cluster and to troubleshoot, if necessary:","title":"Useful Commands"},{"location":"contributing/development-environment/#see-all-drycc-pods","text":"$ kubectl --namespace=drycc get pods","title":"See All Drycc Pods"},{"location":"contributing/development-environment/#describe-a-pod","text":"This is often useful for troubleshooting pods that are in pending or crashed states: $ kubectl --namespace=drycc describe -f ","title":"Describe a Pod"},{"location":"contributing/development-environment/#tail-logs","text":"$ kubectl --namespace=drycc logs -f ","title":"Tail Logs"},{"location":"contributing/development-environment/#django-shell","text":"Specific to drycc/controller $ kubectl --namespace=drycc exec -it -- python manage.py shell Have commands other Drycc contributors might find useful? Send us a PR!","title":"Django Shell"},{"location":"contributing/development-environment/#pull-requests","text":"Satisfied with your changes? Share them! Please read Submitting a Pull Request . It contains a checklist of things you should do when proposing a change to any Drycc component.","title":"Pull Requests"},{"location":"contributing/maintainers/","text":"Drycc Maintainers \u00b6 This document serves to describe the leadership structure of the Drycc project, and list the current project maintainers. What is a maintainer? \u00b6 (Unabashedly stolen from the Podman project) There are different types of maintainers, with different responsibilities, but all maintainers have 3 things in common: They share responsibility in the project's success. They have made a long-term, recurring time investment to improve the project. They spend that time doing whatever needs to be done, not necessarily what is the most interesting or fun. Maintainers are often under-appreciated, because their work is harder to appreciate. It's easy to appreciate a really cool and technically advanced feature. It's harder to appreciate the absence of bugs, the slow but steady improvement in stability, or the reliability of a release process. But those things distinguish a good project from a great one. Drycc maintainers \u00b6 Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life. BDFL \u00b6 Drycc follows the timeless, highly efficient and totally unfair system known as Benevolent dictator for life . Gabriel Monroy ( @gabrtv ), as creator of the Drycc project, serves as our project's BDFL. While the day-to-day project management is carried out by the maintainers, Gabriel serves as the final arbiter of any disputes and has the final say on project direction. Core maintainers \u00b6 Core maintainers are exceptionally knowledgeable about all areas of Drycc. Some maintainers work on Drycc full-time, although this is not a requirement. The duties of a core maintainer include: Classify and respond to GitHub issues and review pull requests Help to shape the Drycc roadmap and lead efforts to accomplish roadmap milestones Participate actively in feature development and bug fixing Answer questions and help users in the Drycc #community Slack channel The current list of core maintainers can be seen here . No pull requests can be merged until at least one core maintainer signs off with an LGTM . The other LGTM can come from either a core maintainer or contributing maintainer. Contributing maintainers \u00b6 Contributing maintainers are exceptionally knowledgeable about some but not necessarily all areas of Drycc, and are often selected due to specific domain knowledge that complements the project (but a willingness to continually contribute to the project is most important!). Often, core maintainers will ask a contributing maintainer to weigh in on issues, pull requests, or conversations where the contributing maintainer is knowledgeable. The duties of a contributing maintainer are very similar to those of a core maintainer, but they are limited to areas of the Drycc project where the contributing maintainer is knowledgeable. Contributing maintainers are defined in practice as those who have write access to the Drycc repository. All maintainers can review pull requests and add LGTM labels as appropriate. Becoming a maintainer \u00b6 The Drycc project wouldn't be where it is today without its community. Many of the project's community members embody the spirit of maintainership, and have contributed substantially to the project. The contributing maintainers group was created in part so that exceptional members of the community who have an interest in the continued success of the project have the opportunity to join the core maintainers in guiding the future of Drycc. Generally, potential contributing maintainers are selected by the Drycc core maintainers based in part on the following criteria: Sustained contributions to the project over a period of time (usually months) A willingness to help Drycc users on GitHub and in the Drycc #community Slack channel A friendly attitude :) The Drycc core maintainers must unanimously agree before inviting a community member to join as a contributing maintainer, although in many cases the candidate has already been acting in the capacity of a contributing maintainer for some time, and has been consulted on issues, pull requests, etc.","title":"Maintainers"},{"location":"contributing/maintainers/#drycc-maintainers","text":"This document serves to describe the leadership structure of the Drycc project, and list the current project maintainers.","title":"Drycc Maintainers"},{"location":"contributing/maintainers/#what-is-a-maintainer","text":"(Unabashedly stolen from the Podman project) There are different types of maintainers, with different responsibilities, but all maintainers have 3 things in common: They share responsibility in the project's success. They have made a long-term, recurring time investment to improve the project. They spend that time doing whatever needs to be done, not necessarily what is the most interesting or fun. Maintainers are often under-appreciated, because their work is harder to appreciate. It's easy to appreciate a really cool and technically advanced feature. It's harder to appreciate the absence of bugs, the slow but steady improvement in stability, or the reliability of a release process. But those things distinguish a good project from a great one.","title":"What is a maintainer?"},{"location":"contributing/maintainers/#drycc-maintainers_1","text":"Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.","title":"Drycc maintainers"},{"location":"contributing/maintainers/#bdfl","text":"Drycc follows the timeless, highly efficient and totally unfair system known as Benevolent dictator for life . Gabriel Monroy ( @gabrtv ), as creator of the Drycc project, serves as our project's BDFL. While the day-to-day project management is carried out by the maintainers, Gabriel serves as the final arbiter of any disputes and has the final say on project direction.","title":"BDFL"},{"location":"contributing/maintainers/#core-maintainers","text":"Core maintainers are exceptionally knowledgeable about all areas of Drycc. Some maintainers work on Drycc full-time, although this is not a requirement. The duties of a core maintainer include: Classify and respond to GitHub issues and review pull requests Help to shape the Drycc roadmap and lead efforts to accomplish roadmap milestones Participate actively in feature development and bug fixing Answer questions and help users in the Drycc #community Slack channel The current list of core maintainers can be seen here . No pull requests can be merged until at least one core maintainer signs off with an LGTM . The other LGTM can come from either a core maintainer or contributing maintainer.","title":"Core maintainers"},{"location":"contributing/maintainers/#contributing-maintainers","text":"Contributing maintainers are exceptionally knowledgeable about some but not necessarily all areas of Drycc, and are often selected due to specific domain knowledge that complements the project (but a willingness to continually contribute to the project is most important!). Often, core maintainers will ask a contributing maintainer to weigh in on issues, pull requests, or conversations where the contributing maintainer is knowledgeable. The duties of a contributing maintainer are very similar to those of a core maintainer, but they are limited to areas of the Drycc project where the contributing maintainer is knowledgeable. Contributing maintainers are defined in practice as those who have write access to the Drycc repository. All maintainers can review pull requests and add LGTM labels as appropriate.","title":"Contributing maintainers"},{"location":"contributing/maintainers/#becoming-a-maintainer","text":"The Drycc project wouldn't be where it is today without its community. Many of the project's community members embody the spirit of maintainership, and have contributed substantially to the project. The contributing maintainers group was created in part so that exceptional members of the community who have an interest in the continued success of the project have the opportunity to join the core maintainers in guiding the future of Drycc. Generally, potential contributing maintainers are selected by the Drycc core maintainers based in part on the following criteria: Sustained contributions to the project over a period of time (usually months) A willingness to help Drycc users on GitHub and in the Drycc #community Slack channel A friendly attitude :) The Drycc core maintainers must unanimously agree before inviting a community member to join as a contributing maintainer, although in many cases the candidate has already been acting in the capacity of a contributing maintainer for some time, and has been consulted on issues, pull requests, etc.","title":"Becoming a maintainer"},{"location":"contributing/overview/","text":"Contributor Overview \u00b6 Interested in contributing to a Drycc project? There are lots of ways to help. File Bugs & Enhancements \u00b6 Find a bug? Want to see a new feature? Have a request for the maintainers? Open a Github issue in the applicable repository and we\u2019ll get the conversation started. Our official support channel is the Drycc #community Slack channel . Don't know what the applicable repository for an issue is? Open up in issue in workflow or chat with a maintainer in the Drycc #community Slack channel and we'll make sure it gets to the right place. Additionally, take a look at the troubleshooting documentation for common issues. Before opening a new issue, it's helpful to search and see if anyone else has already reported the problem. You can search through a list of issues for all Drycc projects here . Write Documentation \u00b6 We are always looking to improve and expand our documentation. Most docs reside in the drycc/workflow repository. Simply fork the project, update docs and send us a pull request. Contribute Code \u00b6 We are always looking for help improving the core platform, other workloads, tooling, and test coverage. Interested in contributing code? Let\u2019s chat in the Drycc #community Slack channel . Make sure to check out issues tagged easy fix or help wanted . When you're ready to begin writing code, review Design Documents and get your Development Environment set up. By contributing to any Drycc project you agree to its Developer Certificate of Origin (DCO) . This document was created by the Linux Kernel community and is a simple statement that you, as a contributor, have the legal right to make the contribution. Triage Issues \u00b6 If you don't have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. See Triaging Issues for more info. Share your Experience \u00b6 Interact with the community on our user mailing list or live in our Drycc #community Slack channel , where you can chat with other Drycc Workflow users any time of day.","title":"Overview"},{"location":"contributing/overview/#contributor-overview","text":"Interested in contributing to a Drycc project? There are lots of ways to help.","title":"Contributor Overview"},{"location":"contributing/overview/#file-bugs-enhancements","text":"Find a bug? Want to see a new feature? Have a request for the maintainers? Open a Github issue in the applicable repository and we\u2019ll get the conversation started. Our official support channel is the Drycc #community Slack channel . Don't know what the applicable repository for an issue is? Open up in issue in workflow or chat with a maintainer in the Drycc #community Slack channel and we'll make sure it gets to the right place. Additionally, take a look at the troubleshooting documentation for common issues. Before opening a new issue, it's helpful to search and see if anyone else has already reported the problem. You can search through a list of issues for all Drycc projects here .","title":"File Bugs & Enhancements"},{"location":"contributing/overview/#write-documentation","text":"We are always looking to improve and expand our documentation. Most docs reside in the drycc/workflow repository. Simply fork the project, update docs and send us a pull request.","title":"Write Documentation"},{"location":"contributing/overview/#contribute-code","text":"We are always looking for help improving the core platform, other workloads, tooling, and test coverage. Interested in contributing code? Let\u2019s chat in the Drycc #community Slack channel . Make sure to check out issues tagged easy fix or help wanted . When you're ready to begin writing code, review Design Documents and get your Development Environment set up. By contributing to any Drycc project you agree to its Developer Certificate of Origin (DCO) . This document was created by the Linux Kernel community and is a simple statement that you, as a contributor, have the legal right to make the contribution.","title":"Contribute Code"},{"location":"contributing/overview/#triage-issues","text":"If you don't have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. See Triaging Issues for more info.","title":"Triage Issues"},{"location":"contributing/overview/#share-your-experience","text":"Interact with the community on our user mailing list or live in our Drycc #community Slack channel , where you can chat with other Drycc Workflow users any time of day.","title":"Share your Experience"},{"location":"contributing/submitting-a-pull-request/","text":"Submitting a Pull Request \u00b6 Proposed changes to Drycc projects are made as GitHub pull requests. Design Document \u00b6 Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see Design Documents . Single Issue \u00b6 It's hard to reach agreement on the merit of a PR when it isn't focused. When fixing an issue or implementing a new feature, resist the temptation to refactor nearby code or to fix that potential bug you noticed. Instead, open a separate issue or pull request. Keeping concerns separated allows pull requests to be tested, reviewed, and merged more quickly. Squash and rebase the commit or commits in your pull request into logical units of work with git . Include tests and documentation changes in the same commit, so that a revert would remove all traces of the feature or fix. Most pull requests will reference a GitHub issue. In the PR description - not in the commit itself - include a line such as \"closes #1234\". The issue referenced will automatically be closed when your PR is merged. Include Tests \u00b6 If you significantly alter or add functionality to a component that impacts the broader Drycc Workflow PaaS, you should submit a complementary PR to modify or amend end-to-end integration tests. These integration tests can be found in the drycc/workflow-e2e repository. See testing for more information. Include Docs \u00b6 Changes to any Drycc Workflow component that could affect a user's experience also require a change or addition to the relevant documentation. For most Drycc components, this involves updating the component's own documentation. In some cases where a component is tightly integrated into drycc/workflow , its documentation must also be updated. Cross-repo commits \u00b6 If a pull request is part of a larger piece of work involving one or more additional commits in other Workflow repositories, these commits can be referenced in the last PR to be submitted. The downstream e2e test job will then supply every referenced commit (derived from PR issue number supplied) to the test runner so it can source the necessary Container images for inclusion in the generated Workflow chart to be tested. For example, consider paired commits in drycc/controller and drycc/workflow-e2e . The commit body for the first PR in drycc/workflow-e2e would look like: feat(foo_test): add e2e test for feature foo [skip e2e] test for controller#42 Adding [skip e2e] forgoes the e2e tests on this commit. This and any other required PRs aside from the final PR should be submitted first, so that their respective build and image push jobs run. Lastly, the final PR in drycc/controller should be created with the required PR number(s) listed, in the form of [Rr]equires # , for use by the downstream e2e run. feat(foo): add feature foo Requires workflow-e2e#42 Code Standards \u00b6 Drycc components are implemented in Go and Python . For both languages, we agree with The Zen of Python , which emphasizes simple over clever. Readability counts. Go code should always be run through gofmt on the default settings. Lines of code may be up to 99 characters long. Documentation strings and tests are required for all exported functions. Use of third-party go packages should be minimal, but when doing so, such dependencies should be managed via the glide tool. Python code should always adhere to PEP8 , the python code style guide, with the exception that lines of code may be up to 99 characters long. Docstrings and tests are required for all public methods, although the flake8 tool used by Drycc does not enforce this. Commit Style \u00b6 We follow a convention for commit messages borrowed from CoreOS, who borrowed theirs from AngularJS. This is an example of a commit: feat(scripts/test-cluster): add a cluster test command this uses tmux to setup a test cluster that you can easily kill and start for debugging. To make it more formal, it looks something like this: {type}({scope}): {subject} {body} {footer} The allowed {types} are as follows: feat -> feature fix -> bug fix docs -> documentation style -> formatting ref -> refactoring code test -> adding missing tests chore -> maintenance The {scope} can be anything specifying the location(s) of the commit change(s). The {subject} needs to be an imperative, present tense verb: \u201cchange\u201d, not \u201cchanged\u201d nor \u201cchanges\u201d. The first letter should not be capitalized, and there is no dot (.) at the end. Just like the {subject} , the message {body} needs to be in the present tense, and includes the motivation for the change, as well as a contrast with the previous behavior. The first letter in a paragraph must be capitalized. All breaking changes need to be mentioned in the {footer} with the description of the change, the justification behind the change and any migration notes required. Any line of the commit message cannot be longer than 72 characters, with the subject line limited to 50 characters. This allows the message to be easier to read on GitHub as well as in various git tools. Merge Approval \u00b6 Any code change - other than a simple typo fix or one-line documentation change - requires at least two Drycc maintainers to accept it. Maintainers tag pull requests with \" LGTM1 \" and \" LGTM2 \" (Looks Good To Me) labels to indicate acceptance. No pull requests can be merged until at least one core maintainer signs off with an LGTM. The other LGTM can come from either a core maintainer or contributing maintainer. If the PR is from a Drycc maintainer, then he or she should be the one to close it. This keeps the commit stream clean and gives the maintainer the benefit of revisiting the PR before deciding whether or not to merge the changes. An exception to this is when an errant commit needs to be reverted urgently. If necessary, a PR that only reverts a previous commit can be merged without waiting for LGTM approval.","title":"Submitting a Pull Request"},{"location":"contributing/submitting-a-pull-request/#submitting-a-pull-request","text":"Proposed changes to Drycc projects are made as GitHub pull requests.","title":"Submitting a Pull Request"},{"location":"contributing/submitting-a-pull-request/#design-document","text":"Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see Design Documents .","title":"Design Document"},{"location":"contributing/submitting-a-pull-request/#single-issue","text":"It's hard to reach agreement on the merit of a PR when it isn't focused. When fixing an issue or implementing a new feature, resist the temptation to refactor nearby code or to fix that potential bug you noticed. Instead, open a separate issue or pull request. Keeping concerns separated allows pull requests to be tested, reviewed, and merged more quickly. Squash and rebase the commit or commits in your pull request into logical units of work with git . Include tests and documentation changes in the same commit, so that a revert would remove all traces of the feature or fix. Most pull requests will reference a GitHub issue. In the PR description - not in the commit itself - include a line such as \"closes #1234\". The issue referenced will automatically be closed when your PR is merged.","title":"Single Issue"},{"location":"contributing/submitting-a-pull-request/#include-tests","text":"If you significantly alter or add functionality to a component that impacts the broader Drycc Workflow PaaS, you should submit a complementary PR to modify or amend end-to-end integration tests. These integration tests can be found in the drycc/workflow-e2e repository. See testing for more information.","title":"Include Tests"},{"location":"contributing/submitting-a-pull-request/#include-docs","text":"Changes to any Drycc Workflow component that could affect a user's experience also require a change or addition to the relevant documentation. For most Drycc components, this involves updating the component's own documentation. In some cases where a component is tightly integrated into drycc/workflow , its documentation must also be updated.","title":"Include Docs"},{"location":"contributing/submitting-a-pull-request/#cross-repo-commits","text":"If a pull request is part of a larger piece of work involving one or more additional commits in other Workflow repositories, these commits can be referenced in the last PR to be submitted. The downstream e2e test job will then supply every referenced commit (derived from PR issue number supplied) to the test runner so it can source the necessary Container images for inclusion in the generated Workflow chart to be tested. For example, consider paired commits in drycc/controller and drycc/workflow-e2e . The commit body for the first PR in drycc/workflow-e2e would look like: feat(foo_test): add e2e test for feature foo [skip e2e] test for controller#42 Adding [skip e2e] forgoes the e2e tests on this commit. This and any other required PRs aside from the final PR should be submitted first, so that their respective build and image push jobs run. Lastly, the final PR in drycc/controller should be created with the required PR number(s) listed, in the form of [Rr]equires # , for use by the downstream e2e run. feat(foo): add feature foo Requires workflow-e2e#42","title":"Cross-repo commits"},{"location":"contributing/submitting-a-pull-request/#code-standards","text":"Drycc components are implemented in Go and Python . For both languages, we agree with The Zen of Python , which emphasizes simple over clever. Readability counts. Go code should always be run through gofmt on the default settings. Lines of code may be up to 99 characters long. Documentation strings and tests are required for all exported functions. Use of third-party go packages should be minimal, but when doing so, such dependencies should be managed via the glide tool. Python code should always adhere to PEP8 , the python code style guide, with the exception that lines of code may be up to 99 characters long. Docstrings and tests are required for all public methods, although the flake8 tool used by Drycc does not enforce this.","title":"Code Standards"},{"location":"contributing/submitting-a-pull-request/#commit-style","text":"We follow a convention for commit messages borrowed from CoreOS, who borrowed theirs from AngularJS. This is an example of a commit: feat(scripts/test-cluster): add a cluster test command this uses tmux to setup a test cluster that you can easily kill and start for debugging. To make it more formal, it looks something like this: {type}({scope}): {subject} {body} {footer} The allowed {types} are as follows: feat -> feature fix -> bug fix docs -> documentation style -> formatting ref -> refactoring code test -> adding missing tests chore -> maintenance The {scope} can be anything specifying the location(s) of the commit change(s). The {subject} needs to be an imperative, present tense verb: \u201cchange\u201d, not \u201cchanged\u201d nor \u201cchanges\u201d. The first letter should not be capitalized, and there is no dot (.) at the end. Just like the {subject} , the message {body} needs to be in the present tense, and includes the motivation for the change, as well as a contrast with the previous behavior. The first letter in a paragraph must be capitalized. All breaking changes need to be mentioned in the {footer} with the description of the change, the justification behind the change and any migration notes required. Any line of the commit message cannot be longer than 72 characters, with the subject line limited to 50 characters. This allows the message to be easier to read on GitHub as well as in various git tools.","title":"Commit Style"},{"location":"contributing/submitting-a-pull-request/#merge-approval","text":"Any code change - other than a simple typo fix or one-line documentation change - requires at least two Drycc maintainers to accept it. Maintainers tag pull requests with \" LGTM1 \" and \" LGTM2 \" (Looks Good To Me) labels to indicate acceptance. No pull requests can be merged until at least one core maintainer signs off with an LGTM. The other LGTM can come from either a core maintainer or contributing maintainer. If the PR is from a Drycc maintainer, then he or she should be the one to close it. This keeps the commit stream clean and gives the maintainer the benefit of revisiting the PR before deciding whether or not to merge the changes. An exception to this is when an errant commit needs to be reverted urgently. If necessary, a PR that only reverts a previous commit can be merged without waiting for LGTM approval.","title":"Merge Approval"},{"location":"contributing/testing/","text":"Testing Drycc \u00b6 Each Drycc component is one among an ecosystem of such components - many of which integrate with one another - which makes testing each component thoroughly a matter of paramount importance. Each Drycc component includes its own suite of style checks, unit tests , and black-box type functional tests . Integration tests verify the behavior of the Drycc components together as a system and are provided separately by the drycc/workflow-e2e project. GitHub pull requests for all Drycc components are tested automatically by the Travis CI continuous integration system. Contributors should run the same tests locally before proposing any changes to the Drycc codebase. Set Up the Environment \u00b6 Successfully executing the unit and functional tests for any Drycc component requires that the Development Environment is set up first. Run the Tests \u00b6 The style checks, unit tests, and functional tests for each component can all be executed via make targets: To execute style checks: $ make test-style To execute unit tests: $ make test-unit To execute functional tests: $ make test-functional To execute style checks, unit tests, and functional tests all in one shot: $ make test To execute integration tests, refer to drycc/workflow-e2e documentation.","title":"Testing"},{"location":"contributing/testing/#testing-drycc","text":"Each Drycc component is one among an ecosystem of such components - many of which integrate with one another - which makes testing each component thoroughly a matter of paramount importance. Each Drycc component includes its own suite of style checks, unit tests , and black-box type functional tests . Integration tests verify the behavior of the Drycc components together as a system and are provided separately by the drycc/workflow-e2e project. GitHub pull requests for all Drycc components are tested automatically by the Travis CI continuous integration system. Contributors should run the same tests locally before proposing any changes to the Drycc codebase.","title":"Testing Drycc"},{"location":"contributing/testing/#set-up-the-environment","text":"Successfully executing the unit and functional tests for any Drycc component requires that the Development Environment is set up first.","title":"Set Up the Environment"},{"location":"contributing/testing/#run-the-tests","text":"The style checks, unit tests, and functional tests for each component can all be executed via make targets: To execute style checks: $ make test-style To execute unit tests: $ make test-unit To execute functional tests: $ make test-functional To execute style checks, unit tests, and functional tests all in one shot: $ make test To execute integration tests, refer to drycc/workflow-e2e documentation.","title":"Run the Tests"},{"location":"contributing/triaging-issues/","text":"Triaging Issues \u00b6 Issue triage provides an important way to contribute to an open source project. Triage helps ensure issues resolve quickly by: Describing the issue's intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took. Giving a contributor the information they need before they commit to resolving an issue. Lowering the issue count by preventing duplicate issues. Streamlining the development process by preventing duplicate discussions. If you don't have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. Ensure the Issue Contains Basic Information \u00b6 Before triaging an issue very far, make sure that the issue's author provided the standard issue information. This will help you make an educated recommendation on how this to categorize the issue. Standard information that should be included in most issues are things such as: the version(s) of Drycc this issue affects a reproducible case if this is a bug page URL if this is a docs issue or the name of a man page Depending on the issue, you might not feel all this information is needed. Use your best judgment. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem. If the author provides the recommended information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author's time. If the author does not respond requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided. Classifying the Issue \u00b6 An issue can have multiple of the following labels: Issue Kind \u00b6 Kind Description bug Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate. docs Writing documentation, man pages, articles, blogs, or other significant word-driven task. enhancement Enhancements can drastically improve usability or performance of a component. question Contains a user or contributor question requiring a response. security Security-related issues such as TLS encryption, network segregation, authn/authz features, etc. Functional Area \u00b6 builder cache contrib and provisioning client controller database docs kubernetes registry router store (Ceph) tests Easy Fix \u00b6 \"Easy Fix\" issues are a way for a new contributor to find issues that are fit for their experience level. These issues are typically for users who are new to Drycc, and possibly Go, and is looking to help while learning the basics. Prioritizing issues \u00b6 When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority. Priority Description priority 0 Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release. priority 1 Serious: Impedes user actions or is a regression. Fix this before the next planned release. And that's it. That should be all the information required for a new or existing contributor to come in an resolve an issue.","title":"Triaging Issues"},{"location":"contributing/triaging-issues/#triaging-issues","text":"Issue triage provides an important way to contribute to an open source project. Triage helps ensure issues resolve quickly by: Describing the issue's intent and purpose is conveyed precisely. This is necessary because it can be difficult for an issue to explain how an end user experiences an problem and what actions they took. Giving a contributor the information they need before they commit to resolving an issue. Lowering the issue count by preventing duplicate issues. Streamlining the development process by preventing duplicate discussions. If you don't have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours.","title":"Triaging Issues"},{"location":"contributing/triaging-issues/#ensure-the-issue-contains-basic-information","text":"Before triaging an issue very far, make sure that the issue's author provided the standard issue information. This will help you make an educated recommendation on how this to categorize the issue. Standard information that should be included in most issues are things such as: the version(s) of Drycc this issue affects a reproducible case if this is a bug page URL if this is a docs issue or the name of a man page Depending on the issue, you might not feel all this information is needed. Use your best judgment. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem. If the author provides the recommended information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author's time. If the author does not respond requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided.","title":"Ensure the Issue Contains Basic Information"},{"location":"contributing/triaging-issues/#classifying-the-issue","text":"An issue can have multiple of the following labels:","title":"Classifying the Issue"},{"location":"contributing/triaging-issues/#issue-kind","text":"Kind Description bug Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate. docs Writing documentation, man pages, articles, blogs, or other significant word-driven task. enhancement Enhancements can drastically improve usability or performance of a component. question Contains a user or contributor question requiring a response. security Security-related issues such as TLS encryption, network segregation, authn/authz features, etc.","title":"Issue Kind"},{"location":"contributing/triaging-issues/#functional-area","text":"builder cache contrib and provisioning client controller database docs kubernetes registry router store (Ceph) tests","title":"Functional Area"},{"location":"contributing/triaging-issues/#easy-fix","text":"\"Easy Fix\" issues are a way for a new contributor to find issues that are fit for their experience level. These issues are typically for users who are new to Drycc, and possibly Go, and is looking to help while learning the basics.","title":"Easy Fix"},{"location":"contributing/triaging-issues/#prioritizing-issues","text":"When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority. Priority Description priority 0 Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release. priority 1 Serious: Impedes user actions or is a regression. Fix this before the next planned release. And that's it. That should be all the information required for a new or existing contributor to come in an resolve an issue.","title":"Prioritizing issues"},{"location":"diagrams/","text":"Architecture Diagrams \u00b6 This is an OmniGraffle file which holds the source materials for the following images. To update a chart: Make your modification! Select \"File > Export\" Select \"Entire Document Choose: Scale: 100% Set Bitmap Resolution to 72 dpi (for web) Uncheck \"Transparent Background\" Select \"images\" directory Click \"Export\" This should update all of the graphics in one go! Commit and pull-request.","title":"Architecture Diagrams"},{"location":"diagrams/#architecture-diagrams","text":"This is an OmniGraffle file which holds the source materials for the following images. To update a chart: Make your modification! Select \"File > Export\" Select \"Entire Document Choose: Scale: 100% Set Bitmap Resolution to 72 dpi (for web) Uncheck \"Transparent Background\" Select \"images\" directory Click \"Export\" This should update all of the graphics in one go! Commit and pull-request.","title":"Architecture Diagrams"},{"location":"installing-workflow/","text":"Installing Drycc Workflow \u00b6 This document is aimed at those who have already provisioned a Kubernetes v1.16.15+ cluster and want to install Drycc Workflow. If help is required getting started with Kubernetes and Drycc Workflow, follow the quickstart guide for assistance. Prerequisites \u00b6 Verify the Kubernetes system requirements Install Helm and Drycc Workflow CLI tools Check Your Setup \u00b6 Check that the helm command is available and the version is v2.5.0 or newer. $ helm version Client: &version.Version{SemVer:\"v2.5.0\", GitCommit:\"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6\", GitTreeState:\"clean\"} Server: &version.Version{SemVer:\"v2.5.0\", GitCommit:\"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6\", GitTreeState:\"clean\"} Choose Your Deployment Strategy \u00b6 Drycc Workflow includes everything it needs to run out of the box. However, these defaults are aimed at simplicity rather than production readiness. Production and staging deployments of Workflow should, at a minimum, use off-cluster storage which is used by Workflow components to store and backup critical data. Should an operator need to completely re-install Workflow, the required components can recover from off-cluster storage. See the documentation for configuring object storage for more details. More rigorous installations would benefit from using outside sources for the following things: * Postgres - For example AWS RDS. * Registry - This includes quay.io , dockerhub , Amazon ECR , and Google GCR . * Redis - Such as AWS Elasticache * Grafana Gateway \u00b6 Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used. Install Drycc Workflow \u00b6 If the version of helm is 3.0 +; you need to create the namespace in advance: kubectl create ns drycc If you want to change it, set the variable when using helm. $ helm install drycc oci://registry.drycc.cc/charts/workflow \\ --namespace drycc \\ --set builder.imageRegistry=quay.io \\ --set imagebuilder.imageRegistry=quay.io \\ --set controller.imageRegistry=quay.io \\ --set database.imageRegistry=quay.io \\ --set fluentbit.imageRegistry=quay.io \\ --set redis.imageRegistry=quay.io \\ --set rabbitmq.imageRegistry=quay.io \\ --set logger.imageRegistry=quay.io \\ --set storage.imageRegistry=quay.io \\ --set monitor.imageRegistry=quay.io \\ --set registry.imageRegistry=quay.io \\ --set registry-proxy.imageRegistry=quay.io \\ --set global.platformDomain=drycc.cc Helm will install a variety of Kubernetes resources in the drycc namespace. Wait for the pods that Helm launched to be ready. Monitor their status by running: $ kubectl --namespace=drycc get pods If it's preferred to have kubectl automatically update as the pod states change, run (type Ctrl-C to stop the watch): $ kubectl --namespace=drycc get pods -w Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will automatically restart it. Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start: $ kubectl --namespace=drycc get pods NAME READY STATUS RESTARTS AGE drycc-builder-574483744-l15zj 1/1 Running 0 4m drycc-controller-3953262871-pncgq 1/1 Running 2 4m drycc-controller-celery-cmxxn 3/3 Running 0 4m drycc-database-83844344-47ld6 1/1 Running 0 4m drycc-logger-176328999-wjckx 1/1 Running 4 4m drycc-logger-fluentbit-zxnqb 1/1 Running 0 4m drycc-redis-304849759-1f35p 1/1 Running 0 4m drycc-storage-676004970-nxqgt 1/1 Running 0 4m drycc-monitor-grafana-432627134-lnl2h 1/1 Running 0 4m drycc-monitor-telegraf-wmcmn 1/1 Running 1 4m drycc-registry-756475849-lwc6b 1/1 Running 1 4m drycc-registry-proxy-96c4p 1/1 Running 0 4m drycc-rabbitmq-0 1/1 Running 0 4m Once all of the pods are in the READY state, Drycc Workflow is up and running! For more installation parameters, please check the values.yaml file of workflow. After installing Workflow, register a user and deploy an application . Configure DNS \u00b6 User must to set up a hostname, and assumes the drycc-builder.$host convention. We need to point the drycc-builder.$host record to the public IP address of your builder. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed. $ kubectl get svc drycc-builder --namespace drycc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE drycc-builder 10.0.25.3 138.91.243.152 2222:31625/TCP 33m If we were using drycc.cc as a hostname, we would need to create the following A DNS records. Name Type Value drycc-builder.drycc.cc A 138.91.243.152 Once all of the pods are in the READY state, and drycc-builder.$host resolves to the external IP found above, Workflow is up and running! After installing Workflow, register a user and deploy an application . If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can access both internal and external networks, and then expose 80 and 443 .","title":"Installing Workflow"},{"location":"installing-workflow/#installing-drycc-workflow","text":"This document is aimed at those who have already provisioned a Kubernetes v1.16.15+ cluster and want to install Drycc Workflow. If help is required getting started with Kubernetes and Drycc Workflow, follow the quickstart guide for assistance.","title":"Installing Drycc Workflow"},{"location":"installing-workflow/#prerequisites","text":"Verify the Kubernetes system requirements Install Helm and Drycc Workflow CLI tools","title":"Prerequisites"},{"location":"installing-workflow/#check-your-setup","text":"Check that the helm command is available and the version is v2.5.0 or newer. $ helm version Client: &version.Version{SemVer:\"v2.5.0\", GitCommit:\"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6\", GitTreeState:\"clean\"} Server: &version.Version{SemVer:\"v2.5.0\", GitCommit:\"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6\", GitTreeState:\"clean\"}","title":"Check Your Setup"},{"location":"installing-workflow/#choose-your-deployment-strategy","text":"Drycc Workflow includes everything it needs to run out of the box. However, these defaults are aimed at simplicity rather than production readiness. Production and staging deployments of Workflow should, at a minimum, use off-cluster storage which is used by Workflow components to store and backup critical data. Should an operator need to completely re-install Workflow, the required components can recover from off-cluster storage. See the documentation for configuring object storage for more details. More rigorous installations would benefit from using outside sources for the following things: * Postgres - For example AWS RDS. * Registry - This includes quay.io , dockerhub , Amazon ECR , and Google GCR . * Redis - Such as AWS Elasticache * Grafana","title":"Choose Your Deployment Strategy"},{"location":"installing-workflow/#gateway","text":"Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.","title":"Gateway"},{"location":"installing-workflow/#install-drycc-workflow","text":"If the version of helm is 3.0 +; you need to create the namespace in advance: kubectl create ns drycc If you want to change it, set the variable when using helm. $ helm install drycc oci://registry.drycc.cc/charts/workflow \\ --namespace drycc \\ --set builder.imageRegistry=quay.io \\ --set imagebuilder.imageRegistry=quay.io \\ --set controller.imageRegistry=quay.io \\ --set database.imageRegistry=quay.io \\ --set fluentbit.imageRegistry=quay.io \\ --set redis.imageRegistry=quay.io \\ --set rabbitmq.imageRegistry=quay.io \\ --set logger.imageRegistry=quay.io \\ --set storage.imageRegistry=quay.io \\ --set monitor.imageRegistry=quay.io \\ --set registry.imageRegistry=quay.io \\ --set registry-proxy.imageRegistry=quay.io \\ --set global.platformDomain=drycc.cc Helm will install a variety of Kubernetes resources in the drycc namespace. Wait for the pods that Helm launched to be ready. Monitor their status by running: $ kubectl --namespace=drycc get pods If it's preferred to have kubectl automatically update as the pod states change, run (type Ctrl-C to stop the watch): $ kubectl --namespace=drycc get pods -w Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will automatically restart it. Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start: $ kubectl --namespace=drycc get pods NAME READY STATUS RESTARTS AGE drycc-builder-574483744-l15zj 1/1 Running 0 4m drycc-controller-3953262871-pncgq 1/1 Running 2 4m drycc-controller-celery-cmxxn 3/3 Running 0 4m drycc-database-83844344-47ld6 1/1 Running 0 4m drycc-logger-176328999-wjckx 1/1 Running 4 4m drycc-logger-fluentbit-zxnqb 1/1 Running 0 4m drycc-redis-304849759-1f35p 1/1 Running 0 4m drycc-storage-676004970-nxqgt 1/1 Running 0 4m drycc-monitor-grafana-432627134-lnl2h 1/1 Running 0 4m drycc-monitor-telegraf-wmcmn 1/1 Running 1 4m drycc-registry-756475849-lwc6b 1/1 Running 1 4m drycc-registry-proxy-96c4p 1/1 Running 0 4m drycc-rabbitmq-0 1/1 Running 0 4m Once all of the pods are in the READY state, Drycc Workflow is up and running! For more installation parameters, please check the values.yaml file of workflow. After installing Workflow, register a user and deploy an application .","title":"Install Drycc Workflow"},{"location":"installing-workflow/#configure-dns","text":"User must to set up a hostname, and assumes the drycc-builder.$host convention. We need to point the drycc-builder.$host record to the public IP address of your builder. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed. $ kubectl get svc drycc-builder --namespace drycc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE drycc-builder 10.0.25.3 138.91.243.152 2222:31625/TCP 33m If we were using drycc.cc as a hostname, we would need to create the following A DNS records. Name Type Value drycc-builder.drycc.cc A 138.91.243.152 Once all of the pods are in the READY state, and drycc-builder.$host resolves to the external IP found above, Workflow is up and running! After installing Workflow, register a user and deploy an application . If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can access both internal and external networks, and then expose 80 and 443 .","title":"Configure DNS"},{"location":"installing-workflow/configuring-object-storage/","text":"Configuring Object Storage \u00b6 A variety of Drycc Workflow components rely on an object storage system to do their work including storing application slugs, Container images and database logs. Drycc Workflow ships with Storage by default, which provides in-cluster. Configuring off-cluster Object Storage \u00b6 Every component that relies on object storage uses two inputs for configuration: You must use object storage services that are compatible with S3 API Access credentials stored as a Kubernetes secret named storage-creds The helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster object storage. Drycc Workflow currently supports Google Compute Storage, Amazon S3, Azure Blob Storage and OpenStack Swift Storage. Step 1: Create storage buckets \u00b6 Create storage buckets for each of the Workflow subsystems: builder , registry , and database . Depending on your chosen object storage you may need to provide globally unique bucket names. If you are using S3, use hyphens instead of periods in the bucket names. Using periods in the bucket name will cause an ssl certificate validation issue with S3 . If you provide credentials with sufficient access to the underlying storage, Workflow components will create the buckets if they do not exist. Step 2: Generate storage credentials \u00b6 If applicable, generate credentials that have create and write access to the storage buckets created in Step 1. If you are using AWS S3 and your Kubernetes nodes are configured with appropriate IAM API keys via InstanceRoles, you do not need to create API credentials. Do, however, validate that the InstanceRole has appropriate permissions to the configured buckets! Step 3: Configure Workflow Chart \u00b6 Operators should configure object storage by editing the Helm values file before running helm install . To do so: Fetch the Helm values by running helm inspect values oci://registry.drycc.cc/charts/workflow > values.yaml Update the global/storage parameter to reference the platform you are using, e.g. s3 , azure , gcs , or swift Find the corresponding section for your storage type and provide appropriate values including region, bucket names, and access credentials. Save your changes. Note All values will be automatically (base64) encoded except the key_json values under gcs / gcr . These must be base64-encoded. This is to support cleanly passing said encoded text via helm --set cli functionality rather than attempting to pass the raw JSON data. For example: $ helm install drycc oci://registry.drycc.cc/charts/workflow \\ --namespace drycc \\ --set global.platformDomain=youdomain.com --set global.storage=gcs,gcs.key_json=\"$(cat /path/to/gcs_creds.json | base64 -w 0)\" You are now ready to run helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml using your desired object storage.","title":"Configuring Object Storage"},{"location":"installing-workflow/configuring-object-storage/#configuring-object-storage","text":"A variety of Drycc Workflow components rely on an object storage system to do their work including storing application slugs, Container images and database logs. Drycc Workflow ships with Storage by default, which provides in-cluster.","title":"Configuring Object Storage"},{"location":"installing-workflow/configuring-object-storage/#configuring-off-cluster-object-storage","text":"Every component that relies on object storage uses two inputs for configuration: You must use object storage services that are compatible with S3 API Access credentials stored as a Kubernetes secret named storage-creds The helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster object storage. Drycc Workflow currently supports Google Compute Storage, Amazon S3, Azure Blob Storage and OpenStack Swift Storage.","title":"Configuring off-cluster Object Storage"},{"location":"installing-workflow/configuring-object-storage/#step-1-create-storage-buckets","text":"Create storage buckets for each of the Workflow subsystems: builder , registry , and database . Depending on your chosen object storage you may need to provide globally unique bucket names. If you are using S3, use hyphens instead of periods in the bucket names. Using periods in the bucket name will cause an ssl certificate validation issue with S3 . If you provide credentials with sufficient access to the underlying storage, Workflow components will create the buckets if they do not exist.","title":"Step 1: Create storage buckets"},{"location":"installing-workflow/configuring-object-storage/#step-2-generate-storage-credentials","text":"If applicable, generate credentials that have create and write access to the storage buckets created in Step 1. If you are using AWS S3 and your Kubernetes nodes are configured with appropriate IAM API keys via InstanceRoles, you do not need to create API credentials. Do, however, validate that the InstanceRole has appropriate permissions to the configured buckets!","title":"Step 2: Generate storage credentials"},{"location":"installing-workflow/configuring-object-storage/#step-3-configure-workflow-chart","text":"Operators should configure object storage by editing the Helm values file before running helm install . To do so: Fetch the Helm values by running helm inspect values oci://registry.drycc.cc/charts/workflow > values.yaml Update the global/storage parameter to reference the platform you are using, e.g. s3 , azure , gcs , or swift Find the corresponding section for your storage type and provide appropriate values including region, bucket names, and access credentials. Save your changes. Note All values will be automatically (base64) encoded except the key_json values under gcs / gcr . These must be base64-encoded. This is to support cleanly passing said encoded text via helm --set cli functionality rather than attempting to pass the raw JSON data. For example: $ helm install drycc oci://registry.drycc.cc/charts/workflow \\ --namespace drycc \\ --set global.platformDomain=youdomain.com --set global.storage=gcs,gcs.key_json=\"$(cat /path/to/gcs_creds.json | base64 -w 0)\" You are now ready to run helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml using your desired object storage.","title":"Step 3: Configure Workflow Chart"},{"location":"installing-workflow/configuring-postgres/","text":"Configuring Postgres \u00b6 Drycc Workflow's controller and passport component rely on a PostgreSQL database to store platform state. By default, Drycc Workflow ships with the database component, which provides an in-cluster PostgreSQL database backed up to in-cluster or off-cluster object storage . Currently, for object storage, which is utilized by several Workflow components, only off-cluster solutions such as S3 or GCS are recommended in production environments. Experience has shown that many operators already opting for off-cluster object storage similarly prefer to host Postgres off-cluster as well, using Amazon RDS or similar. When excercising both options, a Workflow installation becomes entirely stateless, and is thus restored or rebuilt with greater ease should the need ever arise. Provisioning off-cluster Postgres \u00b6 First, provision a PostgreSQL RDBMS using the cloud provider or other infrastructure of your choice. Take care to ensure that security groups or other firewall rules will permit connectivity from your Kubernetes worker nodes, any of which may play host to the Workflow controller component. Take note of the following: The hostname or public IP of your PostgreSQL RDBMS The port on which your PostgreSQL RDBMS runs-- typically 5432 Within the off-cluster RDBMS, manually provision the following: A database user (take note of the username and password) A database owned by that user (take note of its name) If you are able to log into the RDBMS as a superuser or a user with appropriate permissions, this process will typically look like this: $ psql -h -p -d postgres -U <\"postgres\" or your own username> > create user with password ''; > create database with owner ; > \\q Configuring Workflow \u00b6 The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database. Step 1: If you haven't already fetched the values, do so with helm inspect values drycc/workflow > values.yaml Step 2: Update database connection details by modifying values.yaml : Update the databaseLocation parameter to off-cluster . Update the values in the [database] configuration section to properly reflect all connection details. Update the values in the [controller] configuration section to properly reflect platformDomain details. Save your changes. Note: you do not need to (and must not) base64 encode any values, as the Helm chart will automatically handle encoding as necessary. You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml as usual .","title":"Configuring Postgres"},{"location":"installing-workflow/configuring-postgres/#configuring-postgres","text":"Drycc Workflow's controller and passport component rely on a PostgreSQL database to store platform state. By default, Drycc Workflow ships with the database component, which provides an in-cluster PostgreSQL database backed up to in-cluster or off-cluster object storage . Currently, for object storage, which is utilized by several Workflow components, only off-cluster solutions such as S3 or GCS are recommended in production environments. Experience has shown that many operators already opting for off-cluster object storage similarly prefer to host Postgres off-cluster as well, using Amazon RDS or similar. When excercising both options, a Workflow installation becomes entirely stateless, and is thus restored or rebuilt with greater ease should the need ever arise.","title":"Configuring Postgres"},{"location":"installing-workflow/configuring-postgres/#provisioning-off-cluster-postgres","text":"First, provision a PostgreSQL RDBMS using the cloud provider or other infrastructure of your choice. Take care to ensure that security groups or other firewall rules will permit connectivity from your Kubernetes worker nodes, any of which may play host to the Workflow controller component. Take note of the following: The hostname or public IP of your PostgreSQL RDBMS The port on which your PostgreSQL RDBMS runs-- typically 5432 Within the off-cluster RDBMS, manually provision the following: A database user (take note of the username and password) A database owned by that user (take note of its name) If you are able to log into the RDBMS as a superuser or a user with appropriate permissions, this process will typically look like this: $ psql -h -p -d postgres -U <\"postgres\" or your own username> > create user with password ''; > create database with owner ; > \\q","title":"Provisioning off-cluster Postgres"},{"location":"installing-workflow/configuring-postgres/#configuring-workflow","text":"The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database. Step 1: If you haven't already fetched the values, do so with helm inspect values drycc/workflow > values.yaml Step 2: Update database connection details by modifying values.yaml : Update the databaseLocation parameter to off-cluster . Update the values in the [database] configuration section to properly reflect all connection details. Update the values in the [controller] configuration section to properly reflect platformDomain details. Save your changes. Note: you do not need to (and must not) base64 encode any values, as the Helm chart will automatically handle encoding as necessary. You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml as usual .","title":"Configuring Workflow"},{"location":"installing-workflow/configuring-registry/","text":"Configuring Registry \u00b6 Drycc Workflow's builder component relies on a registry for storing application container images. Drycc Workflow ships with a registry component by default, which provides an in-cluster Container registry backed by the platform-configured object storage . Operators might want to use an off-cluster registry for performance or security reasons. Configuring Off-Cluster Private Registry \u00b6 Every component that relies on a registry uses two inputs for configuration: Registry Location environment variable named DRYCC_REGISTRY_LOCATION Access credentials stored as a Kubernetes secret named registry-secret The Helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster registry. Drycc Workflow supports external registries which provide either short-lived tokens that are valid only for a specified amount of time or long-lived tokens (basic username/password) which are valid forever for authenticating to them. For those registries which provide short lived tokens for authentication, Drycc Workflow will generate and refresh them such that the deployed apps will only have access to the short-lived tokens and not to the actual credentials for the registries. When using a private registry the container images are no longer pulled by Drycc Workflow Controller but rather are managed by Kubernetes . This will increase security and overall speed, however the port information can no longer be discovered. Instead the port information can be set via drycc config:set PORT= prior to deploying the application. Drycc Workflow currently supports: off-cluster: Any provider which supports long-lived username/password authentication, such as Azure Container Registry , Docker Hub , quay.io , or a self-hosted Container registry. Configuration \u00b6 If you haven't already fetched the values file, do so with helm inspect values drycc/workflow > values.yaml Update registry location details by modifying the values file: Update the registryLocation parameter to reference the registry location you are using: off-cluster , ecr , gcr Update the values in the section which corresponds to your registry location type. You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml using your desired registry. Examples \u00b6 Here we show how the relevant parts of the fetched values.yaml file might look like after configuring for a particular off-cluster registry: Azure Container Registry (ACR) \u00b6 After following the docs and creating a registry, e.g. myregistry , with its corresponding login server of myregistry.azurecr.io , the following values should be supplied: global: ... registryLocation: \"off-cluster\" ... registry-token-refresher: ... registry: hostname: \"myregistry.azurecr.io\" organization: \"myorg\" username: \"myusername\" password: \"mypassword\" ... Note: The mandatory organization field (here myorg ) will be created as an ACR repository if it does not already exist. Quay.io \u00b6 global: ... registryLocation: \"off-cluster\" ... registry-token-refresher: ... registry: hostname: \"quay.io\" organization: \"myorg\" username: \"myusername\" password: \"mypassword\" ...","title":"Configuring the Registry"},{"location":"installing-workflow/configuring-registry/#configuring-registry","text":"Drycc Workflow's builder component relies on a registry for storing application container images. Drycc Workflow ships with a registry component by default, which provides an in-cluster Container registry backed by the platform-configured object storage . Operators might want to use an off-cluster registry for performance or security reasons.","title":"Configuring Registry"},{"location":"installing-workflow/configuring-registry/#configuring-off-cluster-private-registry","text":"Every component that relies on a registry uses two inputs for configuration: Registry Location environment variable named DRYCC_REGISTRY_LOCATION Access credentials stored as a Kubernetes secret named registry-secret The Helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster registry. Drycc Workflow supports external registries which provide either short-lived tokens that are valid only for a specified amount of time or long-lived tokens (basic username/password) which are valid forever for authenticating to them. For those registries which provide short lived tokens for authentication, Drycc Workflow will generate and refresh them such that the deployed apps will only have access to the short-lived tokens and not to the actual credentials for the registries. When using a private registry the container images are no longer pulled by Drycc Workflow Controller but rather are managed by Kubernetes . This will increase security and overall speed, however the port information can no longer be discovered. Instead the port information can be set via drycc config:set PORT= prior to deploying the application. Drycc Workflow currently supports: off-cluster: Any provider which supports long-lived username/password authentication, such as Azure Container Registry , Docker Hub , quay.io , or a self-hosted Container registry.","title":"Configuring Off-Cluster Private Registry"},{"location":"installing-workflow/configuring-registry/#configuration","text":"If you haven't already fetched the values file, do so with helm inspect values drycc/workflow > values.yaml Update registry location details by modifying the values file: Update the registryLocation parameter to reference the registry location you are using: off-cluster , ecr , gcr Update the values in the section which corresponds to your registry location type. You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml using your desired registry.","title":"Configuration"},{"location":"installing-workflow/configuring-registry/#examples","text":"Here we show how the relevant parts of the fetched values.yaml file might look like after configuring for a particular off-cluster registry:","title":"Examples"},{"location":"installing-workflow/configuring-registry/#azure-container-registry-acr","text":"After following the docs and creating a registry, e.g. myregistry , with its corresponding login server of myregistry.azurecr.io , the following values should be supplied: global: ... registryLocation: \"off-cluster\" ... registry-token-refresher: ... registry: hostname: \"myregistry.azurecr.io\" organization: \"myorg\" username: \"myusername\" password: \"mypassword\" ... Note: The mandatory organization field (here myorg ) will be created as an ACR repository if it does not already exist.","title":"Azure Container Registry (ACR)"},{"location":"installing-workflow/configuring-registry/#quayio","text":"global: ... registryLocation: \"off-cluster\" ... registry-token-refresher: ... registry: hostname: \"quay.io\" organization: \"myorg\" username: \"myusername\" password: \"mypassword\" ...","title":"Quay.io"},{"location":"installing-workflow/gateway/","text":"Specify Gateway \u00b6 Install Drycc Workflow (Specify gateway) \u00b6 Now that Helm is installed and the repository has been added, install Workflow with a native gateway by running: $ helm install drycc oci://registry.drycc.cc/charts/workflow \\ --namespace drycc \\ --set global.gatewayClass=istio \\ --set global.platformDomain=drycc.cc \\ --set builder.service.type=LoadBalancer Of course, if you deploy it on a bare machine, you probably do not have Load Balancer. You need to use NodePort: $ helm install drycc oci://registry.drycc.cc/charts/workflow \\ --namespace drycc \\ --set global.gatewayClass=istio \\ --set global.platformDomain=drycc.cc \\ --set builder.service.type=NodePort \\ --set builder.service.nodePort=32222 If you want to use Load Balancer on a bare machine, you can look at metallb Where global.platformDomain is a required parameter that is traditionally not required for Workflow that is explained in the next section. In this example we are using drycc.cc for $hostname . Helm will install a variety of Kubernetes resources in the drycc namespace. Wait for the pods that Helm launched to be ready. Monitor their status by running: $ kubectl --namespace=drycc get pods You should also notice that several Kubernetes gatewayclass has been installed on your cluster. You can view it by running: $ kubectl get gatewayclass --namespace drycc Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will automatically restart it. Here, it can be seen that the controller, builder and registry all took a few loops waiting for storage before they were able to start: $ kubectl --namespace=drycc get pods NAME READY STATUS RESTARTS AGE drycc-builder-hy3xv 1/1 Running 5 5m drycc-controller-g3cu8 1/1 Running 5 5m drycc-controller-celery-cmxxn 3/3 Running 0 5m drycc-database-rad1o 1/1 Running 0 5m drycc-logger-fluentbit-1v8uk 1/1 Running 0 5m drycc-logger-fluentbit-esm60 1/1 Running 0 5m drycc-logger-sm8b3 1/1 Running 0 5m drycc-storage-4ww3t 1/1 Running 0 5m drycc-registry-asozo 1/1 Running 1 5m drycc-rabbitmq-0 1/1 Running 0 5m Install a Kubernetes Gateway \u00b6 Now that Workflow has been deployed with the global.gatewayClass , we will need a Kubernetes gateway in place to begin routing traffic. Here is an example of how to use istio as an gateway for Workflow. Of course, you are welcome to use any controller you wish. $ helm repo add istio https://istio-release.storage.googleapis.com/charts $ helm repo update $ kubectl create namespace istio-system $ helm install istio-base istio/base -n istio-system $ helm install istiod istio/istiod -n istio-system --wait $ kubectl create namespace istio-ingress $ helm install istio-ingress istio/gateway -n istio-ingress --wait Configure DNS \u00b6 User must install drycc and then set up a hostname, and assumes the *.$host convention. We need to point the *.$host record to the public IP address of your gateway. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed. $ kubectl get gateway --namespace drycc NAME CLASS ADDRESS PROGRAMMED AGE gateway istio 138.91.243.152 True 36d If we were using drycc.cc as a hostname, we would need to create the following A DNS records. Name Type Value *.drycc.cc A 138.91.243.152 Once all of the pods are in the READY state, and *.$host resolves to the external IP found above, the preparation of gateway has been completed! After installing Workflow, register a user and deploy an application . If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can access both internal and external networks, and then expose 80 and 443 .","title":"Installing Gateway"},{"location":"installing-workflow/gateway/#specify-gateway","text":"","title":"Specify Gateway"},{"location":"installing-workflow/gateway/#install-drycc-workflow-specify-gateway","text":"Now that Helm is installed and the repository has been added, install Workflow with a native gateway by running: $ helm install drycc oci://registry.drycc.cc/charts/workflow \\ --namespace drycc \\ --set global.gatewayClass=istio \\ --set global.platformDomain=drycc.cc \\ --set builder.service.type=LoadBalancer Of course, if you deploy it on a bare machine, you probably do not have Load Balancer. You need to use NodePort: $ helm install drycc oci://registry.drycc.cc/charts/workflow \\ --namespace drycc \\ --set global.gatewayClass=istio \\ --set global.platformDomain=drycc.cc \\ --set builder.service.type=NodePort \\ --set builder.service.nodePort=32222 If you want to use Load Balancer on a bare machine, you can look at metallb Where global.platformDomain is a required parameter that is traditionally not required for Workflow that is explained in the next section. In this example we are using drycc.cc for $hostname . Helm will install a variety of Kubernetes resources in the drycc namespace. Wait for the pods that Helm launched to be ready. Monitor their status by running: $ kubectl --namespace=drycc get pods You should also notice that several Kubernetes gatewayclass has been installed on your cluster. You can view it by running: $ kubectl get gatewayclass --namespace drycc Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the installation: if a component's dependencies are not yet available, that component will exit and Kubernetes will automatically restart it. Here, it can be seen that the controller, builder and registry all took a few loops waiting for storage before they were able to start: $ kubectl --namespace=drycc get pods NAME READY STATUS RESTARTS AGE drycc-builder-hy3xv 1/1 Running 5 5m drycc-controller-g3cu8 1/1 Running 5 5m drycc-controller-celery-cmxxn 3/3 Running 0 5m drycc-database-rad1o 1/1 Running 0 5m drycc-logger-fluentbit-1v8uk 1/1 Running 0 5m drycc-logger-fluentbit-esm60 1/1 Running 0 5m drycc-logger-sm8b3 1/1 Running 0 5m drycc-storage-4ww3t 1/1 Running 0 5m drycc-registry-asozo 1/1 Running 1 5m drycc-rabbitmq-0 1/1 Running 0 5m","title":"Install Drycc Workflow (Specify gateway)"},{"location":"installing-workflow/gateway/#install-a-kubernetes-gateway","text":"Now that Workflow has been deployed with the global.gatewayClass , we will need a Kubernetes gateway in place to begin routing traffic. Here is an example of how to use istio as an gateway for Workflow. Of course, you are welcome to use any controller you wish. $ helm repo add istio https://istio-release.storage.googleapis.com/charts $ helm repo update $ kubectl create namespace istio-system $ helm install istio-base istio/base -n istio-system $ helm install istiod istio/istiod -n istio-system --wait $ kubectl create namespace istio-ingress $ helm install istio-ingress istio/gateway -n istio-ingress --wait","title":"Install a Kubernetes Gateway"},{"location":"installing-workflow/gateway/#configure-dns","text":"User must install drycc and then set up a hostname, and assumes the *.$host convention. We need to point the *.$host record to the public IP address of your gateway. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed. $ kubectl get gateway --namespace drycc NAME CLASS ADDRESS PROGRAMMED AGE gateway istio 138.91.243.152 True 36d If we were using drycc.cc as a hostname, we would need to create the following A DNS records. Name Type Value *.drycc.cc A 138.91.243.152 Once all of the pods are in the READY state, and *.$host resolves to the external IP found above, the preparation of gateway has been completed! After installing Workflow, register a user and deploy an application . If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can access both internal and external networks, and then expose 80 and 443 .","title":"Configure DNS"},{"location":"installing-workflow/system-requirements/","text":"Requirements \u00b6 To run Drycc Workflow on a Kubernetes cluster, there are a few requirements to keep in mind. Kubernetes Versions \u00b6 Drycc Workflow requires Kubernetes v1.16.15 or later. Components Requirements \u00b6 Drycc uses gateway as a routing implementation, so you have to choose an gateway. We recommend using istio or kong . Workflow supports the use of ACME to manage automatic certificates, cert-manager is also one of the necessary components, if you use cert-manager EAB, you need to set the clusterResourceNamespace to the namespace of drycc. Workflow supports stateful apps. You can create and use them through the 'drycc volumes' command. If you want to use this feature, you must have a StorageClass that supports ReadWriteMany . Workflow also supports the OSB API through the 'drycc resources' command. If you want to use this function, you need to install service-catalog . Storage Requirements \u00b6 A variety of Drycc Workflow components rely on an object storage system to do their work, including storing application slugs, Container images and database logs. Drycc Workflow ships with drycc storage by default, which provides in-cluster. Workflow supports Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), OpenShift Swift, and Azure Blob Storage. See configuring object storage for setup instructions. Resource Requirements \u00b6 When deploying Drycc Workflow, it's important to provision machines with adequate resources. Drycc is a highly-available distributed system, which means that Drycc components and your deployed applications will move around the cluster onto healthy hosts as hosts leave the cluster for various reasons (failures, reboots, autoscalers, etc.). Because of this, you should have ample spare resources on any machine in your cluster to withstand the additional load of running services for failed machines. Drycc Workflow components use about 2.5GB of memory across the cluster, and require approximately 30GB of hard disk space. Because it may need to handle additional load if another one fails, each machine has minimum requirements of: At least 4GB of RAM (more is better) At least 40GB of hard disk space Note that these estimates are for Drycc Workflow and Kubernetes only. Be sure to leave enough spare capacity for your application footprint as well. Running smaller machines will likely result in increased system load and has been known to result in component failures and instability.","title":"System Requirements"},{"location":"installing-workflow/system-requirements/#requirements","text":"To run Drycc Workflow on a Kubernetes cluster, there are a few requirements to keep in mind.","title":"Requirements"},{"location":"installing-workflow/system-requirements/#kubernetes-versions","text":"Drycc Workflow requires Kubernetes v1.16.15 or later.","title":"Kubernetes Versions"},{"location":"installing-workflow/system-requirements/#components-requirements","text":"Drycc uses gateway as a routing implementation, so you have to choose an gateway. We recommend using istio or kong . Workflow supports the use of ACME to manage automatic certificates, cert-manager is also one of the necessary components, if you use cert-manager EAB, you need to set the clusterResourceNamespace to the namespace of drycc. Workflow supports stateful apps. You can create and use them through the 'drycc volumes' command. If you want to use this feature, you must have a StorageClass that supports ReadWriteMany . Workflow also supports the OSB API through the 'drycc resources' command. If you want to use this function, you need to install service-catalog .","title":"Components Requirements"},{"location":"installing-workflow/system-requirements/#storage-requirements","text":"A variety of Drycc Workflow components rely on an object storage system to do their work, including storing application slugs, Container images and database logs. Drycc Workflow ships with drycc storage by default, which provides in-cluster. Workflow supports Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), OpenShift Swift, and Azure Blob Storage. See configuring object storage for setup instructions.","title":"Storage Requirements"},{"location":"installing-workflow/system-requirements/#resource-requirements","text":"When deploying Drycc Workflow, it's important to provision machines with adequate resources. Drycc is a highly-available distributed system, which means that Drycc components and your deployed applications will move around the cluster onto healthy hosts as hosts leave the cluster for various reasons (failures, reboots, autoscalers, etc.). Because of this, you should have ample spare resources on any machine in your cluster to withstand the additional load of running services for failed machines. Drycc Workflow components use about 2.5GB of memory across the cluster, and require approximately 30GB of hard disk space. Because it may need to handle additional load if another one fails, each machine has minimum requirements of: At least 4GB of RAM (more is better) At least 40GB of hard disk space Note that these estimates are for Drycc Workflow and Kubernetes only. Be sure to leave enough spare capacity for your application footprint as well. Running smaller machines will likely result in increased system load and has been known to result in component failures and instability.","title":"Resource Requirements"},{"location":"managing-workflow/configuring-dns/","text":"Configure DNS \u00b6 The Drycc Workflow controller and all applications deployed via Workflow are intended (by default) to be accessible as subdomains of the Workflow cluster's domain. For example, assuming example.com were a cluster's domain: The controller should be accessible at drycc.example.com Applications should be accessible (by default) at .example.com Given that this is the case, the primary objective in configuring DNS is that traffic for all subdomains of a cluster's domain be directed to the cluster node(s) hosting the platform's router component, which is capable of directing traffic within the cluster to the correct endpoints. With a Load Balancer \u00b6 Generally, it is recommended that a [load balancer][] be used to direct inbound traffic to one or more routers. In such a case, configuring DNS is as simple as defining a wildcard record in DNS that points to the load balancer. For example, assuming a domain of example.com : An A record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining) A CNAME record referencing an existing fully-qualified domain name for the load balancer Per AWS' own documentation , this is the recommended strategy when using AWS Elastic Load Balancers, as ELB IPs may change over time. DNS for any applications using a \"custom domain\" (a fully-qualified domain name that is not a subdomain of the cluster's own domain) can be configured by creating a CNAME record that references the wildcard record described above. Although it is dependent upon your distribution of Kubernetes and your underlying infrastructure, in many cases, the IP(s) or existing fully-qualified domain name of a load balancer can be determined directly using the kubectl tool: $ kubectl --namespace=istio-nginx describe service | grep \"LoadBalancer\" LoadBalancer Ingress: a493e4e58ea0511e5bb390686bc85da3-1558404688.us-west-2.elb.amazonaws.com The LoadBalancer Ingress field typically describes an existing domain name or public IP(s). Note that if Kubernetes is able to automatically provision a load balancer for you, it does so asynchronously. If the command shown above is issued very soon after Workflow installation, the load balancer may not exist yet. Without a Load Balancer \u00b6 On some platforms (Minikube, for instance), a load balancer is not an easy or practical thing to provision. In these cases, one can directly identify the public IP of a Kubernetes node that is hosting a router pod and use that information to configure the local /etc/hosts file. Because wildcard entries do not work in a local /etc/hosts file, using this strategy may result in frequent editing of that file to add fully-qualified subdomains of a cluster for each application added to that cluster. Because of this a more viable option may be to utilize the xip.io service. In general, for any IP, a.b.c.d , the fully-qualified domain name any-subdomain.a.b.c.d.xip.io will resolve to the IP a.b.c.d . This can be enormously useful. To begin, find the node(s) hosting router instances using kubectl : $ kubectl --namespace=istio-ingress describe pod | grep Node: Node: ip-10-0-0-199.us-west-2.compute.internal/10.0.0.199 Node: ip-10-0-0-198.us-west-2.compute.internal/10.0.0.198 The command will display information for every router pod. For each, a node name and IP are displayed in the Node field. If the IPs appearing in these fields are public, any of these may be used to configure your local /etc/hosts file or may be used with xip.io . If the IPs shown are not public, further investigation may be needed. You can list the IP addresses of a node using kubectl : $ kubectl describe node ip-10-0-0-199.us-west-2.compute.internal # ... Addresses: 10.0.0.199,10.0.0.199,54.218.85.175 # ... Here, the Addresses field lists all the node's IPs. If any of them are public, again, they may be used to configure your local /etc/hosts file or may be used with xip.io . Tutorial: Configuring DNS with Google Cloud DNS \u00b6 In this section, we'll describe how to configure Google Cloud DNS for routing your domain name to your Drycc cluster. We'll assume the following in this section: Your Ingress service has a load balancer in front of it. The load balancer need not be cloud based, it just needs to provide a stable IP address or a stable domain name You have the mystuff.com domain name registered with a registrar Replace your domain name with mystuff.com in the instructions to follow Your registrar lets you alter the nameservers for your domain name (most registrars do) Here are the steps for configuring cloud DNS to route to your drycc cluster: Get the load balancer IP or domain name If you are on Google Container Engine, you can run kubectl get svc -n istio-ingress and look for the LoadBalancer Ingress column to get the IP address Create a new Cloud DNS Zone (on the console: Networking => Cloud DNS , then click on Create Zone ) Name your zone, and set the DNS name to mystuff.com. (note the . at the end Click on the Create button Click on the Add Record Set button on the resulting page If your load balancer provides a stable IP address, enter the following fields in the resulting form: DNS Name : * Resource Record Type : A TTL : the DNS TTL of your choosing. If you're testing or you anticipate that you'll tear down and rebuild many drycc clusters over time, we recommend a low TTL IPv4 Address : The IP that you got in the very first step Click the Create button If your load balancer provides the stable domain name lbdomain.com , enter the following fields in the resulting form: DNS Name : * Resource Record Type : CNAME TTL : the DNS TTL of your choosing. If you're testing or you anticipate that you'll tear down and rebuild many drycc clusters over time, we recommend a low TTL Canonical name : lbdomain.com. (note the . a the end) Click on the Create button In your domain registrar, set the nameservers for your mystuff.com domain to the ones under the data column in the NS record on the same page. They'll often be something like the below (note the trailing . characters). ns-cloud-b1.googledomains.com. ns-cloud-b2.googledomains.com. ns-cloud-b3.googledomains.com. ns-cloud-b4.googledomains.com. Note: If you ever have to re-create your drycc cluster, simply go back to step 6.4 or 7.4 (depending on your load balancer) and change the IP address or domain name to the new value. You may have to wait for the TTL you set to expire. Testing \u00b6 To test that traffic reaches its intended destination, a request can be sent to the Drycc controller like so (do not forget the trailing slash!): curl http://drycc.example.com/v2/ Or: curl http://drycc.54.218.85.175.xip.io/v2/ Since such requests require authentication, a response such as the following should be considered an indicator of success: {\"detail\":\"Authentication credentials were not provided.\"}","title":"Configuring DNS"},{"location":"managing-workflow/configuring-dns/#configure-dns","text":"The Drycc Workflow controller and all applications deployed via Workflow are intended (by default) to be accessible as subdomains of the Workflow cluster's domain. For example, assuming example.com were a cluster's domain: The controller should be accessible at drycc.example.com Applications should be accessible (by default) at .example.com Given that this is the case, the primary objective in configuring DNS is that traffic for all subdomains of a cluster's domain be directed to the cluster node(s) hosting the platform's router component, which is capable of directing traffic within the cluster to the correct endpoints.","title":"Configure DNS"},{"location":"managing-workflow/configuring-dns/#with-a-load-balancer","text":"Generally, it is recommended that a [load balancer][] be used to direct inbound traffic to one or more routers. In such a case, configuring DNS is as simple as defining a wildcard record in DNS that points to the load balancer. For example, assuming a domain of example.com : An A record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining) A CNAME record referencing an existing fully-qualified domain name for the load balancer Per AWS' own documentation , this is the recommended strategy when using AWS Elastic Load Balancers, as ELB IPs may change over time. DNS for any applications using a \"custom domain\" (a fully-qualified domain name that is not a subdomain of the cluster's own domain) can be configured by creating a CNAME record that references the wildcard record described above. Although it is dependent upon your distribution of Kubernetes and your underlying infrastructure, in many cases, the IP(s) or existing fully-qualified domain name of a load balancer can be determined directly using the kubectl tool: $ kubectl --namespace=istio-nginx describe service | grep \"LoadBalancer\" LoadBalancer Ingress: a493e4e58ea0511e5bb390686bc85da3-1558404688.us-west-2.elb.amazonaws.com The LoadBalancer Ingress field typically describes an existing domain name or public IP(s). Note that if Kubernetes is able to automatically provision a load balancer for you, it does so asynchronously. If the command shown above is issued very soon after Workflow installation, the load balancer may not exist yet.","title":"With a Load Balancer"},{"location":"managing-workflow/configuring-dns/#without-a-load-balancer","text":"On some platforms (Minikube, for instance), a load balancer is not an easy or practical thing to provision. In these cases, one can directly identify the public IP of a Kubernetes node that is hosting a router pod and use that information to configure the local /etc/hosts file. Because wildcard entries do not work in a local /etc/hosts file, using this strategy may result in frequent editing of that file to add fully-qualified subdomains of a cluster for each application added to that cluster. Because of this a more viable option may be to utilize the xip.io service. In general, for any IP, a.b.c.d , the fully-qualified domain name any-subdomain.a.b.c.d.xip.io will resolve to the IP a.b.c.d . This can be enormously useful. To begin, find the node(s) hosting router instances using kubectl : $ kubectl --namespace=istio-ingress describe pod | grep Node: Node: ip-10-0-0-199.us-west-2.compute.internal/10.0.0.199 Node: ip-10-0-0-198.us-west-2.compute.internal/10.0.0.198 The command will display information for every router pod. For each, a node name and IP are displayed in the Node field. If the IPs appearing in these fields are public, any of these may be used to configure your local /etc/hosts file or may be used with xip.io . If the IPs shown are not public, further investigation may be needed. You can list the IP addresses of a node using kubectl : $ kubectl describe node ip-10-0-0-199.us-west-2.compute.internal # ... Addresses: 10.0.0.199,10.0.0.199,54.218.85.175 # ... Here, the Addresses field lists all the node's IPs. If any of them are public, again, they may be used to configure your local /etc/hosts file or may be used with xip.io .","title":"Without a Load Balancer"},{"location":"managing-workflow/configuring-dns/#tutorial-configuring-dns-with-google-cloud-dns","text":"In this section, we'll describe how to configure Google Cloud DNS for routing your domain name to your Drycc cluster. We'll assume the following in this section: Your Ingress service has a load balancer in front of it. The load balancer need not be cloud based, it just needs to provide a stable IP address or a stable domain name You have the mystuff.com domain name registered with a registrar Replace your domain name with mystuff.com in the instructions to follow Your registrar lets you alter the nameservers for your domain name (most registrars do) Here are the steps for configuring cloud DNS to route to your drycc cluster: Get the load balancer IP or domain name If you are on Google Container Engine, you can run kubectl get svc -n istio-ingress and look for the LoadBalancer Ingress column to get the IP address Create a new Cloud DNS Zone (on the console: Networking => Cloud DNS , then click on Create Zone ) Name your zone, and set the DNS name to mystuff.com. (note the . at the end Click on the Create button Click on the Add Record Set button on the resulting page If your load balancer provides a stable IP address, enter the following fields in the resulting form: DNS Name : * Resource Record Type : A TTL : the DNS TTL of your choosing. If you're testing or you anticipate that you'll tear down and rebuild many drycc clusters over time, we recommend a low TTL IPv4 Address : The IP that you got in the very first step Click the Create button If your load balancer provides the stable domain name lbdomain.com , enter the following fields in the resulting form: DNS Name : * Resource Record Type : CNAME TTL : the DNS TTL of your choosing. If you're testing or you anticipate that you'll tear down and rebuild many drycc clusters over time, we recommend a low TTL Canonical name : lbdomain.com. (note the . a the end) Click on the Create button In your domain registrar, set the nameservers for your mystuff.com domain to the ones under the data column in the NS record on the same page. They'll often be something like the below (note the trailing . characters). ns-cloud-b1.googledomains.com. ns-cloud-b2.googledomains.com. ns-cloud-b3.googledomains.com. ns-cloud-b4.googledomains.com. Note: If you ever have to re-create your drycc cluster, simply go back to step 6.4 or 7.4 (depending on your load balancer) and change the IP address or domain name to the new value. You may have to wait for the TTL you set to expire.","title":"Tutorial: Configuring DNS with Google Cloud DNS"},{"location":"managing-workflow/configuring-dns/#testing","text":"To test that traffic reaches its intended destination, a request can be sent to the Drycc controller like so (do not forget the trailing slash!): curl http://drycc.example.com/v2/ Or: curl http://drycc.54.218.85.175.xip.io/v2/ Since such requests require authentication, a response such as the following should be considered an indicator of success: {\"detail\":\"Authentication credentials were not provided.\"}","title":"Testing"},{"location":"managing-workflow/deploy-hooks/","text":"Deploy Hooks \u00b6 Deploy hooks allow an external service to receive a notification whenever a new version of your app is pushed to Workflow. It\u2019s useful to help keep the development team informed about deploys, while it can also be used to integrate different systems together. After one or more hooks are setup, hook output and errors appear in your application\u2019s logs: $ drycc logs ... 2011-03-15T15:07:29-07:00 drycc[api]: Deploy hook sent to http://drycc.rocks Deploy hooks are a generic HTTP hook. An administrator can create and configure multiple deploy hooks by tuning the controller settings via the Helm chart. HTTP POST Hook \u00b6 The HTTP deploy hook performs an HTTP POST to a URL. The parameters included in the request are the same as the variables available in the hook message: app , release , release_summary , sha and user . See below for their descriptions: app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv Optionally, if a deploy hook secret key is added to the controller through tuning the controller settings , a new Authorization header will be present in the POST request. The value of this header is computed as the HMAC hex digest of the request URL, using the secret as the key. In order to authenticate that this request came from Workflow, use the secret key, the full URL and the HMAC-SHA1 hashing algorithm to compute the signature. In Python, that would look something like this: import hashlib import hmac hmac.new(\"my_secret_key\", \"http://drycc.rocks?app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv\", digestmod=hashlib.sha1).hexdigest() If the value of the computed HMAC hex digest and the value in the Authorization header are identical, then the request came from Workflow. Important When computing the signature, ensure that the URL parameters are in alphabetic order. This is critical when computing the cryptographic signature as most web applications don't care about the order of the HTTP parameters, but the cryptographic signature will not be the same.","title":"Deploy Hooks"},{"location":"managing-workflow/deploy-hooks/#deploy-hooks","text":"Deploy hooks allow an external service to receive a notification whenever a new version of your app is pushed to Workflow. It\u2019s useful to help keep the development team informed about deploys, while it can also be used to integrate different systems together. After one or more hooks are setup, hook output and errors appear in your application\u2019s logs: $ drycc logs ... 2011-03-15T15:07:29-07:00 drycc[api]: Deploy hook sent to http://drycc.rocks Deploy hooks are a generic HTTP hook. An administrator can create and configure multiple deploy hooks by tuning the controller settings via the Helm chart.","title":"Deploy Hooks"},{"location":"managing-workflow/deploy-hooks/#http-post-hook","text":"The HTTP deploy hook performs an HTTP POST to a URL. The parameters included in the request are the same as the variables available in the hook message: app , release , release_summary , sha and user . See below for their descriptions: app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv Optionally, if a deploy hook secret key is added to the controller through tuning the controller settings , a new Authorization header will be present in the POST request. The value of this header is computed as the HMAC hex digest of the request URL, using the secret as the key. In order to authenticate that this request came from Workflow, use the secret key, the full URL and the HMAC-SHA1 hashing algorithm to compute the signature. In Python, that would look something like this: import hashlib import hmac hmac.new(\"my_secret_key\", \"http://drycc.rocks?app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv\", digestmod=hashlib.sha1).hexdigest() If the value of the computed HMAC hex digest and the value in the Authorization header are identical, then the request came from Workflow. Important When computing the signature, ensure that the URL parameters are in alphabetic order. This is critical when computing the cryptographic signature as most web applications don't care about the order of the HTTP parameters, but the cryptographic signature will not be the same.","title":"HTTP POST Hook"},{"location":"managing-workflow/platform-logging/","text":"Platform Logging \u00b6 The logging platform is made up of 2 components - Fluentbit and Logger . Fluentbit runs on every worker node of the cluster and is deployed as a Daemon Set . The Fluentbit pods capture all of the stderr and stdout streams of every container running on the host (even those not hosted directly by kubernetes). Once the log message arrives in our custom fluentbit plugin we determine where the message originated. If the message was from the Workflow Controller or from an application deployed via workflow we send it to the logs topic on the local Redis Stream instance. Logger then acts as a consumer reading messages off of the Redis Stream logs topic storing those messages in a local Redis instance. When a user wants to retrieve log entries using the drycc logs command we make an HTTP request from Controller to Logger which then fetches the appropriate data from Redis. Configuring Off Cluster Redis \u00b6 Even though we provide a redis instance with the default Workflow install, it is recommended that operators use a third-party source like Elasticache or similar offering. This way your data is durable across upgrades or outages. If you have a third-party Redis installation you would like to use all you need to do is set the following values in your helm chart: db = \"0\" host = \"my.host.redis\" port = \"6379\" password = \"\" These can be changed by running helm inspect values drycc/workflow > values.yaml before using helm install to complete the installation. To customize the redis credentials, edit values.yaml and modify the redis section of the file to tune these settings. Debugging Logger \u00b6 If the drycc logs command encounters an error it will return the following message: Error: There are currently no log messages. Please check the following things: 1) Logger and fluentbit pods are running. 2) The application is writing logs to the logger component by checking that an entry in the ring buffer was created: kubectl --namespace=drycc logs 3) Making sure that the container logs were mounted properly into the fluentbit pod: kubectl --namespace=drycc exec ls /var/log/containers Architecture Diagram \u00b6 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 Router \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 Logger \u2502\u25c0\u2500\u2500\u2500\u25b6\u2502Redis\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2518 Log file \u25b2 \u2502 \u2502 \u25bc \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 logs/metrics \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502App Logs\u2502\u2500\u2500Log File\u2500\u2500\u25b6\u2502Fluentbit\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500topics\u2500\u2500\u2500\u2500\u2500\u25b6\u2502 Redis Stream \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 Default Configuration \u00b6 Fluent Bit is based in a pluggable architecture where different plugins plays a major role in the data pipeline, more than 70 built-in plugins available. Please refer to charts values.yaml for specific configurations.","title":"Platform Logging"},{"location":"managing-workflow/platform-logging/#platform-logging","text":"The logging platform is made up of 2 components - Fluentbit and Logger . Fluentbit runs on every worker node of the cluster and is deployed as a Daemon Set . The Fluentbit pods capture all of the stderr and stdout streams of every container running on the host (even those not hosted directly by kubernetes). Once the log message arrives in our custom fluentbit plugin we determine where the message originated. If the message was from the Workflow Controller or from an application deployed via workflow we send it to the logs topic on the local Redis Stream instance. Logger then acts as a consumer reading messages off of the Redis Stream logs topic storing those messages in a local Redis instance. When a user wants to retrieve log entries using the drycc logs command we make an HTTP request from Controller to Logger which then fetches the appropriate data from Redis.","title":"Platform Logging"},{"location":"managing-workflow/platform-logging/#configuring-off-cluster-redis","text":"Even though we provide a redis instance with the default Workflow install, it is recommended that operators use a third-party source like Elasticache or similar offering. This way your data is durable across upgrades or outages. If you have a third-party Redis installation you would like to use all you need to do is set the following values in your helm chart: db = \"0\" host = \"my.host.redis\" port = \"6379\" password = \"\" These can be changed by running helm inspect values drycc/workflow > values.yaml before using helm install to complete the installation. To customize the redis credentials, edit values.yaml and modify the redis section of the file to tune these settings.","title":"Configuring Off Cluster Redis"},{"location":"managing-workflow/platform-logging/#debugging-logger","text":"If the drycc logs command encounters an error it will return the following message: Error: There are currently no log messages. Please check the following things: 1) Logger and fluentbit pods are running. 2) The application is writing logs to the logger component by checking that an entry in the ring buffer was created: kubectl --namespace=drycc logs 3) Making sure that the container logs were mounted properly into the fluentbit pod: kubectl --namespace=drycc exec ls /var/log/containers","title":"Debugging Logger"},{"location":"managing-workflow/platform-logging/#architecture-diagram","text":"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 Router \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 Logger \u2502\u25c0\u2500\u2500\u2500\u25b6\u2502Redis\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2518 Log file \u25b2 \u2502 \u2502 \u25bc \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 logs/metrics \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502App Logs\u2502\u2500\u2500Log File\u2500\u2500\u25b6\u2502Fluentbit\u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500topics\u2500\u2500\u2500\u2500\u2500\u25b6\u2502 Redis Stream \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518","title":"Architecture Diagram"},{"location":"managing-workflow/platform-logging/#default-configuration","text":"Fluent Bit is based in a pluggable architecture where different plugins plays a major role in the data pipeline, more than 70 built-in plugins available. Please refer to charts values.yaml for specific configurations.","title":"Default Configuration"},{"location":"managing-workflow/platform-monitoring/","text":"Platform Monitoring \u00b6 Description \u00b6 We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components: kube-state-metrics , kube-state-metrics (KSM) is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects. Node Exporter , Prometheus exporter for hardware and OS metrics exposed by *NIX kernels. Prometheus , a Cloud Native Computing Foundation project, is a systems and service monitoring system. Grafana , Graphing tool for time series data Architecture Diagram \u00b6 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 HOST \u2502 \u2502 node-exporter \u2502\u25c0\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502kube-state-metrics\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u25b2 \u2502 HOST \u2502 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502 node-exporter \u2502\u25c0\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2502 Prometheus \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u25b2 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502 \u2502 HOST \u2502 \u2502 \u25bc \u2502 node-exporter\u2502\u25c0\u2500\u2500\u2500\u2518 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 Grafana \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 Grafana \u00b6 Grafana allows users to create custom dashboards that visualize the data captured to the running Prometheus component. By default Grafana is exposed using a service annotation through the router at the following URL: http://grafana.mydomain.com . The default login is admin/admin . If you are interested in changing these values please see [Tuning Component Settings][]. Grafana will preload several dashboards to help operators get started with monitoring Kubernetes and Drycc Workflow. These dashboards are meant as starting points and don't include every item that might be desirable to monitor in a production installation. Drycc Workflow monitoring by default does not write data to the host filesystem or to long-term storage. If the Grafana instance fails, modified dashboards are lost. Production Configuration \u00b6 A production install of Grafana should have the following configuration values changed if possible: Change the default username and password from admin/admin . The value for the password is passed in plain text so it is best to set this value on the command line instead of checking it into version control. Enable persistence Use a supported external database such as mysql or postgres. You can find more information here On Cluster Persistence \u00b6 Enabling persistence will allow your custom configuration to persist across pod restarts. This means that the default sqllite database (which stores things like sessions and user data) will not disappear if you upgrade the Workflow installation. If you wish to have persistence for Grafana you can set enabled to true in the values.yaml file before running helm install . grafana: # Configure the following ONLY if you want persistence for on-cluster grafana # GCP PDs and EBS volumes are supported only persistence: enabled: true # Set to true to enable persistence size: 5Gi # PVC size Off Cluster Grafana \u00b6 If you wish to provide your own Grafana instance you can set grafanaLocation in the values.yaml file before running helm install . Prometheus \u00b6 Prometheus writes data to the host disk; however, if the prometheus pod dies and comes back on another host, the data will not be recovered. The prometheus graph UI is also exposed through the router allowing users to access the query engine by going to prometheus.mydomain.com . On Cluster Persistence \u00b6 You can set node-exporter and kube-state-metrics to true or false in the values.yaml . If you wish to have persistence for Prometheus you can set enabled to true in the values.yaml file before running helm install . prometheus: prometheus-server: persistence: enabled: true # Set to true to enable persistence size: 10Gi # PVC size node-exporter: enabled: true kube-state-metrics: enabled: true Off Cluster Prometheus \u00b6 To use off-cluster Prometheus, please provide the following values in the values.yaml file before running helm install . global.prometheusLocation=off-cluster url = \"http://my.prometheus.url:9090\"","title":"Platform Monitoring"},{"location":"managing-workflow/platform-monitoring/#platform-monitoring","text":"","title":"Platform Monitoring"},{"location":"managing-workflow/platform-monitoring/#description","text":"We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components: kube-state-metrics , kube-state-metrics (KSM) is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects. Node Exporter , Prometheus exporter for hardware and OS metrics exposed by *NIX kernels. Prometheus , a Cloud Native Computing Foundation project, is a systems and service monitoring system. Grafana , Graphing tool for time series data","title":"Description"},{"location":"managing-workflow/platform-monitoring/#architecture-diagram","text":"\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 HOST \u2502 \u2502 node-exporter \u2502\u25c0\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502kube-state-metrics\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u25b2 \u2502 HOST \u2502 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502 node-exporter \u2502\u25c0\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2502 Prometheus \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u25b2 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502 \u2502 HOST \u2502 \u2502 \u25bc \u2502 node-exporter\u2502\u25c0\u2500\u2500\u2500\u2518 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 Grafana \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518","title":"Architecture Diagram"},{"location":"managing-workflow/platform-monitoring/#grafana","text":"Grafana allows users to create custom dashboards that visualize the data captured to the running Prometheus component. By default Grafana is exposed using a service annotation through the router at the following URL: http://grafana.mydomain.com . The default login is admin/admin . If you are interested in changing these values please see [Tuning Component Settings][]. Grafana will preload several dashboards to help operators get started with monitoring Kubernetes and Drycc Workflow. These dashboards are meant as starting points and don't include every item that might be desirable to monitor in a production installation. Drycc Workflow monitoring by default does not write data to the host filesystem or to long-term storage. If the Grafana instance fails, modified dashboards are lost.","title":"Grafana"},{"location":"managing-workflow/platform-monitoring/#production-configuration","text":"A production install of Grafana should have the following configuration values changed if possible: Change the default username and password from admin/admin . The value for the password is passed in plain text so it is best to set this value on the command line instead of checking it into version control. Enable persistence Use a supported external database such as mysql or postgres. You can find more information here","title":"Production Configuration"},{"location":"managing-workflow/platform-monitoring/#on-cluster-persistence","text":"Enabling persistence will allow your custom configuration to persist across pod restarts. This means that the default sqllite database (which stores things like sessions and user data) will not disappear if you upgrade the Workflow installation. If you wish to have persistence for Grafana you can set enabled to true in the values.yaml file before running helm install . grafana: # Configure the following ONLY if you want persistence for on-cluster grafana # GCP PDs and EBS volumes are supported only persistence: enabled: true # Set to true to enable persistence size: 5Gi # PVC size","title":"On Cluster Persistence"},{"location":"managing-workflow/platform-monitoring/#off-cluster-grafana","text":"If you wish to provide your own Grafana instance you can set grafanaLocation in the values.yaml file before running helm install .","title":"Off Cluster Grafana"},{"location":"managing-workflow/platform-monitoring/#prometheus","text":"Prometheus writes data to the host disk; however, if the prometheus pod dies and comes back on another host, the data will not be recovered. The prometheus graph UI is also exposed through the router allowing users to access the query engine by going to prometheus.mydomain.com .","title":"Prometheus"},{"location":"managing-workflow/platform-monitoring/#on-cluster-persistence_1","text":"You can set node-exporter and kube-state-metrics to true or false in the values.yaml . If you wish to have persistence for Prometheus you can set enabled to true in the values.yaml file before running helm install . prometheus: prometheus-server: persistence: enabled: true # Set to true to enable persistence size: 10Gi # PVC size node-exporter: enabled: true kube-state-metrics: enabled: true","title":"On Cluster Persistence"},{"location":"managing-workflow/platform-monitoring/#off-cluster-prometheus","text":"To use off-cluster Prometheus, please provide the following values in the values.yaml file before running helm install . global.prometheusLocation=off-cluster url = \"http://my.prometheus.url:9090\"","title":"Off Cluster Prometheus"},{"location":"managing-workflow/production-deployments/","text":"Production Deployments \u00b6 When readying a Workflow deployment for production workloads, there are some additional recommendations. Running Workflow without drycc storage \u00b6 In production, persistent storage can be achieved by running an external object store. For users on AWS, GCE/GKE or Azure, the convenience of Amazon S3, Google GCS or Microsoft Azure Storage makes the prospect of running a Storage-less Workflow cluster quite reasonable. For users who have restriction on using external object storage using swift object storage can be an option. Running a Workflow cluster without Storage provides several advantages: Removal of state from the worker nodes Reduced resource usage Reduced complexity and operational burden of managing Workflow See Configuring Object Storage for details on removing this operational complexity. Review Security Considerations \u00b6 There are some additional security-related considerations when running Workflow in production. See [Security Considerations][] for details. Registration is Admin-Only \u00b6 By default, registration with the Workflow controller is in \"admin_only\" mode. The first user to run a drycc register command becomes the initial \"admin\" user, and registrations after that are disallowed unless requested by an admin. Please see the following documentation to learn about changing registration mode: Customizing Controller Disable Grafana Signups \u00b6 It is also recommended to disable signups for the Grafana dashboards. Please see the following documentation to learn about disabling Grafana signups: Customizing Monitor Running Workflow with RBAC \u00b6 If your cluster has RBAC amongst your authorization modes ( $ kubectl api-versions should contains rbac.authorization.k8s.io ) it may be necessary to enable RBAC in Workflow. This can be achieved by setting use_rbac in the global section of values.yaml to true , or by adding --set=global.use_rbac=true to the $ helm install/upgrade command. RBAC support was announced in Kubernetes-1.5 and is enabled by default if: - your Kubernetes cluster is in GKE - your Kubernetes cluster built with kubeadm Note : helm may need to be given specific permissions under RBAC if not already done. Attention : Azure ACS Kubernetes clusters are not RBAC-enabled for today due to lack in authentication strategy. Feel free to watch this PR for more details.","title":"Production Deployments"},{"location":"managing-workflow/production-deployments/#production-deployments","text":"When readying a Workflow deployment for production workloads, there are some additional recommendations.","title":"Production Deployments"},{"location":"managing-workflow/production-deployments/#running-workflow-without-drycc-storage","text":"In production, persistent storage can be achieved by running an external object store. For users on AWS, GCE/GKE or Azure, the convenience of Amazon S3, Google GCS or Microsoft Azure Storage makes the prospect of running a Storage-less Workflow cluster quite reasonable. For users who have restriction on using external object storage using swift object storage can be an option. Running a Workflow cluster without Storage provides several advantages: Removal of state from the worker nodes Reduced resource usage Reduced complexity and operational burden of managing Workflow See Configuring Object Storage for details on removing this operational complexity.","title":"Running Workflow without drycc storage"},{"location":"managing-workflow/production-deployments/#review-security-considerations","text":"There are some additional security-related considerations when running Workflow in production. See [Security Considerations][] for details.","title":"Review Security Considerations"},{"location":"managing-workflow/production-deployments/#registration-is-admin-only","text":"By default, registration with the Workflow controller is in \"admin_only\" mode. The first user to run a drycc register command becomes the initial \"admin\" user, and registrations after that are disallowed unless requested by an admin. Please see the following documentation to learn about changing registration mode: Customizing Controller","title":"Registration is Admin-Only"},{"location":"managing-workflow/production-deployments/#disable-grafana-signups","text":"It is also recommended to disable signups for the Grafana dashboards. Please see the following documentation to learn about disabling Grafana signups: Customizing Monitor","title":"Disable Grafana Signups"},{"location":"managing-workflow/production-deployments/#running-workflow-with-rbac","text":"If your cluster has RBAC amongst your authorization modes ( $ kubectl api-versions should contains rbac.authorization.k8s.io ) it may be necessary to enable RBAC in Workflow. This can be achieved by setting use_rbac in the global section of values.yaml to true , or by adding --set=global.use_rbac=true to the $ helm install/upgrade command. RBAC support was announced in Kubernetes-1.5 and is enabled by default if: - your Kubernetes cluster is in GKE - your Kubernetes cluster built with kubeadm Note : helm may need to be given specific permissions under RBAC if not already done. Attention : Azure ACS Kubernetes clusters are not RBAC-enabled for today due to lack in authentication strategy. Feel free to watch this PR for more details.","title":"Running Workflow with RBAC"},{"location":"managing-workflow/tuning-component-settings/","text":"Tuning Component Settings \u00b6 Helm Charts are a set of Kubernetes manifests that reflect best practices for deploying an application or service on Kubernetes. After you add the Drycc Chart Repository, you can customize the chart using helm inspect values drycc/workflow > values.yaml before using helm install to complete the installation. There are a few ways to customize the respective component: If the value is exposed in the values.yaml file as derived above, one may modify the section of the component to tune these settings. The modified value(s) will then take effect at chart installation or release upgrade time via either of the two respective commands: $ helm install drycc oci://registry.drycc.cc/charts/workflow \\ -n drycc \\ --namespace drycc \\ -f values.yaml $ helm upgrade drycc oci://registry.drycc.cc/charts/workflow \\ -n drycc \\ --namespace drycc \\ -f values.yaml If the value hasn't yet been exposed in the values.yaml file, one may edit the component deployment with the tuned setting. Here we edit the drycc-controller deployment: $ kubectl --namespace drycc edit deployment drycc-controller Add/edit the setting via the appropriate environment variable and value under the env section and save. The updated deployment will recreate the component pod with the new/modified setting. Lastly, one may also fetch and edit the chart as served by version control/the chart repository itself: $ helm fetch oci://registry.drycc.cc/charts/workflow --untar $ $EDITOR workflow/charts/controller/templates/controller-deployment.yaml Then run helm install ./workflow --namespace drycc --name drycc to apply the changes, or helm upgrade drycc ./workflow if the cluster is already running. Setting Resource limits \u00b6 You can set resource limits to Workflow components by modifying the values.yaml file fetched earlier. This file has a section for each Workflow component. To set a limit to any Workflow component just add limitsCpu , limitsMemory in the section and set them to the appropriate values. Below is an example of how the builder section of values.yaml might look with CPU and memory limits set: builder: imageOrg: \"drycc\" imagePullPolicy: \"Always\" imageTag: \"canary\" limitsCpu: \"100m\" limitsMemory: \"50Mi\" Customizing the Builder \u00b6 The following environment variables are tunable for the Builder component: Setting Description DEBUG Enable debug log output (default: false) BUILDER_POD_NODE_SELECTOR A node selector setting for builder job. As it may sometimes consume a lot of node resources, one may want a given builder job to run in a specific node only, so it won't affect critical nodes. for example pool:testing,disk:magnetic Customizing the Controller \u00b6 The following environment variables are tunable for the Controller component: Setting Description REGISTRATION_MODE set registration to \"enabled\", \"disabled\", or \"admin_only\" (default: \"admin_only\") GUNICORN_WORKERS number of gunicorn workers spawned to process requests (default: CPU cores * 4 + 1) RESERVED_NAMES a comma-separated list of names which applications cannot reserve for routing (default: \"drycc, drycc-builder\") DRYCC_DEPLOY_HOOK_URLS a comma-separated list of URLs to send deploy hooks to. DRYCC_DEPLOY_HOOK_SECRET_KEY a private key used to compute the HMAC signature for deploy hooks. DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSING rejects a deploy if the previous build had a Procfile but the current deploy is missing it. A 409 is thrown in the API. Prevents accidental process types removal. (default: \"false\", allowed values: \"true\", \"false\") DRYCC_DEPLOY_PROCFILE_MISSING_REMOVE when turned on (default) any missing process type in a Procfile compared to the previous deploy is removed. When set to false will allow an empty Procfile to go through without removing missing process types, note that new images, configs and so on will get updated on all proc types. (default: \"true\", allowed values: \"true\", \"false\") DRYCC_DEFAULT_CONFIG_TAGS set tags for all applications by default, for example: '{\"role\": \"worker\"}'. (default: '') KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPEC set resource quota to application namespace by setting ResourceQuota spec, for example: {\"spec\":{\"hard\":{\"pods\":\"10\"}}} , restrict app owner to spawn more then 10 pods (default: \"\", no quota will be applied to namespace) LDAP authentication settings \u00b6 Configuration options for LDAP authentication are detailed here . The following environment variables are available for enabling LDAP authentication of user accounts in the Passport component: Setting Description LDAP_ENDPOINT The URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: \"\", example: ldap://hostname ). LDAP_BIND_DN The distinguished name to use when binding to the LDAP server (default: \"\") LDAP_BIND_PASSWORD The password to use with LDAP_BIND_DN (default: \"\") LDAP_USER_BASEDN The distinguished name of the search base for user names (default: \"\") LDAP_USER_FILTER The name of the login field in the users search base (default: \"username\") LDAP_GROUP_BASEDN The distinguished name of the search base for user's groups names (default: \"\") LDAP_GROUP_FILTER The filter for user's groups (default: \"\", example: objectClass=person ) Global and per application settings \u00b6 Setting Description DRYCC_DEPLOY_BATCHES the number of pods to bring up and take down sequentially during a scale (default: number of available nodes) DRYCC_DEPLOY_TIMEOUT deploy timeout in seconds per deploy batch (default: 120) IMAGE_PULL_POLICY the kubernetes image pull policy for application images (default: \"IfNotPresent\") (allowed values: \"Always\", \"IfNotPresent\") KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT how many revisions Kubernetes keeps around of a given Deployment (default: all revisions) KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30) See the Deploying Apps guide for more detailed information on those. Customizing the Database \u00b6 The following environment variables are tunable for the Database component: Setting Description BACKUP_FREQUENCY how often the database should perform a base backup (default: \"12h\") BACKUPS_TO_RETAIN number of base backups the backing store should retain (default: 5) Customizing Fluentbit \u00b6 The following values can be changed in the values.yaml file or by using the --values flag with the Helm CLI. Key Description config.service The service section defines the global properties of the service. config.inputs An input section defines a source (related to an input plugin). config.filters A filter section defines a filter (related to a filter plugin) config.outputs The outputs section specify a destination that certain records should follow after a Tag match. For more information about the various variables that can be set please see the fluentbit . Customizing the Logger \u00b6 The following environment variables are tunable for the Logger component: Setting Description STORAGE_ADAPTER How to store logs that are sent to the logger. Legal values are \"file\", \"memory\", and \"redis\". (default: \"redis\") NUMBER_OF_LINES How many lines to store in the ring buffer (default: 1000) Customizing the Monitor \u00b6 Grafana \u00b6 We have exposed some of the more useful configuration values directly in the chart. This allows them to be set using either the values.yaml file or by using the --set flag with the Helm CLI. You can see these options below: Setting | Default Value | Description ----------------- | -------------- |------------ | user | \"admin\" | The first user created in the database (this user has admin privileges) password | \"admin\" | Password for the first user. allow_sign_up | \"true\" | Allows users to sign up for an account. For a list of other options you can set by using environment variables please see the configuration file in Github. Telegraf \u00b6 For a list of configuration values that can be set by using environment variables please see the following configuration file . Prometheus \u00b6 You can find a list of values that can be set using environment variables here . Customizing the Registry \u00b6 The Registry component can be tuned by following the drycc/distribution config doc . Customizing the Router \u00b6 The majority of router settings are tunable through annotations, which allows the router to be re-configured with zero downtime post-installation. You can find the list of annotations to tune here . The following environment variables are tunable for the [Router][] component: Setting Description POD_NAMESPACE The pod namespace the router resides in. This is set by the Kubernetes downward API . Customizing Workflow Manager \u00b6 The following environment variables are tunable for [Workflow Manager][]: Setting Description CHECK_VERSIONS Enables the external version check at https://versions.drycc.info/ (default: \"true\") POLL_INTERVAL_SEC The interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours) VERSIONS_API_URL The versions API URL (default: \" https://versions-staging.drycc.info \") DOCTOR_API_URL The doctor API URL (default: \" https://doctor-staging.drycc.info \") API_VERSION The version number Workflow Manager sends to the versions API (default: \"v2\")","title":"Tuning Component Settings"},{"location":"managing-workflow/tuning-component-settings/#tuning-component-settings","text":"Helm Charts are a set of Kubernetes manifests that reflect best practices for deploying an application or service on Kubernetes. After you add the Drycc Chart Repository, you can customize the chart using helm inspect values drycc/workflow > values.yaml before using helm install to complete the installation. There are a few ways to customize the respective component: If the value is exposed in the values.yaml file as derived above, one may modify the section of the component to tune these settings. The modified value(s) will then take effect at chart installation or release upgrade time via either of the two respective commands: $ helm install drycc oci://registry.drycc.cc/charts/workflow \\ -n drycc \\ --namespace drycc \\ -f values.yaml $ helm upgrade drycc oci://registry.drycc.cc/charts/workflow \\ -n drycc \\ --namespace drycc \\ -f values.yaml If the value hasn't yet been exposed in the values.yaml file, one may edit the component deployment with the tuned setting. Here we edit the drycc-controller deployment: $ kubectl --namespace drycc edit deployment drycc-controller Add/edit the setting via the appropriate environment variable and value under the env section and save. The updated deployment will recreate the component pod with the new/modified setting. Lastly, one may also fetch and edit the chart as served by version control/the chart repository itself: $ helm fetch oci://registry.drycc.cc/charts/workflow --untar $ $EDITOR workflow/charts/controller/templates/controller-deployment.yaml Then run helm install ./workflow --namespace drycc --name drycc to apply the changes, or helm upgrade drycc ./workflow if the cluster is already running.","title":"Tuning Component Settings"},{"location":"managing-workflow/tuning-component-settings/#setting-resource-limits","text":"You can set resource limits to Workflow components by modifying the values.yaml file fetched earlier. This file has a section for each Workflow component. To set a limit to any Workflow component just add limitsCpu , limitsMemory in the section and set them to the appropriate values. Below is an example of how the builder section of values.yaml might look with CPU and memory limits set: builder: imageOrg: \"drycc\" imagePullPolicy: \"Always\" imageTag: \"canary\" limitsCpu: \"100m\" limitsMemory: \"50Mi\"","title":"Setting Resource limits"},{"location":"managing-workflow/tuning-component-settings/#customizing-the-builder","text":"The following environment variables are tunable for the Builder component: Setting Description DEBUG Enable debug log output (default: false) BUILDER_POD_NODE_SELECTOR A node selector setting for builder job. As it may sometimes consume a lot of node resources, one may want a given builder job to run in a specific node only, so it won't affect critical nodes. for example pool:testing,disk:magnetic","title":"Customizing the Builder"},{"location":"managing-workflow/tuning-component-settings/#customizing-the-controller","text":"The following environment variables are tunable for the Controller component: Setting Description REGISTRATION_MODE set registration to \"enabled\", \"disabled\", or \"admin_only\" (default: \"admin_only\") GUNICORN_WORKERS number of gunicorn workers spawned to process requests (default: CPU cores * 4 + 1) RESERVED_NAMES a comma-separated list of names which applications cannot reserve for routing (default: \"drycc, drycc-builder\") DRYCC_DEPLOY_HOOK_URLS a comma-separated list of URLs to send deploy hooks to. DRYCC_DEPLOY_HOOK_SECRET_KEY a private key used to compute the HMAC signature for deploy hooks. DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSING rejects a deploy if the previous build had a Procfile but the current deploy is missing it. A 409 is thrown in the API. Prevents accidental process types removal. (default: \"false\", allowed values: \"true\", \"false\") DRYCC_DEPLOY_PROCFILE_MISSING_REMOVE when turned on (default) any missing process type in a Procfile compared to the previous deploy is removed. When set to false will allow an empty Procfile to go through without removing missing process types, note that new images, configs and so on will get updated on all proc types. (default: \"true\", allowed values: \"true\", \"false\") DRYCC_DEFAULT_CONFIG_TAGS set tags for all applications by default, for example: '{\"role\": \"worker\"}'. (default: '') KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPEC set resource quota to application namespace by setting ResourceQuota spec, for example: {\"spec\":{\"hard\":{\"pods\":\"10\"}}} , restrict app owner to spawn more then 10 pods (default: \"\", no quota will be applied to namespace)","title":"Customizing the Controller"},{"location":"managing-workflow/tuning-component-settings/#ldap-authentication-settings","text":"Configuration options for LDAP authentication are detailed here . The following environment variables are available for enabling LDAP authentication of user accounts in the Passport component: Setting Description LDAP_ENDPOINT The URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: \"\", example: ldap://hostname ). LDAP_BIND_DN The distinguished name to use when binding to the LDAP server (default: \"\") LDAP_BIND_PASSWORD The password to use with LDAP_BIND_DN (default: \"\") LDAP_USER_BASEDN The distinguished name of the search base for user names (default: \"\") LDAP_USER_FILTER The name of the login field in the users search base (default: \"username\") LDAP_GROUP_BASEDN The distinguished name of the search base for user's groups names (default: \"\") LDAP_GROUP_FILTER The filter for user's groups (default: \"\", example: objectClass=person )","title":"LDAP authentication settings"},{"location":"managing-workflow/tuning-component-settings/#global-and-per-application-settings","text":"Setting Description DRYCC_DEPLOY_BATCHES the number of pods to bring up and take down sequentially during a scale (default: number of available nodes) DRYCC_DEPLOY_TIMEOUT deploy timeout in seconds per deploy batch (default: 120) IMAGE_PULL_POLICY the kubernetes image pull policy for application images (default: \"IfNotPresent\") (allowed values: \"Always\", \"IfNotPresent\") KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT how many revisions Kubernetes keeps around of a given Deployment (default: all revisions) KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30) See the Deploying Apps guide for more detailed information on those.","title":"Global and per application settings"},{"location":"managing-workflow/tuning-component-settings/#customizing-the-database","text":"The following environment variables are tunable for the Database component: Setting Description BACKUP_FREQUENCY how often the database should perform a base backup (default: \"12h\") BACKUPS_TO_RETAIN number of base backups the backing store should retain (default: 5)","title":"Customizing the Database"},{"location":"managing-workflow/tuning-component-settings/#customizing-fluentbit","text":"The following values can be changed in the values.yaml file or by using the --values flag with the Helm CLI. Key Description config.service The service section defines the global properties of the service. config.inputs An input section defines a source (related to an input plugin). config.filters A filter section defines a filter (related to a filter plugin) config.outputs The outputs section specify a destination that certain records should follow after a Tag match. For more information about the various variables that can be set please see the fluentbit .","title":"Customizing Fluentbit"},{"location":"managing-workflow/tuning-component-settings/#customizing-the-logger","text":"The following environment variables are tunable for the Logger component: Setting Description STORAGE_ADAPTER How to store logs that are sent to the logger. Legal values are \"file\", \"memory\", and \"redis\". (default: \"redis\") NUMBER_OF_LINES How many lines to store in the ring buffer (default: 1000)","title":"Customizing the Logger"},{"location":"managing-workflow/tuning-component-settings/#customizing-the-monitor","text":"","title":"Customizing the Monitor"},{"location":"managing-workflow/tuning-component-settings/#grafana","text":"We have exposed some of the more useful configuration values directly in the chart. This allows them to be set using either the values.yaml file or by using the --set flag with the Helm CLI. You can see these options below: Setting | Default Value | Description ----------------- | -------------- |------------ | user | \"admin\" | The first user created in the database (this user has admin privileges) password | \"admin\" | Password for the first user. allow_sign_up | \"true\" | Allows users to sign up for an account. For a list of other options you can set by using environment variables please see the configuration file in Github.","title":"Grafana"},{"location":"managing-workflow/tuning-component-settings/#telegraf","text":"For a list of configuration values that can be set by using environment variables please see the following configuration file .","title":"Telegraf"},{"location":"managing-workflow/tuning-component-settings/#prometheus","text":"You can find a list of values that can be set using environment variables here .","title":"Prometheus"},{"location":"managing-workflow/tuning-component-settings/#customizing-the-registry","text":"The Registry component can be tuned by following the drycc/distribution config doc .","title":"Customizing the Registry"},{"location":"managing-workflow/tuning-component-settings/#customizing-the-router","text":"The majority of router settings are tunable through annotations, which allows the router to be re-configured with zero downtime post-installation. You can find the list of annotations to tune here . The following environment variables are tunable for the [Router][] component: Setting Description POD_NAMESPACE The pod namespace the router resides in. This is set by the Kubernetes downward API .","title":"Customizing the Router"},{"location":"managing-workflow/tuning-component-settings/#customizing-workflow-manager","text":"The following environment variables are tunable for [Workflow Manager][]: Setting Description CHECK_VERSIONS Enables the external version check at https://versions.drycc.info/ (default: \"true\") POLL_INTERVAL_SEC The interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours) VERSIONS_API_URL The versions API URL (default: \" https://versions-staging.drycc.info \") DOCTOR_API_URL The doctor API URL (default: \" https://doctor-staging.drycc.info \") API_VERSION The version number Workflow Manager sends to the versions API (default: \"v2\")","title":"Customizing Workflow Manager"},{"location":"managing-workflow/upgrading-workflow/","text":"Upgrading Workflow \u00b6 Drycc Workflow releases may be upgraded in-place with minimal downtime. This upgrade process requires: Helm version 2.1.0 or newer Configured Off-Cluster Storage Upgrade Process \u00b6 Note If upgrading from a Helm Classic install, you'll need to 'migrate' the cluster to a Kubernetes Helm installation. See Workflow-Migration for steps. Step 1: Apply the Workflow upgrade \u00b6 Helm will remove all components from the previous release. Traffic to applications deployed through Workflow will continue to flow during the upgrade. No service interruptions should occur. If Workflow is not configured to use off-cluster Postgres, the Workflow API will experience a brief period of downtime while the database recovers from backup. First, find the name of the release helm gave to your deployment with helm ls , then run $ helm upgrade oci://registry.drycc.cc/charts/workflow Note: If using off-cluster object storage on gcs and/or off-cluster registry using gcr and intending to upgrade from a pre- v2.10.0 chart to v2.10.0 or greater, the key_json values will now need to be pre-base64-encoded. Therefore, assuming the rest of the custom/off-cluster values are defined in the existing values.yaml used for previous installs, the following may be run: $ B64_KEY_JSON=\"$(cat ~/path/to/key.json | base64 -w 0)\" $ helm upgrade drycc/workflow -f values.yaml --set gcs.key_json=\"${B64_KEY_JSON}\",registry-token-refresher.gcr.key_json=\"${B64_KEY_JSON}\" Alternatively, simply replace the appropriate values in values.yaml and do without the --set parameter. Make sure to wrap it in single quotes as double quotes will give a parser error when upgrading. Step 2: Verify Upgrade \u00b6 Verify that all components have started and passed their readiness checks: $ kubectl --namespace=drycc get pods NAME READY STATUS RESTARTS AGE drycc-builder-2448122224-3cibz 1/1 Running 0 5m drycc-controller-1410285775-ipc34 1/1 Running 3 5m drycc-controller-celery-694f75749b-cmxxn 3/3 Running 0 5m drycc-database-e7c5z 1/1 Running 0 5m drycc-logger-cgjup 1/1 Running 3 5m drycc-logger-fluentbit-45h7j 1/1 Running 0 5m drycc-logger-fluentbit-4z7lw 1/1 Running 0 5m drycc-logger-fluentbit-k2wsw 1/1 Running 0 5m drycc-logger-fluentbit-skdw4 1/1 Running 0 5m drycc-redis-8nazu 1/1 Running 0 5m drycc-monitor-grafana-tm266 1/1 Running 0 5m drycc-monitor-telegraf-51zel 1/1 Running 1 5m drycc-monitor-telegraf-cdasg 1/1 Running 0 5m drycc-monitor-telegraf-hea6x 1/1 Running 0 5m drycc-monitor-telegraf-r7lsg 1/1 Running 0 5m drycc-registry-1814324048-yomz5 1/1 Running 0 5m drycc-registry-proxy-4m3o4 1/1 Running 0 5m drycc-registry-proxy-no3r1 1/1 Running 0 5m drycc-registry-proxy-ou8is 1/1 Running 0 5m drycc-registry-proxy-zyajl 1/1 Running 0 5m drycc-rabbitmq-0 1/1 Running 0 5m Step 3: Upgrade the Drycc Client \u00b6 Users of Drycc Workflow should now upgrade their drycc client to avoid getting WARNING: Client and server API versions do not match. Please consider upgrading. warnings. curl -sfL https://www.drycc.cc/install-cli.sh | bash - && sudo mv drycc $(which drycc)","title":"Upgrading Workflow"},{"location":"managing-workflow/upgrading-workflow/#upgrading-workflow","text":"Drycc Workflow releases may be upgraded in-place with minimal downtime. This upgrade process requires: Helm version 2.1.0 or newer Configured Off-Cluster Storage","title":"Upgrading Workflow"},{"location":"managing-workflow/upgrading-workflow/#upgrade-process","text":"Note If upgrading from a Helm Classic install, you'll need to 'migrate' the cluster to a Kubernetes Helm installation. See Workflow-Migration for steps.","title":"Upgrade Process"},{"location":"managing-workflow/upgrading-workflow/#step-1-apply-the-workflow-upgrade","text":"Helm will remove all components from the previous release. Traffic to applications deployed through Workflow will continue to flow during the upgrade. No service interruptions should occur. If Workflow is not configured to use off-cluster Postgres, the Workflow API will experience a brief period of downtime while the database recovers from backup. First, find the name of the release helm gave to your deployment with helm ls , then run $ helm upgrade oci://registry.drycc.cc/charts/workflow Note: If using off-cluster object storage on gcs and/or off-cluster registry using gcr and intending to upgrade from a pre- v2.10.0 chart to v2.10.0 or greater, the key_json values will now need to be pre-base64-encoded. Therefore, assuming the rest of the custom/off-cluster values are defined in the existing values.yaml used for previous installs, the following may be run: $ B64_KEY_JSON=\"$(cat ~/path/to/key.json | base64 -w 0)\" $ helm upgrade drycc/workflow -f values.yaml --set gcs.key_json=\"${B64_KEY_JSON}\",registry-token-refresher.gcr.key_json=\"${B64_KEY_JSON}\" Alternatively, simply replace the appropriate values in values.yaml and do without the --set parameter. Make sure to wrap it in single quotes as double quotes will give a parser error when upgrading.","title":"Step 1: Apply the Workflow upgrade"},{"location":"managing-workflow/upgrading-workflow/#step-2-verify-upgrade","text":"Verify that all components have started and passed their readiness checks: $ kubectl --namespace=drycc get pods NAME READY STATUS RESTARTS AGE drycc-builder-2448122224-3cibz 1/1 Running 0 5m drycc-controller-1410285775-ipc34 1/1 Running 3 5m drycc-controller-celery-694f75749b-cmxxn 3/3 Running 0 5m drycc-database-e7c5z 1/1 Running 0 5m drycc-logger-cgjup 1/1 Running 3 5m drycc-logger-fluentbit-45h7j 1/1 Running 0 5m drycc-logger-fluentbit-4z7lw 1/1 Running 0 5m drycc-logger-fluentbit-k2wsw 1/1 Running 0 5m drycc-logger-fluentbit-skdw4 1/1 Running 0 5m drycc-redis-8nazu 1/1 Running 0 5m drycc-monitor-grafana-tm266 1/1 Running 0 5m drycc-monitor-telegraf-51zel 1/1 Running 1 5m drycc-monitor-telegraf-cdasg 1/1 Running 0 5m drycc-monitor-telegraf-hea6x 1/1 Running 0 5m drycc-monitor-telegraf-r7lsg 1/1 Running 0 5m drycc-registry-1814324048-yomz5 1/1 Running 0 5m drycc-registry-proxy-4m3o4 1/1 Running 0 5m drycc-registry-proxy-no3r1 1/1 Running 0 5m drycc-registry-proxy-ou8is 1/1 Running 0 5m drycc-registry-proxy-zyajl 1/1 Running 0 5m drycc-rabbitmq-0 1/1 Running 0 5m","title":"Step 2: Verify Upgrade"},{"location":"managing-workflow/upgrading-workflow/#step-3-upgrade-the-drycc-client","text":"Users of Drycc Workflow should now upgrade their drycc client to avoid getting WARNING: Client and server API versions do not match. Please consider upgrading. warnings. curl -sfL https://www.drycc.cc/install-cli.sh | bash - && sudo mv drycc $(which drycc)","title":"Step 3: Upgrade the Drycc Client"},{"location":"quickstart/","text":"Quick Start \u00b6 Get started with Drycc Workflow in three easy steps. Install CLI tools for Helm and Drycc Workflow Boot a Kubernetes and install Drycc Workflow Deploy your first application This guide will help you set up a cluster suitable for evaluation, development and testing. When you are ready for staging and production, view our production checklist . Step 1: Install Workflow \u00b6 For the quickstart we will install Drycc Workflow . Step 2: Install CLI tools \u00b6 For the quickstart we will install Drycc Workflow CLI . Step 3: Deploy your first app \u00b6 Last but not least, login and deploy your first application .","title":"Overview"},{"location":"quickstart/#quick-start","text":"Get started with Drycc Workflow in three easy steps. Install CLI tools for Helm and Drycc Workflow Boot a Kubernetes and install Drycc Workflow Deploy your first application This guide will help you set up a cluster suitable for evaluation, development and testing. When you are ready for staging and production, view our production checklist .","title":"Quick Start"},{"location":"quickstart/#step-1-install-workflow","text":"For the quickstart we will install Drycc Workflow .","title":"Step 1: Install Workflow"},{"location":"quickstart/#step-2-install-cli-tools","text":"For the quickstart we will install Drycc Workflow CLI .","title":"Step 2: Install CLI tools"},{"location":"quickstart/#step-3-deploy-your-first-app","text":"Last but not least, login and deploy your first application .","title":"Step 3: Deploy your first app"},{"location":"quickstart/deploy-an-app/","text":"Determine Your Host and Hostname Values \u00b6 Drycc workflow requires a wildcard DNS record to dynamically map app names to the router. User should already have DNS set up pointing to their known host. The $hostname value can be calculated by prepending drycc. to the value set in global.platformDomain . Login to Workflow \u00b6 Workflow use the passport component to create and authorize users. If you already have an account, use drycc login to authenticate against the Drycc Workflow API. $ drycc login http://drycc.example.com Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71 Waiting for login... .o.Logged in as admin Configuration file written to /root/.drycc/client.json Deploy an Application \u00b6 Drycc Workflow supports three different types of applications, Buildpacks, Dockerfiles and Container Images. Our first application will be a simple Container Image-based application, so you don't have to wrestle with checking out code. Run drycc create to create a new application on Drycc Workflow. If you do not specify a name for your application, Workflow automatically generates a friendly (and sometimes funny) name. $ drycc create --no-remote Creating Application... done, created proper-barbecue If you want to add a git remote for this app later, use `drycc git:remote -a proper-barbecue` Our application has been created and named proper-barbecue . As with the drycc hostname, any HTTP traffic to proper-barbecue will be automatically routed to your application pods by the edge router. Let's use the CLI to tell the platform to deploy an application and then use curl to send a request to the app: $ drycc pull drycc/example-go -a proper-barbecue Creating build... done $ curl http://proper-barbecue.$hostname Powered by Drycc Note If you see a 404 error, make sure you specified your application name with -a ! Workflow's edge router knows all about application names and automatically sends traffic to the right application. The router sends traffic for proper-barbecue.104.197.125.75.nip.io to your app, just like drycc.104.197.125.75.nip.io was sent to the Workflow API service. Change Application Configuration \u00b6 Next, let's change some configuration using the CLI. Our example app is built to read configuration from the environment. By using drycc config:set we can change how the application behaves: $ drycc config:set POWERED_BY=\"Container Images + Kubernetes\" -a proper-barbecue Creating config... done === proper-barbecue Config POWERED_BY Container Images + Kubernetes Behind the scenes, Workflow creates a new release for your application and uses Kubernetes to provide a zero-downtime rolling deploy to the new release! Validate that our configuration change has worked: $ curl http://proper-barbecue.104.197.125.75.nip.io Powered by Container Images + Kubernetes Scale Your Application \u00b6 Last, let's scale our application by adding more application processes. Using the CLI you can easily add and remove additional processes to service requests: $ drycc scale cmd=2 -a proper-barbecue Scaling processes... but first, coffee! done in 36s === proper-barbecue Processes --- cmd (started): 2 proper-barbecue-v18-cmd-rk644 up (v18) proper-barbecue-v18-cmd-0ag04 up (v18) Congratulations! You have deployed, configured, and scaled your first application using Drycc Workflow. Going Further \u00b6 There is a lot more you can do with Drycc Workflow, play around with the CLI: Important In order to have permission to push an app you must add a SSH key to your user on the Drycc Workflow. For more information, please check Users and SSH Keys and Troubleshooting Workflow . Roll back to a previous release with drycc rollback -a proper-barbecue See application logs with drycc logs -a proper-barbecue Try one of our other example applications like: drycc/ruby-getting-started drycc/python-getting-started drycc/php-getting-started Read about using application Buildpacks or Dockerfiles Join our #community slack channel and meet the team!","title":"Deploy Your First App"},{"location":"quickstart/deploy-an-app/#determine-your-host-and-hostname-values","text":"Drycc workflow requires a wildcard DNS record to dynamically map app names to the router. User should already have DNS set up pointing to their known host. The $hostname value can be calculated by prepending drycc. to the value set in global.platformDomain .","title":"Determine Your Host and Hostname Values"},{"location":"quickstart/deploy-an-app/#login-to-workflow","text":"Workflow use the passport component to create and authorize users. If you already have an account, use drycc login to authenticate against the Drycc Workflow API. $ drycc login http://drycc.example.com Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71 Waiting for login... .o.Logged in as admin Configuration file written to /root/.drycc/client.json","title":"Login to Workflow"},{"location":"quickstart/deploy-an-app/#deploy-an-application","text":"Drycc Workflow supports three different types of applications, Buildpacks, Dockerfiles and Container Images. Our first application will be a simple Container Image-based application, so you don't have to wrestle with checking out code. Run drycc create to create a new application on Drycc Workflow. If you do not specify a name for your application, Workflow automatically generates a friendly (and sometimes funny) name. $ drycc create --no-remote Creating Application... done, created proper-barbecue If you want to add a git remote for this app later, use `drycc git:remote -a proper-barbecue` Our application has been created and named proper-barbecue . As with the drycc hostname, any HTTP traffic to proper-barbecue will be automatically routed to your application pods by the edge router. Let's use the CLI to tell the platform to deploy an application and then use curl to send a request to the app: $ drycc pull drycc/example-go -a proper-barbecue Creating build... done $ curl http://proper-barbecue.$hostname Powered by Drycc Note If you see a 404 error, make sure you specified your application name with -a ! Workflow's edge router knows all about application names and automatically sends traffic to the right application. The router sends traffic for proper-barbecue.104.197.125.75.nip.io to your app, just like drycc.104.197.125.75.nip.io was sent to the Workflow API service.","title":"Deploy an Application"},{"location":"quickstart/deploy-an-app/#change-application-configuration","text":"Next, let's change some configuration using the CLI. Our example app is built to read configuration from the environment. By using drycc config:set we can change how the application behaves: $ drycc config:set POWERED_BY=\"Container Images + Kubernetes\" -a proper-barbecue Creating config... done === proper-barbecue Config POWERED_BY Container Images + Kubernetes Behind the scenes, Workflow creates a new release for your application and uses Kubernetes to provide a zero-downtime rolling deploy to the new release! Validate that our configuration change has worked: $ curl http://proper-barbecue.104.197.125.75.nip.io Powered by Container Images + Kubernetes","title":"Change Application Configuration"},{"location":"quickstart/deploy-an-app/#scale-your-application","text":"Last, let's scale our application by adding more application processes. Using the CLI you can easily add and remove additional processes to service requests: $ drycc scale cmd=2 -a proper-barbecue Scaling processes... but first, coffee! done in 36s === proper-barbecue Processes --- cmd (started): 2 proper-barbecue-v18-cmd-rk644 up (v18) proper-barbecue-v18-cmd-0ag04 up (v18) Congratulations! You have deployed, configured, and scaled your first application using Drycc Workflow.","title":"Scale Your Application"},{"location":"quickstart/deploy-an-app/#going-further","text":"There is a lot more you can do with Drycc Workflow, play around with the CLI: Important In order to have permission to push an app you must add a SSH key to your user on the Drycc Workflow. For more information, please check Users and SSH Keys and Troubleshooting Workflow . Roll back to a previous release with drycc rollback -a proper-barbecue See application logs with drycc logs -a proper-barbecue Try one of our other example applications like: drycc/ruby-getting-started drycc/python-getting-started drycc/php-getting-started Read about using application Buildpacks or Dockerfiles Join our #community slack channel and meet the team!","title":"Going Further"},{"location":"quickstart/install-cli-tools/","text":"Drycc Workflow Client CLI \u00b6 The Drycc command-line interface (CLI), lets you interact with Drycc Workflow. Use the CLI to create and configure and manage applications. Install the drycc client for Linux or Mac OS X with: $ curl -sfL https://www.drycc.cc/install-cli.sh | bash - Important Users in Chinese mainland can use the following methods to speed up installation: $ curl -sfL https://www.drycc.cc/install-cli.sh | INSTALL_DRYCC_MIRROR=cn bash - Others please visit: https://github.com/drycc/workflow-cli/releases The installer places the drycc binary in your current directory, but you should move it somewhere in your $PATH: $ sudo ln -fs $PWD/drycc /usr/local/bin/drycc or : $ sudo mv $PWD/drycc /usr/local/bin/drycc Check your work by running drycc version : $ drycc version v1.1.0 Note Note that version numbers may vary as new releases become available","title":"Install CLI Tools"},{"location":"quickstart/install-cli-tools/#drycc-workflow-client-cli","text":"The Drycc command-line interface (CLI), lets you interact with Drycc Workflow. Use the CLI to create and configure and manage applications. Install the drycc client for Linux or Mac OS X with: $ curl -sfL https://www.drycc.cc/install-cli.sh | bash - Important Users in Chinese mainland can use the following methods to speed up installation: $ curl -sfL https://www.drycc.cc/install-cli.sh | INSTALL_DRYCC_MIRROR=cn bash - Others please visit: https://github.com/drycc/workflow-cli/releases The installer places the drycc binary in your current directory, but you should move it somewhere in your $PATH: $ sudo ln -fs $PWD/drycc /usr/local/bin/drycc or : $ sudo mv $PWD/drycc /usr/local/bin/drycc Check your work by running drycc version : $ drycc version v1.1.0 Note Note that version numbers may vary as new releases become available","title":"Drycc Workflow Client CLI"},{"location":"quickstart/install-workflow/","text":"Install Workflow \u00b6 If you have a pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop. Then this chapter is very suitable for you. Operating Systems \u00b6 Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements: (Red Hat/CentOS) Enterprise Linux, they usually use RPM package management. Ubuntu (Desktop/Server/Cloud) Linux, a very popular distribution. Debian GNU Linux, a very pure distribution of opensource software. If you want to add more Linux distribution support, please submit a issue on github or submit PR directly. System Software \u00b6 Some basic software needs to be installed before installing drycc workflow. OS configuration \u00b6 K8s requires a large number of ports. If you are not sure what they are, please close the local firewall or open these ports. At the same time, because k8s you need system time, you need to ensure that the system time is correct. Installing open-iscsi \u00b6 The command used to install open-iscsi differs depending on the Linux distribution. We recommend using Ubuntu as the guest OS image since it contains open-iscsi already. You may need to edit the cluster security group to allow SSH access. For SUSE and openSUSE, use this command: $ zypper install open-iscsi For Debian and Ubuntu, use this command: $ apt-get install open-iscsi For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command: $ yum install iscsi-initiator-utils Installing NFSv4 client \u00b6 The command used to install a NFSv4 client differs depending on the Linux distribution. For Debian and Ubuntu, use this command: $ apt-get install nfs-common For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command: $ yum install nfs-utils Installing curl \u00b6 For Debian and Ubuntu, use this command: $ apt-get install curl For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command: $ yum install curl Installing bc \u00b6 For Debian and Ubuntu, use this command: $ apt-get install bc For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command: $ yum install bc Hardware \u00b6 Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here. RAM: 1G Minimum (we recommend at least 2GB) CPU: 1 Minimum This configuration only contains the minimum requirements that can meet the operation. Disk \u00b6 Drycc performance depends on the performance of the database. To ensure optimal speed, we recommend using an SSD when possible. Disk performance will vary on ARM devices utilizing an SD card or eMMC. Domain Name \u00b6 Drycc needs a root domain name under your full control and points this domain name to the server to be installed. Suppose there is a wildcard domain pointing to the current server to install drycc, which is the name *.dryccdoman.com . We need to set the PLATFORM_DOMAIN environment variables before installation. $ export PLATFORM_DOMAIN=dryccdoman.co Of course, if it is a test environment, we can also use nip.io , an IP to domain name service. For example, your host IP is 59.46.3.190 , we will get the following domain name 59.46.3.190.nip.io $ export PLATFORM_DOMAIN=59.46.3.190.nip.io Install \u00b6 Before installation, please make sure whether your installation environment is a public network. If it is an intranet environment and there is no public IP, you need to disable the automatic certificate. $ export CERT_MANAGER_ENABLED=false Then you can use the installation script available at https://www.drycc.cc/install.sh to install drycc as a service on systemd and openrc based systems. $ curl -sfL https://www.drycc.cc/install.sh | bash - Important If you are in China, you need to use mirror acceleration: $ curl -sfL https://www.drycc.cc/install.sh | INSTALL_DRYCC_MIRROR=cn bash - Install Node \u00b6 Node can be a simple agent or a server; Server has the function of agent. Multiple servers have high availability, but the number of servers should not exceed 7 at most. There is no limit to the number of agents. First, check the cluster token of the master. $ cat /var/lib/rancher/k3s/server/node-token K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa We assume that the IP address of the cluster master is 192.168.6.240 , in that way. Then, Set the environment variable: $ export K3S_URL=https://192.168.6.240:6443 $ export K3S_TOKEN=\"K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa\" Important If you are in China, you need to use mirror acceleration: $ export INSTALL_DRYCC_MIRROR=cn Join the cluster as server: $ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server Join the cluster as agent: $ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent Install Options \u00b6 When using this method to install drycc, the following environment variables can be used to configure the installation: ENVIRONMENT VARIABLE DESCRIPTION PLATFORM_DOMAIN Required item, specify drycc's domain name DRYCC_ADMIN_USERNAME Required item, specify drycc's admin username DRYCC_ADMIN_PASSWORD Required item, specify drycc's admin password CERT_MANAGER_ENABLED Whether to use automatic certificate. It is true by default CHANNEL By default, stable channel will be installed. You can also specify testing CONTAINERD_FILE The config.yaml file path used by containerd KUBE_API_SERVER_ADDRESS Set with the IP address of the loadbalancer that was in front of kube-apiserver, The default is the IP address of the current node KUBE_API_SERVER_PORT Set with the PORT of the loadbalancer that was in front of kube-apiserver, which is 6443 by default METALLB_CONFIG_FILE The metallb config file path, layer 2 network is used by default INSTALL_DRYCC_MIRROR Specify the accelerated mirror location. Currently, only cn is supported BUILDER_REPLICAS Number of builder replicas to deploy CONTROLLER_API_REPLICAS Number of controller api replicas to deploy CONTROLLER_CELERY_REPLICAS Number of controller celery replicas to deploy CONTROLLER_WEBHOOK_REPLICAS Number of controller webhook replicas to deploy CONTROLLER_APP_RUNTIME_CLASS RuntimeClass is a feature for selecting the container runtime configuration. CONTROLLER_APP_STORAGE_CLASS StorageClass allocated by drycc volumes ; default storageClass is used by default REDIS_REPLICAS Number of redis replicas to deploy REDIS_PERSISTENCE_SIZE The size of the persistence space allocated to redis , which is 5Gi by default REDIS_PERSISTENCE_STORAGE_CLASS StorangeClass of redis ; default storangeclass is used by default STORAGE_CSI_STATEFULSET_REPLICAS Number of storage csi controller replicas to deploy STORAGE_MAINNODE_TIPD_REPLICAS Number of storage mainode tipd replicas to deploy STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZE The size of the persistence space allocated to mainnode tipd , which is 10Gi by default STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASS StorangeClass of mainnode tipd ; default storangeclass is used by default STORAGE_MAINNODE_WEED_REPLICAS Number of storage mainode weed replicas to deploy STORAGE_MAINNODE_WEED_PERSISTENCE_SIZE The size of the persistence space allocated to mainnode weed , which is 10Gi by default STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASS StorangeClass of mainnode weed ; default storangeclass is used by default STORAGE_METANODE_TIKV_REPLICAS Number of storage metanode tikv replicas to deploy STORAGE_METANODE_TIKV_PERSISTENCE_SIZE The size of the persistence space allocated to metanode tikv , which is 10Gi by default STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASS StorangeClass of mainnode tikv ; default storangeclass is used by default STORAGE_METANODE_WEED_REPLICAS Number of storage metanode weed replicas to deploy STORAGE_METANODE_WEED_PERSISTENCE_SIZE The size of the persistence space allocated to metanode weed , which is 10Gi by default STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASS StorangeClass of mainnode weed ; default storangeclass is used by default STORAGE_DATANODE_WEED_REPLICAS Number of storage datanode weed replicas to deploy STORAGE_DATANODE_WEED_PERSISTENCE_SIZE The size of the persistence space allocated to datanode weed , which is 20Gi by default STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASS StorangeClass of datanode weed ; default storangeclass is used by default MONITOR_GRAFANA_PERSISTENCE_SIZE The size of the persistence space allocated to monitor.grafana , which is 5Gi by default MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASS StorangeClass of monitor grafana; default storangeclass is used by default LOGGER_REPLICAS Number of logger replicas to deploy RABBITMQ_REPLICAS Number of rabbitmq replicas to deploy RABBITMQ_PERSISTENCE_SIZE The size of the persistence space allocated to rabbitmq , which is 5Gi by default RABBITMQ_PERSISTENCE_STORAGE_CLASS StorangeClass of rabbitmq ; default storangeclass is used by default DATABASE_REPLICAS Number of database replicas to deploy DATABASE_PERSISTENCE_SIZE The size of the persistence space allocated to database , which is 5Gi by default DATABASE_PERSISTENCE_STORAGE_CLASS StorangeClass of database ; default storangeclass is used by default TIMESERIES_REPLICAS Number of timeseries replicas to deploy TIMESERIES_PERSISTENCE_SIZE The size of the persistence space allocated to timeseries , which is 5Gi by default TIMESERIES_PERSISTENCE_STORAGE_CLASS StorangeClass of timeseries ; default storangeclass is used by default PASSPORT_REPLICAS Number of passport replicas to deploy REGISTRY_REPLICAS Number of registry replicas to deploy HELMBROKER_REPLICAS Number of helmbroker api replicas to deploy HELMBROKER_CELERY_REPLICAS Number of helmbroker celery replicas to deploy HELMBROKER_PERSISTENCE_SIZE The size of the persistence space allocated to helmbroker , which is 5Gi by default HELMBROKER_PERSISTENCE_STORAGE_CLASS StorangeClass of helmbroker ; default storangeclass is used by default PROMETHEUS_SERVER_RETENTION Prometheus data retention period (default if not specified is 15 days) PROMETHEUS_SERVER_PERSISTENCE_SIZE The size of the persistence space allocated to prometheus-server , which is 10Gi by default PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASS StorangeClass of prometheus-server ; default storangeclass is used by default K3S_DATA_DIR The config of k3s data dir; If not set, the default path is used ACME_SERVER ACME Server url, default use letsencrypt ACME_EAB_KEY_ID The key ID of which your external account binding is indexed by the external account ACME_EAB_KEY_SECRET The key Secret of which your external account symmetric MAC key Since the installation script will install k3s, other environment variables can refer to k3s installation environment variables . Uninstall \u00b6 If you installed drycc using an installation script, you can uninstall the entire drycc using this script. $ curl -sfL https://www.drycc.cc/uninstall.sh | bash -","title":"Install Workflow"},{"location":"quickstart/install-workflow/#install-workflow","text":"If you have a pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop. Then this chapter is very suitable for you.","title":"Install Workflow"},{"location":"quickstart/install-workflow/#operating-systems","text":"Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements: (Red Hat/CentOS) Enterprise Linux, they usually use RPM package management. Ubuntu (Desktop/Server/Cloud) Linux, a very popular distribution. Debian GNU Linux, a very pure distribution of opensource software. If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.","title":"Operating Systems"},{"location":"quickstart/install-workflow/#system-software","text":"Some basic software needs to be installed before installing drycc workflow.","title":"System Software"},{"location":"quickstart/install-workflow/#os-configuration","text":"K8s requires a large number of ports. If you are not sure what they are, please close the local firewall or open these ports. At the same time, because k8s you need system time, you need to ensure that the system time is correct.","title":"OS configuration"},{"location":"quickstart/install-workflow/#installing-open-iscsi","text":"The command used to install open-iscsi differs depending on the Linux distribution. We recommend using Ubuntu as the guest OS image since it contains open-iscsi already. You may need to edit the cluster security group to allow SSH access. For SUSE and openSUSE, use this command: $ zypper install open-iscsi For Debian and Ubuntu, use this command: $ apt-get install open-iscsi For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command: $ yum install iscsi-initiator-utils","title":"Installing open-iscsi"},{"location":"quickstart/install-workflow/#installing-nfsv4-client","text":"The command used to install a NFSv4 client differs depending on the Linux distribution. For Debian and Ubuntu, use this command: $ apt-get install nfs-common For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command: $ yum install nfs-utils","title":"Installing NFSv4 client"},{"location":"quickstart/install-workflow/#installing-curl","text":"For Debian and Ubuntu, use this command: $ apt-get install curl For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command: $ yum install curl","title":"Installing curl"},{"location":"quickstart/install-workflow/#installing-bc","text":"For Debian and Ubuntu, use this command: $ apt-get install bc For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command: $ yum install bc","title":"Installing bc"},{"location":"quickstart/install-workflow/#hardware","text":"Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here. RAM: 1G Minimum (we recommend at least 2GB) CPU: 1 Minimum This configuration only contains the minimum requirements that can meet the operation.","title":"Hardware"},{"location":"quickstart/install-workflow/#disk","text":"Drycc performance depends on the performance of the database. To ensure optimal speed, we recommend using an SSD when possible. Disk performance will vary on ARM devices utilizing an SD card or eMMC.","title":"Disk"},{"location":"quickstart/install-workflow/#domain-name","text":"Drycc needs a root domain name under your full control and points this domain name to the server to be installed. Suppose there is a wildcard domain pointing to the current server to install drycc, which is the name *.dryccdoman.com . We need to set the PLATFORM_DOMAIN environment variables before installation. $ export PLATFORM_DOMAIN=dryccdoman.co Of course, if it is a test environment, we can also use nip.io , an IP to domain name service. For example, your host IP is 59.46.3.190 , we will get the following domain name 59.46.3.190.nip.io $ export PLATFORM_DOMAIN=59.46.3.190.nip.io","title":"Domain Name"},{"location":"quickstart/install-workflow/#install","text":"Before installation, please make sure whether your installation environment is a public network. If it is an intranet environment and there is no public IP, you need to disable the automatic certificate. $ export CERT_MANAGER_ENABLED=false Then you can use the installation script available at https://www.drycc.cc/install.sh to install drycc as a service on systemd and openrc based systems. $ curl -sfL https://www.drycc.cc/install.sh | bash - Important If you are in China, you need to use mirror acceleration: $ curl -sfL https://www.drycc.cc/install.sh | INSTALL_DRYCC_MIRROR=cn bash -","title":"Install"},{"location":"quickstart/install-workflow/#install-node","text":"Node can be a simple agent or a server; Server has the function of agent. Multiple servers have high availability, but the number of servers should not exceed 7 at most. There is no limit to the number of agents. First, check the cluster token of the master. $ cat /var/lib/rancher/k3s/server/node-token K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa We assume that the IP address of the cluster master is 192.168.6.240 , in that way. Then, Set the environment variable: $ export K3S_URL=https://192.168.6.240:6443 $ export K3S_TOKEN=\"K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa\" Important If you are in China, you need to use mirror acceleration: $ export INSTALL_DRYCC_MIRROR=cn Join the cluster as server: $ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server Join the cluster as agent: $ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent","title":"Install Node"},{"location":"quickstart/install-workflow/#install-options","text":"When using this method to install drycc, the following environment variables can be used to configure the installation: ENVIRONMENT VARIABLE DESCRIPTION PLATFORM_DOMAIN Required item, specify drycc's domain name DRYCC_ADMIN_USERNAME Required item, specify drycc's admin username DRYCC_ADMIN_PASSWORD Required item, specify drycc's admin password CERT_MANAGER_ENABLED Whether to use automatic certificate. It is true by default CHANNEL By default, stable channel will be installed. You can also specify testing CONTAINERD_FILE The config.yaml file path used by containerd KUBE_API_SERVER_ADDRESS Set with the IP address of the loadbalancer that was in front of kube-apiserver, The default is the IP address of the current node KUBE_API_SERVER_PORT Set with the PORT of the loadbalancer that was in front of kube-apiserver, which is 6443 by default METALLB_CONFIG_FILE The metallb config file path, layer 2 network is used by default INSTALL_DRYCC_MIRROR Specify the accelerated mirror location. Currently, only cn is supported BUILDER_REPLICAS Number of builder replicas to deploy CONTROLLER_API_REPLICAS Number of controller api replicas to deploy CONTROLLER_CELERY_REPLICAS Number of controller celery replicas to deploy CONTROLLER_WEBHOOK_REPLICAS Number of controller webhook replicas to deploy CONTROLLER_APP_RUNTIME_CLASS RuntimeClass is a feature for selecting the container runtime configuration. CONTROLLER_APP_STORAGE_CLASS StorageClass allocated by drycc volumes ; default storageClass is used by default REDIS_REPLICAS Number of redis replicas to deploy REDIS_PERSISTENCE_SIZE The size of the persistence space allocated to redis , which is 5Gi by default REDIS_PERSISTENCE_STORAGE_CLASS StorangeClass of redis ; default storangeclass is used by default STORAGE_CSI_STATEFULSET_REPLICAS Number of storage csi controller replicas to deploy STORAGE_MAINNODE_TIPD_REPLICAS Number of storage mainode tipd replicas to deploy STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZE The size of the persistence space allocated to mainnode tipd , which is 10Gi by default STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASS StorangeClass of mainnode tipd ; default storangeclass is used by default STORAGE_MAINNODE_WEED_REPLICAS Number of storage mainode weed replicas to deploy STORAGE_MAINNODE_WEED_PERSISTENCE_SIZE The size of the persistence space allocated to mainnode weed , which is 10Gi by default STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASS StorangeClass of mainnode weed ; default storangeclass is used by default STORAGE_METANODE_TIKV_REPLICAS Number of storage metanode tikv replicas to deploy STORAGE_METANODE_TIKV_PERSISTENCE_SIZE The size of the persistence space allocated to metanode tikv , which is 10Gi by default STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASS StorangeClass of mainnode tikv ; default storangeclass is used by default STORAGE_METANODE_WEED_REPLICAS Number of storage metanode weed replicas to deploy STORAGE_METANODE_WEED_PERSISTENCE_SIZE The size of the persistence space allocated to metanode weed , which is 10Gi by default STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASS StorangeClass of mainnode weed ; default storangeclass is used by default STORAGE_DATANODE_WEED_REPLICAS Number of storage datanode weed replicas to deploy STORAGE_DATANODE_WEED_PERSISTENCE_SIZE The size of the persistence space allocated to datanode weed , which is 20Gi by default STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASS StorangeClass of datanode weed ; default storangeclass is used by default MONITOR_GRAFANA_PERSISTENCE_SIZE The size of the persistence space allocated to monitor.grafana , which is 5Gi by default MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASS StorangeClass of monitor grafana; default storangeclass is used by default LOGGER_REPLICAS Number of logger replicas to deploy RABBITMQ_REPLICAS Number of rabbitmq replicas to deploy RABBITMQ_PERSISTENCE_SIZE The size of the persistence space allocated to rabbitmq , which is 5Gi by default RABBITMQ_PERSISTENCE_STORAGE_CLASS StorangeClass of rabbitmq ; default storangeclass is used by default DATABASE_REPLICAS Number of database replicas to deploy DATABASE_PERSISTENCE_SIZE The size of the persistence space allocated to database , which is 5Gi by default DATABASE_PERSISTENCE_STORAGE_CLASS StorangeClass of database ; default storangeclass is used by default TIMESERIES_REPLICAS Number of timeseries replicas to deploy TIMESERIES_PERSISTENCE_SIZE The size of the persistence space allocated to timeseries , which is 5Gi by default TIMESERIES_PERSISTENCE_STORAGE_CLASS StorangeClass of timeseries ; default storangeclass is used by default PASSPORT_REPLICAS Number of passport replicas to deploy REGISTRY_REPLICAS Number of registry replicas to deploy HELMBROKER_REPLICAS Number of helmbroker api replicas to deploy HELMBROKER_CELERY_REPLICAS Number of helmbroker celery replicas to deploy HELMBROKER_PERSISTENCE_SIZE The size of the persistence space allocated to helmbroker , which is 5Gi by default HELMBROKER_PERSISTENCE_STORAGE_CLASS StorangeClass of helmbroker ; default storangeclass is used by default PROMETHEUS_SERVER_RETENTION Prometheus data retention period (default if not specified is 15 days) PROMETHEUS_SERVER_PERSISTENCE_SIZE The size of the persistence space allocated to prometheus-server , which is 10Gi by default PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASS StorangeClass of prometheus-server ; default storangeclass is used by default K3S_DATA_DIR The config of k3s data dir; If not set, the default path is used ACME_SERVER ACME Server url, default use letsencrypt ACME_EAB_KEY_ID The key ID of which your external account binding is indexed by the external account ACME_EAB_KEY_SECRET The key Secret of which your external account symmetric MAC key Since the installation script will install k3s, other environment variables can refer to k3s installation environment variables .","title":"Install Options"},{"location":"quickstart/install-workflow/#uninstall","text":"If you installed drycc using an installation script, you can uninstall the entire drycc using this script. $ curl -sfL https://www.drycc.cc/uninstall.sh | bash -","title":"Uninstall"},{"location":"reference-guide/creating-a-self-signed-ssl-certificate/","text":"Creating a Self-Signed SSL Certificate \u00b6 When using the app ssl feature for non-production applications or when installing SSL for the platform , you can avoid the costs associated with the SSL certificate by using a self-signed SSL certificate. Though the certificate implements full encryption, visitors to your site will see a browser warning indicating that the certificate should not be trusted. Prerequisites \u00b6 The openssl library is required to generate your own certificate. Run the following command in your local environment to see if you already have openssl installed. $ which openssl /usr/bin/openssl If the which command does not return a path then you will need to install openssl yourself: If you have... Install with... Mac OS X Homebrew: brew install openssl Windows complete package .exe installed Ubuntu Linux apt-get install openssl Generate Private Key and Certificate Signing Request \u00b6 A private key and certificate signing request are required to create an SSL certificate. These can be generated with a few simple commands. When the openssl req command asks for a \u201cchallenge password\u201d, just press return, leaving the password empty. $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 ... $ openssl rsa -passin pass:x -in server.pass.key -out server.key writing RSA key $ rm server.pass.key $ openssl req -new -key server.key -out server.csr ... Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:California ... A challenge password []: ... Generate SSL Certificate \u00b6 The self-signed SSL certificate is generated from the server.key private key and server.csr files. $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt The server.crt file is your site certificate suitable for use with Drycc's SSL endpoint along with the server.key private key.","title":"Creating a Self-Signed SSL Certificate"},{"location":"reference-guide/creating-a-self-signed-ssl-certificate/#creating-a-self-signed-ssl-certificate","text":"When using the app ssl feature for non-production applications or when installing SSL for the platform , you can avoid the costs associated with the SSL certificate by using a self-signed SSL certificate. Though the certificate implements full encryption, visitors to your site will see a browser warning indicating that the certificate should not be trusted.","title":"Creating a Self-Signed SSL Certificate"},{"location":"reference-guide/creating-a-self-signed-ssl-certificate/#prerequisites","text":"The openssl library is required to generate your own certificate. Run the following command in your local environment to see if you already have openssl installed. $ which openssl /usr/bin/openssl If the which command does not return a path then you will need to install openssl yourself: If you have... Install with... Mac OS X Homebrew: brew install openssl Windows complete package .exe installed Ubuntu Linux apt-get install openssl","title":"Prerequisites"},{"location":"reference-guide/creating-a-self-signed-ssl-certificate/#generate-private-key-and-certificate-signing-request","text":"A private key and certificate signing request are required to create an SSL certificate. These can be generated with a few simple commands. When the openssl req command asks for a \u201cchallenge password\u201d, just press return, leaving the password empty. $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 ... $ openssl rsa -passin pass:x -in server.pass.key -out server.key writing RSA key $ rm server.pass.key $ openssl req -new -key server.key -out server.csr ... Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:California ... A challenge password []: ...","title":"Generate Private Key and Certificate Signing Request"},{"location":"reference-guide/creating-a-self-signed-ssl-certificate/#generate-ssl-certificate","text":"The self-signed SSL certificate is generated from the server.key private key and server.csr files. $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt The server.crt file is your site certificate suitable for use with Drycc's SSL endpoint along with the server.key private key.","title":"Generate SSL Certificate"},{"location":"reference-guide/terms/","text":"Terms \u00b6 Application \u00b6 An application services requests and background jobs for a deployed git repository. Each application includes a set of Containers used to run isolated processes, and a Release that defines the current Build and Config deployed by containers. Build \u00b6 Drycc builds are created automatically on the controller when a developer uses git push drycc master . When a new build is created, a new Release is created automatically. Config \u00b6 Config refers to a set of environment variables used by Containers in as Application. When Config is changed, a new Release is created automatically. Container \u00b6 Drycc containers are instances of containers used to run Applications. Containers perform the actual work of an Application by servicing requests or by running background tasks as part of the cluster. Ephemeral Filesystem \u00b6 Each container gets its own ephemeral filesystem, with a fresh copy of the most recently deployed code. During the container\u2019s lifetime, its running processes can use the filesystem as a temporary scratchpad, but no files that are written are visible to processes in any other container. Any files written to the ephemeral filesystem will be discarded the moment the container is either stopped or restarted. Container States \u00b6 There are several states that a container can be in at any time. The states are: initialized - the state of the container before it is created created - the container is built and ready for operation up - the container is running down - the container crashed or is stopped destroyed - the container has been destroyed Controller \u00b6 The controller is the \"brain\" of the Drycc platform. A controller manages Applications and their lifecycle. The controller is in charge of: Processing client API calls Managing containers that perform work for applications Managing proxies that route traffic to containers Managing users, keys and other base configuration The Controller stack includes: Django API Server for handling API calls Key \u00b6 Drycc keys are SSH Keys used during the git push process. Each user can use the client to manage a list of keys on the Controller. Release \u00b6 A Drycc release is a combination of a Build with a Config. Each Application is associated with one release at a time. Drycc releases are numbered and new releases always increment by one (e.g. v1, v2, v3). Containers that host an application use these release versions to pull the correct code and configuration. Scheduler \u00b6 The Scheduler is responsible for creating, starting, stopping, and destroying Containers. For example, a command such as drycc scale cmd=10 tells the Scheduler to run ten Containers from the Container image for your Application. The Scheduler must decide which machines are eligible to run these container jobs. Scheduler backends vary in the details of their job allocation policies and whether or not they are resource-aware, among other features. The Drycc scheduler client is implemented in the Controller component. Service \u00b6 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. In Workflow, a Service is used to load-balance an application's Containers internally through a virtual IP address.","title":"Terms"},{"location":"reference-guide/terms/#terms","text":"","title":"Terms"},{"location":"reference-guide/terms/#application","text":"An application services requests and background jobs for a deployed git repository. Each application includes a set of Containers used to run isolated processes, and a Release that defines the current Build and Config deployed by containers.","title":"Application"},{"location":"reference-guide/terms/#build","text":"Drycc builds are created automatically on the controller when a developer uses git push drycc master . When a new build is created, a new Release is created automatically.","title":"Build"},{"location":"reference-guide/terms/#config","text":"Config refers to a set of environment variables used by Containers in as Application. When Config is changed, a new Release is created automatically.","title":"Config"},{"location":"reference-guide/terms/#container","text":"Drycc containers are instances of containers used to run Applications. Containers perform the actual work of an Application by servicing requests or by running background tasks as part of the cluster.","title":"Container"},{"location":"reference-guide/terms/#ephemeral-filesystem","text":"Each container gets its own ephemeral filesystem, with a fresh copy of the most recently deployed code. During the container\u2019s lifetime, its running processes can use the filesystem as a temporary scratchpad, but no files that are written are visible to processes in any other container. Any files written to the ephemeral filesystem will be discarded the moment the container is either stopped or restarted.","title":"Ephemeral Filesystem"},{"location":"reference-guide/terms/#container-states","text":"There are several states that a container can be in at any time. The states are: initialized - the state of the container before it is created created - the container is built and ready for operation up - the container is running down - the container crashed or is stopped destroyed - the container has been destroyed","title":"Container States"},{"location":"reference-guide/terms/#controller","text":"The controller is the \"brain\" of the Drycc platform. A controller manages Applications and their lifecycle. The controller is in charge of: Processing client API calls Managing containers that perform work for applications Managing proxies that route traffic to containers Managing users, keys and other base configuration The Controller stack includes: Django API Server for handling API calls","title":"Controller"},{"location":"reference-guide/terms/#key","text":"Drycc keys are SSH Keys used during the git push process. Each user can use the client to manage a list of keys on the Controller.","title":"Key"},{"location":"reference-guide/terms/#release","text":"A Drycc release is a combination of a Build with a Config. Each Application is associated with one release at a time. Drycc releases are numbered and new releases always increment by one (e.g. v1, v2, v3). Containers that host an application use these release versions to pull the correct code and configuration.","title":"Release"},{"location":"reference-guide/terms/#scheduler","text":"The Scheduler is responsible for creating, starting, stopping, and destroying Containers. For example, a command such as drycc scale cmd=10 tells the Scheduler to run ten Containers from the Container image for your Application. The Scheduler must decide which machines are eligible to run these container jobs. Scheduler backends vary in the details of their job allocation policies and whether or not they are resource-aware, among other features. The Drycc scheduler client is implemented in the Controller component.","title":"Scheduler"},{"location":"reference-guide/terms/#service","text":"A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. In Workflow, a Service is used to load-balance an application's Containers internally through a virtual IP address.","title":"Service"},{"location":"reference-guide/controller-api/v2.0/","text":"Controller API v2.0 \u00b6 This is the v2.0 REST API for the Controller. What's New \u00b6 New! format of POST /v2/apps//run has changed. Authentication \u00b6 Register a New User \u00b6 Example Request: POST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters: { \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } Log in \u00b6 Example Request: POST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"} Cancel Account \u00b6 Example Request: DELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Regenerate Token \u00b6 note This command could require administrative privileges Example Request: POST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters: { \"username\" : \"test\" \"all\" : \"true\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"} Change Password \u00b6 Example Request: POST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters: {\"username\": \"testuser\"} note Using the username parameter requires administrative privileges and makes the password parameter optional. Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Applications \u00b6 List all Applications \u00b6 Example Request: GET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Create an Application \u00b6 Example Request: POST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters: {\"id\": \"example-go\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Destroy an Application \u00b6 Example Request: DELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 List Application Details \u00b6 Example Request: GET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Update Application Details \u00b6 Example Request: POST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters: { \"owner\": \"test\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json Retrieve Application Logs \u00b6 Example Request: GET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters: ?log_lines= Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: text/plain \"16:51:14 drycc[api]: test created initial release\\n\" Run one-off Commands \u00b6 POST /v2/apps/example-go/run/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"command\": \"echo hi\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"exit_code\": 0, \"output\": \"hi\\n\"} Certificates \u00b6 List all Certificates \u00b6 Example Request: GET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } ] } Get Certificate Details \u00b6 Example Request: GET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } Create Certificate \u00b6 Example Request: POST /v2/certs/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"name\": \"foo\" \"certificate\": \"-----BEGIN CERTIFICATE-----\", \"key\": \"-----BEGIN RSA PRIVATE KEY-----\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } Destroy a Certificate \u00b6 Example Request: DELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Attach a Domain to a Certificate \u00b6 Example Request: POST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Remove a Domain from a Certificate \u00b6 Example Request: DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Pods \u00b6 List all Pods \u00b6 Example Request: GET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] } List all Pods by Type \u00b6 Example Request: GET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] } Restart All Pods \u00b6 Example Request: POST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Restart Pods by Type \u00b6 Example Request: POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Restart Pods by Type and Name \u00b6 Example Request: POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Scale Pods \u00b6 Example Request: POST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Configuration \u00b6 List Application Configuration \u00b6 Example Request: GET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Create new Config \u00b6 Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": \"world\", \"PLATFORM\": \"drycc\"}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json X-Drycc-Release: 3 { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v3\", \"HELLO\": \"world\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Unset Config Variable \u00b6 Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json X-Drycc-Release: 4 { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v4\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Domains \u00b6 List Application Domains \u00b6 Example Request: GET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } ] } Add Domain \u00b6 Example Request: POST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } Remove Domain \u00b6 Example Request: DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Builds \u00b6 List Application Builds \u00b6 Example Request: GET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\\\"/runner/init\\\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db\", \"image\": \"example-go\", \"owner\": \"test\", \"procfile\": { \"web\": \"example-go\" }, \"sha\": \"060da68f\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Create Application Build \u00b6 Example Request: POST /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"image\": \"drycc/example-go:latest\"} Optional Parameters: { \"procfile\": { \"web\": \"./cmd\" } } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json X-Drycc-Release: 4 { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"\", \"image\": \"drycc/example-go:latest\", \"owner\": \"test\", \"procfile\": {}, \"sha\": \"\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Releases \u00b6 List Application Releases \u00b6 Example Request: GET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 3, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"ed637ceb-5d32-44bd-9406-d326a777a513\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test changed nothing\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 3 }, { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test deployed 060da68\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 2 }, { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } ] } List Release Details \u00b6 Example Request: GET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } Rollback Release \u00b6 Example Request: POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"version\": 5} Keys \u00b6 List Keys \u00b6 Example Request: GET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"test@example.com\", \"owner\": \"test\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Add Key to User \u00b6 Example Request: POST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa <...>\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example\", \"owner\": \"example\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Remove Key from User \u00b6 Example Request: DELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Permissions \u00b6 List Application Permissions \u00b6 note This does not include the app owner. Example Request: GET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] } Create Application Permission \u00b6 Example Request: POST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Remove Application Permission \u00b6 Example Request: DELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 List Administrators \u00b6 Example Request: GET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 2, \"next\": null \"previous\": null, \"results\": [ { \"username\": \"test\", \"is_superuser\": true }, { \"username\": \"foo\", \"is_superuser\": true } ] } Grant User Administrative Privileges \u00b6 note This command requires administrative privileges Example Request: POST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Remove User's Administrative Privileges \u00b6 note This command requires administrative privileges Example Request: DELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Users \u00b6 List all users \u00b6 note This command requires administrative privileges Example Request: GET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } ] }","title":"Controller API v2.0"},{"location":"reference-guide/controller-api/v2.0/#controller-api-v20","text":"This is the v2.0 REST API for the Controller.","title":"Controller API v2.0"},{"location":"reference-guide/controller-api/v2.0/#whats-new","text":"New! format of POST /v2/apps//run has changed.","title":"What's New"},{"location":"reference-guide/controller-api/v2.0/#authentication","text":"","title":"Authentication"},{"location":"reference-guide/controller-api/v2.0/#register-a-new-user","text":"Example Request: POST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters: { \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] }","title":"Register a New User"},{"location":"reference-guide/controller-api/v2.0/#log-in","text":"Example Request: POST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"}","title":"Log in"},{"location":"reference-guide/controller-api/v2.0/#cancel-account","text":"Example Request: DELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Cancel Account"},{"location":"reference-guide/controller-api/v2.0/#regenerate-token","text":"note This command could require administrative privileges Example Request: POST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters: { \"username\" : \"test\" \"all\" : \"true\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"}","title":"Regenerate Token"},{"location":"reference-guide/controller-api/v2.0/#change-password","text":"Example Request: POST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters: {\"username\": \"testuser\"} note Using the username parameter requires administrative privileges and makes the password parameter optional. Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Change Password"},{"location":"reference-guide/controller-api/v2.0/#applications","text":"","title":"Applications"},{"location":"reference-guide/controller-api/v2.0/#list-all-applications","text":"Example Request: GET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List all Applications"},{"location":"reference-guide/controller-api/v2.0/#create-an-application","text":"Example Request: POST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters: {\"id\": \"example-go\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create an Application"},{"location":"reference-guide/controller-api/v2.0/#destroy-an-application","text":"Example Request: DELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Destroy an Application"},{"location":"reference-guide/controller-api/v2.0/#list-application-details","text":"Example Request: GET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"List Application Details"},{"location":"reference-guide/controller-api/v2.0/#update-application-details","text":"Example Request: POST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters: { \"owner\": \"test\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json","title":"Update Application Details"},{"location":"reference-guide/controller-api/v2.0/#retrieve-application-logs","text":"Example Request: GET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters: ?log_lines= Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: text/plain \"16:51:14 drycc[api]: test created initial release\\n\"","title":"Retrieve Application Logs"},{"location":"reference-guide/controller-api/v2.0/#run-one-off-commands","text":"POST /v2/apps/example-go/run/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"command\": \"echo hi\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"exit_code\": 0, \"output\": \"hi\\n\"}","title":"Run one-off Commands"},{"location":"reference-guide/controller-api/v2.0/#certificates","text":"","title":"Certificates"},{"location":"reference-guide/controller-api/v2.0/#list-all-certificates","text":"Example Request: GET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } ] }","title":"List all Certificates"},{"location":"reference-guide/controller-api/v2.0/#get-certificate-details","text":"Example Request: GET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" }","title":"Get Certificate Details"},{"location":"reference-guide/controller-api/v2.0/#create-certificate","text":"Example Request: POST /v2/certs/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"name\": \"foo\" \"certificate\": \"-----BEGIN CERTIFICATE-----\", \"key\": \"-----BEGIN RSA PRIVATE KEY-----\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" }","title":"Create Certificate"},{"location":"reference-guide/controller-api/v2.0/#destroy-a-certificate","text":"Example Request: DELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Destroy a Certificate"},{"location":"reference-guide/controller-api/v2.0/#attach-a-domain-to-a-certificate","text":"Example Request: POST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Attach a Domain to a Certificate"},{"location":"reference-guide/controller-api/v2.0/#remove-a-domain-from-a-certificate","text":"Example Request: DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Remove a Domain from a Certificate"},{"location":"reference-guide/controller-api/v2.0/#pods","text":"","title":"Pods"},{"location":"reference-guide/controller-api/v2.0/#list-all-pods","text":"Example Request: GET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] }","title":"List all Pods"},{"location":"reference-guide/controller-api/v2.0/#list-all-pods-by-type","text":"Example Request: GET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] }","title":"List all Pods by Type"},{"location":"reference-guide/controller-api/v2.0/#restart-all-pods","text":"Example Request: POST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart All Pods"},{"location":"reference-guide/controller-api/v2.0/#restart-pods-by-type","text":"Example Request: POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart Pods by Type"},{"location":"reference-guide/controller-api/v2.0/#restart-pods-by-type-and-name","text":"Example Request: POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart Pods by Type and Name"},{"location":"reference-guide/controller-api/v2.0/#scale-pods","text":"Example Request: POST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Scale Pods"},{"location":"reference-guide/controller-api/v2.0/#configuration","text":"","title":"Configuration"},{"location":"reference-guide/controller-api/v2.0/#list-application-configuration","text":"Example Request: GET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"List Application Configuration"},{"location":"reference-guide/controller-api/v2.0/#create-new-config","text":"Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": \"world\", \"PLATFORM\": \"drycc\"}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json X-Drycc-Release: 3 { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v3\", \"HELLO\": \"world\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create new Config"},{"location":"reference-guide/controller-api/v2.0/#unset-config-variable","text":"Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json X-Drycc-Release: 4 { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v4\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Unset Config Variable"},{"location":"reference-guide/controller-api/v2.0/#domains","text":"","title":"Domains"},{"location":"reference-guide/controller-api/v2.0/#list-application-domains","text":"Example Request: GET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } ] }","title":"List Application Domains"},{"location":"reference-guide/controller-api/v2.0/#add-domain","text":"Example Request: POST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" }","title":"Add Domain"},{"location":"reference-guide/controller-api/v2.0/#remove-domain","text":"Example Request: DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Remove Domain"},{"location":"reference-guide/controller-api/v2.0/#builds","text":"","title":"Builds"},{"location":"reference-guide/controller-api/v2.0/#list-application-builds","text":"Example Request: GET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\\\"/runner/init\\\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db\", \"image\": \"example-go\", \"owner\": \"test\", \"procfile\": { \"web\": \"example-go\" }, \"sha\": \"060da68f\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List Application Builds"},{"location":"reference-guide/controller-api/v2.0/#create-application-build","text":"Example Request: POST /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"image\": \"drycc/example-go:latest\"} Optional Parameters: { \"procfile\": { \"web\": \"./cmd\" } } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json X-Drycc-Release: 4 { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"\", \"image\": \"drycc/example-go:latest\", \"owner\": \"test\", \"procfile\": {}, \"sha\": \"\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create Application Build"},{"location":"reference-guide/controller-api/v2.0/#releases","text":"","title":"Releases"},{"location":"reference-guide/controller-api/v2.0/#list-application-releases","text":"Example Request: GET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 3, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"ed637ceb-5d32-44bd-9406-d326a777a513\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test changed nothing\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 3 }, { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test deployed 060da68\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 2 }, { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } ] }","title":"List Application Releases"},{"location":"reference-guide/controller-api/v2.0/#list-release-details","text":"Example Request: GET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 }","title":"List Release Details"},{"location":"reference-guide/controller-api/v2.0/#rollback-release","text":"Example Request: POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"version\": 5}","title":"Rollback Release"},{"location":"reference-guide/controller-api/v2.0/#keys","text":"","title":"Keys"},{"location":"reference-guide/controller-api/v2.0/#list-keys","text":"Example Request: GET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"test@example.com\", \"owner\": \"test\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List Keys"},{"location":"reference-guide/controller-api/v2.0/#add-key-to-user","text":"Example Request: POST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa <...>\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example\", \"owner\": \"example\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Add Key to User"},{"location":"reference-guide/controller-api/v2.0/#remove-key-from-user","text":"Example Request: DELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Remove Key from User"},{"location":"reference-guide/controller-api/v2.0/#permissions","text":"","title":"Permissions"},{"location":"reference-guide/controller-api/v2.0/#list-application-permissions","text":"note This does not include the app owner. Example Request: GET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] }","title":"List Application Permissions"},{"location":"reference-guide/controller-api/v2.0/#create-application-permission","text":"Example Request: POST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Create Application Permission"},{"location":"reference-guide/controller-api/v2.0/#remove-application-permission","text":"Example Request: DELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Remove Application Permission"},{"location":"reference-guide/controller-api/v2.0/#list-administrators","text":"Example Request: GET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 2, \"next\": null \"previous\": null, \"results\": [ { \"username\": \"test\", \"is_superuser\": true }, { \"username\": \"foo\", \"is_superuser\": true } ] }","title":"List Administrators"},{"location":"reference-guide/controller-api/v2.0/#grant-user-administrative-privileges","text":"note This command requires administrative privileges Example Request: POST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Grant User Administrative Privileges"},{"location":"reference-guide/controller-api/v2.0/#remove-users-administrative-privileges","text":"note This command requires administrative privileges Example Request: DELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Remove User's Administrative Privileges"},{"location":"reference-guide/controller-api/v2.0/#users","text":"","title":"Users"},{"location":"reference-guide/controller-api/v2.0/#list-all-users","text":"note This command requires administrative privileges Example Request: GET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.0 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } ] }","title":"List all users"},{"location":"reference-guide/controller-api/v2.1/","text":"Controller API v2.1 \u00b6 This is the v2.1 REST API for the Controller. What's New \u00b6 New! healthcheck field in configuration, deprecates the HEALTHCHECK_* environment variables. New! Unsetting a configuration variable that does not exist will return a 422. New! Creating an identical sequential release returns a 409 rather than create a no-op release. Authentication \u00b6 Register a New User \u00b6 Example Request: POST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters: { \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } Log in \u00b6 Example Request: POST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"} Cancel Account \u00b6 Example Request: DELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Regenerate Token \u00b6 note This command could require administrative privileges Example Request: POST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters: { \"username\" : \"test\" \"all\" : \"true\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"} Change Password \u00b6 Example Request: POST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters: {\"username\": \"testuser\"} note Using the username parameter requires administrative privileges and makes the password parameter optional. Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Applications \u00b6 List all Applications \u00b6 Example Request: GET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Create an Application \u00b6 Example Request: POST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters: {\"id\": \"example-go\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Destroy an Application \u00b6 Example Request: DELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 List Application Details \u00b6 Example Request: GET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Update Application Details \u00b6 Example Request: POST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters: { \"owner\": \"test\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json Retrieve Application Logs \u00b6 Example Request: GET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters: ?log_lines= Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: text/plain \"16:51:14 drycc[api]: test created initial release\\n\" Run one-off Commands \u00b6 POST /v2/apps/example-go/run/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"command\": \"echo hi\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"exit_code\": 0, \"output\": \"hi\\n\"} Certificates \u00b6 List all Certificates \u00b6 Example Request: GET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } ] } Get Certificate Details \u00b6 Example Request: GET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } Create Certificate \u00b6 Example Request: POST /v2/certs/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"name\": \"foo\" \"certificate\": \"-----BEGIN CERTIFICATE-----\", \"key\": \"-----BEGIN RSA PRIVATE KEY-----\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } Destroy a Certificate \u00b6 Example Request: DELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Attach a Domain to a Certificate \u00b6 Example Request: POST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Remove a Domain from a Certificate \u00b6 Example Request: DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Pods \u00b6 List all Pods \u00b6 Example Request: GET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] } List all Pods by Type \u00b6 Example Request: GET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] } Restart All Pods \u00b6 Example Request: POST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Restart Pods by Type \u00b6 Example Request: POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Restart Pods by Type and Name \u00b6 Example Request: POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Scale Pods \u00b6 Example Request: POST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Configuration \u00b6 List Application Configuration \u00b6 Example Request: GET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Create new Config \u00b6 Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": \"world\", \"PLATFORM\": \"drycc\"}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v3\", \"HELLO\": \"world\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Unset Config Variable \u00b6 Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v4\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Domains \u00b6 List Application Domains \u00b6 Example Request: GET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } ] } Add Domain \u00b6 Example Request: POST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } Remove Domain \u00b6 Example Request: DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Builds \u00b6 List Application Builds \u00b6 Example Request: GET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\\\"/runner/init\\\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db\", \"image\": \"example-go\", \"owner\": \"test\", \"procfile\": { \"web\": \"example-go\" }, \"sha\": \"060da68f\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Create Application Build \u00b6 Example Request: POST /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"image\": \"drycc/example-go:latest\"} Optional Parameters: { \"procfile\": { \"web\": \"./cmd\" } } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"\", \"image\": \"drycc/example-go:latest\", \"owner\": \"test\", \"procfile\": {}, \"sha\": \"\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Releases \u00b6 List Application Releases \u00b6 Example Request: GET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 3, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"ed637ceb-5d32-44bd-9406-d326a777a513\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test changed nothing\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 3 }, { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test deployed 060da68\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 2 }, { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } ] } List Release Details \u00b6 Example Request: GET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } Rollback Release \u00b6 Example Request: POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"version\": 5} Keys \u00b6 List Keys \u00b6 Example Request: GET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"test@example.com\", \"owner\": \"test\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Add Key to User \u00b6 Example Request: POST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa <...>\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example\", \"owner\": \"example\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Remove Key from User \u00b6 Example Request: DELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Permissions \u00b6 List Application Permissions \u00b6 note This does not include the app owner. Example Request: GET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] } Create Application Permission \u00b6 Example Request: POST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Remove Application Permission \u00b6 Example Request: DELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 List Administrators \u00b6 Example Request: GET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 2, \"next\": null \"previous\": null, \"results\": [ { \"username\": \"test\", \"is_superuser\": true }, { \"username\": \"foo\", \"is_superuser\": true } ] } Grant User Administrative Privileges \u00b6 note This command requires administrative privileges Example Request: POST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Remove User's Administrative Privileges \u00b6 note This command requires administrative privileges Example Request: DELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Users \u00b6 List all users \u00b6 note This command requires administrative privileges Example Request: GET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } ] }","title":"Controller API v2.1"},{"location":"reference-guide/controller-api/v2.1/#controller-api-v21","text":"This is the v2.1 REST API for the Controller.","title":"Controller API v2.1"},{"location":"reference-guide/controller-api/v2.1/#whats-new","text":"New! healthcheck field in configuration, deprecates the HEALTHCHECK_* environment variables. New! Unsetting a configuration variable that does not exist will return a 422. New! Creating an identical sequential release returns a 409 rather than create a no-op release.","title":"What's New"},{"location":"reference-guide/controller-api/v2.1/#authentication","text":"","title":"Authentication"},{"location":"reference-guide/controller-api/v2.1/#register-a-new-user","text":"Example Request: POST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters: { \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] }","title":"Register a New User"},{"location":"reference-guide/controller-api/v2.1/#log-in","text":"Example Request: POST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"}","title":"Log in"},{"location":"reference-guide/controller-api/v2.1/#cancel-account","text":"Example Request: DELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Cancel Account"},{"location":"reference-guide/controller-api/v2.1/#regenerate-token","text":"note This command could require administrative privileges Example Request: POST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters: { \"username\" : \"test\" \"all\" : \"true\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"token\": \"abc123\"}","title":"Regenerate Token"},{"location":"reference-guide/controller-api/v2.1/#change-password","text":"Example Request: POST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters: {\"username\": \"testuser\"} note Using the username parameter requires administrative privileges and makes the password parameter optional. Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Change Password"},{"location":"reference-guide/controller-api/v2.1/#applications","text":"","title":"Applications"},{"location":"reference-guide/controller-api/v2.1/#list-all-applications","text":"Example Request: GET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List all Applications"},{"location":"reference-guide/controller-api/v2.1/#create-an-application","text":"Example Request: POST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters: {\"id\": \"example-go\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create an Application"},{"location":"reference-guide/controller-api/v2.1/#destroy-an-application","text":"Example Request: DELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Destroy an Application"},{"location":"reference-guide/controller-api/v2.1/#list-application-details","text":"Example Request: GET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"List Application Details"},{"location":"reference-guide/controller-api/v2.1/#update-application-details","text":"Example Request: POST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters: { \"owner\": \"test\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json","title":"Update Application Details"},{"location":"reference-guide/controller-api/v2.1/#retrieve-application-logs","text":"Example Request: GET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters: ?log_lines= Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: text/plain \"16:51:14 drycc[api]: test created initial release\\n\"","title":"Retrieve Application Logs"},{"location":"reference-guide/controller-api/v2.1/#run-one-off-commands","text":"POST /v2/apps/example-go/run/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"command\": \"echo hi\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"exit_code\": 0, \"output\": \"hi\\n\"}","title":"Run one-off Commands"},{"location":"reference-guide/controller-api/v2.1/#certificates","text":"","title":"Certificates"},{"location":"reference-guide/controller-api/v2.1/#list-all-certificates","text":"Example Request: GET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } ] }","title":"List all Certificates"},{"location":"reference-guide/controller-api/v2.1/#get-certificate-details","text":"Example Request: GET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" }","title":"Get Certificate Details"},{"location":"reference-guide/controller-api/v2.1/#create-certificate","text":"Example Request: POST /v2/certs/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"name\": \"foo\" \"certificate\": \"-----BEGIN CERTIFICATE-----\", \"key\": \"-----BEGIN RSA PRIVATE KEY-----\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" }","title":"Create Certificate"},{"location":"reference-guide/controller-api/v2.1/#destroy-a-certificate","text":"Example Request: DELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Destroy a Certificate"},{"location":"reference-guide/controller-api/v2.1/#attach-a-domain-to-a-certificate","text":"Example Request: POST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Attach a Domain to a Certificate"},{"location":"reference-guide/controller-api/v2.1/#remove-a-domain-from-a-certificate","text":"Example Request: DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Remove a Domain from a Certificate"},{"location":"reference-guide/controller-api/v2.1/#pods","text":"","title":"Pods"},{"location":"reference-guide/controller-api/v2.1/#list-all-pods","text":"Example Request: GET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] }","title":"List all Pods"},{"location":"reference-guide/controller-api/v2.1/#list-all-pods-by-type","text":"Example Request: GET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] }","title":"List all Pods by Type"},{"location":"reference-guide/controller-api/v2.1/#restart-all-pods","text":"Example Request: POST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart All Pods"},{"location":"reference-guide/controller-api/v2.1/#restart-pods-by-type","text":"Example Request: POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart Pods by Type"},{"location":"reference-guide/controller-api/v2.1/#restart-pods-by-type-and-name","text":"Example Request: POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart Pods by Type and Name"},{"location":"reference-guide/controller-api/v2.1/#scale-pods","text":"Example Request: POST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Scale Pods"},{"location":"reference-guide/controller-api/v2.1/#configuration","text":"","title":"Configuration"},{"location":"reference-guide/controller-api/v2.1/#list-application-configuration","text":"Example Request: GET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"List Application Configuration"},{"location":"reference-guide/controller-api/v2.1/#create-new-config","text":"Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": \"world\", \"PLATFORM\": \"drycc\"}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v3\", \"HELLO\": \"world\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create new Config"},{"location":"reference-guide/controller-api/v2.1/#unset-config-variable","text":"Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v4\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Unset Config Variable"},{"location":"reference-guide/controller-api/v2.1/#domains","text":"","title":"Domains"},{"location":"reference-guide/controller-api/v2.1/#list-application-domains","text":"Example Request: GET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } ] }","title":"List Application Domains"},{"location":"reference-guide/controller-api/v2.1/#add-domain","text":"Example Request: POST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" }","title":"Add Domain"},{"location":"reference-guide/controller-api/v2.1/#remove-domain","text":"Example Request: DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Remove Domain"},{"location":"reference-guide/controller-api/v2.1/#builds","text":"","title":"Builds"},{"location":"reference-guide/controller-api/v2.1/#list-application-builds","text":"Example Request: GET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\\\"/runner/init\\\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db\", \"image\": \"example-go\", \"owner\": \"test\", \"procfile\": { \"web\": \"example-go\" }, \"sha\": \"060da68f\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List Application Builds"},{"location":"reference-guide/controller-api/v2.1/#create-application-build","text":"Example Request: POST /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"image\": \"drycc/example-go:latest\"} Optional Parameters: { \"procfile\": { \"web\": \"./cmd\" } } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"\", \"image\": \"drycc/example-go:latest\", \"owner\": \"test\", \"procfile\": {}, \"sha\": \"\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create Application Build"},{"location":"reference-guide/controller-api/v2.1/#releases","text":"","title":"Releases"},{"location":"reference-guide/controller-api/v2.1/#list-application-releases","text":"Example Request: GET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 3, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"ed637ceb-5d32-44bd-9406-d326a777a513\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test changed nothing\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 3 }, { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test deployed 060da68\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 2 }, { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } ] }","title":"List Application Releases"},{"location":"reference-guide/controller-api/v2.1/#list-release-details","text":"Example Request: GET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 }","title":"List Release Details"},{"location":"reference-guide/controller-api/v2.1/#rollback-release","text":"Example Request: POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json {\"version\": 5}","title":"Rollback Release"},{"location":"reference-guide/controller-api/v2.1/#keys","text":"","title":"Keys"},{"location":"reference-guide/controller-api/v2.1/#list-keys","text":"Example Request: GET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"test@example.com\", \"owner\": \"test\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List Keys"},{"location":"reference-guide/controller-api/v2.1/#add-key-to-user","text":"Example Request: POST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa <...>\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example\", \"owner\": \"example\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Add Key to User"},{"location":"reference-guide/controller-api/v2.1/#remove-key-from-user","text":"Example Request: DELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Remove Key from User"},{"location":"reference-guide/controller-api/v2.1/#permissions","text":"","title":"Permissions"},{"location":"reference-guide/controller-api/v2.1/#list-application-permissions","text":"note This does not include the app owner. Example Request: GET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] }","title":"List Application Permissions"},{"location":"reference-guide/controller-api/v2.1/#create-application-permission","text":"Example Request: POST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Create Application Permission"},{"location":"reference-guide/controller-api/v2.1/#remove-application-permission","text":"Example Request: DELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Remove Application Permission"},{"location":"reference-guide/controller-api/v2.1/#list-administrators","text":"Example Request: GET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 2, \"next\": null \"previous\": null, \"results\": [ { \"username\": \"test\", \"is_superuser\": true }, { \"username\": \"foo\", \"is_superuser\": true } ] }","title":"List Administrators"},{"location":"reference-guide/controller-api/v2.1/#grant-user-administrative-privileges","text":"note This command requires administrative privileges Example Request: POST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Grant User Administrative Privileges"},{"location":"reference-guide/controller-api/v2.1/#remove-users-administrative-privileges","text":"note This command requires administrative privileges Example Request: DELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0","title":"Remove User's Administrative Privileges"},{"location":"reference-guide/controller-api/v2.1/#users","text":"","title":"Users"},{"location":"reference-guide/controller-api/v2.1/#list-all-users","text":"note This command requires administrative privileges Example Request: GET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.1 DRYCC_PLATFORM_VERSION: 2.1.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } ] }","title":"List all users"},{"location":"reference-guide/controller-api/v2.2/","text":"Controller API v2.2 \u00b6 This is the v2.2 REST API for the Controller. What's New \u00b6 New! /v2/auth/whoami endpoint Authentication \u00b6 Register a New User \u00b6 Example Request: POST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters: { \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } Log in \u00b6 Example Request: POST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"token\": \"abc123\"} Cancel Account \u00b6 Example Request: DELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Who Am I \u00b6 Example Request: GET /v2/auth/whoami/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } Regenerate Token \u00b6 note This command could require administrative privileges Example Request: POST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters: { \"username\" : \"test\" \"all\" : \"true\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"token\": \"abc123\"} Change Password \u00b6 Example Request: POST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters: {\"username\": \"testuser\"} note Using the username parameter requires administrative privileges and makes the password parameter optional. Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Applications \u00b6 List all Applications \u00b6 Example Request: GET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Create an Application \u00b6 Example Request: POST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters: {\"id\": \"example-go\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Destroy an Application \u00b6 Example Request: DELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 List Application Details \u00b6 Example Request: GET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Update Application Details \u00b6 Example Request: POST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters: { \"owner\": \"test\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json Retrieve Application Logs \u00b6 Example Request: GET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters: ?log_lines= Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: text/plain \"16:51:14 drycc[api]: test created initial release\\n\" Run one-off Commands \u00b6 POST /v2/apps/example-go/run/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"command\": \"echo hi\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"exit_code\": 0, \"output\": \"hi\\n\"} Certificates \u00b6 List all Certificates \u00b6 Example Request: GET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } ] } Get Certificate Details \u00b6 Example Request: GET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } Create Certificate \u00b6 Example Request: POST /v2/certs/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"name\": \"foo\" \"certificate\": \"-----BEGIN CERTIFICATE-----\", \"key\": \"-----BEGIN RSA PRIVATE KEY-----\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } Destroy a Certificate \u00b6 Example Request: DELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Attach a Domain to a Certificate \u00b6 Example Request: POST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Remove a Domain from a Certificate \u00b6 Example Request: DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Pods \u00b6 List all Pods \u00b6 Example Request: GET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] } List all Pods by Type \u00b6 Example Request: GET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] } Restart All Pods \u00b6 Example Request: POST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Restart Pods by Type \u00b6 Example Request: POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Restart Pods by Type and Name \u00b6 Example Request: POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Scale Pods \u00b6 Example Request: POST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Configuration \u00b6 List Application Configuration \u00b6 Example Request: GET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Create new Config \u00b6 Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": \"world\", \"PLATFORM\": \"drycc\"}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v3\", \"HELLO\": \"world\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Unset Config Variable \u00b6 Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v4\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Domains \u00b6 List Application Domains \u00b6 Example Request: GET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } ] } Add Domain \u00b6 Example Request: POST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } Remove Domain \u00b6 Example Request: DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Builds \u00b6 List Application Builds \u00b6 Example Request: GET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\\\"/runner/init\\\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db\", \"image\": \"example-go\", \"owner\": \"test\", \"procfile\": { \"web\": \"example-go\" }, \"sha\": \"060da68f\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Create Application Build \u00b6 Example Request: POST /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"image\": \"drycc/example-go:latest\"} Optional Parameters: { \"procfile\": { \"web\": \"./cmd\" } } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"\", \"image\": \"drycc/example-go:latest\", \"owner\": \"test\", \"procfile\": {}, \"sha\": \"\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Releases \u00b6 List Application Releases \u00b6 Example Request: GET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 3, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"ed637ceb-5d32-44bd-9406-d326a777a513\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test changed nothing\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 3 }, { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test deployed 060da68\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 2 }, { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } ] } List Release Details \u00b6 Example Request: GET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } Rollback Release \u00b6 Example Request: POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"version\": 5} Keys \u00b6 List Keys \u00b6 Example Request: GET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"test@example.com\", \"owner\": \"test\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Add Key to User \u00b6 Example Request: POST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa <...>\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example\", \"owner\": \"example\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Remove Key from User \u00b6 Example Request: DELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Permissions \u00b6 List Application Permissions \u00b6 note This does not include the app owner. Example Request: GET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] } Create Application Permission \u00b6 Example Request: POST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Remove Application Permission \u00b6 Example Request: DELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 List Administrators \u00b6 Example Request: GET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 2, \"next\": null \"previous\": null, \"results\": [ { \"username\": \"test\", \"is_superuser\": true }, { \"username\": \"foo\", \"is_superuser\": true } ] } Grant User Administrative Privileges \u00b6 note This command requires administrative privileges Example Request: POST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Remove User's Administrative Privileges \u00b6 note This command requires administrative privileges Example Request: DELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Users \u00b6 List all users \u00b6 note This command requires administrative privileges Example Request: GET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } ] }","title":"Controller API v2.2"},{"location":"reference-guide/controller-api/v2.2/#controller-api-v22","text":"This is the v2.2 REST API for the Controller.","title":"Controller API v2.2"},{"location":"reference-guide/controller-api/v2.2/#whats-new","text":"New! /v2/auth/whoami endpoint","title":"What's New"},{"location":"reference-guide/controller-api/v2.2/#authentication","text":"","title":"Authentication"},{"location":"reference-guide/controller-api/v2.2/#register-a-new-user","text":"Example Request: POST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters: { \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] }","title":"Register a New User"},{"location":"reference-guide/controller-api/v2.2/#log-in","text":"Example Request: POST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"token\": \"abc123\"}","title":"Log in"},{"location":"reference-guide/controller-api/v2.2/#cancel-account","text":"Example Request: DELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Cancel Account"},{"location":"reference-guide/controller-api/v2.2/#who-am-i","text":"Example Request: GET /v2/auth/whoami/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] }","title":"Who Am I"},{"location":"reference-guide/controller-api/v2.2/#regenerate-token","text":"note This command could require administrative privileges Example Request: POST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters: { \"username\" : \"test\" \"all\" : \"true\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"token\": \"abc123\"}","title":"Regenerate Token"},{"location":"reference-guide/controller-api/v2.2/#change-password","text":"Example Request: POST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters: {\"username\": \"testuser\"} note Using the username parameter requires administrative privileges and makes the password parameter optional. Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Change Password"},{"location":"reference-guide/controller-api/v2.2/#applications","text":"","title":"Applications"},{"location":"reference-guide/controller-api/v2.2/#list-all-applications","text":"Example Request: GET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List all Applications"},{"location":"reference-guide/controller-api/v2.2/#create-an-application","text":"Example Request: POST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters: {\"id\": \"example-go\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create an Application"},{"location":"reference-guide/controller-api/v2.2/#destroy-an-application","text":"Example Request: DELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Destroy an Application"},{"location":"reference-guide/controller-api/v2.2/#list-application-details","text":"Example Request: GET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"List Application Details"},{"location":"reference-guide/controller-api/v2.2/#update-application-details","text":"Example Request: POST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters: { \"owner\": \"test\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json","title":"Update Application Details"},{"location":"reference-guide/controller-api/v2.2/#retrieve-application-logs","text":"Example Request: GET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters: ?log_lines= Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: text/plain \"16:51:14 drycc[api]: test created initial release\\n\"","title":"Retrieve Application Logs"},{"location":"reference-guide/controller-api/v2.2/#run-one-off-commands","text":"POST /v2/apps/example-go/run/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"command\": \"echo hi\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"exit_code\": 0, \"output\": \"hi\\n\"}","title":"Run one-off Commands"},{"location":"reference-guide/controller-api/v2.2/#certificates","text":"","title":"Certificates"},{"location":"reference-guide/controller-api/v2.2/#list-all-certificates","text":"Example Request: GET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } ] }","title":"List all Certificates"},{"location":"reference-guide/controller-api/v2.2/#get-certificate-details","text":"Example Request: GET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" }","title":"Get Certificate Details"},{"location":"reference-guide/controller-api/v2.2/#create-certificate","text":"Example Request: POST /v2/certs/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"name\": \"foo\" \"certificate\": \"-----BEGIN CERTIFICATE-----\", \"key\": \"-----BEGIN RSA PRIVATE KEY-----\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22T22:24:20Z\", \"updated\": \"2016-06-22T22:24:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" }","title":"Create Certificate"},{"location":"reference-guide/controller-api/v2.2/#destroy-a-certificate","text":"Example Request: DELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Destroy a Certificate"},{"location":"reference-guide/controller-api/v2.2/#attach-a-domain-to-a-certificate","text":"Example Request: POST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Attach a Domain to a Certificate"},{"location":"reference-guide/controller-api/v2.2/#remove-a-domain-from-a-certificate","text":"Example Request: DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Remove a Domain from a Certificate"},{"location":"reference-guide/controller-api/v2.2/#pods","text":"","title":"Pods"},{"location":"reference-guide/controller-api/v2.2/#list-all-pods","text":"Example Request: GET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] }","title":"List all Pods"},{"location":"reference-guide/controller-api/v2.2/#list-all-pods-by-type","text":"Example Request: GET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] }","title":"List all Pods by Type"},{"location":"reference-guide/controller-api/v2.2/#restart-all-pods","text":"Example Request: POST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart All Pods"},{"location":"reference-guide/controller-api/v2.2/#restart-pods-by-type","text":"Example Request: POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart Pods by Type"},{"location":"reference-guide/controller-api/v2.2/#restart-pods-by-type-and-name","text":"Example Request: POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart Pods by Type and Name"},{"location":"reference-guide/controller-api/v2.2/#scale-pods","text":"Example Request: POST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Scale Pods"},{"location":"reference-guide/controller-api/v2.2/#configuration","text":"","title":"Configuration"},{"location":"reference-guide/controller-api/v2.2/#list-application-configuration","text":"Example Request: GET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"List Application Configuration"},{"location":"reference-guide/controller-api/v2.2/#create-new-config","text":"Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": \"world\", \"PLATFORM\": \"drycc\"}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v3\", \"HELLO\": \"world\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create new Config"},{"location":"reference-guide/controller-api/v2.2/#unset-config-variable","text":"Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v4\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Unset Config Variable"},{"location":"reference-guide/controller-api/v2.2/#domains","text":"","title":"Domains"},{"location":"reference-guide/controller-api/v2.2/#list-application-domains","text":"Example Request: GET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } ] }","title":"List Application Domains"},{"location":"reference-guide/controller-api/v2.2/#add-domain","text":"Example Request: POST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" }","title":"Add Domain"},{"location":"reference-guide/controller-api/v2.2/#remove-domain","text":"Example Request: DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Remove Domain"},{"location":"reference-guide/controller-api/v2.2/#builds","text":"","title":"Builds"},{"location":"reference-guide/controller-api/v2.2/#list-application-builds","text":"Example Request: GET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\\\"/runner/init\\\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db\", \"image\": \"example-go\", \"owner\": \"test\", \"procfile\": { \"web\": \"example-go\" }, \"sha\": \"060da68f\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List Application Builds"},{"location":"reference-guide/controller-api/v2.2/#create-application-build","text":"Example Request: POST /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"image\": \"drycc/example-go:latest\"} Optional Parameters: { \"procfile\": { \"web\": \"./cmd\" } } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"\", \"image\": \"drycc/example-go:latest\", \"owner\": \"test\", \"procfile\": {}, \"sha\": \"\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create Application Build"},{"location":"reference-guide/controller-api/v2.2/#releases","text":"","title":"Releases"},{"location":"reference-guide/controller-api/v2.2/#list-application-releases","text":"Example Request: GET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 3, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"ed637ceb-5d32-44bd-9406-d326a777a513\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test changed nothing\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 3 }, { \"app\": \"example-go\", \"build\": \"202d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test deployed 060da68\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 2 }, { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } ] }","title":"List Application Releases"},{"location":"reference-guide/controller-api/v2.2/#list-release-details","text":"Example Request: GET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 }","title":"List Release Details"},{"location":"reference-guide/controller-api/v2.2/#rollback-release","text":"Example Request: POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json {\"version\": 5}","title":"Rollback Release"},{"location":"reference-guide/controller-api/v2.2/#keys","text":"","title":"Keys"},{"location":"reference-guide/controller-api/v2.2/#list-keys","text":"Example Request: GET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"test@example.com\", \"owner\": \"test\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List Keys"},{"location":"reference-guide/controller-api/v2.2/#add-key-to-user","text":"Example Request: POST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa <...>\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example\", \"owner\": \"example\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Add Key to User"},{"location":"reference-guide/controller-api/v2.2/#remove-key-from-user","text":"Example Request: DELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Remove Key from User"},{"location":"reference-guide/controller-api/v2.2/#permissions","text":"","title":"Permissions"},{"location":"reference-guide/controller-api/v2.2/#list-application-permissions","text":"note This does not include the app owner. Example Request: GET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] }","title":"List Application Permissions"},{"location":"reference-guide/controller-api/v2.2/#create-application-permission","text":"Example Request: POST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Create Application Permission"},{"location":"reference-guide/controller-api/v2.2/#remove-application-permission","text":"Example Request: DELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Remove Application Permission"},{"location":"reference-guide/controller-api/v2.2/#list-administrators","text":"Example Request: GET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 2, \"next\": null \"previous\": null, \"results\": [ { \"username\": \"test\", \"is_superuser\": true }, { \"username\": \"foo\", \"is_superuser\": true } ] }","title":"List Administrators"},{"location":"reference-guide/controller-api/v2.2/#grant-user-administrative-privileges","text":"note This command requires administrative privileges Example Request: POST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Grant User Administrative Privileges"},{"location":"reference-guide/controller-api/v2.2/#remove-users-administrative-privileges","text":"note This command requires administrative privileges Example Request: DELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0","title":"Remove User's Administrative Privileges"},{"location":"reference-guide/controller-api/v2.2/#users","text":"","title":"Users"},{"location":"reference-guide/controller-api/v2.2/#list-all-users","text":"note This command requires administrative privileges Example Request: GET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.2 DRYCC_PLATFORM_VERSION: 2.2.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } ] }","title":"List all users"},{"location":"reference-guide/controller-api/v2.3/","text":"Controller API v2.3 \u00b6 This is the v2.3 REST API for the Controller. What's New \u00b6 New! /v2/apps/{name}/logs endpoint was fixed and no longer returns b'log data' and instead returns a normal string log data Authentication \u00b6 Register a New User \u00b6 Example Request: POST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters: { \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } Log in \u00b6 Example Request: POST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"token\": \"abc123\"} Cancel Account \u00b6 Example Request: DELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Who Am I \u00b6 Example Request: GET /v2/auth/whoami/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } Regenerate Token \u00b6 note This command could require administrative privileges Example Request: POST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters: { \"username\" : \"test\" \"all\" : \"true\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"token\": \"abc123\"} Change Password \u00b6 Example Request: POST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters: {\"username\": \"testuser\"} note Using the username parameter requires administrative privileges and makes the password parameter optional. Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Applications \u00b6 List all Applications \u00b6 Example Request: GET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Create an Application \u00b6 Example Request: POST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters: {\"id\": \"example-go\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Destroy an Application \u00b6 Example Request: DELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 List Application Details \u00b6 Example Request: GET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Update Application Details \u00b6 Example Request: POST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters: { \"owner\": \"test\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json Retrieve Application Logs \u00b6 Example Request: GET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters: ?log_lines= Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: text/plain \"16:51:14 drycc[api]: test created initial release\\n\" Run one-off Commands \u00b6 POST /v2/apps/example-go/run/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"command\": \"echo hi\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"exit_code\": 0, \"output\": \"hi\\n\"} Certificates \u00b6 List all Certificates \u00b6 Example Request: GET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22.32.34:20Z\", \"updated\": \"2016-06-22.32.34:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } ] } Get Certificate Details \u00b6 Example Request: GET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22.32.34:20Z\", \"updated\": \"2016-06-22.32.34:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } Create Certificate \u00b6 Example Request: POST /v2/certs/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"name\": \"foo\" \"certificate\": \"-----BEGIN CERTIFICATE-----\", \"key\": \"-----BEGIN RSA PRIVATE KEY-----\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22.32.34:20Z\", \"updated\": \"2016-06-22.32.34:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } Destroy a Certificate \u00b6 Example Request: DELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Attach a Domain to a Certificate \u00b6 Example Request: POST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Remove a Domain from a Certificate \u00b6 Example Request: DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Enable or disable TLS \u00b6 Example Request: POST /v2/apps/example-go/tls/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"https_enforced\": true } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"app\": \"example-go\", \"owner\": \"test\", \"https_enforced\": true, \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Get TLS status \u00b6 Example Request: GET /v2/apps/example-go/tls/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"app\": \"example-go\", \"owner\": \"test\", \"https_enforced\": false, \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Pods \u00b6 List all Pods \u00b6 Example Request: GET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] } List all Pods by Type \u00b6 Example Request: GET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] } Restart All Pods \u00b6 Example Request: POST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Restart Pods by Type \u00b6 Example Request: POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Restart Pods by Type and Name \u00b6 Example Request: POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ] Scale Pods \u00b6 Example Request: POST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Configuration \u00b6 List Application Configuration \u00b6 Example Request: GET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Create new Config \u00b6 Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": \"world\", \"PLATFORM\": \"drycc\"}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v3\", \"HELLO\": \"world\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Unset Config Variable \u00b6 Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v4\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Domains \u00b6 List Application Domains \u00b6 Example Request: GET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } ] } Add Domain \u00b6 Example Request: POST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } Remove Domain \u00b6 Example Request: DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Builds \u00b6 List Application Builds \u00b6 Example Request: GET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\\\"/runner/init\\\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db\", \"image\": \"example-go\", \"owner\": \"test\", \"procfile\": { \"web\": \"example-go\" }, \"sha\": \"060da68f\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Create Application Build \u00b6 Example Request: POST /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"image\": \"drycc/example-go:latest\"} Optional Parameters: { \"procfile\": { \"web\": \"./cmd\" } } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"\", \"image\": \"drycc/example-go:latest\", \"owner\": \"test\", \"procfile\": {}, \"sha\": \"\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Releases \u00b6 List Application Releases \u00b6 Example Request: GET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 3, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"build\": \"2.3d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"ed637ceb-5d32-44bd-9406-d326a777a513\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test changed nothing\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 3 }, { \"app\": \"example-go\", \"build\": \"2.3d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test deployed 060da68\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 2 }, { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } ] } List Release Details \u00b6 Example Request: GET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } Rollback Release \u00b6 Example Request: POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"version\": 5} Keys \u00b6 List Keys \u00b6 Example Request: GET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"test@example.com\", \"owner\": \"test\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] } Add Key to User \u00b6 Example Request: POST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa <...>\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example\", \"owner\": \"example\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } Remove Key from User \u00b6 Example Request: DELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Permissions \u00b6 List Application Permissions \u00b6 note This does not include the app owner. Example Request: GET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] } Create Application Permission \u00b6 Example Request: POST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Remove Application Permission \u00b6 Example Request: DELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 List Administrators \u00b6 Example Request: GET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 2, \"next\": null \"previous\": null, \"results\": [ { \"username\": \"test\", \"is_superuser\": true }, { \"username\": \"foo\", \"is_superuser\": true } ] } Grant User Administrative Privileges \u00b6 note This command requires administrative privileges Example Request: POST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Remove User's Administrative Privileges \u00b6 note This command requires administrative privileges Example Request: DELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Users \u00b6 List all users \u00b6 note This command requires administrative privileges Example Request: GET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } ] }","title":"Controller API v2.3"},{"location":"reference-guide/controller-api/v2.3/#controller-api-v23","text":"This is the v2.3 REST API for the Controller.","title":"Controller API v2.3"},{"location":"reference-guide/controller-api/v2.3/#whats-new","text":"New! /v2/apps/{name}/logs endpoint was fixed and no longer returns b'log data' and instead returns a normal string log data","title":"What's New"},{"location":"reference-guide/controller-api/v2.3/#authentication","text":"","title":"Authentication"},{"location":"reference-guide/controller-api/v2.3/#register-a-new-user","text":"Example Request: POST /v2/auth/register/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json { \"username\": \"test\", \"password\": \"opensesame\", \"email\": \"test@example.com\" } Optional Parameters: { \"first_name\": \"test\", \"last_name\": \"testerson\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] }","title":"Register a New User"},{"location":"reference-guide/controller-api/v2.3/#log-in","text":"Example Request: POST /v2/auth/login/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json {\"username\": \"test\", \"password\": \"opensesame\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"token\": \"abc123\"}","title":"Log in"},{"location":"reference-guide/controller-api/v2.3/#cancel-account","text":"Example Request: DELETE /v2/auth/cancel/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Cancel Account"},{"location":"reference-guide/controller-api/v2.3/#who-am-i","text":"Example Request: GET /v2/auth/whoami/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] }","title":"Who Am I"},{"location":"reference-guide/controller-api/v2.3/#regenerate-token","text":"note This command could require administrative privileges Example Request: POST /v2/auth/tokens/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional Parameters: { \"username\" : \"test\" \"all\" : \"true\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"token\": \"abc123\"}","title":"Regenerate Token"},{"location":"reference-guide/controller-api/v2.3/#change-password","text":"Example Request: POST /v2/auth/passwd/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"password\": \"foo\", \"new_password\": \"bar\" } Optional parameters: {\"username\": \"testuser\"} note Using the username parameter requires administrative privileges and makes the password parameter optional. Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Change Password"},{"location":"reference-guide/controller-api/v2.3/#applications","text":"","title":"Applications"},{"location":"reference-guide/controller-api/v2.3/#list-all-applications","text":"Example Request: GET /v2/apps HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List all Applications"},{"location":"reference-guide/controller-api/v2.3/#create-an-application","text":"Example Request: POST /v2/apps/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 Optional parameters: {\"id\": \"example-go\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create an Application"},{"location":"reference-guide/controller-api/v2.3/#destroy-an-application","text":"Example Request: DELETE /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Destroy an Application"},{"location":"reference-guide/controller-api/v2.3/#list-application-details","text":"Example Request: GET /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example-go\", \"owner\": \"test\", \"structure\": {}, \"updated\": \"2014-01-01T00:00:00UTC\", \"url\": \"example-go.example.com\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"List Application Details"},{"location":"reference-guide/controller-api/v2.3/#update-application-details","text":"Example Request: POST /v2/apps/example-go/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional parameters: { \"owner\": \"test\" } Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 1.8.0 Content-Type: application/json","title":"Update Application Details"},{"location":"reference-guide/controller-api/v2.3/#retrieve-application-logs","text":"Example Request: GET /v2/apps/example-go/logs/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Optional URL Query Parameters: ?log_lines= Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: text/plain \"16:51:14 drycc[api]: test created initial release\\n\"","title":"Retrieve Application Logs"},{"location":"reference-guide/controller-api/v2.3/#run-one-off-commands","text":"POST /v2/apps/example-go/run/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"command\": \"echo hi\"} Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"exit_code\": 0, \"output\": \"hi\\n\"}","title":"Run one-off Commands"},{"location":"reference-guide/controller-api/v2.3/#certificates","text":"","title":"Certificates"},{"location":"reference-guide/controller-api/v2.3/#list-all-certificates","text":"Example Request: GET /v2/certs HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22.32.34:20Z\", \"updated\": \"2016-06-22.32.34:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" } ] }","title":"List all Certificates"},{"location":"reference-guide/controller-api/v2.3/#get-certificate-details","text":"Example Request: GET /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22.32.34:20Z\", \"updated\": \"2016-06-22.32.34:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" }","title":"Get Certificate Details"},{"location":"reference-guide/controller-api/v2.3/#create-certificate","text":"Example Request: POST /v2/certs/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"name\": \"foo\" \"certificate\": \"-----BEGIN CERTIFICATE-----\", \"key\": \"-----BEGIN RSA PRIVATE KEY-----\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"id\": 22, \"owner\": \"test\", \"san\": [], \"domains\": [], \"created\": \"2016-06-22.32.34:20Z\", \"updated\": \"2016-06-22.32.34:20Z\", \"name\": \"foo\", \"common_name\": \"bar.com\", \"fingerprint\": \"7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0\", \"expires\": \"2017-01-14T23:57:57Z\", \"starts\": \"2016-01-15T23:57:57Z\", \"issuer\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\", \"subject\": \"/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc\" }","title":"Create Certificate"},{"location":"reference-guide/controller-api/v2.3/#destroy-a-certificate","text":"Example Request: DELETE /v2/certs/foo HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Destroy a Certificate"},{"location":"reference-guide/controller-api/v2.3/#attach-a-domain-to-a-certificate","text":"Example Request: POST /v2/certs/foo/domain/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"domain\": \"test.com\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Attach a Domain to a Certificate"},{"location":"reference-guide/controller-api/v2.3/#remove-a-domain-from-a-certificate","text":"Example Request: DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Remove a Domain from a Certificate"},{"location":"reference-guide/controller-api/v2.3/#enable-or-disable-tls","text":"Example Request: POST /v2/apps/example-go/tls/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 { \"https_enforced\": true } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"app\": \"example-go\", \"owner\": \"test\", \"https_enforced\": true, \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Enable or disable TLS"},{"location":"reference-guide/controller-api/v2.3/#get-tls-status","text":"Example Request: GET /v2/apps/example-go/tls/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"app\": \"example-go\", \"owner\": \"test\", \"https_enforced\": false, \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Get TLS status"},{"location":"reference-guide/controller-api/v2.3/#pods","text":"","title":"Pods"},{"location":"reference-guide/controller-api/v2.3/#list-all-pods","text":"Example Request: GET /v2/apps/example-go/pods/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] }","title":"List all Pods"},{"location":"reference-guide/controller-api/v2.3/#list-all-pods-by-type","text":"Example Request: GET /v2/apps/example-go/pods/web/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"results\": [ { \"name\": \"go-v2-web-e7dej\", \"release\": \"v2\", \"started\": \"2014-01-01T00:00:00Z\", \"state\": \"up\", \"type\": \"web\" } ] }","title":"List all Pods by Type"},{"location":"reference-guide/controller-api/v2.3/#restart-all-pods","text":"Example Request: POST /v2/apps/example-go/pods/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart All Pods"},{"location":"reference-guide/controller-api/v2.3/#restart-pods-by-type","text":"Example Request: POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart Pods by Type"},{"location":"reference-guide/controller-api/v2.3/#restart-pods-by-type-and-name","text":"Example Request: POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json [ { \"name\": \"go-v2-web-atots\", \"release\": \"v2\", \"started\": \"2016-04-11T21:07:54Z\", \"state\": \"up\", \"type\": \"web\" } ]","title":"Restart Pods by Type and Name"},{"location":"reference-guide/controller-api/v2.3/#scale-pods","text":"Example Request: POST /v2/apps/example-go/scale/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"web\": 3} Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Scale Pods"},{"location":"reference-guide/controller-api/v2.3/#configuration","text":"","title":"Configuration"},{"location":"reference-guide/controller-api/v2.3/#list-application-configuration","text":"Example Request: GET /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"List Application Configuration"},{"location":"reference-guide/controller-api/v2.3/#create-new-config","text":"Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": \"world\", \"PLATFORM\": \"drycc\"}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v3\", \"HELLO\": \"world\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create new Config"},{"location":"reference-guide/controller-api/v2.3/#unset-config-variable","text":"Example Request: POST /v2/apps/example-go/config/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"values\": {\"HELLO\": null}} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"owner\": \"test\", \"app\": \"example-go\", \"values\": { \"DRYCC_APP\": \"example-go\", \"DRYCC_RELEASE\": \"v4\", \"PLATFORM\": \"drycc\" }, \"memory\": {}, \"cpu\": {}, \"tags\": {}, \"healthcheck\": {}, \"created\": \"2014-01-01T00:00:00UTC\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Unset Config Variable"},{"location":"reference-guide/controller-api/v2.3/#domains","text":"","title":"Domains"},{"location":"reference-guide/controller-api/v2.3/#list-application-domains","text":"Example Request: GET /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" } ] }","title":"List Application Domains"},{"location":"reference-guide/controller-api/v2.3/#add-domain","text":"Example Request: POST /v2/apps/example-go/domains/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {'domain': 'example.example.com'} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"domain\": \"example.example.com\", \"owner\": \"test\", \"updated\": \"2014-01-01T00:00:00UTC\" }","title":"Add Domain"},{"location":"reference-guide/controller-api/v2.3/#remove-domain","text":"Example Request: DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Remove Domain"},{"location":"reference-guide/controller-api/v2.3/#builds","text":"","title":"Builds"},{"location":"reference-guide/controller-api/v2.3/#list-application-builds","text":"Example Request: GET /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\\\"/runner/init\\\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db\", \"image\": \"example-go\", \"owner\": \"test\", \"procfile\": { \"web\": \"example-go\" }, \"sha\": \"060da68f\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List Application Builds"},{"location":"reference-guide/controller-api/v2.3/#create-application-build","text":"Example Request: POST /v2/apps/example-go/builds/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"image\": \"drycc/example-go:latest\"} Optional Parameters: { \"procfile\": { \"web\": \"./cmd\" } } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"app\": \"example-go\", \"created\": \"2014-01-01T00:00:00UTC\", \"dockerfile\": \"\", \"image\": \"drycc/example-go:latest\", \"owner\": \"test\", \"procfile\": {}, \"sha\": \"\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Create Application Build"},{"location":"reference-guide/controller-api/v2.3/#releases","text":"","title":"Releases"},{"location":"reference-guide/controller-api/v2.3/#list-application-releases","text":"Example Request: GET /v2/apps/example-go/releases/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 3, \"next\": null, \"previous\": null, \"results\": [ { \"app\": \"example-go\", \"build\": \"2.3d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"ed637ceb-5d32-44bd-9406-d326a777a513\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test changed nothing\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 3 }, { \"app\": \"example-go\", \"build\": \"2.3d8e4b-600e-4425-a85c-ffc7ea607f61\", \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test deployed 060da68\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 2 }, { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 } ] }","title":"List Application Releases"},{"location":"reference-guide/controller-api/v2.3/#list-release-details","text":"Example Request: GET /v2/apps/example-go/releases/v2/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"app\": \"example-go\", \"build\": null, \"config\": \"95bd6dea-1685-4f78-a03d-fd7270b058d1\", \"created\": \"2014-01-01T00:00:00UTC\", \"owner\": \"test\", \"summary\": \"test created initial release\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\", \"version\": 1 }","title":"List Release Details"},{"location":"reference-guide/controller-api/v2.3/#rollback-release","text":"Example Request: POST /v2/apps/example-go/releases/rollback/ HTTP/1.1 Host: drycc.example.com Content-Type: application/json Authorization: token abc123 {\"version\": 1} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json {\"version\": 5}","title":"Rollback Release"},{"location":"reference-guide/controller-api/v2.3/#keys","text":"","title":"Keys"},{"location":"reference-guide/controller-api/v2.3/#list-keys","text":"Example Request: GET /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"test@example.com\", \"owner\": \"test\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" } ] }","title":"List Keys"},{"location":"reference-guide/controller-api/v2.3/#add-key-to-user","text":"Example Request: POST /v2/keys/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 { \"id\": \"example\", \"public\": \"ssh-rsa <...>\" } Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"created\": \"2014-01-01T00:00:00UTC\", \"id\": \"example\", \"owner\": \"example\", \"public\": \"ssh-rsa <...>\", \"updated\": \"2014-01-01T00:00:00UTC\", \"uuid\": \"de1bf5b5-4a72-4f94-a10c-d2a3741cdf75\" }","title":"Add Key to User"},{"location":"reference-guide/controller-api/v2.3/#remove-key-from-user","text":"Example Request: DELETE /v2/keys/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Remove Key from User"},{"location":"reference-guide/controller-api/v2.3/#permissions","text":"","title":"Permissions"},{"location":"reference-guide/controller-api/v2.3/#list-application-permissions","text":"note This does not include the app owner. Example Request: GET /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"users\": [ \"test\", \"foo\" ] }","title":"List Application Permissions"},{"location":"reference-guide/controller-api/v2.3/#create-application-permission","text":"Example Request: POST /v2/apps/example-go/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Create Application Permission"},{"location":"reference-guide/controller-api/v2.3/#remove-application-permission","text":"Example Request: DELETE /v2/apps/example-go/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Remove Application Permission"},{"location":"reference-guide/controller-api/v2.3/#list-administrators","text":"Example Request: GET /v2/admin/perms/ HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 2, \"next\": null \"previous\": null, \"results\": [ { \"username\": \"test\", \"is_superuser\": true }, { \"username\": \"foo\", \"is_superuser\": true } ] }","title":"List Administrators"},{"location":"reference-guide/controller-api/v2.3/#grant-user-administrative-privileges","text":"note This command requires administrative privileges Example Request: POST /v2/admin/perms HTTP/1.1 Host: drycc.example.com Authorization: token abc123 {\"username\": \"example\"} Example Response: HTTP/1.1 201 CREATED DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Grant User Administrative Privileges"},{"location":"reference-guide/controller-api/v2.3/#remove-users-administrative-privileges","text":"note This command requires administrative privileges Example Request: DELETE /v2/admin/perms/example HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 204 NO CONTENT DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0","title":"Remove User's Administrative Privileges"},{"location":"reference-guide/controller-api/v2.3/#users","text":"","title":"Users"},{"location":"reference-guide/controller-api/v2.3/#list-all-users","text":"note This command requires administrative privileges Example Request: GET /v2/users HTTP/1.1 Host: drycc.example.com Authorization: token abc123 Example Response: HTTP/1.1 200 OK DRYCC_API_VERSION: 2.3 DRYCC_PLATFORM_VERSION: 2.3.0 Content-Type: application/json { \"count\": 1, \"next\": null, \"previous\": null, \"results\": [ { \"id\": 1, \"last_login\": \"2014-10-19T22:01:00.601Z\", \"is_superuser\": true, \"username\": \"test\", \"first_name\": \"test\", \"last_name\": \"testerson\", \"email\": \"test@example.com\", \"is_staff\": true, \"is_active\": true, \"date_joined\": \"2014-10-19T22:01:00.601Z\", \"groups\": [], \"user_permissions\": [] } ] }","title":"List all users"},{"location":"roadmap/planning-process/","text":"Planning Process \u00b6 Drycc features a lightweight process that emphasizes openness and ensures every community member can be an integral part of planning for the future. The Role of Maintainers \u00b6 Maintainers lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project. Open Roadmap \u00b6 The Drycc Roadmap is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings. Contributing to the Roadmap \u00b6 Proposals and issues can be opened by anyone. Every member of the community is welcome to participate in the discussion by providing feedback and/or offering counter-proposals. Release Milestones \u00b6 The Roadmap gets delivered progressively via the Release Schedule . Releases are defined during Release Planning Meetings and managed using GitHub Milestones which track specific deliverables and work-in-progress. Release Planning Meetings \u00b6 Major decisions affecting the Roadmap are discussed during Release Planning Meetings on the first Thursday of each month, aligned with the Release Schedule . Release Planning Meetings are open to the public with access coordinated via the Drycc #community Slack channel . Notes from past meetings are below, along with links to a recording of the entire meeting on YouTube. Credits \u00b6 Thanks to Amy Lindburg and our friends at Podman for their inspiration.","title":"Planning Process"},{"location":"roadmap/planning-process/#planning-process","text":"Drycc features a lightweight process that emphasizes openness and ensures every community member can be an integral part of planning for the future.","title":"Planning Process"},{"location":"roadmap/planning-process/#the-role-of-maintainers","text":"Maintainers lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.","title":"The Role of Maintainers"},{"location":"roadmap/planning-process/#open-roadmap","text":"The Drycc Roadmap is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.","title":"Open Roadmap"},{"location":"roadmap/planning-process/#contributing-to-the-roadmap","text":"Proposals and issues can be opened by anyone. Every member of the community is welcome to participate in the discussion by providing feedback and/or offering counter-proposals.","title":"Contributing to the Roadmap"},{"location":"roadmap/planning-process/#release-milestones","text":"The Roadmap gets delivered progressively via the Release Schedule . Releases are defined during Release Planning Meetings and managed using GitHub Milestones which track specific deliverables and work-in-progress.","title":"Release Milestones"},{"location":"roadmap/planning-process/#release-planning-meetings","text":"Major decisions affecting the Roadmap are discussed during Release Planning Meetings on the first Thursday of each month, aligned with the Release Schedule . Release Planning Meetings are open to the public with access coordinated via the Drycc #community Slack channel . Notes from past meetings are below, along with links to a recording of the entire meeting on YouTube.","title":"Release Planning Meetings"},{"location":"roadmap/planning-process/#credits","text":"Thanks to Amy Lindburg and our friends at Podman for their inspiration.","title":"Credits"},{"location":"roadmap/releases/","text":"Releases \u00b6 Drycc uses a continuous delivery approach for creating releases. Every merged commit that passes testing results in a deliverable that can be given a semantic version tag and shipped. The master git branch of a project should always work. Only changes considered ready to be released publicly are merged. Components Release as Needed \u00b6 Drycc components release new versions as often as needed. Fixing a high priority bug requires the project maintainer to create a new patch release. Merging a backward-compatible feature implies a minor release. By releasing often, each component release becomes a safe and routine event. This makes it faster and easier for users to obtain specific fixes. Continuous delivery also reduces the work necessary to release a product such as Drycc Workflow, which integrates several components. \"Components\" applies not just to Drycc Workflow projects, but also to development and release tools, to Container base images, and to other Drycc projects that do semantic version releases. See \" How to Release a Component \" for more detail. Workflow Releases Each Month \u00b6 Drycc Workflow has a regular, public release cadence. From v2.8.0 onward, new Workflow feature releases arrive on the first Thursday of each month. Patch releases are created at any time, as needed. GitHub milestones are used to communicate the content and timing of major and minor releases, and longer-term planning is visible at the Roadmap . Workflow release timing is not linked to specific features. If a feature is merged before the release date, it is included in the next release. See \" How to Release Workflow \" for more detail. Semantic Versioning \u00b6 Drycc releases comply with semantic versioning , with the \"public API\" broadly defined as: REST, gRPC, or other API that is network-accessible Library or framework API intended for public use \"Pluggable\" socket-level protocols users can redirect CLI commands and output formats In general, changes to anything a user might reasonably link to, customize, or integrate with should be backward-compatible, or else require a major release. Drycc users can be confident that upgrading to a patch or to a minor release will not break anything. How to Release a Component \u00b6 Most Drycc projects are \"components\" which produce a Container image or binary executable as a deliverable. This section leads a maintainer through creating a component release. Step 1: Update Code and Run the Release Tool \u00b6 Major or minor releases should happen on the master branch. Patch releases should check out the previous release tag and cherry-pick specific commits from master. Note: if a patch release, the release artifact will have to be manually promoted by triggering the component-promote job with the following values: COMPONENT_NAME= COMPONENT_SHA= Make sure you have the dryccrel release tool in your search $PATH . Run dryccrel release once with a fake semver tag to proofread the changelog content. (If HEAD of master is not what is intended for the release, add the --sha flag as described in dryccrel release --help .) $ dryccrel release controller v0.0.0 Doing a dry run of the component release... skipping commit 943a49267eeb28546819a266654806cfcbae0e38 Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38 ### v2.8.1 -> v0.0.0 #### Fixes - [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output Based on the changelog content, determine whether the component deserves a minor or patch release. Run the command again with that semver tag and --dry-run=false . You will still be asked for confirmation before the release is created: $ dryccrel release controller v2.8.2 --dry-run=false skipping commit 943a49267eeb28546819a266654806cfcbae0e38 Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38 ### v2.8.1 -> v2.8.2 #### Fixes - [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output Please review the above changelog contents and ensure: 1. All intended commits are mentioned 2. The changes agree with the semver release tag (major, minor, or patch) Create release for Drycc Controller v2.8.2? [y/n]: y New release is available at https://github.com/drycc/controller/releases/tag/v2.8.2 Step 2: Verify the Component is Available \u00b6 Tagging the component (see Step 1 ) starts a CI job that eventually results in an artifact being made available for public download. Please see the CI flow diagrams for details. Double-check that the artifact is available, either by a podman pull command or by running the appropriate installer script. If the artifact can't be downloaded, ensure that its CI release jobs are still in progress, or fix whatever issue arose in the pipeline. For example, the master merge pipeline may have failed to promote the :git-abc1d23 candidate image and needs to be restarted with that component and commit. If the component has a correlating Kubernetes Helm chart, this chart will also be packaged, signed and uploaded to its production chart repo. Please verify it can be fetched (and verified): $ helm fetch oci://registry.drycc.cc/charts/controller --version 1.0.0 Verification: &{0xc4207ec870 sha256:026e766e918ff28d2a7041bc3d560d149ee7eb0cb84165c9d9d00a3045ff45c3 controller-v1.0.1.tgz} How to Release Workflow \u00b6 Drycc Workflow integrates multiple component releases together with a Kubernetes Helm chart deliverable. This section leads a maintainer through creating a Workflow release. Step 1: Set Environment Variables \u00b6 Export two environment variables that will be used in later steps: export WORKFLOW_RELEASE=v2.17.0 WORKFLOW_PREV_RELEASE=v2.16.0 # for example Step 2: Tag Supporting Repositories \u00b6 Some Workflow components not in the Helm chart must also be tagged in sync with the release. Follow the component release process above and ensure that these components are tagged: drycc/workflow-cli drycc/workflow-e2e The version number for drycc/workflow-cli should always match the overall Workflow version number. Step 3: Create Helm Chart \u00b6 To create and stage a release candidate chart for Workflow, we will build the workflow-chart-stage job with the following parameters: RELEASE_TAG=$WORKFLOW_RELEASE This job will gather all of the latest component release tags and use these to specify the versions of all component charts. It will then package the Workflow chart, upload it to the staging chart repo and kick off an e2e run against said chart. Step 4: Manual Testing \u00b6 Now it's time to go above and beyond current CI tests. Create a testing matrix spreadsheet (copying from the previous document is a good start) and sign up testers to cover all permutations. Testers should pay special attention to the overall user experience, make sure upgrading from earlier versions is smooth, and cover various storage configurations and Kubernetes versions and infrastructure providers. When showstopper-level bugs are found, the process is as follows: Create a component PR that fixes the bug. Once the PR passes and is reviewed, merge it and do a new component release Trigger the same workflow-chart-stage job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging. Step 5: Release the Chart \u00b6 When testing has completed without uncovering any new showstopper bugs, kick off the workflow-chart-release job with the following parameter: RELEASE_TAG=$WORKFLOW_RELEASE This job will copy the release candidate chart (now approved by CI and manual testing) from the staging repo to the production repo, signing it if it has not done so already. Step 6: Assemble Master Changelog \u00b6 Each component already updated its release notes on GitHub with CHANGELOG content. We'll now generate the master changelog for the Workflow chart, consisting of all component and auxilliary repo changes. We'll employ the requirements.lock file from the WORKFLOW_PREV_RELEASE chart, as well as a repo-to-chart-name mapping file , this time invoking dryccrel changelog global to get all component changes between the chart versions existing in the WORKFLOW_PREV_RELEASE chart and the most recent releases existing in GitHub. (Therefore, if there are any unreleased commits in a component repo, they will not appear here): helm fetch --untar oci://registry.drycc.cc/charts/workflow --version $WORKFLOW_PREV_RELEASE dryccrel changelog global workflow/requirements.lock map.json > changelog-$WORKFLOW_RELEASE.md This master changelog should then be placed into a single gist. The file will also be added to the documentation update PR created in the next step. Step 7: Update Documentation \u00b6 Create a new pull request at drycc/workflow that updates version references to the new release. Use git grep $WORKFLOW_PREV_RELEASE to find any references, but be careful not to change CHANGELOG.md . Place the $WORKFLOW_RELEASE master changelog generated in Step 7 in the changelogs directory. Make sure to add a header to the page to make it clear that this is for a Workflow release, e.g.: ## Workflow v2.16.0 -> v2.17.0 Once the PR has been reviewed and merged, do a component release of drycc/workflow itself. The version number for drycc/workflow should always match the overall Workflow version number. Step 8: Close GitHub Milestones \u00b6 Create a pull request at seed-repo to close the release milestone and create the next one. When changes are merged to seed-repo, milestones on all relevant projects will be updated. If there are open issues attached to the milestone, move them to the next upcoming milestone before merging the pull request. Milestones map to Drycc Workflow releases in drycc/workflow . These milestones do not correspond to individual component release tags. Step 9: Release Workflow CLI Stable \u00b6 Now that the $WORKFLOW_RELEASE version of Workflow CLI has been vetted, we can push stable artifacts based on this version. Kick off https://ci.drycc.info/job/workflow-cli-build-stable/ with the TAG build parameter of $WORKFLOW_RELEASE and then verify stable artifacts are available and appropriately updated after the job completes: $ curl -sfL https://www.drycc.cc/install-cli.sh | bash - $ ./drycc version # (Should show $WORKFLOW_RELEASE) Step 10: Let Everyone Know \u00b6 Let the rest of the team know they can start blogging and tweeting about the new Workflow release. Post a message to the #company channel on Slack. Include a link to the released chart and to the master CHANGELOG: @here Drycc Workflow v2.17.0 is now live! Master CHANGELOG: https://drycc.info/docs/workflow/changelogs/v2.17.0/ You're done with the release. Nice job!","title":"Releases"},{"location":"roadmap/releases/#releases","text":"Drycc uses a continuous delivery approach for creating releases. Every merged commit that passes testing results in a deliverable that can be given a semantic version tag and shipped. The master git branch of a project should always work. Only changes considered ready to be released publicly are merged.","title":"Releases"},{"location":"roadmap/releases/#components-release-as-needed","text":"Drycc components release new versions as often as needed. Fixing a high priority bug requires the project maintainer to create a new patch release. Merging a backward-compatible feature implies a minor release. By releasing often, each component release becomes a safe and routine event. This makes it faster and easier for users to obtain specific fixes. Continuous delivery also reduces the work necessary to release a product such as Drycc Workflow, which integrates several components. \"Components\" applies not just to Drycc Workflow projects, but also to development and release tools, to Container base images, and to other Drycc projects that do semantic version releases. See \" How to Release a Component \" for more detail.","title":"Components Release as Needed"},{"location":"roadmap/releases/#workflow-releases-each-month","text":"Drycc Workflow has a regular, public release cadence. From v2.8.0 onward, new Workflow feature releases arrive on the first Thursday of each month. Patch releases are created at any time, as needed. GitHub milestones are used to communicate the content and timing of major and minor releases, and longer-term planning is visible at the Roadmap . Workflow release timing is not linked to specific features. If a feature is merged before the release date, it is included in the next release. See \" How to Release Workflow \" for more detail.","title":"Workflow Releases Each Month"},{"location":"roadmap/releases/#semantic-versioning","text":"Drycc releases comply with semantic versioning , with the \"public API\" broadly defined as: REST, gRPC, or other API that is network-accessible Library or framework API intended for public use \"Pluggable\" socket-level protocols users can redirect CLI commands and output formats In general, changes to anything a user might reasonably link to, customize, or integrate with should be backward-compatible, or else require a major release. Drycc users can be confident that upgrading to a patch or to a minor release will not break anything.","title":"Semantic Versioning"},{"location":"roadmap/releases/#how-to-release-a-component","text":"Most Drycc projects are \"components\" which produce a Container image or binary executable as a deliverable. This section leads a maintainer through creating a component release.","title":"How to Release a Component"},{"location":"roadmap/releases/#step-1-update-code-and-run-the-release-tool","text":"Major or minor releases should happen on the master branch. Patch releases should check out the previous release tag and cherry-pick specific commits from master. Note: if a patch release, the release artifact will have to be manually promoted by triggering the component-promote job with the following values: COMPONENT_NAME= COMPONENT_SHA= Make sure you have the dryccrel release tool in your search $PATH . Run dryccrel release once with a fake semver tag to proofread the changelog content. (If HEAD of master is not what is intended for the release, add the --sha flag as described in dryccrel release --help .) $ dryccrel release controller v0.0.0 Doing a dry run of the component release... skipping commit 943a49267eeb28546819a266654806cfcbae0e38 Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38 ### v2.8.1 -> v0.0.0 #### Fixes - [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output Based on the changelog content, determine whether the component deserves a minor or patch release. Run the command again with that semver tag and --dry-run=false . You will still be asked for confirmation before the release is created: $ dryccrel release controller v2.8.2 --dry-run=false skipping commit 943a49267eeb28546819a266654806cfcbae0e38 Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38 ### v2.8.1 -> v2.8.2 #### Fixes - [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output Please review the above changelog contents and ensure: 1. All intended commits are mentioned 2. The changes agree with the semver release tag (major, minor, or patch) Create release for Drycc Controller v2.8.2? [y/n]: y New release is available at https://github.com/drycc/controller/releases/tag/v2.8.2","title":"Step 1: Update Code and Run the Release Tool"},{"location":"roadmap/releases/#step-2-verify-the-component-is-available","text":"Tagging the component (see Step 1 ) starts a CI job that eventually results in an artifact being made available for public download. Please see the CI flow diagrams for details. Double-check that the artifact is available, either by a podman pull command or by running the appropriate installer script. If the artifact can't be downloaded, ensure that its CI release jobs are still in progress, or fix whatever issue arose in the pipeline. For example, the master merge pipeline may have failed to promote the :git-abc1d23 candidate image and needs to be restarted with that component and commit. If the component has a correlating Kubernetes Helm chart, this chart will also be packaged, signed and uploaded to its production chart repo. Please verify it can be fetched (and verified): $ helm fetch oci://registry.drycc.cc/charts/controller --version 1.0.0 Verification: &{0xc4207ec870 sha256:026e766e918ff28d2a7041bc3d560d149ee7eb0cb84165c9d9d00a3045ff45c3 controller-v1.0.1.tgz}","title":"Step 2: Verify the Component is Available"},{"location":"roadmap/releases/#how-to-release-workflow","text":"Drycc Workflow integrates multiple component releases together with a Kubernetes Helm chart deliverable. This section leads a maintainer through creating a Workflow release.","title":"How to Release Workflow"},{"location":"roadmap/releases/#step-1-set-environment-variables","text":"Export two environment variables that will be used in later steps: export WORKFLOW_RELEASE=v2.17.0 WORKFLOW_PREV_RELEASE=v2.16.0 # for example","title":"Step 1: Set Environment Variables"},{"location":"roadmap/releases/#step-2-tag-supporting-repositories","text":"Some Workflow components not in the Helm chart must also be tagged in sync with the release. Follow the component release process above and ensure that these components are tagged: drycc/workflow-cli drycc/workflow-e2e The version number for drycc/workflow-cli should always match the overall Workflow version number.","title":"Step 2: Tag Supporting Repositories"},{"location":"roadmap/releases/#step-3-create-helm-chart","text":"To create and stage a release candidate chart for Workflow, we will build the workflow-chart-stage job with the following parameters: RELEASE_TAG=$WORKFLOW_RELEASE This job will gather all of the latest component release tags and use these to specify the versions of all component charts. It will then package the Workflow chart, upload it to the staging chart repo and kick off an e2e run against said chart.","title":"Step 3: Create Helm Chart"},{"location":"roadmap/releases/#step-4-manual-testing","text":"Now it's time to go above and beyond current CI tests. Create a testing matrix spreadsheet (copying from the previous document is a good start) and sign up testers to cover all permutations. Testers should pay special attention to the overall user experience, make sure upgrading from earlier versions is smooth, and cover various storage configurations and Kubernetes versions and infrastructure providers. When showstopper-level bugs are found, the process is as follows: Create a component PR that fixes the bug. Once the PR passes and is reviewed, merge it and do a new component release Trigger the same workflow-chart-stage job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging.","title":"Step 4: Manual Testing"},{"location":"roadmap/releases/#step-5-release-the-chart","text":"When testing has completed without uncovering any new showstopper bugs, kick off the workflow-chart-release job with the following parameter: RELEASE_TAG=$WORKFLOW_RELEASE This job will copy the release candidate chart (now approved by CI and manual testing) from the staging repo to the production repo, signing it if it has not done so already.","title":"Step 5: Release the Chart"},{"location":"roadmap/releases/#step-6-assemble-master-changelog","text":"Each component already updated its release notes on GitHub with CHANGELOG content. We'll now generate the master changelog for the Workflow chart, consisting of all component and auxilliary repo changes. We'll employ the requirements.lock file from the WORKFLOW_PREV_RELEASE chart, as well as a repo-to-chart-name mapping file , this time invoking dryccrel changelog global to get all component changes between the chart versions existing in the WORKFLOW_PREV_RELEASE chart and the most recent releases existing in GitHub. (Therefore, if there are any unreleased commits in a component repo, they will not appear here): helm fetch --untar oci://registry.drycc.cc/charts/workflow --version $WORKFLOW_PREV_RELEASE dryccrel changelog global workflow/requirements.lock map.json > changelog-$WORKFLOW_RELEASE.md This master changelog should then be placed into a single gist. The file will also be added to the documentation update PR created in the next step.","title":"Step 6: Assemble Master Changelog"},{"location":"roadmap/releases/#step-7-update-documentation","text":"Create a new pull request at drycc/workflow that updates version references to the new release. Use git grep $WORKFLOW_PREV_RELEASE to find any references, but be careful not to change CHANGELOG.md . Place the $WORKFLOW_RELEASE master changelog generated in Step 7 in the changelogs directory. Make sure to add a header to the page to make it clear that this is for a Workflow release, e.g.: ## Workflow v2.16.0 -> v2.17.0 Once the PR has been reviewed and merged, do a component release of drycc/workflow itself. The version number for drycc/workflow should always match the overall Workflow version number.","title":"Step 7: Update Documentation"},{"location":"roadmap/releases/#step-8-close-github-milestones","text":"Create a pull request at seed-repo to close the release milestone and create the next one. When changes are merged to seed-repo, milestones on all relevant projects will be updated. If there are open issues attached to the milestone, move them to the next upcoming milestone before merging the pull request. Milestones map to Drycc Workflow releases in drycc/workflow . These milestones do not correspond to individual component release tags.","title":"Step 8: Close GitHub Milestones"},{"location":"roadmap/releases/#step-9-release-workflow-cli-stable","text":"Now that the $WORKFLOW_RELEASE version of Workflow CLI has been vetted, we can push stable artifacts based on this version. Kick off https://ci.drycc.info/job/workflow-cli-build-stable/ with the TAG build parameter of $WORKFLOW_RELEASE and then verify stable artifacts are available and appropriately updated after the job completes: $ curl -sfL https://www.drycc.cc/install-cli.sh | bash - $ ./drycc version # (Should show $WORKFLOW_RELEASE)","title":"Step 9: Release Workflow CLI Stable"},{"location":"roadmap/releases/#step-10-let-everyone-know","text":"Let the rest of the team know they can start blogging and tweeting about the new Workflow release. Post a message to the #company channel on Slack. Include a link to the released chart and to the master CHANGELOG: @here Drycc Workflow v2.17.0 is now live! Master CHANGELOG: https://drycc.info/docs/workflow/changelogs/v2.17.0/ You're done with the release. Nice job!","title":"Step 10: Let Everyone Know"},{"location":"roadmap/roadmap/","text":"Drycc Workflow Roadmap \u00b6 The Drycc Workflow Roadmap is a community document created as part of the open Planning Process . Each roadmap item describes a high-level capability or grouping of features that are deemed important to the future of Drycc. Given the project's rapid Release Schedule , roadmap items are designed to provide a sense of direction over many releases. Interactive drycc run /bin/bash \u00b6 Provide the ability for developers to launch an interactive terminal session in their application environment. Related issues: https://github.com/drycc/workflow-cli/issues/28 https://github.com/drycc/drycc/issues/117 Log Streaming \u00b6 Stream application logs via drycc logs -f https://github.com/drycc/drycc/issues/465 Teams and Permissions \u00b6 Teams and Permissions represents a more flexible permissions model to allow more nuanced control to applications, capabilities and resources on the platform. There have been a number of proposals in this area which need to be reconciled for Drycc Workflow before we begin implementation. Related issues: Deploy Keys: https://github.com/drycc/drycc/issues/3875 Teams: https://github.com/drycc/drycc/issues/4173 Fine grained permissions: https://github.com/drycc/drycc/issues/4150 Admins create apps only: https://github.com/drycc/drycc/issues/4052 Admin Certificate Permissions: https://github.com/drycc/drycc/issues/4576#issuecomment-170987223 Monitoring \u00b6 Define and deliver alerts with Kapacitor: https://github.com/drycc/monitor/issues/44 Workflow Addons/Services \u00b6 Developers should be able to quickly and easily provision application dependencies using a services or addon abstraction. https://github.com/drycc/drycc/issues/231 Inbound/Outbound Webhooks \u00b6 Drycc Workflow should be able to send and receive webhooks from external systems. Facilitating integration with third party services like GitHub, Gitlab, Slack, Hipchat. Send webhook on platform events: https://github.com/drycc/drycc/issues/1486 (Workflow v2.10)","title":"Roadmap"},{"location":"roadmap/roadmap/#drycc-workflow-roadmap","text":"The Drycc Workflow Roadmap is a community document created as part of the open Planning Process . Each roadmap item describes a high-level capability or grouping of features that are deemed important to the future of Drycc. Given the project's rapid Release Schedule , roadmap items are designed to provide a sense of direction over many releases.","title":"Drycc Workflow Roadmap"},{"location":"roadmap/roadmap/#interactive-drycc-run-binbash","text":"Provide the ability for developers to launch an interactive terminal session in their application environment. Related issues: https://github.com/drycc/workflow-cli/issues/28 https://github.com/drycc/drycc/issues/117","title":"Interactive drycc run /bin/bash"},{"location":"roadmap/roadmap/#log-streaming","text":"Stream application logs via drycc logs -f https://github.com/drycc/drycc/issues/465","title":"Log Streaming"},{"location":"roadmap/roadmap/#teams-and-permissions","text":"Teams and Permissions represents a more flexible permissions model to allow more nuanced control to applications, capabilities and resources on the platform. There have been a number of proposals in this area which need to be reconciled for Drycc Workflow before we begin implementation. Related issues: Deploy Keys: https://github.com/drycc/drycc/issues/3875 Teams: https://github.com/drycc/drycc/issues/4173 Fine grained permissions: https://github.com/drycc/drycc/issues/4150 Admins create apps only: https://github.com/drycc/drycc/issues/4052 Admin Certificate Permissions: https://github.com/drycc/drycc/issues/4576#issuecomment-170987223","title":"Teams and Permissions"},{"location":"roadmap/roadmap/#monitoring","text":"Define and deliver alerts with Kapacitor: https://github.com/drycc/monitor/issues/44","title":"Monitoring"},{"location":"roadmap/roadmap/#workflow-addonsservices","text":"Developers should be able to quickly and easily provision application dependencies using a services or addon abstraction. https://github.com/drycc/drycc/issues/231","title":"Workflow Addons/Services"},{"location":"roadmap/roadmap/#inboundoutbound-webhooks","text":"Drycc Workflow should be able to send and receive webhooks from external systems. Facilitating integration with third party services like GitHub, Gitlab, Slack, Hipchat. Send webhook on platform events: https://github.com/drycc/drycc/issues/1486 (Workflow v2.10)","title":"Inbound/Outbound Webhooks"},{"location":"troubleshooting/","text":"Troubleshooting Workflow \u00b6 Common issues that users have run into when provisioning Workflow are detailed below. A Component Fails to Start \u00b6 For information on troubleshooting a failing component, see Troubleshooting with Kubectl . An Application Fails to Start \u00b6 For information on troubleshooting application deployment issues, see Troubleshooting Applications . Permission denied (publickey) \u00b6 The most common problem for this issue is the user forgetting to run drycc keys:add or add their private key to their SSH agent. To do so, run ssh-add ~/.ssh/id_rsa and try running git push drycc master again. If you happen get a Could not open a connection to your authentication agent error after trying to run ssh-add command above, you may need to load the SSH agent environment variables issuing the eval \"$(ssh-agent)\" command before. Other Issues \u00b6 Running into something not detailed here? Please open an issue or hop into #community on Slack for help!","title":"Troubleshooting Workflow"},{"location":"troubleshooting/#troubleshooting-workflow","text":"Common issues that users have run into when provisioning Workflow are detailed below.","title":"Troubleshooting Workflow"},{"location":"troubleshooting/#a-component-fails-to-start","text":"For information on troubleshooting a failing component, see Troubleshooting with Kubectl .","title":"A Component Fails to Start"},{"location":"troubleshooting/#an-application-fails-to-start","text":"For information on troubleshooting application deployment issues, see Troubleshooting Applications .","title":"An Application Fails to Start"},{"location":"troubleshooting/#permission-denied-publickey","text":"The most common problem for this issue is the user forgetting to run drycc keys:add or add their private key to their SSH agent. To do so, run ssh-add ~/.ssh/id_rsa and try running git push drycc master again. If you happen get a Could not open a connection to your authentication agent error after trying to run ssh-add command above, you may need to load the SSH agent environment variables issuing the eval \"$(ssh-agent)\" command before.","title":"Permission denied (publickey)"},{"location":"troubleshooting/#other-issues","text":"Running into something not detailed here? Please open an issue or hop into #community on Slack for help!","title":"Other Issues"},{"location":"troubleshooting/applications/","text":"Troubleshooting Applications \u00b6 This document describes how one can troubleshoot common issues when deploying or debugging an application that fails to start or deploy. Application has a Dockerfile, but a Buildpack Deployment Occurs \u00b6 When you deploy an application to Workflow using git push drycc master and the Builder attempts to deploy using the Buildpack workflow, check the following steps: Are you deploying the correct project? Are you pushing the correct git branch ( git push drycc )? Is the Dockerfile in the project's root directory? Have you committed the Dockerfile to the project? Application was Deployed, but is Failing to Start \u00b6 If you deployed your application but it is failing to start, you can use drycc logs to check why the application fails to boot. Sometimes, the application container may fail to boot without logging any information about the error. This typically occurs when the healthcheck configured for the application fails. In this case, you can start by troubleshooting using kubectl . You can inspect the application's current state by examining the pod deployed in the application's namespace. To do that, run $ kubectl --namespace=myapp get pods NAME READY STATUS RESTARTS AGE myapp-cmd-1585713350-3brbo 0/1 CrashLoopBackOff 2 43s We can then describe the pod and determine why it is failing to boot: Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 43s 43s 1 {default-scheduler } Normal Scheduled Successfully assigned myapp-cmd-1585713350-3brbo to kubernetes-node-1 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-cmd} Normal Created Created container with container id b86bd851a61f 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-cmd} Normal Started Started container with container id b86bd851a61f 37s 35s 1 {kubelet kubernetes-node-1} spec.containers{myapp-cmd} Warning Unhealthy Liveness probe failed: Get http://10.246.39.13:8000/healthz: dial tcp 10.246.39.13:8000: getsockopt: connection refused In this instance, we set the healthcheck initial delay timeout for the application at 1 second, which is too aggressive. The application needs some time to set up the API server after the container has booted. By increasing the healthcheck initial delay timeout to 10 seconds, the application is able to boot and is responding correctly. See Custom Health Checks for more information on how to customize the application's health checks to better suit the application's needs.","title":"Troubleshooting Applications"},{"location":"troubleshooting/applications/#troubleshooting-applications","text":"This document describes how one can troubleshoot common issues when deploying or debugging an application that fails to start or deploy.","title":"Troubleshooting Applications"},{"location":"troubleshooting/applications/#application-has-a-dockerfile-but-a-buildpack-deployment-occurs","text":"When you deploy an application to Workflow using git push drycc master and the Builder attempts to deploy using the Buildpack workflow, check the following steps: Are you deploying the correct project? Are you pushing the correct git branch ( git push drycc )? Is the Dockerfile in the project's root directory? Have you committed the Dockerfile to the project?","title":"Application has a Dockerfile, but a Buildpack Deployment Occurs"},{"location":"troubleshooting/applications/#application-was-deployed-but-is-failing-to-start","text":"If you deployed your application but it is failing to start, you can use drycc logs to check why the application fails to boot. Sometimes, the application container may fail to boot without logging any information about the error. This typically occurs when the healthcheck configured for the application fails. In this case, you can start by troubleshooting using kubectl . You can inspect the application's current state by examining the pod deployed in the application's namespace. To do that, run $ kubectl --namespace=myapp get pods NAME READY STATUS RESTARTS AGE myapp-cmd-1585713350-3brbo 0/1 CrashLoopBackOff 2 43s We can then describe the pod and determine why it is failing to boot: Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 43s 43s 1 {default-scheduler } Normal Scheduled Successfully assigned myapp-cmd-1585713350-3brbo to kubernetes-node-1 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-cmd} Normal Created Created container with container id b86bd851a61f 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-cmd} Normal Started Started container with container id b86bd851a61f 37s 35s 1 {kubelet kubernetes-node-1} spec.containers{myapp-cmd} Warning Unhealthy Liveness probe failed: Get http://10.246.39.13:8000/healthz: dial tcp 10.246.39.13:8000: getsockopt: connection refused In this instance, we set the healthcheck initial delay timeout for the application at 1 second, which is too aggressive. The application needs some time to set up the API server after the container has booted. By increasing the healthcheck initial delay timeout to 10 seconds, the application is able to boot and is responding correctly. See Custom Health Checks for more information on how to customize the application's health checks to better suit the application's needs.","title":"Application was Deployed, but is Failing to Start"},{"location":"troubleshooting/kubectl/","text":"Troubleshooting using Kubectl \u00b6 This document describes how one can use kubectl to debug any issues with the cluster. Diving into the Components \u00b6 Using kubectl , one can inspect the cluster's current state. When Workflow is installed with helm , Workflow is installed into the drycc namespace. To inspect if Workflow is running, run: $ kubectl --namespace=drycc get pods NAME READY STATUS RESTARTS AGE drycc-builder-gqum7 0/1 ContainerCreating 0 4s drycc-controller-h6lk6 0/1 ContainerCreating 0 4s drycc-controller-celery-cmxxn 0/3 ContainerCreating 0 4s drycc-database-56v39 0/1 ContainerCreating 0 4s drycc-logger-fluentbit-xihr1 0/1 Pending 0 2s drycc-logger-grupg 0/1 ContainerCreating 0 3s drycc-storage-c2exb 0/1 Pending 0 3s drycc-monitor-grafana-9ccur 0/1 Pending 0 3s drycc-monitor-telegraf-dc3y3 0/1 Pending 0 2s drycc-registry-5bor6 0/1 Pending 0 3s drycc-rabbitmq-0 0/1 ContainerCreating 0 3s Tip To save precious keystrokes, alias kubectl --namespace=drycc to kd so it is easier to type in the future. To fetch the logs of a specific component, use kubectl logs : $ kubectl --namespace=drycc logs drycc-controller-h6lk6 system information: Django Version: 1.9.6 Python 3.5.1 addgroup: gid '0' in use Django checks: System check identified no issues (2 silenced). [...] To dive into a running container to inspect its environment, use kubectl exec : $ kubectl --namespace=drycc exec -it drycc-database-56v39 gosu postgres psql psql (13.4 (Debian 13.4-1.pgdg100+1)) Type \"help\" for help. postgres=# \\l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -------------------+----------+----------+------------+------------+----------------------- drycc_controller | postgres | UTF8 | en_US.utf8 | en_US.utf8 | drycc_passport | postgres | UTF8 | en_US.utf8 | en_US.utf8 | postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows) postgres=# \\connect drycc_controller You are now connected to database \"drycc_controller\" as user \"postgres\". drycc_controller=# \\dt List of relations Schema | Name | Type | Owner --------+--------------------------------+-------+------------------- public | api_app | table | drycc_controller public | api_build | table | drycc_controller public | api_certificate | table | drycc_controller public | api_config | table | drycc_controller public | api_domain | table | drycc_controller public | api_key | table | drycc_controller public | api_push | table | drycc_controller public | api_release | table | drycc_controller public | auth_group | table | drycc_controller --More-- drycc_controller=# SELECT COUNT(*) from api_app; count ------- 0 (1 row)","title":"Troubleshooting using Kubectl"},{"location":"troubleshooting/kubectl/#troubleshooting-using-kubectl","text":"This document describes how one can use kubectl to debug any issues with the cluster.","title":"Troubleshooting using Kubectl"},{"location":"troubleshooting/kubectl/#diving-into-the-components","text":"Using kubectl , one can inspect the cluster's current state. When Workflow is installed with helm , Workflow is installed into the drycc namespace. To inspect if Workflow is running, run: $ kubectl --namespace=drycc get pods NAME READY STATUS RESTARTS AGE drycc-builder-gqum7 0/1 ContainerCreating 0 4s drycc-controller-h6lk6 0/1 ContainerCreating 0 4s drycc-controller-celery-cmxxn 0/3 ContainerCreating 0 4s drycc-database-56v39 0/1 ContainerCreating 0 4s drycc-logger-fluentbit-xihr1 0/1 Pending 0 2s drycc-logger-grupg 0/1 ContainerCreating 0 3s drycc-storage-c2exb 0/1 Pending 0 3s drycc-monitor-grafana-9ccur 0/1 Pending 0 3s drycc-monitor-telegraf-dc3y3 0/1 Pending 0 2s drycc-registry-5bor6 0/1 Pending 0 3s drycc-rabbitmq-0 0/1 ContainerCreating 0 3s Tip To save precious keystrokes, alias kubectl --namespace=drycc to kd so it is easier to type in the future. To fetch the logs of a specific component, use kubectl logs : $ kubectl --namespace=drycc logs drycc-controller-h6lk6 system information: Django Version: 1.9.6 Python 3.5.1 addgroup: gid '0' in use Django checks: System check identified no issues (2 silenced). [...] To dive into a running container to inspect its environment, use kubectl exec : $ kubectl --namespace=drycc exec -it drycc-database-56v39 gosu postgres psql psql (13.4 (Debian 13.4-1.pgdg100+1)) Type \"help\" for help. postgres=# \\l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -------------------+----------+----------+------------+------------+----------------------- drycc_controller | postgres | UTF8 | en_US.utf8 | en_US.utf8 | drycc_passport | postgres | UTF8 | en_US.utf8 | en_US.utf8 | postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows) postgres=# \\connect drycc_controller You are now connected to database \"drycc_controller\" as user \"postgres\". drycc_controller=# \\dt List of relations Schema | Name | Type | Owner --------+--------------------------------+-------+------------------- public | api_app | table | drycc_controller public | api_build | table | drycc_controller public | api_certificate | table | drycc_controller public | api_config | table | drycc_controller public | api_domain | table | drycc_controller public | api_key | table | drycc_controller public | api_push | table | drycc_controller public | api_release | table | drycc_controller public | auth_group | table | drycc_controller --More-- drycc_controller=# SELECT COUNT(*) from api_app; count ------- 0 (1 row)","title":"Diving into the Components"},{"location":"understanding-workflow/architecture/","text":"Architecture \u00b6 Drycc Workflow is built using a service oriented architecture. All components are published as a set of container images which can be deployed to any compliant Kubernetes cluster. Overview \u00b6 Operators use Helm to configure and install the Workflow components which interface directly with the underlying Kubernetes cluster. Service discovery, container availability and networking are all delegated to Kubernetes, while Workflow provides a clean and simple developer experience. Platform Services \u00b6 Drycc Workflow provides additional functionality to your Kubernetes cluster, including: Source to Image Builder which compiles your Application code via Buildpacks or Dockerfiles Cross-Pod Log Aggregation which gathers logs from all of your Application processes Simple REST API which powers the CLI and any external integrations Application release and rollback Authentication and Authorization to Application resources HTTP/HTTPS edge routing for your Applications Kubernetes-Native \u00b6 All platform components and applications deployed via Workflow expect to be running on an existing Kubernetes cluster. This means that you can happily run your Kubernetes-native workloads next to applications that are managed through Drycc Workflow. Application Layout and Edge Routing \u00b6 By default Workflow creates per-application Namespaces and Services so you can easily connect your applications to other on-cluster services through standard Kubernetes mechanisms. The router component is responsible for routing HTTP/s traffic to your Applications as well as proxying git push and platform API traffic. By default, the router component is deployed as a Kubernetes service with type LoadBalancer ; which, depending on your configuration, will provision a cloud-native load balancer automatically. The router automatically discovers routable Applications, SSL/TLS certificates and application-specific configurations through the use of Kubernetes annotations. Any changes to router configuration or certificates are applied within seconds. Topologies \u00b6 Drycc Workflow no longer dictates a specific topology or server count for your deployment. The platform components will happily run on single-server configurations as well as multi-server production clusters.","title":"Architecture"},{"location":"understanding-workflow/architecture/#architecture","text":"Drycc Workflow is built using a service oriented architecture. All components are published as a set of container images which can be deployed to any compliant Kubernetes cluster.","title":"Architecture"},{"location":"understanding-workflow/architecture/#overview","text":"Operators use Helm to configure and install the Workflow components which interface directly with the underlying Kubernetes cluster. Service discovery, container availability and networking are all delegated to Kubernetes, while Workflow provides a clean and simple developer experience.","title":"Overview"},{"location":"understanding-workflow/architecture/#platform-services","text":"Drycc Workflow provides additional functionality to your Kubernetes cluster, including: Source to Image Builder which compiles your Application code via Buildpacks or Dockerfiles Cross-Pod Log Aggregation which gathers logs from all of your Application processes Simple REST API which powers the CLI and any external integrations Application release and rollback Authentication and Authorization to Application resources HTTP/HTTPS edge routing for your Applications","title":"Platform Services"},{"location":"understanding-workflow/architecture/#kubernetes-native","text":"All platform components and applications deployed via Workflow expect to be running on an existing Kubernetes cluster. This means that you can happily run your Kubernetes-native workloads next to applications that are managed through Drycc Workflow.","title":"Kubernetes-Native"},{"location":"understanding-workflow/architecture/#application-layout-and-edge-routing","text":"By default Workflow creates per-application Namespaces and Services so you can easily connect your applications to other on-cluster services through standard Kubernetes mechanisms. The router component is responsible for routing HTTP/s traffic to your Applications as well as proxying git push and platform API traffic. By default, the router component is deployed as a Kubernetes service with type LoadBalancer ; which, depending on your configuration, will provision a cloud-native load balancer automatically. The router automatically discovers routable Applications, SSL/TLS certificates and application-specific configurations through the use of Kubernetes annotations. Any changes to router configuration or certificates are applied within seconds.","title":"Application Layout and Edge Routing"},{"location":"understanding-workflow/architecture/#topologies","text":"Drycc Workflow no longer dictates a specific topology or server count for your deployment. The platform components will happily run on single-server configurations as well as multi-server production clusters.","title":"Topologies"},{"location":"understanding-workflow/components/","text":"Components \u00b6 Workflow is comprised of a number of small, independent services that combine to create a distributed PaaS. All Workflow components are deployed as services (and associated controllers) in your Kubernetes cluster. If you are interested we have a more detailed exploration of the Workflow architecture . All of the componentry for Workflow is built with composability in mind. If you need to customize one of the components for your specific deployment or need the functionality in your own project we invite you to give it a shot! Controller \u00b6 Project Location: drycc/controller The controller component is an HTTP API server which serves as the endpoint for the drycc CLI. The controller provides all of the platform functionality as well as interfacing with your Kubernetes cluster. The controller persists all of its data to the database component. Passport \u00b6 Project Location: drycc/passport The passport component exposes a web API and provide OAuth2 authentication. Database \u00b6 Project Location: drycc/postgres The database component is a managed instance of PostgreSQL which holds a majority of the platforms state. Backups and WAL files are pushed to object storage via WAL-E . When the database is restarted, backups are fetched and replayed from object storage so no data is lost. Builder \u00b6 Project Location: drycc/builder The builder component is responsible for accepting code pushes via Git and managing the build process of your Application . The builder process is: Receives incoming git push requests over SSH Authenticates the user via SSH key fingerprint Authorizes the user's access to push code to the Application Starts the Application Build phase (see below) Triggers a new Release via the Controller Builder currently supports both buildpack and Dockerfile based builds. Project Location: drycc/imagebuilder For Buildpack-based deploys, the builder component will launch a one-shot Job in the drycc namespace. This job runs imagebuilder component which handles default and custom buildpacks (specified by .packbuilder ). The completed image is pushed to the managed Container registry on cluster. For more information about buildpacks see using buildpacks . Unlike buildpack-based, For Applications which contain a Dockerfile in the root of the repository, it generates a Container image (using the underlying Container engine). For more information see using Dockerfiles . Object Storage \u00b6 Project Location: drycc/storage All of the Workflow components that need to persist data will ship them to the object storage that was configured for the cluster.For example, database ships its WAL files, registry stores Container images, and slugbuilder stores slugs. Workflow supports either on or off-cluster storage. For production deployments we highly recommend that you configure off-cluster object storage . To facilitate experimentation, development and test environments, the default charts for Workflow include on-cluster storage via storage . If you also feel comfortable using Kubernetes persistent volumes you may configure storage to use persistent storage available in your environment. Registry \u00b6 Project Location: drycc/registry The registry component is a managed container registry which holds application images generated from the builder component. Registry persists the Container image images to either local storage (in development mode) or to object storage configured for the cluster. Logger: fluentbit, logger \u00b6 The logging subsystem consists of two components. Fluentbit handles log shipping and logger maintains a ring-buffer of application logs. Project Location: drycc/fluentbit Fluentbit is deployed to your Kubernetes cluster via Daemon Sets. Fluentbit subscribes to all container logs, decorates the output with Kubernetes metadata and can be configured to drain logs to multiple destinations. By default, Fluentbit ships logs to the logger component, which powers drycc logs . Project Location: drycc/logger The logger component receives log streams from fluentbit , collating by Application name. Logger does not persist logs to disk, instead maintaining an in-memory ring buffer. For more information on logger see the project documentation . Monitor \u00b6 Project Location: drycc/monitor The monitoring subsystem consists of two components: Telegraf and Grafana. Telegraf is the is the metrics collection agent that runs using the daemon set API. It runs on every worker node in the cluster, fetches information about the pods currently running and ships it to Prometheus. Grafana is a standalone graphing application. It natively supports Prometheus as a datasource and provides a robust engine for creating dashboards on top of timeseries data. Workflow provides a few dashboards out of the box for monitoring Drycc Workflow and Kubernetes. The dashboards can be used as a starting point for creating more custom dashboards to suit a user's needs. Prometheus \u00b6 Project Location: drycc/prometheus Prometheus is a system monitoring and alerting system. It was opensourced by SoundCloud in 2012 and is the second project both to join and to graduate within Cloud Native Computing Foundation after Kubernetes. Prometheus stores all metrics data as time series, i.e metrics information is stored along with the timestamp at which it was recorded, optional key-value pairs called as labels can also be stored along with metrics. Rabbitmq \u00b6 Project Location: drycc/rabbitmq RabbitMQ is the most widely deployed open source message broker. Controller use celery with rabbitMQ to execute the asynchronous task. HelmBroker \u00b6 Project Location: drycc/rabbitmq Helm Broker is a Service Broker that exposes Helm charts as Service Classes in Service Catalog. To do so, Helm Broker uses the concept of addons. An addon is an abstraction layer over a Helm chart which provides all information required to convert the chart into a Service Class. Prometheus \u00b6 Project Location: drycc/rabbitmq Prometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud. See Also \u00b6 Workflow Concepts Workflow Architecture","title":"Components"},{"location":"understanding-workflow/components/#components","text":"Workflow is comprised of a number of small, independent services that combine to create a distributed PaaS. All Workflow components are deployed as services (and associated controllers) in your Kubernetes cluster. If you are interested we have a more detailed exploration of the Workflow architecture . All of the componentry for Workflow is built with composability in mind. If you need to customize one of the components for your specific deployment or need the functionality in your own project we invite you to give it a shot!","title":"Components"},{"location":"understanding-workflow/components/#controller","text":"Project Location: drycc/controller The controller component is an HTTP API server which serves as the endpoint for the drycc CLI. The controller provides all of the platform functionality as well as interfacing with your Kubernetes cluster. The controller persists all of its data to the database component.","title":"Controller"},{"location":"understanding-workflow/components/#passport","text":"Project Location: drycc/passport The passport component exposes a web API and provide OAuth2 authentication.","title":"Passport"},{"location":"understanding-workflow/components/#database","text":"Project Location: drycc/postgres The database component is a managed instance of PostgreSQL which holds a majority of the platforms state. Backups and WAL files are pushed to object storage via WAL-E . When the database is restarted, backups are fetched and replayed from object storage so no data is lost.","title":"Database"},{"location":"understanding-workflow/components/#builder","text":"Project Location: drycc/builder The builder component is responsible for accepting code pushes via Git and managing the build process of your Application . The builder process is: Receives incoming git push requests over SSH Authenticates the user via SSH key fingerprint Authorizes the user's access to push code to the Application Starts the Application Build phase (see below) Triggers a new Release via the Controller Builder currently supports both buildpack and Dockerfile based builds. Project Location: drycc/imagebuilder For Buildpack-based deploys, the builder component will launch a one-shot Job in the drycc namespace. This job runs imagebuilder component which handles default and custom buildpacks (specified by .packbuilder ). The completed image is pushed to the managed Container registry on cluster. For more information about buildpacks see using buildpacks . Unlike buildpack-based, For Applications which contain a Dockerfile in the root of the repository, it generates a Container image (using the underlying Container engine). For more information see using Dockerfiles .","title":"Builder"},{"location":"understanding-workflow/components/#object-storage","text":"Project Location: drycc/storage All of the Workflow components that need to persist data will ship them to the object storage that was configured for the cluster.For example, database ships its WAL files, registry stores Container images, and slugbuilder stores slugs. Workflow supports either on or off-cluster storage. For production deployments we highly recommend that you configure off-cluster object storage . To facilitate experimentation, development and test environments, the default charts for Workflow include on-cluster storage via storage . If you also feel comfortable using Kubernetes persistent volumes you may configure storage to use persistent storage available in your environment.","title":"Object Storage"},{"location":"understanding-workflow/components/#registry","text":"Project Location: drycc/registry The registry component is a managed container registry which holds application images generated from the builder component. Registry persists the Container image images to either local storage (in development mode) or to object storage configured for the cluster.","title":"Registry"},{"location":"understanding-workflow/components/#logger-fluentbit-logger","text":"The logging subsystem consists of two components. Fluentbit handles log shipping and logger maintains a ring-buffer of application logs. Project Location: drycc/fluentbit Fluentbit is deployed to your Kubernetes cluster via Daemon Sets. Fluentbit subscribes to all container logs, decorates the output with Kubernetes metadata and can be configured to drain logs to multiple destinations. By default, Fluentbit ships logs to the logger component, which powers drycc logs . Project Location: drycc/logger The logger component receives log streams from fluentbit , collating by Application name. Logger does not persist logs to disk, instead maintaining an in-memory ring buffer. For more information on logger see the project documentation .","title":"Logger: fluentbit, logger"},{"location":"understanding-workflow/components/#monitor","text":"Project Location: drycc/monitor The monitoring subsystem consists of two components: Telegraf and Grafana. Telegraf is the is the metrics collection agent that runs using the daemon set API. It runs on every worker node in the cluster, fetches information about the pods currently running and ships it to Prometheus. Grafana is a standalone graphing application. It natively supports Prometheus as a datasource and provides a robust engine for creating dashboards on top of timeseries data. Workflow provides a few dashboards out of the box for monitoring Drycc Workflow and Kubernetes. The dashboards can be used as a starting point for creating more custom dashboards to suit a user's needs.","title":"Monitor"},{"location":"understanding-workflow/components/#prometheus","text":"Project Location: drycc/prometheus Prometheus is a system monitoring and alerting system. It was opensourced by SoundCloud in 2012 and is the second project both to join and to graduate within Cloud Native Computing Foundation after Kubernetes. Prometheus stores all metrics data as time series, i.e metrics information is stored along with the timestamp at which it was recorded, optional key-value pairs called as labels can also be stored along with metrics.","title":"Prometheus"},{"location":"understanding-workflow/components/#rabbitmq","text":"Project Location: drycc/rabbitmq RabbitMQ is the most widely deployed open source message broker. Controller use celery with rabbitMQ to execute the asynchronous task.","title":"Rabbitmq"},{"location":"understanding-workflow/components/#helmbroker","text":"Project Location: drycc/rabbitmq Helm Broker is a Service Broker that exposes Helm charts as Service Classes in Service Catalog. To do so, Helm Broker uses the concept of addons. An addon is an abstraction layer over a Helm chart which provides all information required to convert the chart into a Service Class.","title":"HelmBroker"},{"location":"understanding-workflow/components/#prometheus_1","text":"Project Location: drycc/rabbitmq Prometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud.","title":"Prometheus"},{"location":"understanding-workflow/components/#see-also","text":"Workflow Concepts Workflow Architecture","title":"See Also"},{"location":"understanding-workflow/concepts/","text":"Concepts \u00b6 Drycc Workflow is a lightweight application platform that deploys and scales Twelve-Factor apps as containers across a Kubernetes cluster. Twelve-Factor Applications \u00b6 The Twelve-Factor App is a methodology for building modern applications that can be scaled across a distributed system. Twelve-factor is a valuable synthesis of years of experience with software-as-a-service apps in the wild, particularly on the Heroku platform. Workflow is designed to run applications that adhere to the Twelve-Factor App methodology and best practices. Kubernetes \u00b6 Kubernetes is an open-source cluster manager developed by Google and donated to the Cloud Native Compute Foundation . Kubernetes manages all the activity on your cluster, including: desired state convergence, stable service addresses, health monitoring, service discovery, and DNS resolution. Workflow builds upon Kubernetes abstractions like Services, Deployments and Pods to provide a developer-friendly experience. Building containers directly from application source code, aggregating logs, and managing deployment configurations and app releases are just some of the features Workflow adds. Drycc Workflow is a set of Kubernetes-native components, installable via Helm . Systems engineers who are familiar with Kubernetes will feel right at home running Workflow. See the components overview for more detail. Container \u00b6 [Container][] is an open source project to build, ship and run any application as a lightweight, portable, self-sufficient container. If you have not yet converted your application to containers, Workflow provides a simple and straightforward \"source to Container image\" capability. Supporting multiple language runtimes via community buildpacks , building your application in a container can be as easy as git push drycc master . Applications which use either a Dockerfile or reference external Container images are launched unmodified. Applications \u00b6 Workflow is designed around the concept of an application , or app. Applications come in one of three forms: a collection of source files stored in a git repository a Dockerfile and associated source files stored in a git repository a reference to an existing image at a Container repository Applications are identified by a unique name for easy reference. If you do not specify a name when creating your application, Workflow generates one for you. Workflow also manages related information, including domain names, SSL certificates, and developer-provided configuration. Build, Release, Run \u00b6 Build Stage \u00b6 The builder component processes incoming git push drycc master requests and manages your application packaging. If your application is using a buildpack , builder will launch an ephemeral job to extract and execute the packaging instructions. The resulting application artifact is stored by the platform for execution during the run stage. If instead builder finds a Dockerfile , it follows those instructions to create a Container image. The resulting artifact is stored in a Drycc-managed registry which will be referenced during the run stage. If another system already builds and packages your application, that container artifact can be used directly. When referencing an external Container image , the builder component doesn't attempt to repackage your app. Release Stage \u00b6 During the release stage, a build is combined with application configuration to create a new, numbered release . New releases are created any time a new build is created or application configuration is changed. Tracking releases as a \"write-only ledger\" this way makes it easy to rollback to any previous release. Run Stage \u00b6 The run stage deploys the new release to the underlying Kubernetes cluster by changing the Deployment object which references the new release. By managing the desired replica count, Workflow orchestrates a zero-downtime, rolling update of your application. Once successfully updated, Workflow removes the last reference to the old release. Note that during the deploy, your application will be running in a mixed mode. Backing Services \u00b6 Workflow treats all persistent services such as databases, caches, storage, messaging systems, and other backing services as resources managed separately from your application. This philosophy aligns with Twelve-Factor best practices. Applications attach to backing services using environment variables . Because apps are decoupled from backing services, they are free to scale up independently, to use services provided by other apps, or to switch to external or third-party vendor services. See Also \u00b6 Workflow Architecture Workflow Components","title":"Concepts"},{"location":"understanding-workflow/concepts/#concepts","text":"Drycc Workflow is a lightweight application platform that deploys and scales Twelve-Factor apps as containers across a Kubernetes cluster.","title":"Concepts"},{"location":"understanding-workflow/concepts/#twelve-factor-applications","text":"The Twelve-Factor App is a methodology for building modern applications that can be scaled across a distributed system. Twelve-factor is a valuable synthesis of years of experience with software-as-a-service apps in the wild, particularly on the Heroku platform. Workflow is designed to run applications that adhere to the Twelve-Factor App methodology and best practices.","title":"Twelve-Factor Applications"},{"location":"understanding-workflow/concepts/#kubernetes","text":"Kubernetes is an open-source cluster manager developed by Google and donated to the Cloud Native Compute Foundation . Kubernetes manages all the activity on your cluster, including: desired state convergence, stable service addresses, health monitoring, service discovery, and DNS resolution. Workflow builds upon Kubernetes abstractions like Services, Deployments and Pods to provide a developer-friendly experience. Building containers directly from application source code, aggregating logs, and managing deployment configurations and app releases are just some of the features Workflow adds. Drycc Workflow is a set of Kubernetes-native components, installable via Helm . Systems engineers who are familiar with Kubernetes will feel right at home running Workflow. See the components overview for more detail.","title":"Kubernetes"},{"location":"understanding-workflow/concepts/#container","text":"[Container][] is an open source project to build, ship and run any application as a lightweight, portable, self-sufficient container. If you have not yet converted your application to containers, Workflow provides a simple and straightforward \"source to Container image\" capability. Supporting multiple language runtimes via community buildpacks , building your application in a container can be as easy as git push drycc master . Applications which use either a Dockerfile or reference external Container images are launched unmodified.","title":"Container"},{"location":"understanding-workflow/concepts/#applications","text":"Workflow is designed around the concept of an application , or app. Applications come in one of three forms: a collection of source files stored in a git repository a Dockerfile and associated source files stored in a git repository a reference to an existing image at a Container repository Applications are identified by a unique name for easy reference. If you do not specify a name when creating your application, Workflow generates one for you. Workflow also manages related information, including domain names, SSL certificates, and developer-provided configuration.","title":"Applications"},{"location":"understanding-workflow/concepts/#build-release-run","text":"","title":"Build, Release, Run"},{"location":"understanding-workflow/concepts/#build-stage","text":"The builder component processes incoming git push drycc master requests and manages your application packaging. If your application is using a buildpack , builder will launch an ephemeral job to extract and execute the packaging instructions. The resulting application artifact is stored by the platform for execution during the run stage. If instead builder finds a Dockerfile , it follows those instructions to create a Container image. The resulting artifact is stored in a Drycc-managed registry which will be referenced during the run stage. If another system already builds and packages your application, that container artifact can be used directly. When referencing an external Container image , the builder component doesn't attempt to repackage your app.","title":"Build Stage"},{"location":"understanding-workflow/concepts/#release-stage","text":"During the release stage, a build is combined with application configuration to create a new, numbered release . New releases are created any time a new build is created or application configuration is changed. Tracking releases as a \"write-only ledger\" this way makes it easy to rollback to any previous release.","title":"Release Stage"},{"location":"understanding-workflow/concepts/#run-stage","text":"The run stage deploys the new release to the underlying Kubernetes cluster by changing the Deployment object which references the new release. By managing the desired replica count, Workflow orchestrates a zero-downtime, rolling update of your application. Once successfully updated, Workflow removes the last reference to the old release. Note that during the deploy, your application will be running in a mixed mode.","title":"Run Stage"},{"location":"understanding-workflow/concepts/#backing-services","text":"Workflow treats all persistent services such as databases, caches, storage, messaging systems, and other backing services as resources managed separately from your application. This philosophy aligns with Twelve-Factor best practices. Applications attach to backing services using environment variables . Because apps are decoupled from backing services, they are free to scale up independently, to use services provided by other apps, or to switch to external or third-party vendor services.","title":"Backing Services"},{"location":"understanding-workflow/concepts/#see-also","text":"Workflow Architecture Workflow Components","title":"See Also"},{"location":"users/cli/","text":"Drycc Workflow CLI \u00b6 The Drycc Workflow command-line interface (CLI), or client, allows you to interact with Drycc Workflow. Installation \u00b6 Install the latest drycc client for Linux or Mac OS X with: $ curl -sfL https://www.drycc.cc/install-cli.sh | bash - The installer puts drycc in your current directory, but you should move it somewhere in your $PATH: $ ln -fs $PWD/drycc /usr/local/bin/drycc Getting Help \u00b6 The Drycc client comes with comprehensive documentation for every command. Use drycc help to explore the commands available to you: $ drycc help The Drycc command-line client issues API calls to a Drycc controller. Usage: drycc [...] Auth commands:: login login to a controller logout logout from the current controller Subcommands, use `drycc help [subcommand]` to learn more:: ... To get help on subcommands, use drycc help [subcommand] : $ drycc help apps Valid commands for apps: apps:create create a new application apps:list list accessible applications apps:info view info about an application apps:open open the application in a browser apps:logs view aggregated application logs apps:run run a command in an ephemeral app container apps:destroy destroy an application apps:transfer transfer app ownership to another user Use `drycc help [command]` to learn more Support for Multiple Profiles \u00b6 The CLI reads from the default client profile, which is located on your workstation at $HOME/.drycc/client.json . Easily switch between multiple Drycc Workflow installations or users by setting the $DRYCC_PROFILE environment variable or by using the -c flag. There are two ways to set the $DRYCC_PROFILE option. Path to a json configuration file. Profile name. If you set profile to just a name, it will be saved alongside the default profile, in $HOME/.drycc/.json . Examples: $ DRYCC_PROFILE=production drycc login drycc.production.com ... Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71 Waiting for login... .o.Logged in as drycc Configuration saved to /home/testuser/.drycc/production.json $ DRYCC_PROFILE=~/config.json drycc login drycc.example.com ... Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71 Waiting for login... .o.Logged in as drycc Configuration saved to /home/testuser/config.json The configuration flag works identically to and overrides $DRYCC_PROFILE : $ drycc whoami -c ~/config.json You are drycc at drycc.example.com Proxy Support \u00b6 If your workstation uses a proxy to reach the network where the cluster lies, set the http_proxy or https_proxy environment variable to enable proxy support: $ export http_proxy=\"http://proxyip:port\" $ export https_proxy=\"http://proxyip:port\" Note Configuring a proxy is generally not necessary for local Minikube clusters. CLI Plugins \u00b6 Plugins allow developers to extend the functionality of the Drycc Client, adding new commands or features. If an unknown command is specified, the client will attempt to execute the command as a dash-separated command. In this case, drycc resource:command will execute drycc-resource with the argument list command . In full form: $ # these two are identical $ drycc accounts:list $ drycc-accounts list Any flags after the command will also be sent to the plugin as an argument: $ # these two are identical $ drycc accounts:list --debug $ drycc-accounts list --debug But flags preceding the command will not: $ # these two are identical $ drycc --debug accounts:list $ drycc-accounts list","title":"Command Line Interface"},{"location":"users/cli/#drycc-workflow-cli","text":"The Drycc Workflow command-line interface (CLI), or client, allows you to interact with Drycc Workflow.","title":"Drycc Workflow CLI"},{"location":"users/cli/#installation","text":"Install the latest drycc client for Linux or Mac OS X with: $ curl -sfL https://www.drycc.cc/install-cli.sh | bash - The installer puts drycc in your current directory, but you should move it somewhere in your $PATH: $ ln -fs $PWD/drycc /usr/local/bin/drycc","title":"Installation"},{"location":"users/cli/#getting-help","text":"The Drycc client comes with comprehensive documentation for every command. Use drycc help to explore the commands available to you: $ drycc help The Drycc command-line client issues API calls to a Drycc controller. Usage: drycc [...] Auth commands:: login login to a controller logout logout from the current controller Subcommands, use `drycc help [subcommand]` to learn more:: ... To get help on subcommands, use drycc help [subcommand] : $ drycc help apps Valid commands for apps: apps:create create a new application apps:list list accessible applications apps:info view info about an application apps:open open the application in a browser apps:logs view aggregated application logs apps:run run a command in an ephemeral app container apps:destroy destroy an application apps:transfer transfer app ownership to another user Use `drycc help [command]` to learn more","title":"Getting Help"},{"location":"users/cli/#support-for-multiple-profiles","text":"The CLI reads from the default client profile, which is located on your workstation at $HOME/.drycc/client.json . Easily switch between multiple Drycc Workflow installations or users by setting the $DRYCC_PROFILE environment variable or by using the -c flag. There are two ways to set the $DRYCC_PROFILE option. Path to a json configuration file. Profile name. If you set profile to just a name, it will be saved alongside the default profile, in $HOME/.drycc/.json . Examples: $ DRYCC_PROFILE=production drycc login drycc.production.com ... Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71 Waiting for login... .o.Logged in as drycc Configuration saved to /home/testuser/.drycc/production.json $ DRYCC_PROFILE=~/config.json drycc login drycc.example.com ... Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71 Waiting for login... .o.Logged in as drycc Configuration saved to /home/testuser/config.json The configuration flag works identically to and overrides $DRYCC_PROFILE : $ drycc whoami -c ~/config.json You are drycc at drycc.example.com","title":"Support for Multiple Profiles"},{"location":"users/cli/#proxy-support","text":"If your workstation uses a proxy to reach the network where the cluster lies, set the http_proxy or https_proxy environment variable to enable proxy support: $ export http_proxy=\"http://proxyip:port\" $ export https_proxy=\"http://proxyip:port\" Note Configuring a proxy is generally not necessary for local Minikube clusters.","title":"Proxy Support"},{"location":"users/cli/#cli-plugins","text":"Plugins allow developers to extend the functionality of the Drycc Client, adding new commands or features. If an unknown command is specified, the client will attempt to execute the command as a dash-separated command. In this case, drycc resource:command will execute drycc-resource with the argument list command . In full form: $ # these two are identical $ drycc accounts:list $ drycc-accounts list Any flags after the command will also be sent to the plugin as an argument: $ # these two are identical $ drycc accounts:list --debug $ drycc-accounts list --debug But flags preceding the command will not: $ # these two are identical $ drycc --debug accounts:list $ drycc-accounts list","title":"CLI Plugins"},{"location":"users/registration/","text":"Users and Registration \u00b6 Workflow use the passport component to create and authorize users, it can config options for LDAP authentication or browse passport web site to register users. Login to Workflow \u00b6 If you already have an account, use drycc login to authenticate against the Drycc Workflow API. $ drycc login http://drycc.example.com Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71 Waiting for login... .o.Logged in as drycc Configuration file written to /root/.drycc/client.json Logout from Workflow \u00b6 Logout of an existing controller session using drycc logout . $ drycc logout Logged out as drycc Verify Your Session \u00b6 You can verify your client configuration by running drycc whoami . $ drycc whoami You are drycc at http://drycc.example.com Note Session and client configuration is stored in the ~/.drycc/client.json file.","title":"Users and Registration"},{"location":"users/registration/#users-and-registration","text":"Workflow use the passport component to create and authorize users, it can config options for LDAP authentication or browse passport web site to register users.","title":"Users and Registration"},{"location":"users/registration/#login-to-workflow","text":"If you already have an account, use drycc login to authenticate against the Drycc Workflow API. $ drycc login http://drycc.example.com Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71 Waiting for login... .o.Logged in as drycc Configuration file written to /root/.drycc/client.json","title":"Login to Workflow"},{"location":"users/registration/#logout-from-workflow","text":"Logout of an existing controller session using drycc logout . $ drycc logout Logged out as drycc","title":"Logout from Workflow"},{"location":"users/registration/#verify-your-session","text":"You can verify your client configuration by running drycc whoami . $ drycc whoami You are drycc at http://drycc.example.com Note Session and client configuration is stored in the ~/.drycc/client.json file.","title":"Verify Your Session"},{"location":"users/ssh-keys/","text":"Users and SSH Keys \u00b6 For Dockerfile and Buildpack based application deploys via git push , Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user. Users may have multiple SSH keys as needed. Generate an SSH Key \u00b6 If you do not already have an SSH key or would like to create a new key for Drycc Workflow, generate a new key using ssh-keygen : $ ssh-keygen -f ~/.ssh/id_drycc -t rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/admin/.ssh/id_drycc. Your public key has been saved in /Users/admin/.ssh/id_drycc.pub. The key fingerprint is: 3d:ac:1f:f4:83:f7:64:51:c1:7e:7f:80:b6:70:36:c9 admin@plinth-23437.local The key's randomart image is: +--[ RSA 2048]----+ | .. | | ..| | . o. .| | o. E .o.| | S == o..o| | o +. .o| | . o + o .| | . o = | | . . | +-----------------+ $ ssh-add ~/.ssh/id_drycc Identity added: /Users/admin/.ssh/id_drycc (/Users/admin/.ssh/id_drycc) Adding and Removing SSH Keys \u00b6 By publishing the public half of your SSH key to Drycc Workflow the component responsible for receiving git push will be able to authenticate the user and ensure that they have access to the destination application. $ drycc keys:add ~/.ssh/id_drycc.pub Uploading id_drycc.pub to drycc... done You can always view the keys associated with your user as well: $ drycc keys:list === admin Keys admin@plinth-23437.local ssh-rsa AAAAB3Nz...3437.local admin@subgenius.local ssh-rsa AAAAB3Nz...nius.local Remove keys by their name: $ drycc keys:remove admin@plinth-23437.local Removing admin@plinth-23437.local SSH Key... don","title":"SSH Keys"},{"location":"users/ssh-keys/#users-and-ssh-keys","text":"For Dockerfile and Buildpack based application deploys via git push , Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user. Users may have multiple SSH keys as needed.","title":"Users and SSH Keys"},{"location":"users/ssh-keys/#generate-an-ssh-key","text":"If you do not already have an SSH key or would like to create a new key for Drycc Workflow, generate a new key using ssh-keygen : $ ssh-keygen -f ~/.ssh/id_drycc -t rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/admin/.ssh/id_drycc. Your public key has been saved in /Users/admin/.ssh/id_drycc.pub. The key fingerprint is: 3d:ac:1f:f4:83:f7:64:51:c1:7e:7f:80:b6:70:36:c9 admin@plinth-23437.local The key's randomart image is: +--[ RSA 2048]----+ | .. | | ..| | . o. .| | o. E .o.| | S == o..o| | o +. .o| | . o + o .| | . o = | | . . | +-----------------+ $ ssh-add ~/.ssh/id_drycc Identity added: /Users/admin/.ssh/id_drycc (/Users/admin/.ssh/id_drycc)","title":"Generate an SSH Key"},{"location":"users/ssh-keys/#adding-and-removing-ssh-keys","text":"By publishing the public half of your SSH key to Drycc Workflow the component responsible for receiving git push will be able to authenticate the user and ensure that they have access to the destination application. $ drycc keys:add ~/.ssh/id_drycc.pub Uploading id_drycc.pub to drycc... done You can always view the keys associated with your user as well: $ drycc keys:list === admin Keys admin@plinth-23437.local ssh-rsa AAAAB3Nz...3437.local admin@subgenius.local ssh-rsa AAAAB3Nz...nius.local Remove keys by their name: $ drycc keys:remove admin@plinth-23437.local Removing admin@plinth-23437.local SSH Key... don","title":"Adding and Removing SSH Keys"}]} \ No newline at end of file diff --git a/search/worker.js b/search/worker.js new file mode 100644 index 000000000..8628dbce9 --- /dev/null +++ b/search/worker.js @@ -0,0 +1,133 @@ +var base_path = 'function' === typeof importScripts ? '.' : '/search/'; +var allowSearch = false; +var index; +var documents = {}; +var lang = ['en']; +var data; + +function getScript(script, callback) { + console.log('Loading script: ' + script); + $.getScript(base_path + script).done(function () { + callback(); + }).fail(function (jqxhr, settings, exception) { + console.log('Error: ' + exception); + }); +} + +function getScriptsInOrder(scripts, callback) { + if (scripts.length === 0) { + callback(); + return; + } + getScript(scripts[0], function() { + getScriptsInOrder(scripts.slice(1), callback); + }); +} + +function loadScripts(urls, callback) { + if( 'function' === typeof importScripts ) { + importScripts.apply(null, urls); + callback(); + } else { + getScriptsInOrder(urls, callback); + } +} + +function onJSONLoaded () { + data = JSON.parse(this.responseText); + var scriptsToLoad = ['lunr.js']; + if (data.config && data.config.lang && data.config.lang.length) { + lang = data.config.lang; + } + if (lang.length > 1 || lang[0] !== "en") { + scriptsToLoad.push('lunr.stemmer.support.js'); + if (lang.length > 1) { + scriptsToLoad.push('lunr.multi.js'); + } + if (lang.includes("ja") || lang.includes("jp")) { + scriptsToLoad.push('tinyseg.js'); + } + for (var i=0; i < lang.length; i++) { + if (lang[i] != 'en') { + scriptsToLoad.push(['lunr', lang[i], 'js'].join('.')); + } + } + } + loadScripts(scriptsToLoad, onScriptsLoaded); +} + +function onScriptsLoaded () { + console.log('All search scripts loaded, building Lunr index...'); + if (data.config && data.config.separator && data.config.separator.length) { + lunr.tokenizer.separator = new RegExp(data.config.separator); + } + + if (data.index) { + index = lunr.Index.load(data.index); + data.docs.forEach(function (doc) { + documents[doc.location] = doc; + }); + console.log('Lunr pre-built index loaded, search ready'); + } else { + index = lunr(function () { + if (lang.length === 1 && lang[0] !== "en" && lunr[lang[0]]) { + this.use(lunr[lang[0]]); + } else if (lang.length > 1) { + this.use(lunr.multiLanguage.apply(null, lang)); // spread operator not supported in all browsers: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator#Browser_compatibility + } + this.field('title'); + this.field('text'); + this.ref('location'); + + for (var i=0; i < data.docs.length; i++) { + var doc = data.docs[i]; + this.add(doc); + documents[doc.location] = doc; + } + }); + console.log('Lunr index built, search ready'); + } + allowSearch = true; + postMessage({config: data.config}); + postMessage({allowSearch: allowSearch}); +} + +function init () { + var oReq = new XMLHttpRequest(); + oReq.addEventListener("load", onJSONLoaded); + var index_path = base_path + '/search_index.json'; + if( 'function' === typeof importScripts ){ + index_path = 'search_index.json'; + } + oReq.open("GET", index_path); + oReq.send(); +} + +function search (query) { + if (!allowSearch) { + console.error('Assets for search still loading'); + return; + } + + var resultDocuments = []; + var results = index.search(query); + for (var i=0; i < results.length; i++){ + var result = results[i]; + doc = documents[result.ref]; + doc.summary = doc.text.substring(0, 200); + resultDocuments.push(doc); + } + return resultDocuments; +} + +if( 'function' === typeof importScripts ) { + onmessage = function (e) { + if (e.data.init) { + init(); + } else if (e.data.query) { + postMessage({ results: search(e.data.query) }); + } else { + console.error("Worker - Unrecognized message: " + e); + } + }; +} diff --git a/security/1d6a97d0.txt b/security/1d6a97d0.txt new file mode 100644 index 000000000..0282082c5 --- /dev/null +++ b/security/1d6a97d0.txt @@ -0,0 +1,92 @@ +sec 4096R/1D6A97D0 2016-11-03 + Key fingerprint = 41AF 6B6A 9489 9B58 1EB6 9ED1 17E5 26B5 1D6A 97D0 +uid Drycc, Inc. (Helm chart signing key) +ssb 4096R/2CA931B0 2016-11-03 +ssb 4096R/41C9CA1E 2016-11-03 [expires: 2024-11-01] + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +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 +K8I9jWQf2UCagoUuV3w= +=qap/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000..24f448507 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,310 @@ + + + + + + /docs/workflow/ + + + + + + + /docs/workflow/quickstart/ + + + + /docs/workflow/quickstart/install-workflow/ + + + + /docs/workflow/quickstart/install-cli-tools/ + + + + /docs/workflow/quickstart/deploy-an-app/ + + + + + + + + /docs/workflow/understanding-workflow/concepts/ + + + + /docs/workflow/understanding-workflow/architecture/ + + + + /docs/workflow/understanding-workflow/components/ + + + + + + + + /docs/workflow/installing-workflow/system-requirements/ + + + + /docs/workflow/installing-workflow/gateway/ + + + + /docs/workflow/installing-workflow/ + + + + /docs/workflow/installing-workflow/configuring-object-storage/ + + + + /docs/workflow/installing-workflow/configuring-postgres/ + + + + /docs/workflow/installing-workflow/configuring-registry/ + + + + + + + + /docs/workflow/users/cli/ + + + + /docs/workflow/users/registration/ + + + + /docs/workflow/users/ssh-keys/ + + + + + + + + /docs/workflow/applications/deploying-apps/ + + + + /docs/workflow/applications/using-buildpacks/ + + + + /docs/workflow/applications/using-dockerfiles/ + + + + /docs/workflow/applications/using-container-images/ + + + + /docs/workflow/applications/managing-app-processes/ + + + + /docs/workflow/applications/managing-app-configuration/ + + + + /docs/workflow/applications/managing-app-lifecycle/ + + + + /docs/workflow/applications/managing-app-volumes/ + + + + /docs/workflow/applications/managing-app-gateway/ + + + + /docs/workflow/applications/managing-app-resources/ + + + + /docs/workflow/applications/inter-app-communication/ + + + + /docs/workflow/applications/managing-resource-limits/ + + + + /docs/workflow/applications/domains-and-routing/ + + + + /docs/workflow/applications/ssl-certificates/ + + + + + + + + /docs/workflow/managing-workflow/tuning-component-settings/ + + + + /docs/workflow/managing-workflow/configuring-dns/ + + + + /docs/workflow/managing-workflow/deploy-hooks/ + + + + /docs/workflow/managing-workflow/platform-logging/ + + + + /docs/workflow/managing-workflow/platform-monitoring/ + + + + /docs/workflow/managing-workflow/production-deployments/ + + + + /docs/workflow/managing-workflow/upgrading-workflow/ + + + + + + + + /docs/workflow/troubleshooting/ + + + + /docs/workflow/troubleshooting/kubectl/ + + + + /docs/workflow/troubleshooting/applications/ + + + + + + + + /docs/workflow/roadmap/planning-process/ + + + + /docs/workflow/roadmap/roadmap/ + + + + /docs/workflow/roadmap/releases/ + + + + + + + + /docs/workflow/contributing/overview/ + + + + /docs/workflow/contributing/design-documents/ + + + + /docs/workflow/contributing/development-environment/ + + + + /docs/workflow/contributing/testing/ + + + + /docs/workflow/contributing/submitting-a-pull-request/ + + + + /docs/workflow/contributing/community/ + + + + /docs/workflow/contributing/triaging-issues/ + + + + /docs/workflow/contributing/conduct/ + + + + /docs/workflow/contributing/maintainers/ + + + + + + + + /docs/workflow/reference-guide/creating-a-self-signed-ssl-certificate/ + + + + /docs/workflow/reference-guide/terms/ + + + + /docs/workflow/reference-guide/controller-api/v2.0/ + + + + /docs/workflow/reference-guide/controller-api/v2.1/ + + + + /docs/workflow/reference-guide/controller-api/v2.2/ + + + + /docs/workflow/reference-guide/controller-api/v2.3/ + + + + + + + + /docs/workflow/changelogs/v1.5.0/ + + + + /docs/workflow/changelogs/v1.4.0/ + + + + /docs/workflow/changelogs/v1.3.0/ + + + + /docs/workflow/changelogs/v1.2.0/ + + + + /docs/workflow/changelogs/v1.1.0/ + + + + /docs/workflow/changelogs/v1.0.1/ + + + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..e10a72625074d530241ca0323d5bd051c5adefa7 GIT binary patch literal 813 zcmV+|1Je8-iwFo-3^HW`|8r?{Wo=<_E_iKh0JWFfa@sHuhVOX_hI?U1+L^XP$X%bH zeE=b^jf$*wwUQ}s-<2_GAVW#8lnV}u`F?9p`n`Jo)0k-ojx^e**>b*^O~EQGwXL6K zKYx4|UuMti$tpNQ;HP}CrKj1}`}SK=?DzXQX%CHTX^yTgNNxEG6~kh&n17wECzC1v z^)C^#?mtae2GzPKQBko+x2p{9i&YU9k5?8im%jS_dqKa0Ry*?2`76vjK-%)VG2+JE zjvy z4VlGSBwstA%rXvYP2L@HG$nCO7d%bIHb>7HZd7_cAd&!ywqgf|9IeGe&S=%&Dh;zQ z#+sMMrt^#(C{i~;o3fQWYSXj%f*rU@8^{3XGW1ega6&iSPe~OTX=OdcT(k}q5M@+2 zbySM#yslz&1?r#-WK-zSgeGI0(oFvAe4dvWoJzX`Z9UiMG0jaA?C_5)n>cNNbKPj4 zbQ>i$+-<}rtP~D|XStMkB6g18ysqLBYNoQ-~x3_eNl!$I8G*ucG2dVOY= zHa&lE$Xmo+dU$K3uh2EZU|o;T`+o!)w3_Wv77d4GP_fv=F<2?=>06o5)=rimag}#e zvgZce@S)1-PSA&!v|ZS+Pc@0DXWgDYBo1X6pVhgPY~R$wsXcNRC+z7x5e*DT$};4l zD{^{soX^;S>okmgusLIvK)SZk+JzJybiwYxU>mstY^NRC_&KEnA1w)5<_t+;!-uW! zO@wHJG5rHD>!cJJyn{a^4TjUl@ui6ZP}=*oaonavM*nei{8Lw zkW&IviCFbeiVL4Ib|74cvQum*F|&^$8q=FlU33rgMRtW{c7=!R3XeIa^H$oLM;trM rZaM!vIuqx-Pla{color:#ff2a53}meta.foundation-version{font-family:"/5.5.3/"}meta.foundation-mq-small{font-family:"/only screen/";width:0}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.0625em) and (max-width:64em)/";width:40.0625em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.0625em)/";width:64.0625em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.0625em) and (max-width:90em)/";width:64.0625em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.0625em)/";width:90.0625em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.0625em) and (max-width:120em)/";width:90.0625em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.0625em)/";width:120.0625em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;color:#222;cursor:auto;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.5;margin:0;padding:0;position:relative}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object,.mqa-display img,.mqa-display embed,.mqa-display object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.row{margin:0 auto;max-width:59.375rem;width:100%}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{margin:0 -0.9375rem;max-width:none;width:auto}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{margin:0;max-width:none;width:auto}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:0.9375rem;padding-right:0.9375rem;width:100%;float:left}.column+.column:last-child,.columns+.column:last-child,.column+.columns:last-child,.columns+.columns:last-child{float:right}.column+.column.end,.columns+.column.end,.column+.columns.end,.columns+.columns.end{float:left}@media only screen{.small-push-0{position:relative;left:0;right:auto}.small-pull-0{position:relative;right:0;left:auto}.small-push-1{position:relative;left:8.33333%;right:auto}.small-pull-1{position:relative;right:8.33333%;left:auto}.small-push-2{position:relative;left:16.66667%;right:auto}.small-pull-2{position:relative;right:16.66667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.33333%;right:auto}.small-pull-4{position:relative;right:33.33333%;left:auto}.small-push-5{position:relative;left:41.66667%;right:auto}.small-pull-5{position:relative;right:41.66667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.33333%;right:auto}.small-pull-7{position:relative;right:58.33333%;left:auto}.small-push-8{position:relative;left:66.66667%;right:auto}.small-pull-8{position:relative;right:66.66667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.33333%;right:auto}.small-pull-10{position:relative;right:83.33333%;left:auto}.small-push-11{position:relative;left:91.66667%;right:auto}.small-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.small-1{width:8.33333%}.small-2{width:16.66667%}.small-3{width:25%}.small-4{width:33.33333%}.small-5{width:41.66667%}.small-6{width:50%}.small-7{width:58.33333%}.small-8{width:66.66667%}.small-9{width:75%}.small-10{width:83.33333%}.small-11{width:91.66667%}.small-12{width:100%}.small-offset-0{margin-left:0 !important}.small-offset-1{margin-left:8.33333% !important}.small-offset-2{margin-left:16.66667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.33333% !important}.small-offset-5{margin-left:41.66667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.33333% !important}.small-offset-8{margin-left:66.66667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.33333% !important}.small-offset-11{margin-left:91.66667% !important}.small-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{float:left;margin-left:0;margin-right:0}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}}@media only screen and (min-width: 40.0625em){.medium-push-0{position:relative;left:0;right:auto}.medium-pull-0{position:relative;right:0;left:auto}.medium-push-1{position:relative;left:8.33333%;right:auto}.medium-pull-1{position:relative;right:8.33333%;left:auto}.medium-push-2{position:relative;left:16.66667%;right:auto}.medium-pull-2{position:relative;right:16.66667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.33333%;right:auto}.medium-pull-4{position:relative;right:33.33333%;left:auto}.medium-push-5{position:relative;left:41.66667%;right:auto}.medium-pull-5{position:relative;right:41.66667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.33333%;right:auto}.medium-pull-7{position:relative;right:58.33333%;left:auto}.medium-push-8{position:relative;left:66.66667%;right:auto}.medium-pull-8{position:relative;right:66.66667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.33333%;right:auto}.medium-pull-10{position:relative;right:83.33333%;left:auto}.medium-push-11{position:relative;left:91.66667%;right:auto}.medium-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.medium-1{width:8.33333%}.medium-2{width:16.66667%}.medium-3{width:25%}.medium-4{width:33.33333%}.medium-5{width:41.66667%}.medium-6{width:50%}.medium-7{width:58.33333%}.medium-8{width:66.66667%}.medium-9{width:75%}.medium-10{width:83.33333%}.medium-11{width:91.66667%}.medium-12{width:100%}.medium-offset-0{margin-left:0 !important}.medium-offset-1{margin-left:8.33333% !important}.medium-offset-2{margin-left:16.66667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.33333% !important}.medium-offset-5{margin-left:41.66667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.33333% !important}.medium-offset-8{margin-left:66.66667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.33333% !important}.medium-offset-11{margin-left:91.66667% !important}.medium-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{float:left;margin-left:0;margin-right:0}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}@media only screen and (min-width: 64.0625em){.large-push-0{position:relative;left:0;right:auto}.large-pull-0{position:relative;right:0;left:auto}.large-push-1{position:relative;left:8.33333%;right:auto}.large-pull-1{position:relative;right:8.33333%;left:auto}.large-push-2{position:relative;left:16.66667%;right:auto}.large-pull-2{position:relative;right:16.66667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.33333%;right:auto}.large-pull-4{position:relative;right:33.33333%;left:auto}.large-push-5{position:relative;left:41.66667%;right:auto}.large-pull-5{position:relative;right:41.66667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.33333%;right:auto}.large-pull-7{position:relative;right:58.33333%;left:auto}.large-push-8{position:relative;left:66.66667%;right:auto}.large-pull-8{position:relative;right:66.66667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.33333%;right:auto}.large-pull-10{position:relative;right:83.33333%;left:auto}.large-push-11{position:relative;left:91.66667%;right:auto}.large-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:0.9375rem;padding-right:0.9375rem;float:left}.large-1{width:8.33333%}.large-2{width:16.66667%}.large-3{width:25%}.large-4{width:33.33333%}.large-5{width:41.66667%}.large-6{width:50%}.large-7{width:58.33333%}.large-8{width:66.66667%}.large-9{width:75%}.large-10{width:83.33333%}.large-11{width:91.66667%}.large-12{width:100%}.large-offset-0{margin-left:0 !important}.large-offset-1{margin-left:8.33333% !important}.large-offset-2{margin-left:16.66667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.33333% !important}.large-offset-5{margin-left:41.66667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.33333% !important}.large-offset-8{margin-left:66.66667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.33333% !important}.large-offset-11{margin-left:91.66667% !important}.large-reset-order{float:left;left:auto;margin-left:0;margin-right:0;right:auto}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{float:left;margin-left:0;margin-right:0}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:0.9375rem;padding-right:0.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}[class*="block-grid-"]{display:block;padding:0;margin:0 -0.625rem}[class*="block-grid-"]:before,[class*="block-grid-"]:after{content:" ";display:table}[class*="block-grid-"]:after{clear:both}[class*="block-grid-"]>li{display:block;float:left;height:auto;padding:0 0.625rem 1.25rem}@media only screen{.small-block-grid-1>li{list-style:none;width:100%}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{list-style:none;width:50%}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{list-style:none;width:33.33333%}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{list-style:none;width:25%}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{list-style:none;width:20%}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{list-style:none;width:16.66667%}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{list-style:none;width:14.28571%}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{list-style:none;width:12.5%}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{list-style:none;width:11.11111%}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{list-style:none;width:10%}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{list-style:none;width:9.09091%}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{list-style:none;width:8.33333%}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 40.0625em){.medium-block-grid-1>li{list-style:none;width:100%}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{list-style:none;width:50%}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{list-style:none;width:33.33333%}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{list-style:none;width:25%}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{list-style:none;width:20%}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{list-style:none;width:16.66667%}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{list-style:none;width:14.28571%}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{list-style:none;width:12.5%}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{list-style:none;width:11.11111%}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{list-style:none;width:10%}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{list-style:none;width:9.09091%}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{list-style:none;width:8.33333%}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 64.0625em){.large-block-grid-1>li{list-style:none;width:100%}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{list-style:none;width:50%}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{list-style:none;width:33.33333%}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{list-style:none;width:25%}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{list-style:none;width:20%}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{list-style:none;width:16.66667%}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{list-style:none;width:14.28571%}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{list-style:none;width:12.5%}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{list-style:none;width:11.11111%}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{list-style:none;width:10%}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{list-style:none;width:9.09091%}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{list-style:none;width:8.33333%}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}.inline-list{list-style:none;margin-top:0;margin-bottom:1.0625rem;margin-left:-1.375rem;margin-right:0;overflow:hidden;padding:0}.inline-list>li{display:block;float:left;list-style:none;margin-left:1.375rem}.inline-list>li>*{display:block}.alert-box{border-style:solid;border-width:1px;display:block;font-size:0.8125rem;font-weight:normal;margin-bottom:1.25rem;padding:0.875rem 1.5rem 0.875rem 0.875rem;position:relative;transition:opacity 300ms ease-out;background-color:#008cba;border-color:#0078a0;color:#fff}.alert-box .close{right:0.25rem;background:inherit;color:#333;font-size:1.375rem;line-height:.9;margin-top:-0.6875rem;opacity:0.3;padding:0 6px 4px;position:absolute;top:50%}.alert-box .close:hover,.alert-box .close:focus{opacity:0.5}.alert-box.radius{border-radius:3px}.alert-box.round{border-radius:1000px}.alert-box.success{background-color:#43ac6a;border-color:#3a945b;color:#fff}.alert-box.alert{background-color:#f04124;border-color:#de2d0f;color:#fff}.alert-box.secondary{background-color:#e7e7e7;border-color:#c7c7c7;color:#4f4f4f}.alert-box.warning{background-color:#f08a24;border-color:#de770f;color:#fff}.alert-box.info{background-color:#a0d3e8;border-color:#74bfdd;color:#4f4f4f}.alert-box.alert-close{opacity:0}.reveal-modal-bg{background:#555;background:rgba(85,85,85,0.45);bottom:0;display:none;left:0;position:fixed;right:0;top:0;z-index:1004;left:0}.reveal-modal{border-radius:3px;display:none;position:absolute;top:0;visibility:hidden;width:100%;z-index:1005;left:0;background-color:#fff;padding:1.875rem;border:solid 1px #666;box-shadow:0 0 10px rgba(85,85,85,0.4)}@media only screen and (max-width: 40em){.reveal-modal{min-height:100vh}}.reveal-modal .column,.reveal-modal .columns{min-width:0}.reveal-modal>:first-child{margin-top:0}.reveal-modal>:last-child{margin-bottom:0}@media only screen and (min-width: 40.0625em){.reveal-modal{left:0;margin:0 auto;max-width:59.375rem;right:0;width:80%}}@media only screen and (min-width: 40.0625em){.reveal-modal{top:6.25rem}}.reveal-modal.radius{box-shadow:none;border-radius:3px}.reveal-modal.round{box-shadow:none;border-radius:1000px}.reveal-modal.collapse{padding:0;box-shadow:none}@media only screen and (min-width: 40.0625em){.reveal-modal.tiny{left:0;margin:0 auto;max-width:59.375rem;right:0;width:30%}}@media only screen and (min-width: 40.0625em){.reveal-modal.small{left:0;margin:0 auto;max-width:59.375rem;right:0;width:40%}}@media only screen and (min-width: 40.0625em){.reveal-modal.medium{left:0;margin:0 auto;max-width:59.375rem;right:0;width:60%}}@media only screen and (min-width: 40.0625em){.reveal-modal.large{left:0;margin:0 auto;max-width:59.375rem;right:0;width:70%}}@media only screen and (min-width: 40.0625em){.reveal-modal.xlarge{left:0;margin:0 auto;max-width:59.375rem;right:0;width:95%}}.reveal-modal.full{height:100vh;height:100%;left:0;margin-left:0 !important;max-width:none !important;min-height:100vh;top:0}@media only screen and (min-width: 40.0625em){.reveal-modal.full{left:0;margin:0 auto;max-width:59.375rem;right:0;width:100%}}.reveal-modal.toback{z-index:1003}.reveal-modal .close-reveal-modal{color:#aaa;cursor:pointer;font-size:2.5rem;font-weight:bold;line-height:1;position:absolute;top:0.625rem;right:1.375rem}button,.button{-webkit-appearance:none;-moz-appearance:none;border-radius:0;border-style:solid;border-width:0;cursor:pointer;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:normal;line-height:normal;margin:0 0 1.25rem;position:relative;text-align:center;text-decoration:none;display:inline-block;padding:1rem 2rem 1.0625rem 2rem;font-size:1rem;background-color:#008cba;border-color:#007095;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#007095}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43ac6a;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding:1.125rem 2.25rem 1.1875rem 2.25rem;font-size:1.25rem}button.small,.button.small{padding:0.875rem 1.75rem 0.9375rem 1.75rem;font-size:0.8125rem}button.tiny,.button.tiny{padding:0.625rem 1.25rem 0.6875rem 1.25rem;font-size:0.6875rem}button.expand,.button.expand{padding:1rem 2rem 1.0625rem 2rem;font-size:1rem;padding-bottom:1.0625rem;padding-top:1rem;padding-left:1rem;padding-right:1rem;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:0.75rem}button.right-align,.button.right-align{text-align:right;padding-right:0.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#008cba;border-color:#007095;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#007095}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#008cba}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;box-shadow:none;cursor:default;opacity:0.7}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e7e7e7}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#43ac6a;border-color:#368a55;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#43ac6a}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#f04124;border-color:#cf2a0e;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#f04124}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;box-shadow:none;cursor:default;opacity:0.7}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;box-shadow:none;cursor:default;opacity:0.7}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.0625em){button,.button{display:inline-block}}.dropdown.button,button.dropdown{position:relative;padding-right:3.5625rem}.dropdown.button::after,button.dropdown::after{border-color:#fff transparent transparent transparent;border-style:solid;content:"";display:block;height:0;position:absolute;top:50%;width:0}.dropdown.button::after,button.dropdown::after{border-width:0.375rem;right:1.40625rem;margin-top:-0.15625rem}.dropdown.button::after,button.dropdown::after{border-color:#fff transparent transparent transparent}.dropdown.button.tiny,button.dropdown.tiny{padding-right:2.625rem}.dropdown.button.tiny:after,button.dropdown.tiny:after{border-width:0.375rem;right:1.125rem;margin-top:-0.125rem}.dropdown.button.tiny::after,button.dropdown.tiny::after{border-color:#fff transparent transparent transparent}.dropdown.button.small,button.dropdown.small{padding-right:3.0625rem}.dropdown.button.small::after,button.dropdown.small::after{border-width:0.4375rem;right:1.3125rem;margin-top:-0.15625rem}.dropdown.button.small::after,button.dropdown.small::after{border-color:#fff transparent transparent transparent}.dropdown.button.large,button.dropdown.large{padding-right:3.625rem}.dropdown.button.large::after,button.dropdown.large::after{border-width:0.3125rem;right:1.71875rem;margin-top:-0.15625rem}.dropdown.button.large::after,button.dropdown.large::after{border-color:#fff transparent transparent transparent}.dropdown.button.secondary:after,button.dropdown.secondary:after{border-color:#333 transparent transparent transparent}.split.button{position:relative;padding-right:5.0625rem}.split.button span{display:block;height:100%;position:absolute;right:0;top:0;border-left:solid 1px}.split.button span:after{position:absolute;content:"";width:0;height:0;display:block;border-style:inset;top:50%;left:50%}.split.button span:active{background-color:rgba(0,0,0,0.1)}.split.button span{border-left-color:rgba(255,255,255,0.5)}.split.button span{width:3.09375rem}.split.button span:after{border-top-style:solid;border-width:0.375rem;margin-left:-0.375rem;top:48%}.split.button span:after{border-color:#fff transparent transparent transparent}.split.button.secondary span{border-left-color:rgba(255,255,255,0.5)}.split.button.secondary span:after{border-color:#fff transparent transparent transparent}.split.button.alert span{border-left-color:rgba(255,255,255,0.5)}.split.button.success span{border-left-color:rgba(255,255,255,0.5)}.split.button.tiny{padding-right:3.75rem}.split.button.tiny span{width:2.25rem}.split.button.tiny span:after{border-top-style:solid;border-width:0.375rem;margin-left:-0.375rem;top:48%}.split.button.small{padding-right:4.375rem}.split.button.small span{width:2.625rem}.split.button.small span:after{border-top-style:solid;border-width:0.4375rem;margin-left:-0.375rem;top:48%}.split.button.large{padding-right:5.5rem}.split.button.large span{width:3.4375rem}.split.button.large span:after{border-top-style:solid;border-width:0.3125rem;margin-left:-0.375rem;top:48%}.split.button.expand{padding-left:2rem}.split.button.secondary span:after{border-color:#333 transparent transparent transparent}.split.button.radius span{-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.split.button.round span{-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}.split.button.no-pip span:before{border-style:none}.split.button.no-pip span:after{border-style:none}.split.button.no-pip span>i{display:block;left:50%;margin-left:-0.28889em;margin-top:-0.48889em;position:absolute;top:50%}table{background:#fff;border:solid 1px #ddd;margin-bottom:1.25rem;table-layout:auto}table caption{background:transparent;color:#222;font-size:1rem;font-weight:bold}table thead{background:#f5f5f5}table thead tr th,table thead tr td{color:#222;font-size:0.875rem;font-weight:bold;padding:0.5rem 0.625rem 0.625rem}table tfoot{background:#f5f5f5}table tfoot tr th,table tfoot tr td{color:#222;font-size:0.875rem;font-weight:bold;padding:0.5rem 0.625rem 0.625rem}table tr th,table tr td{color:#222;font-size:0.875rem;padding:0.5625rem 0.625rem;text-align:left}table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f9f9f9}table thead tr th,table tfoot tr th,table tfoot tr td,table tbody tr th,table tbody tr td,table tr td{display:table-cell;line-height:1.125rem}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 40em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em) and (max-width: 64em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em) and (max-width: 90em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em) and (max-width: 120em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em) and (max-width: 6249999.9375em){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#3fb1e5;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#1ea1dd}a img{border:none}p{font-family:inherit;font-size:1rem;font-weight:normal;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:0.875rem;font-style:italic;line-height:1.35}h1,h2,h3,h4,h5,h6{color:#222;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.4;margin-bottom:0.5rem;margin-top:0.2rem;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#6f6f6f;font-size:60%;line-height:0}h1{font-size:2.125rem}h2{font-size:1.25rem}h3{font-size:1.375rem}h4{font-size:1.125rem}h5{font-size:1.125rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:normal;margin-top:0.2rem;margin-bottom:0.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;height:0;margin:1.25rem 0 1.1875rem}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{background-color:#f8f8f8;border-color:#dfdfdf;border-style:solid;border-width:1px;color:#333;font-family:Consolas,"Lucida Console",Monaco,monospace;font-weight:normal;padding:0.125rem 0.3125rem 0.0625rem}ul,ol,dl{font-family:inherit;font-size:1rem;line-height:1.6;list-style-position:outside;margin-bottom:1.25rem}ul{margin-left:1.1rem}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}.no-bullet{list-style-type:none;margin-left:0}.no-bullet li ul,.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}dl dt{margin-bottom:0.3rem;font-weight:bold}dl dd{margin-bottom:0.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:0.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:0.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:0.625rem 0.75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:0.9375rem}.vevent .summary{font-weight:bold}.vevent abbr{cursor:default;text-decoration:none;font-weight:bold;border:none;padding:0 0.0625rem}@media only screen and (min-width: 40.0625em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:2.75rem}h2{font-size:1.875rem}h3{font-size:1.6875rem}h4{font-size:1.4375rem}h5{font-size:1.125rem}h6{font-size:1rem}}@media print{*{background:transparent !important;color:#555 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.34in}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.off-canvas-wrap{-webkit-backface-visibility:hidden;position:relative;width:100%;overflow:hidden}.off-canvas-wrap.move-right,.off-canvas-wrap.move-left,.off-canvas-wrap.move-bottom,.off-canvas-wrap.move-top{min-height:100%;-webkit-overflow-scrolling:touch}.inner-wrap{position:relative;width:100%;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.inner-wrap:before,.inner-wrap:after{content:" ";display:table}.inner-wrap:after{clear:both}.tab-bar{-webkit-backface-visibility:hidden;background:#333;color:#fff;height:2.8125rem;line-height:2.8125rem;position:relative}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4,.tab-bar h5,.tab-bar h6{color:#fff;font-weight:bold;line-height:2.8125rem;margin:0}.tab-bar h1,.tab-bar h2,.tab-bar h3,.tab-bar h4{font-size:1.125rem}.left-small{height:2.8125rem;position:absolute;top:0;width:2.8125rem;border-right:solid 1px #1a1a1a;left:0}.right-small{height:2.8125rem;position:absolute;top:0;width:2.8125rem;border-left:solid 1px #1a1a1a;right:0}.tab-bar-section{height:2.8125rem;padding:0 0.625rem;position:absolute;text-align:center;top:0}.tab-bar-section.left{text-align:left}.tab-bar-section.right{text-align:right}.tab-bar-section.left{left:0;right:2.8125rem}.tab-bar-section.right{left:2.8125rem;right:0}.tab-bar-section.middle{left:2.8125rem;right:2.8125rem}.tab-bar .menu-icon{color:#fff;display:block;height:2.8125rem;padding:0;position:relative;text-indent:2.1875rem;transform:translate3d(0, 0, 0);width:2.8125rem}.tab-bar .menu-icon span::after{content:"";display:block;height:0;position:absolute;top:50%;margin-top:-0.5rem;left:0.90625rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:1rem}.tab-bar .menu-icon span:hover:after{box-shadow:0 0 0 1px #b3b3b3,0 7px 0 1px #b3b3b3,0 14px 0 1px #b3b3b3}.left-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate(-100%, 0);-o-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0;top:0}.left-off-canvas-menu *{-webkit-backface-visibility:hidden}.right-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate(100%, 0);-o-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);right:0;top:0}.right-off-canvas-menu *{-webkit-backface-visibility:hidden}.top-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(0, -100%, 0);-moz-transform:translate3d(0, -100%, 0);-ms-transform:translate(0, -100%);-o-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0);top:0;width:100%;height:18.75rem}.top-off-canvas-menu *{-webkit-backface-visibility:hidden}.bottom-off-canvas-menu{-webkit-backface-visibility:hidden;background:#333;bottom:0;box-sizing:content-box;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;overflow-x:hidden;overflow-y:auto;position:absolute;transition:transform 500ms ease 0s;width:15.625rem;z-index:1001;-webkit-transform:translate3d(0, 100%, 0);-moz-transform:translate3d(0, 100%, 0);-ms-transform:translate(0, 100%);-o-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);bottom:0;width:100%;height:18.75rem}.bottom-off-canvas-menu *{-webkit-backface-visibility:hidden}ul.off-canvas-list{list-style-type:none;margin:0;padding:0}ul.off-canvas-list li label{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;display:block;font-size:0.75rem;font-weight:bold;margin:0;padding:0.3rem 0.9375rem;text-transform:uppercase}ul.off-canvas-list li a{border-bottom:1px solid #262626;color:rgba(255,255,255,0.7);display:block;padding:0.66667rem;transition:background 300ms ease}ul.off-canvas-list li a:hover{background:#242424}ul.off-canvas-list li a:active{background:#242424}.move-right>.inner-wrap{-webkit-transform:translate3d(15.625rem, 0, 0);-moz-transform:translate3d(15.625rem, 0, 0);-ms-transform:translate(15.625rem, 0);-o-transform:translate3d(15.625rem, 0, 0);transform:translate3d(15.625rem, 0, 0)}.move-right .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(85,85,85,0.5),4px 0 4px rgba(85,85,85,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.move-right .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}} +.move-left>.inner-wrap{-webkit-transform:translate3d(-15.625rem, 0, 0);-moz-transform:translate3d(-15.625rem, 0, 0);-ms-transform:translate(-15.625rem, 0);-o-transform:translate3d(-15.625rem, 0, 0);transform:translate3d(-15.625rem, 0, 0)}.move-left .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(85,85,85,0.5),4px 0 4px rgba(85,85,85,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.move-left .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}} +.move-top>.inner-wrap{-webkit-transform:translate3d(0, -18.75rem, 0);-moz-transform:translate3d(0, -18.75rem, 0);-ms-transform:translate(0, -18.75rem);-o-transform:translate3d(0, -18.75rem, 0);transform:translate3d(0, -18.75rem, 0)}.move-top .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(85,85,85,0.5),4px 0 4px rgba(85,85,85,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.move-top .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}} +.move-bottom>.inner-wrap{-webkit-transform:translate3d(0, 18.75rem, 0);-moz-transform:translate3d(0, 18.75rem, 0);-ms-transform:translate(0, 18.75rem);-o-transform:translate3d(0, 18.75rem, 0);transform:translate3d(0, 18.75rem, 0)}.move-bottom .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(85,85,85,0.5),4px 0 4px rgba(85,85,85,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.move-bottom .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}} +.offcanvas-overlap .left-off-canvas-menu,.offcanvas-overlap .right-off-canvas-menu,.offcanvas-overlap .top-off-canvas-menu,.offcanvas-overlap .bottom-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(85,85,85,0.5),4px 0 4px rgba(85,85,85,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}} +.offcanvas-overlap-left .right-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-left .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(85,85,85,0.5),4px 0 4px rgba(85,85,85,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap-left .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}} +.offcanvas-overlap-right .left-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-right .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(85,85,85,0.5),4px 0 4px rgba(85,85,85,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap-right .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}} +.offcanvas-overlap-top .bottom-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-top .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(85,85,85,0.5),4px 0 4px rgba(85,85,85,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap-top .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}} +.offcanvas-overlap-bottom .top-off-canvas-menu{-ms-transform:none;-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none;z-index:1003}.offcanvas-overlap-bottom .exit-off-canvas{-webkit-backface-visibility:hidden;box-shadow:-4px 0 4px rgba(85,85,85,0.5),4px 0 4px rgba(85,85,85,0.5);cursor:pointer;transition:background 300ms ease;-webkit-tap-highlight-color:transparent;background:rgba(255,255,255,0.2);bottom:0;display:block;left:0;position:absolute;right:0;top:0;z-index:1002}@media only screen and (min-width: 40.0625em){.offcanvas-overlap-bottom .exit-off-canvas:hover{background:rgba(255,255,255,0.05)}} +.no-csstransforms .left-off-canvas-menu{left:-15.625rem}.no-csstransforms .right-off-canvas-menu{right:-15.625rem}.no-csstransforms .top-off-canvas-menu{top:-18.75rem}.no-csstransforms .bottom-off-canvas-menu{bottom:-18.75rem}.no-csstransforms .move-left>.inner-wrap{right:15.625rem}.no-csstransforms .move-right>.inner-wrap{left:15.625rem}.no-csstransforms .move-top>.inner-wrap{right:18.75rem}.no-csstransforms .move-bottom>.inner-wrap{left:18.75rem}.left-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;height:18.75rem;z-index:1002;-webkit-transform:translate3d(-100%, 0, 0);-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate(-100%, 0);-o-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.left-submenu *{-webkit-backface-visibility:hidden}.left-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:bold;padding:0.3rem 0.9375rem;text-transform:uppercase;margin:0}.left-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.left-submenu .back>a:before{content:"\AB";margin-right:.5rem;display:inline}.left-submenu.move-right,.left-submenu.offcanvas-overlap-right,.left-submenu.offcanvas-overlap{-webkit-transform:translate3d(0%, 0, 0);-moz-transform:translate3d(0%, 0, 0);-ms-transform:translate(0%, 0);-o-transform:translate3d(0%, 0, 0);transform:translate3d(0%, 0, 0)}.right-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;height:18.75rem;z-index:1002;-webkit-transform:translate3d(100%, 0, 0);-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate(100%, 0);-o-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);right:0;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.right-submenu *{-webkit-backface-visibility:hidden}.right-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:bold;padding:0.3rem 0.9375rem;text-transform:uppercase;margin:0}.right-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.right-submenu .back>a:after{content:"\BB";margin-left:.5rem;display:inline}.right-submenu.move-left,.right-submenu.offcanvas-overlap-left,.right-submenu.offcanvas-overlap{-webkit-transform:translate3d(0%, 0, 0);-moz-transform:translate3d(0%, 0, 0);-ms-transform:translate(0%, 0);-o-transform:translate3d(0%, 0, 0);transform:translate3d(0%, 0, 0)}.top-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;height:18.75rem;z-index:1002;-webkit-transform:translate3d(0, -100%, 0);-moz-transform:translate3d(0, -100%, 0);-ms-transform:translate(0, -100%);-o-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0);top:0;width:100%;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.top-submenu *{-webkit-backface-visibility:hidden}.top-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:bold;padding:0.3rem 0.9375rem;text-transform:uppercase;margin:0}.top-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.top-submenu.move-bottom,.top-submenu.offcanvas-overlap-bottom,.top-submenu.offcanvas-overlap{-webkit-transform:translate3d(0, 0%, 0);-moz-transform:translate3d(0, 0%, 0);-ms-transform:translate(0, 0%);-o-transform:translate3d(0, 0%, 0);transform:translate3d(0, 0%, 0)}.bottom-submenu{-webkit-backface-visibility:hidden;-webkit-overflow-scrolling:touch;background:#333;bottom:0;box-sizing:content-box;margin:0;overflow-x:hidden;overflow-y:auto;position:absolute;top:0;width:15.625rem;height:18.75rem;z-index:1002;-webkit-transform:translate3d(0, 100%, 0);-moz-transform:translate3d(0, 100%, 0);-ms-transform:translate(0, 100%);-o-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);bottom:0;width:100%;-webkit-transition:-webkit-transform 500ms ease;-moz-transition:-moz-transform 500ms ease;-ms-transition:-ms-transform 500ms ease;-o-transition:-o-transform 500ms ease;transition:transform 500ms ease}.bottom-submenu *{-webkit-backface-visibility:hidden}.bottom-submenu .back>a{background:#444;border-bottom:none;border-top:1px solid #5e5e5e;color:#999;font-weight:bold;padding:0.3rem 0.9375rem;text-transform:uppercase;margin:0}.bottom-submenu .back>a:hover{background:#303030;border-bottom:none;border-top:1px solid #5e5e5e}.bottom-submenu.move-top,.bottom-submenu.offcanvas-overlap-top,.bottom-submenu.offcanvas-overlap{-webkit-transform:translate3d(0, 0%, 0);-moz-transform:translate3d(0, 0%, 0);-ms-transform:translate(0, 0%);-o-transform:translate3d(0, 0%, 0);transform:translate3d(0, 0%, 0)}.left-off-canvas-menu ul.off-canvas-list li.has-submenu>a:after{content:"\BB";margin-left:.5rem;display:inline}.right-off-canvas-menu ul.off-canvas-list li.has-submenu>a:before{content:"\AB";margin-right:.5rem;display:inline}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xxlarge-only,.hide-for-xxlarge-up{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xxlarge-only,.show-for-xxlarge-up{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xxlarge-only,.visible-for-xxlarge-up{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up{display:table-cell !important}}@media only screen and (min-width: 40.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xxlarge-only,.hide-for-xxlarge-up{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xxlarge-only,.show-for-xxlarge-up{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xxlarge-only,.visible-for-xxlarge-up{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up{display:table-cell !important}}@media only screen and (min-width: 64.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xxlarge-only,.hide-for-xxlarge-up{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xxlarge-only,.show-for-xxlarge-up{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xxlarge-only,.visible-for-xxlarge-up{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up{display:table-cell !important}}@media only screen and (min-width: 90.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.hide-for-xxlarge-only,.hide-for-xxlarge-up{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.show-for-xxlarge-only,.show-for-xxlarge-up{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xxlarge-only,.visible-for-xxlarge-up{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up{display:table-cell !important}}@media only screen and (min-width: 120.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.show-for-xxlarge-only,.show-for-xxlarge-up{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xxlarge-only,.hide-for-xxlarge-up{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xxlarge-only,.visible-for-xxlarge-up{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xxlarge-only,table.show-for-xxlarge-up{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}.show-for-sr{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}.show-on-focus{clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;position:absolute !important;width:1px}.show-on-focus:focus,.show-on-focus:active{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.print-only,.show-for-print{display:none !important}@media print{.print-only,.show-for-print{display:block !important}.hide-on-print,.hide-for-print{display:none !important}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.7.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@font-face{font-family:'klinic';src:url("../fonts/klinicslabbook-webfont.eot");src:url("../fonts/klinicslabbook-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/klinicslabbook-webfont.woff2") format("woff2"),url("../fonts/klinicslabbook-webfont.woff") format("woff"),url("../fonts/klinicslabbook-webfont.ttf") format("truetype"),url("../fonts/klinicslabbook-webfont.svg#klinic_slabbook") format("svg");font-weight:400;font-style:normal}@font-face{font-family:'klinic';src:url("../fonts/klinicslabmedium-webfont.eot");src:url("../fonts/klinicslabmedium-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/klinicslabmedium-webfont.woff2") format("woff2"),url("../fonts/klinicslabmedium-webfont.woff") format("woff"),url("../fonts/klinicslabmedium-webfont.ttf") format("truetype"),url("../fonts/klinicslabmedium-webfont.svg#klinic_slabmedium") format("svg");font-weight:500;font-style:normal}h1{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:500;letter-spacing:0.02em}h2,h3,h4,h5{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:400;letter-spacing:0.0125em}a.button{color:white}a.button:hover{color:white}a.button.hollow{color:#4e4e4e}.button{transition:all 0.3s ease-in-out;background-color:#3fb1e5;color:white}.button:hover{background-color:#1d9bd4;color:white}.button.hollow{background-color:transparent;border:2px solid #dbdbdb}.button.hollow:hover,.button.hollow:active{background-color:transparent;border:2px solid #ff7590}.button.primary{background-color:#ff2a53;color:white}.button.primary:hover,.button.primary:active{background-color:#f6002f;color:white}.button.secondary{background-color:#3fb1e5;color:white}.button.secondary:hover,.button.secondary:active{background-color:#1d9bd4;color:white}.button .fa{font-size:0.875em;margin:0.25em 1.5em}.button .fa.left{margin-left:-0.7em}.button .fa.right{margin-right:-0.7em}.button .fa.fa-github{font-size:19px;margin:initial;padding-right:10px}.button .fa.fa-caret-up,.button .fa.fa-caret-down{margin:initial}.geo-shapes{padding-bottom:2em}.geo-shapes hr{border-width:5px 0 0;margin-top:-0.667em;margin-left:40%;margin-right:40%;opacity:0.13}.geo-shapes span{position:relative;z-index:650;margin:0 0 -2em}.shapes .row{display:block}.shapes .row span{display:inline-block;width:10%;padding-bottom:10%;height:0;overflow:hidden;float:left;position:relative}.shapes .row span em{transform:rotate(45deg);display:block;width:150%;padding-bottom:150%;position:absolute;right:-75%;top:-81.5%;height:0}.shapes .shape-row-6>span{width:16.666%;padding-bottom:16.666%}.shapes .shape-row-8>span{width:12.5%;padding-bottom:12.5%}.shapes .shape-row-12>span{width:8.3333%;padding-bottom:8.3333%}.shapes .s-p{background:#ff2a53}.shapes .s-b{background:#3fb1e5}.shapes .s-g{background:#38bb4c}.shapes .s-pl{background:#ff7590}.shapes .s-bl{background:#7fccf0}.shapes .s-gl{background:#68d478}.shapes .s-pd{background:#ef637e}.shapes .s-bd{background:#27759a}.shapes .s-gd{background:#44a653}.shapes .s-d1{background:#4e4e4e}.shapes .s-d2{background:#464646}.shapes .s-l1{background:#f4f4f4}.shapes .s-l2{background:#e4e4e4}.shapes .s-w{background:#fff}.shapes.shapes-animate .row{display:block}.shapes.shapes-animate .row span{transition:all 0.85s ease-in-out}.shapes.shapes-animate .row span:hover{transform:rotate(90deg)}.shape-position{width:100%}.shape-position .row{max-width:100%}.shape-position.shape-position-top{position:absolute;top:0%}.shape-position.shape-position-bottom{position:absolute;bottom:0%}.shape-position.shape-position-bottom .row span em{transform:rotate(45deg);left:-75%;right:auto;top:-81.5%}@media only screen and (max-width: 40.063em){.billboard-home section{width:100%;z-index:50}.billboard-home section h1{font-size:1.425em}.billboard-home section p{font-size:0.925em;margin:0 20% 2em}.billboard-home section .button{min-width:85%;margin:0.25em 7.5%;max-width:200px}.content-wrap{margin-bottom:-225px !important}footer{height:225px !important}.shape-position.shape-position-bottom{bottom:-3.5em;width:117.5%;z-index:150}.off-canvas-wrap.move-right,.off-canvas-wrap.move-left{height:100%}.off-canvas-wrap.move-right .inner-wrap,.off-canvas-wrap.move-right .content-wrap,.off-canvas-wrap.move-left .inner-wrap,.off-canvas-wrap.move-left .content-wrap{height:100%}.off-canvas-wrap.move-right .inner-wrap+footer,.off-canvas-wrap.move-right .content-wrap+footer,.off-canvas-wrap.move-left .inner-wrap+footer,.off-canvas-wrap.move-left .content-wrap+footer{display:none}aside.right-off-canvas-menu ul:first-child{height:100%;max-height:100%;overflow-y:scroll}aside.right-off-canvas-menu ul:first-child ul{height:auto;margin:0 0 1.25em 0}aside.right-off-canvas-menu ul:first-child ul li a{font-size:0.875em;padding-left:2.75rem;opacity:0.75}}.navbar{background:#fff;padding:15px 0;position:fixed;width:100%;z-index:10000;height:82px;transition:box-shadow 0.2s;transform-style:preserve-3d;height:82px;border-bottom:2px solid #f4f4f4;text-align:center}.navbar .row{max-width:100%}.navbar h1{margin:0;line-height:1;text-align:left}.navbar nav{height:1em;text-align:center}.navbar nav ul.inline-list{margin:1em auto 0;display:inline-block;width:auto;padding-right:2em}.navbar nav li{margin-left:0}.navbar nav li:last-child{margin-right:0}.navbar nav li a{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:400;letter-spacing:0.0125em;position:relative;display:inline-block;text-align:center;transition:all 0.3s ease-in-out;font-size:1.125em;line-height:1;letter-spacing:0.035em;color:#ff2a53;margin-right:3em}.navbar nav li a::after{display:inline-block;content:"";background:#ff2a53;height:3px;width:10%;opacity:0;margin:-0.75em auto 0;transition:all 0.3s ease-in-out}.navbar nav li a:hover::after{width:100%;opacity:1}.navbar nav li a:hover{color:#ff2a53}.navbar nav li a.active{color:#ff2a53}.navbar nav li a.active::after{width:100%;opacity:1}.navbar nav li a.dropdown{display:block}.navbar nav li a.dropdown em{padding-left:0.75em;margin-left:0.425em;border-left:1px dotted #cbcbcb;display:inline-block}.navbar nav li a.dropdown .fa{font-size:0.75em;display:inline-block;transition:all 0.3s ease-in-out}.navbar nav li a.dropdown[aria-expanded=true] .fa{transform:rotate(180deg)}.navbar nav .button{margin:-1.25em 0 0;color:#ff2a53}.navbar nav .button:hover{border-color:#ff7590}.headroom{transition:transform 200ms linear;position:fixed;top:0;z-index:1000}.headroom.headroom--pinned{transform:translateY(0%);box-shadow:0 0 10px rgba(100,100,100,0.15)}.headroom.headroom--top{box-shadow:none}.headroom.headroom--unpinned{transform:translateY(-100%)}ul.f-dropdown{display:none !important}ul.f-open-dropdown{display:block !important;position:fixed !important;top:0px !important;left:0 !important;right:0 !important;padding:85px 8.25% 0;max-width:100% !important;width:100%;z-index:800 !important;box-shadow:none;background:white !important;border-bottom:2px solid #f4f4f4}ul.f-open-dropdown .fa-times{position:fixed;top:40px;right:40px;color:#818181;font-size:2em}ul.f-open-dropdown:before{display:none}ul.f-open-dropdown li{text-align:center;margin:0;display:inline-block}ul.f-open-dropdown li:hover{background:transparent}ul.f-open-dropdown li a{display:block;text-align:left;padding:0.333em 0.25em 0.333em 0;font-size:1.5em;background-color:transparent;min-height:75px;overflow:hidden;position:relative;transition:all 0.3s ease-in-out}ul.f-open-dropdown li a img{position:absolute;top:47.5%;transform:translateY(-47.5%);left:0;max-width:45px;margin:0 0.75em 0.5em 0}ul.f-open-dropdown li a h3,ul.f-open-dropdown li a p{margin:0 0 0 3.75rem;width:100%;display:block;text-align:left}ul.f-open-dropdown li a h3{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:500;letter-spacing:0.02em;font-size:1em}ul.f-open-dropdown li a p{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.425em;color:#a3a3a3}ul.f-open-dropdown li a:after{display:block;content:" ";width:1%;height:4px;background:#ff2a53;position:absolute;bottom:4px;left:50%;margin:0 auto;opacity:0;transition:all 0.3s ease-in-out}ul.f-open-dropdown li a:hover{background-color:transparent !important}ul.f-open-dropdown li a:hover:after{width:100%;left:0;opacity:1}.right-off-canvas-toggle.fa{color:#e4e4e4;font-size:1.5em;padding:1em 0.5em;position:absolute;margin-top:-0.5em;top:0;right:0;z-index:1250;transition:all 0.3s ease-in-out}.right-off-canvas-toggle.fa:hover{background:#fdfdfd;color:#4e4e4e}aside.right-off-canvas-menu ul{margin:1.25em 0}aside.right-off-canvas-menu ul li{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:400;letter-spacing:0.0125em}aside.right-off-canvas-menu ul li a{color:white;padding:0.5em 2em;display:block;line-height:1.2;transition:all 0.3s ease-in-out}aside.right-off-canvas-menu ul li a:hover{background:#bf1435}aside.right-off-canvas-menu .button{margin:2.5em 10% 1em;width:80%}footer{padding:0;z-index:1020;position:relative;height:335px;background:white;margin-left:290px}@media only screen and (max-width: 40em){footer{margin-left:0}}footer .logo{margin:0 0 2em}footer p.copyright{font-size:12px;line-height:1.6;color:#8e8e8e;max-width:220px;margin:0.75em 0 0}footer p.copyright .separator{opacity:0.5}footer p.copyright a{color:#8e8e8e}footer p.copyright a:hover{color:#3fb1e5}footer p.copyright img{margin:-3px 0.2em 0;max-height:15px}footer .panel-newsletter{padding:1.25em 0}@media only screen and (max-width: 40em){footer .panel-newsletter{padding:0.75em 0}}footer .panel-newsletter .subscribe #mc_embed_signup_scroll{position:relative}footer .panel-newsletter .subscribe label,footer .panel-newsletter .subscribe .button,footer .panel-newsletter .subscribe div.mce_inline_error{position:absolute;left:-999em}footer .panel-newsletter .subscribe input{background-color:#f4f4f4;border:none;outline:none;display:block;color:#3fb1e5;border-bottom:1px solid #3fb1e5;font-size:0.75em;padding:0;height:2.5em;margin:-0.5em 0 0;box-shadow:none;transition:all 0.3s ease-in-out;font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:500;letter-spacing:0.02em}footer .panel-newsletter .subscribe input#mce-EMAIL{width:100%}footer .panel-newsletter .subscribe input::-webkit-input-placeholder{color:#3fb1e5 !important}footer .panel-newsletter .subscribe input::-moz-placeholder,footer .panel-newsletter .subscribe input:-moz-placeholder{color:#3fb1e5 !important}footer .panel-newsletter .subscribe input::-ms-input-placeholder{color:#3fb1e5 !important}footer .panel-newsletter .subscribe input::placeholder-shown{color:#3fb1e5 !important}footer .panel-newsletter .subscribe:after{position:absolute;color:#4e4e4e;opacity:0.25;right:0.925em;top:0.125em;font-size:0.75em;font-family:'FontAwesome';display:inline-block;content:"\f054"}footer .panel-newsletter .social nav{white-space:nowrap;margin-right:5%}footer .panel-newsletter .social nav a{font-size:1.125em;margin:0 1.5em 0 0;color:#4e4e4e;opacity:0.425;transition:all 0.3s ease-in-out}footer .panel-newsletter .social nav a:hover{opacity:1;color:#3fb1e5}footer #mc_embed_signup #mce-error-response,footer #mc_embed_signup div.mce_inline_error{left:0;top:-1.2em;background-color:transparent;padding:0;color:#ff2a53;font-size:10px}footer #mc_embed_signup #mce-error-response{color:#38bb4c}footer #mc_embed_signup #mce-success-response{color:#38bb4c;font-size:11px;padding:0.2em 10% 0 0}footer .panel-links{padding-top:2.5em;background:white}@media only screen and (min-width: 40.063em){footer .panel-links{padding-bottom:0;font-size:1.25rem}}footer .panel-links dl{font-size:0.925em;float:left;margin:0.75em 0 2em 7.5%}@media only screen and (max-width: 40em){footer .panel-links dl{float:left;min-width:30%;margin:0 5%;line-height:1}}footer .panel-links dl dt{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:500;letter-spacing:0.02em;font-size:0.875em}footer .panel-links dl dt a{color:#ff2a53;position:relative;display:inline-block;text-align:center;transition:all 0.3s ease-in-out;text-align:left;line-height:1}footer .panel-links dl dt a::after{display:inline-block;content:"";background:#ff2a53;height:3px;width:10%;opacity:0;margin:-0.75em auto 0;transition:all 0.3s ease-in-out}footer .panel-links dl dt a:hover::after{width:100%;opacity:1}footer .panel-links dl dd{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold;font-size:0.667em}@media only screen and (max-width: 40em){footer .panel-links dl dd{display:none}}footer .panel-links dl dd a{color:#4e4e4e;transition:all 0.3s ease-in-out}footer .panel-links dl dd a:hover{color:#3fb1e5}@media only screen and (max-width: 40em){.panel--newsletter{display:none}} +html,body{height:100%}.off-canvas-wrap,.inner-wrap{min-height:100%}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;overflow-x:hidden}body .row{max-width:75rem}body .row.fullwidth{max-width:100%;padding-left:1.25em;padding-right:1.25em}.content-wrap{position:relative;padding-left:320px;min-height:100%;margin-bottom:-335px}@media only screen and (max-width: 40em){.content-wrap{padding-left:5%;padding-right:5%}}@media only screen and (min-width: 40.0625em) and (max-width: 64em){.content-wrap{padding-left:5%;padding-right:5%}}.content-wrap:after{content:"";display:block;height:390px}.content-inner{width:auto;max-width:800px;margin-left:auto;margin-right:auto;padding-top:128px;padding-bottom:128px}.sidebar{width:290px;position:fixed;top:0;left:0;background:white;z-index:1010;height:100%;overflow-y:scroll;border-bottom:2px solid #f4f4f4}.alert-box.banner{background:#ff2a53;text-align:center;color:white;position:relative;z-index:10;display:block;margin-left:290px;padding:88px 0 8px;margin-bottom:-75px;font-size:0.925rem;letter-spacing:0.025em}.alert-box.banner a{color:white;border-bottom:1px dotted white}.sidebar .sidebar-inner{padding:120px 0 40px;max-width:320px;position:relative;z-index:50}.sidebar .sidebar-inner h1{margin:0 0 70px;padding:0;border-bottom:2px solid #f4f4f4;height:82px;width:290px;position:fixed;top:0}.sidebar .sidebar-inner h1:hover{border-color:#3fb1e5}.sidebar .sidebar-inner h1 a.logo{padding:0 0 0 0.825em;display:block;line-height:78px;background:white;border-right:2px solid #f4f4f4}.sidebar .sidebar-inner h1 a.logo img{margin-top:-10px}.sidebar .sidebar-inner:hover li a{color:#8f8f8f}.sidebar .sidebar-inner ul,.sidebar .sidebar-inner li{list-style:none;padding:0;margin:0}.sidebar .sidebar-inner li{font-size:1.125em}.sidebar .sidebar-inner li a{padding:0.333em 2.5em;display:inline-block;width:100%;color:#b7b7b7;font-size:0.825em;transition:all 0.3s ease-in-out}.sidebar .sidebar-inner li a[state=open],.sidebar .sidebar-inner li a.current{color:#ff2a53;font-weight:bold}.sidebar .sidebar-inner li a[state=open]+ul>li a,.sidebar .sidebar-inner li a.current+ul>li a{font-weight:normal !important;color:#4e4e4e}.sidebar .sidebar-inner li a[state=open]+ul>li a:before,.sidebar .sidebar-inner li a.current+ul>li a:before{content:" ";position:absolute;width:8px;height:8px;border-radius:4px;display:inline-block;border:4px solid #fff4f7;margin:0.5em 0 0 0;left:2.8em}.sidebar .sidebar-inner li a:hover{background:#f4f4f4}.sidebar .sidebar-inner li.toctree-l1.current ul{display:block !important}.sidebar .sidebar-inner ul{padding-bottom:1.5em}.sidebar .sidebar-inner li li a{padding-left:4em;font-size:0.75em}.sidebar .sidebar-bg{position:fixed;top:0;bottom:0;width:290px;border-right:2px solid #f4f4f4;z-index:10}.content-inner h1 .headerlink,.content-inner h2 .headerlink,.content-inner h3 .headerlink,.content-inner h4 .headerlink,.content-inner h5 .headerlink,.content-inner h6 .headerlink{opacity:0;margin:0 0 0 0.75em;font-size:0.75em;color:#8e8e8e;transition:all 0.3s ease-in-out}.content-inner *:hover>.headerlink{opacity:1}.content-inner a{background-color:#fefefe;color:#2fabe3;transition:all 0.3s ease-in-out}.content-inner a:hover{color:#7fccf0}.content-inner h1,.content-inner h2,.content-inner h3,.content-inner h4,.content-inner h5,.content-inner h6,.content-inner p,.content-inner li{padding-right:5%}.content-inner h1{color:#4e4e4e}.content-inner h1:not(:first-child){margin-top:1.5em}.content-inner h1+p{font-size:1.333em;margin-bottom:3.5em;padding-right:2.5%;line-height:1.75;font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:400;letter-spacing:0.0125em}.content-inner h1+p:not(:first-child){margin-bottom:1.5em}.content-inner h2{margin-top:2em;font-size:1.75em;color:#ff2a53}.content-inner p{margin-top:0.5em;line-height:1.925;margin-bottom:1.25em}.content-inner ol,.content-inner ul,.content-inner dl{line-height:1.5;margin-bottom:1.75em}.content-inner ol li,.content-inner ul li,.content-inner dl li{margin-bottom:0.5em}.content-inner pre,.content-inner code{font-family:Consolas,"Lucida Console",Monaco,monospace;border:none;background:#4e4e4e;color:white;border:4px solid transparent;font-size:0.825rem;transition:all 0.3s ease-in-out}.content-inner code{padding:0;box-shadow:0 0 0 1px #f4f4f4;background:#f4f4f4;color:#464646}.content-inner pre{line-height:1.636;padding:0.5em 0.75em;margin:1em 0 2em;display:inline-block;width:100%;background:#4e4e4e;color:white}.content-inner pre code{background:#4e4e4e;color:white;box-shadow:0 0 0 1px #4e4e4e;display:block}.content-inner pre:hover{background:#464646;border-left:4px solid #ff2a53}.content-inner pre:hover code{background:#464646;box-shadow:0 0 0 1px #464646}.content-inner .version-warning{padding:10px;margin-top:10px;border:solid 4px #ff2a53}.content-inner .version-warning .version-warning-title{font-size:18px;font-weight:bold;line-height:26px;text-indent:50px}.content-inner .version-warning .important .version-warning-title{background:url(../img/glyphs.png) no-repeat 0 -81px}.content-inner .version-warning a,.content-inner .version-warning a em,.content-inner .version-warning em{font-style:normal !important;color:#ff2a53 !important}.content-inner .admonition{padding:0.25em 1.5em;margin-bottom:1.5em;border:solid 4px #38bb4c}.content-inner .admonition .admonition-title{font-size:18px;font-weight:bold;line-height:26px;text-indent:50px}.content-inner .warning{border:solid 4px #ff2a53}.content-inner .warning .admonition-title{background:url(../img/glyphs.png) no-repeat}.content-inner .note .admonition-title{background:url(../img/glyphs.png) no-repeat 0 -25px}.content-inner .tip .admonition-title{background:url(../img/glyphs.png) no-repeat 0 -53px}.content-inner .important .admonition-title{background:url(../img/glyphs.png) no-repeat 0 -81px}.content-inner .hint .admonition-title{background:url(../img/glyphs.png) no-repeat 0 -108px}.content-inner .attention .admonition-title{background:url(../img/glyphs.png) no-repeat 0 -135px}.content-inner .caution .admonition-title{background:url(../img/glyphs.png) no-repeat 0 -160px}.content-inner .danger .admonition-title{background:url(../img/glyphs.png) no-repeat 0 -186px}.content-inner .error .admonition-title{background:url(../img/glyphs.png) no-repeat 0 -218px}@media only screen and (max-width: 40em){.content-wrap{padding-left:0px}.alert-box.banner{margin-left:0}.navbar h1{margin:0.1em 0 0.125em -0.75em}.content-inner{padding-top:105px;padding-left:1em;padding-right:1em}.content-inner h1,.content-inner h2,.content-inner h3,.content-inner h4,.content-inner h5,.content-inner h6,.content-inner p,.content-inner li{padding-right:0%}.content-inner h1{font-size:1.75em}.content-inner h1+p{font-size:1.25em;line-height:1.4}}.panel{font-size:21px;padding:40px 0;width:100%;position:relative}@media only screen and (max-width: 40em){.panel{padding:10px 0}}.panel.-blue{background-color:#3fb1e5;color:#fff}@media only screen and (min-width: 40.063em){.panel.-blue{padding-top:60px}}.panel.-blue h1,.panel.-blue h2,.panel.-blue p{color:#555}.panel.-gray{background-color:#f4f4f4}.geo-shapes-title{margin:0 auto}.geo-shapes-title.blue h2 hr.border{border-color:#3fb1e5}.geo-shapes-title.pink h2 hr.border{border-color:#ff2a53}.geo-shapes-title h2{display:inline-block;line-height:1;padding:0 1em;margin:0 0 1.5em;font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:500;letter-spacing:0.02em}.geo-shapes-title h2 hr.border{border-color:#38bb4c;border-width:0 0 5px;margin:0.575em -5% 1em}.geo-shapes-title h2 .geo-shapes{padding-bottom:0;font-size:21px;line-height:1.5}.geo-shapes-title h2 .geo-shapes hr{width:42.5%;margin-left:auto;margin-right:auto}.panel.panel--signoff{min-height:320px;overflow:hidden}.panel.panel--signoff.panel--signoff-how{min-height:570px}.panel.panel--signoff .text-center{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);margin-top:-5%;z-index:1200}.panel.panel--signoff .text-center .geo-shapes{padding-top:2em;padding-bottom:0.5em}.panel.panel--signoff .text-center h2{margin:0.5em 0}.panel.panel--signoff .text-center h4 a{position:relative;display:inline-block;text-align:center;transition:all 0.3s ease-in-out;line-height:1}.panel.panel--signoff .text-center h4 a::after{display:inline-block;content:"";background:#ff2a53;height:3px;width:10%;opacity:0;margin:-0.75em auto 0;transition:all 0.3s ease-in-out}.panel.panel--signoff .text-center h4 a:hover::after{width:100%;opacity:1}.panel.panel--signoff .text-center p:last-child{margin-bottom:0}.panel.panel--signoff .shape-position.shape-position-bottom{bottom:-10%}.intro{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);margin-top:50px}.intro .geo-shapes{padding-bottom:0.5em}.intro p{max-width:92%;font-size:0.875em;margin:0.5em auto 1.5em}.content .pink{color:#ff2a53;border-color:#ff2a53}.content .blue{color:#3fb1e5;border-color:#3fb1e5}.content .green{color:#38bb4c;border-color:#38bb4c}.content h2,.content h3,.content h4{color:#ff2a53;margin:1.5em 0;line-height:1.3}.content h2{margin:2em 0 0.5em}.content h2 .geo-shapes{padding:0}.content h3{margin:1em 0}.content .pics p{padding-right:0}.content .text-center p{padding-right:0}.content p{padding-right:5%;line-height:1.636;margin-bottom:1.5rem}@media only screen and (min-width: 40.063em){.content p:last-child{margin-bottom:1em}}.content p.lead{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:400;letter-spacing:0.0125em;padding:0;font-size:0.925em}.content code,.content pre{font-family:Consolas,"Lucida Console",Monaco,monospace;background:#f0f0f0;border:none;color:#464646;line-height:1.8}.content table{border:2px solid #f4f4f4;margin:1.5em auto;width:100%}.content table th,.content table td{vertical-align:top;padding:0.825em 1.5em 1.25em 0.75em;line-height:1.333}.content table th{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:500;letter-spacing:0.02em;color:white;font-size:1em;background:#4e4e4e;line-height:1.2}.content table .small{font-size:0.75em;line-height:1.7;max-width:50%}.content dl{margin:0 0 1.5em;font-size:1.25rem;line-height:1.5}.content dl dt,.content dl dd{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:400;letter-spacing:0.0125em}.content dl dt{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:500;letter-spacing:0.02em;color:#c4c4c4}.content dl.inline-list dt,.content dl.inline-list dd{float:left;display:inline-block;margin-right:1em}.content dl.inline-list dt{clear:left}.content address{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:400;letter-spacing:0.0125em;font-size:1.25rem;margin:2em 0 1em;line-height:1.333}.content address em{font-family:"klinic",Consolas,"Andale Mono",Rockwell,Courier,sans-serif;font-weight:500;letter-spacing:0.02em;font-style:normal;color:#c4c4c4}.content hr.blank{color:white;border-color:white}.content .quote{font-size:0.875em;font-family:Georgia,Cambria,"Times New Roman",Times,serif;line-height:1.7;color:#8f8f8f;padding:0.5em 5%;margin-right:-3.333em;font-style:italic;letter-spacing:0.015em;position:relative}.content .quote:before{content:"\“";position:absolute;font-size:3em;left:-0.125em;top:-0.25em;width:1em;opacity:0.3;z-index:500}.content a.ripple{position:relative;display:inline-block;text-align:center;transition:all 0.3s ease-in-out;display:inline}.content a.ripple::after{display:inline-block;content:"";background:#ff2a53;height:3px;width:10%;opacity:0;margin:-0.75em auto 0;transition:all 0.3s ease-in-out}.content a.ripple:hover::after{width:100%;opacity:1}.content a.ripple:after{position:absolute;left:0;bottom:-0.2em}.content .breakout-cta-row{background:white;box-shadow:0 1px 3px #dedede;padding:1em 1.25em;margin-bottom:1.25em}.content .breakout-cta-row p.left{font-size:0.75em;padding:0.5em 0;margin:0;color:#787878}@media only screen and (max-width: 40em){.content .breakout-cta-row p.left,.content .breakout-cta-row button{float:none;text-align:center;margin:0 auto}}.content .centerer{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.off-canvas-wrap.move-left{position:fixed}@media only screen and (max-width: 40em){.navbar.top-bar{top:0}} +#tos{padding-top:100px}@media only screen and (max-width: 40em){#tos{padding:80px 20px 20px 20px}} +/*# sourceMappingURL=styles.css.map */ diff --git a/static/css/styles.css.map b/static/css/styles.css.map new file mode 100644 index 000000000..794302360 --- /dev/null +++ b/static/css/styles.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../../bower_components/foundation/scss/normalize.scss","../scss/_custom-foundation-settings.scss","../../bower_components/foundation/scss/foundation/components/_global.scss","../../bower_components/foundation/scss/foundation/components/_grid.scss","../../bower_components/foundation/scss/foundation/components/_block-grid.scss","../../bower_components/foundation/scss/foundation/components/_inline-lists.scss","../../bower_components/foundation/scss/foundation/components/_alert-boxes.scss","../../bower_components/foundation/scss/foundation/components/_reveal.scss","../../bower_components/foundation/scss/foundation/components/_buttons.scss","../../bower_components/foundation/scss/foundation/_functions.scss","../../bower_components/foundation/scss/foundation/components/_dropdown-buttons.scss","../../bower_components/foundation/scss/foundation/components/_split-buttons.scss","../../bower_components/foundation/scss/foundation/components/_tables.scss","../../bower_components/foundation/scss/foundation/components/_type.scss","../../bower_components/foundation/scss/foundation/components/_offcanvas.scss","../../bower_components/foundation/scss/foundation/components/_visibility.scss","../../bower_components/font-awesome/scss/_path.scss","../../bower_components/font-awesome/scss/_core.scss","../../bower_components/font-awesome/scss/_larger.scss","../../bower_components/font-awesome/scss/_fixed-width.scss","../../bower_components/font-awesome/scss/_list.scss","../../bower_components/font-awesome/scss/_variables.scss","../../bower_components/font-awesome/scss/_bordered-pulled.scss","../../bower_components/font-awesome/scss/_animated.scss","../../bower_components/font-awesome/scss/_rotated-flipped.scss","../../bower_components/font-awesome/scss/_mixins.scss","../../bower_components/font-awesome/scss/_stacked.scss","../../bower_components/font-awesome/scss/_icons.scss","../../bower_components/font-awesome/scss/_screen-reader.scss","../scss/_typography.scss","../scss/_mixins.scss","../scss/_buttons.scss","../scss/_shapes.scss","../scss/_media.scss","../scss/_header.scss","../scss/_offcanvas.scss","../scss/_footer.scss","../scss/_doc-layout.scss","../scss/_doc-sidebar.scss","../scss/_doc-content.scss","../scss/_doc-responsive.scss","../scss/app.scss"], +"names": [], +"file": "styles.css" +} diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fdc7e80cf9247e09528df32b755709c79a4ec6ae GIT binary patch literal 1406 zcmeH^F-yci5QX2E%Xt}fZ}nnqgEsz~!&=)z3x9?9C#-DkY(%h85D^Q(&i1%UR1h0E z1Yvx;IdXEAHWryM$$LAKFT(^7Ufv_dUJ4Xco6K-jG6fypqo|%g^kCg!#=Ps}Wn?(o zr~Vk?{@ieKKz&hSuwmHFsb8kV%+HLQ519Cc)kdB`Egp?qXe8yCNkJq?&}@t3UuLLAsz|SFEdR zdzbC5ZeQH~y6xTKuG`g{aD)4wNp#EiJAef7F&ffa$-&%ph2aK9ruDKd4%)apJ& zwfi9Ca!;>|j1hkR#?Oe_CxPc7dZ=(0Fv)Pg1nx)clT4WzM~CIYy&fUA>q(KBsV?bj z5TcGuhv#&1WRh-N=6xFOXCmaPNlh`DU|#V2#76k_r;w`vQ4}RvmXd5*n4vSKB7XgOMm!qHX~fpkcZlF%-ch4N4lszFVt z9d)DQ=nQ%e^`n>3b@U$k41I@wMGw#rg(z1_OnFcWN=0d?QPcz~n3_jDL4{KhR3ep1 z^%eC4^)vMcg{g-wjLR?=mCHDnV3)Zr%Uzy! z+2j)IlH!u(QtqG5F`i{ zEEcR5tQSNJQUuw8N?8K=_sL zci|B2LQ7~lt)?f?)9GM(F1>_aLvN(F(vkE|I*l%(%jjy_LbuXA^l|zU{R;gC{UQB1 z{T=-i{TuyIM2lpi;UZ2nUNl)0C<+lR7i|*hMOmT}QLSjNs9SVcbW(Iq^t|Y%=$7aU z(RZSsM8AvdVu@HK9wQDAhlpp3=ZTk!SBjqzM~f50DdJ4=ZgG>iReV5vM0`SgQT(F# zruc2~r{ZtKe~4{vA~zp5wcBVnt=n?9^=@%)iEgQG>28H?6>jZrC)`fEU2=Qg?M=6j z+`e%8!R?;g5JNF67*+v8sC5@HtlqO3J(sXIIG+$aQEtghFYo$%nR%xenzx1H=sPv@t zjPzOQCFwQk3({AluS?&QzAL>Y{aE^6>6g-Pq<5r0Nq>{xm)fL5GD;?txyht5PnkmI zE8}D%WMgC#WK(1TGOa9BHdnS#wp8|%Y?bV3*?QS#*>+i!ELOHtmMk;K(q-AQd|9!q zTvjEkl{Lur%GzZ6WCvu2WXEKEva_-avdgmn$X=AaD!Uf7bn~ zd%ye3?$_PlcK^Wr6ZhNhU%7wl{)79^?!UV~a36Gk=;7i)doUg{4=;~l9!d|j$4HN{ z9uqyLdIWkzdL+grMjDMtX~y_yqb|}At=A=|>k?B^b)cLLCZj3Rz@HJiq*PN@no(zn zjZaK6=_3*&4RJb?o-f54O(_WmT~bQAE;}V9DIz}EaY;!trNqV>I?zQ#CYns~NjgJHWK2v-Msgxt`MSsDv{b$(J~=8SGc_?XD{y2a_`DBMmyBS9Ai8dZS5~8W9y4osbb} zh>48^u>4p^N>pd=*Um|5ow`~lg3ezfJ6ti zBMpX>3@2(GB_}!^#k5rCL!Ph>Ebxo~Oc9^0i-=82Ong){CPgMD>N2AfBa{EoxML6F6W)&siWDWH+%e2&JNQ+9YiMpp8${Z_=_A9DEEce4(&>RR5f0vPlz35e6w*>17yg}{{1ovwL;b75(e__8 zKv4$=K5D^t5to<}rOPmYJc39Y6O5q504Y(1cwKCCq*2E+os+YZQ%t&DX(08MJTy2iyqS!jKl70JMThfzLXxQ@XI6W zUlk5~{i`M|^iqT=WjY%+g zEa>LsB%MAE3}tF$3@9H5iFrfp=!m~MfH_J4eE>Wa5jZ3CAG+KKTxS50i%&Hf)1sV(h`^aascG5SJZ|E3 zK*M;xAKoYUyTrQ%Mt!_4G3K#qcaG1Sg9y-czzb>dM!gQ~Of(1_EJ34VK@-* zvG`|&Q#$@x^S4QGwBX68Hzg%%qm9NOU@p*NP94XiidSn!FhIbkAph~kh`$ZMUsaDy zL`2Z^AcsH1cMC>?pWt5>nD5M~avgPvI*>`w|IVvJx_MW@!NCsA>X=$kK%mor@^>JW zAbB7@PGUd4MgZeQ1O?2{r5WO)z$Spa73>i_TXkMWH5-NvAh~g;>`Zo&n zN>E_vUv(zXVo_-(P>H+(;i3Mj;b;H2)}i(Ob;Cc62nq^@Q=0{5DlJOqc#%itOrRQn z{<9ABU1U}a&>wtA;5ES2BP|l247YKH$fQ_s>Jq@GN{$Vf5fBv*l;9ES=)(k>DAC~j zbyOs#K<|G$9sjuH70_SLc;5KOty82^fd(1i>!oBEL7WUJ@iD;9X_+yA3(z6PgsfE1 zOKAopm<`^N1JzSvK^yX#9TX^-e&CC=t z$14H@J2fTL1UqN@*pdPM_{qV8keC!OtB(vEkJcG8)4}ls_slVYh@hF%oup|*5ka8<8X5#;01XAuPyh`D&`=!>U2 zdRYw6fdCx{(18FQ2+)B59SG2Y038Uu20^bu02c&sK>!!zoWK%i4@&|Z9WCJ>LW3Y@ z_e-?S+7RajdJBe@!7xHFj1UYX1oL&!AlTVpDGZ{8LA2117C^NCss&IjfNB9$3!qw< zObEb*09**bg#cWLb27{LY5)zH5gQQ8R|Dt_sG9+xGXQi3)Xjh{XF!)TLI5TjuF&NS zfSU<$GXV~077R2C2ATx}&4Phu!9cTMpjq%tfC~kxwOz&3*^!QxwJqoEs#qK}(C@m053xv`Fp|l|U+8}@n0=OW6 z1Nvx#04^Bdf&nfV;D9VzAd42rq6M;Ofh<}ei#8bGv;YS*(E?4hKoc#{L<=<00!_3) z6D`n03pCLJO|(E0Ezm>@G|`3tTnNAcL9`(N7Xol0p|OD>)8PcT8G&#GI3S1?2%?<< za5Df72%-goXn`PFAcz(Sq6LCzfgoBSh!zN<1%haSAX*@Z76_sRf@pytS|Erv6yQLD zv>-uRkRWa7%-BFs!60mbGabwt2)%{?Swes;Ax=38oax}yK z2OWk8sF?DmhEt2Fa%vCNNHtUK)PCw9b(%U)Jx5)o`l%18PpQu#*7=Kz0OFi77cZCL zF8(fKTqd}z6u1c71p$H(!CXOvAXbnh*d<646bs4)HG+CUpWp?-tAckSc6mqev*3Y% z2>x^xxaLBfvI3%%9T2BH>Uz@kyz6tW{X%cyEa5!iBH=RO(-4zP6kZp;C;UkGnecmh z97G#u(DUfU5M{hb_tUS_@6sR9UqUo-vuHa+4=tikMPG;~h_&Kb5FuPFUM>z3uMvlf zH;K22d&JL)Ul8AMle_u3jdh#i7T`9^ZK>N@w`bh8x<$F^-ICmnx}9_zfH>f7x3AoO zgh-&x5exKWhCwV)!%Sc%Gqafm%yNkRWib^@J9C0L%e={a0CB$utQ+ge`miI|@$7VV z3#(&yv90WW_Aq;#J;Q#;{>c6zagorHVG@mGkz|?VX~`Bzyd+s-lw?TqC8d&H$py)E z$$;dxm zA)1xxo(EAZK8Dri-sOG)qE>IXf9Z}rq!5*w;t}dG&ts{_lOC%))_LeX@;n+m4tt#N zxaRS$$A=!DdHm1gj>qqwLQfx0jpumJ>7JpU^E?-OuJByvxxq8WGr=>@bB||}=RVIK z&-0$Icz)pdo#!u}_dIQ$LtauZ&TEXN zd!u)Rx6V7++vuI;UF==qZSmgkec1cF_jBIQd%x=ahW9((x4b{`{@nXVZ!D+eBDuHR zSMDz#BcCDhom2Z_t$`j-Ud7ivfUMaW8TjZVc1M9IF_#Br*>zqK6hg z*M3DhXR{1T=dALZZ*fHaBb~y8UE=KWAF+floa8nziOhLUG>&1h9PeYWT#(3M8S^7O zjq@8^aFnC%G+s)&@kTOCP2h*Xjh$9bqOvqBjKYtb}95mYdN+r`G}s?GdKhEfSS$9Yv))|9#D?Q zDc>|JueB4JiaJ|cJJncDceVnqvD|e#$F>ngYetQ_q_e2Apj~X~diIx2WldFWMUA?l z!2d?Ms;n|TJ}D+8#%j-sNfBFX5sq6I(atIGYu$_g|Ul~om$%Is&yS~AoHIYn6| zS>lXJqR7it5`R%HR^)Y6sv9$#vYT_n#Tk)fvz3+A6}6S>(&h(Yb*h#RerapcG*!XT z)KuLh8J*ko!MGMx-GiGA&6?Vp>Y7?*XXG!%UFzocrjEva;;tI3Xl+xnQyD*7VJPEA z7fyk zMfEWH1cnV~un+wbgZ;K(&$&OTaRY7?8X0@IAMu~eD0m{ONw|~2N%#QA7BYJ{o#5a{@vUA&Z z%&E=#|7|*;HZQ&ML6zG4VcD~b)Nc_6yPmw*)o`ur#QrWZnZJ)Le-mF;etz_wtNrSd zu3aCWzb}5H3y&LbR(4!})AEMujW>(4uWQVB+|M^N)X$FCHMb-~e0BZNWiyoI3VGrw zGCxy&*x0je@n|zU6C~PoCc`SGGHlS|#hB&Z|5{@k5S75BvVj{nFn(fmo*U1F0ek9? zB(qaF3{u0=ksSLy2oRnQD7%W?YWFnO*H`=Ecj>w+OIhviE5yymYD!qkk=N;^c((9r z#_DtHRb+r(zdCwzhGr?5EhMiWz|jW)QEr9D9R-9kHii7C&-CghhD79ftjaQ`^I>;Vs-RjK&^r56@!; zDL# z1Py^l!0bR|fwKpJvlAJfvGFqEj;E1D=hcVKw_dr5b&Y)4GCB@mIRVTN?gsT2M6faIE`!ugU^d_48sO9#4?#c_K0b-vv~paP^!T!!1;k7oQ<7sMzJ0A>Mb%f?hG+$gJP7V|`w2eqDi@bjE<{ zjV0kqdj?rROk_OqR2v)8nlsd7718DwR%PtX^Zk6%-n{Ormc71yqBVZ>dbWruDl`}E z;@GU#yiWDac^oUOuis;7RI-NNXtTkd?90YB@lx)MJh*{0j`#Cm(vxhGLlf`N9Xfm37LB3eR zV4BdYIQ#`1P3-~g(1BCah@3F@p>gkH?+Kdn zhT=WN)#Bpfin3A-;fT7huqv}D-pVWG@TnnyQ22`XCHT#(a{tzz%P zez<)=@hxZ^o<b9-rrip|ai zv%$W*_LZfekSlOMt6mXHxGLQ$aj_`7CaXGI{p+utzpC&k?4Py=kJOy37S@2}vM4($ zIx5@MbNd47=bsg)-D>{qBPFZY4?|*>vBz3teXt+1X_L=A#>&|_AN(A1kMX^>2{W7( z9tv5}42Q!c;MgGUN7hkqovBTMZTfsGw$8QElm- zvidUH=Aq3#y@oDJpOWpsX+Wa^JOH9y%ZqlpIUOWk0X~fh=>0K+;UZe-unEwKiDuit zPvV_b_V(@DGp{r3+Z?gLj0y@$bF!5ng=$>PUEr{soy7fH9a!gphY7B03&YN0us2xb z(+)(hW!ONVaXjENjlsMb#fwObFtfR`7-lIF4^0LY_>0!dGvdp|}mHi%_ zRn*#9uVE+7`Q$Dh!C4wgi|4%Y)F=FvfWp_5jQ`0ZxHj6B($9 z0qlU&xx1`PvuV>3;5h3qNeuzk*=R20IXp+d)(S|G_MNicwpG zMSZNWGt1CqP#FwGSy>vkfb*TnlJnpUDN+EP?qh!??rcYCdqFcRtY~bkY*g*tTU%$* zbTl=$*Y3lXXvSwxZ&6Qro0xZEEmOhZtOiod|?_V!HS9}G|AZ@$5^Ip~_j;dm93 z2oJ$ku!4%`wYx^P2$0xM2f@;20kAeK5M+~ySE6R5eTFcFCLZI)5f9J>qd`jiT)zM# z0fy6z>quQRL+Wsy_X0nmE33jv4qs-lncczDQZWg*qZ7;~IKJ!&tb%u005ysMoZQe= z-B#P|TiYevLzh*TRhOunx4uu3g+me+2Yohecdf=!Se;W+uzs#jc}a0OxW84!drBL` zX7&m!H~R5XPIfTofT>AsY)UE5%49|0jf)PgezN&V6`@GnMlu4dYurW*$yhkFads!PB{A0Pe+CDK62~}R28rTu+ZWcQczsNT-&q?$kqW& z%?=fq2Q7j@3+rbsOavzI8${rD@zMmybBNOrNM%{s?y`zfU$!N`%iPl9%Ld_7T+m{+ zx7U2m&r>O>WbL)+i85;aLc|%cH zSzJ=6T1FS|Zm`s|fugRg=3S}E$7b|U^TDo8_5Vbyrm3K?AxA|nttY>bbTZ??Bpj@< zJ)~Li8)cxl!BT~DV6x_MvR;EZ8k`0LTzU;Gn2>%JpJaf*d+I@$EDa472Oce0?lglf z3|zfG0_q$%a7g_tedvHGRl}N@eITIt5?7Bqxw3+04PS16aw%UHW@Qx_3`!7*&MY+x z(q>}G5^xGelO-%~IlxM>p93ce4;*McaZ*@>oe3t_~u;0uc;F>HgmzN$f^wN~Ii@dIH?OG`(mQZ}H&Y(RjHu!|O*A?!Eb zoWbmXn%$L_wrf|~{)2cn=HQrpaDUn^=oZvy3+PbZ9uSjV&WbiWG;kXi=HP>Zf}Aqk z$JI9%z^hG!xt`2BVd_z{N?5hx9bjZZgUH#ld4b>T5j zP2P6>{aY7be)rS2fNTcQK!^JUfDNhvg58&x6pP2kt!%H`Y14K4zN^lpoIQ zWJP?7?6RDK0`M}j@?e$CiX47ZqouaKo+W^7wt-WySWe_@BI63mC>q=_5!+b5w?VVF z!_wK@A^zY62;G397cG5d?YpotgUN~F52c<|V?>`kbm$~-=Pu4>$p>xTq{0D34BO4? zy_;ALQ70@P&R*aZ0I{&J;Lx+ti~=xW0$Yb32qN)u5?GxBZdiy* zjp7#+@K)eT*h~uW5f#MUD#Y$I>nAGYX}XPk> zJOB&jbquHzRz-XWg2P9{s(~C}mqnEzX%jYF?2FPIjW_LMaV;YgHaEAk{F(>`q5D|K zU`7aj{So9lqY{Lw5F|aLR)h{x=oq4Q|LL;(Pr+`zOFE=!1L$PP5=W2Nw8^&;vJqP|Bie#m7Sa=D3I?jnI23DS|^5)up{R~2%NL9VBfD?!3k zBs_Rjd2B@<5y;~(@~lLj&B%*FUV7vmgyddG-hvc6(6AY3STq_|j)t8@ z!(K+ien!JJX!trbyc!Mv4*A3(p99F}BJvGJzW0&xKS;G5sh&lu8%Xs9;uFn-kl!=N zZ#(kajr_Wh-#O&>72^C6w;pj-h&zeYPa<_a(#VizCDQzi{GUYrxyb)E8ZjS@IEqHf z(8we-@_jV&D>U*R8l^|0hojN|L1TuYF{jbkXVJJ>XxwjT{6#cjBbsm)O{CDog=k_P znlu$nI*2B{h$fFklVj23A~g9WG-V5#l7Ob%MpMhswC~Y$cQl=#zzHaDE(+{LfnTDa zO(^JP6wIRF(TPp(DEVlL@;`y0zD~5PYy#* z`k*J3=*hQHm=J}nKw;fz z#ib#=3(`xFJ{!d^Me${5=SZ}3G}<{9?c9ZSUPU_xP{JydI2|Qcqoma+X(vj0A0;n9 z$*-dnIZDYusdBVy7}^zvc2%KWw~=8wGUOrSCS=@?Oo7N$j7(K1Efl5oqjWEnz6_;j zp!BmS{SL~Qk21 z^F?JdP?;5#UqTi4k$E06-$vCHsAejvIfH6dsP;=#`zP8n9o5Z7^>a~u1FHWPH3XoB zT-5LyYV<;lpCHR{)Z~F$7oxT()IJKe|A;y!qK>nu<38$~hW1TD`_7|%zo4#8)V&8C z@I?pqqMk*lrvdexLOuUOy~9!O7}Wa$I=CJk+=mX{L5Ds?hp(U`v(eF==;$Zt*wg6v z2z0y=9sdKJ_y(Q4i24?xzT4=OJ33`Sr^lhQ^U*myI)4jYIEgNfMi;N6=Q#A-Ep$nV zF4d#Uv(Oa}bmeVy^*p*(i~duF{_{3^ejIwf9Q8+{{)6bHHRz>E^s)`TvIo8Djb6=0 zubxJ)wW8}0==$^M^5p^wz)qy6aPH_#`$(5KVUrw7qza`c%E{Wl8TzKTAN zMqeyPU)(}pUO`_SLtkG--_1nd+t5$j(9h4IUmMV`pP=8iqu-j)@AJ?fv(O(epnG%B zy{{2`S95B;S&h|fUK_}n-L8@f$Sd0{sS7?f*!6y5Bn(UFh%`Ixtyc~ zCn(oQik4Dz2PMj;M9)%UFG_rxa%-TNBNTg-l1!!~Hz=uwl5VG@Z&K1BN@k+m=TROb zDUS~* DW6XoSgc`c{Bc2QnN$}5fXI!bvjq~rmVyp~e9QHnuo*g|SpJ2mWO*ej-n zo2lV#l-i9_CsUe*lx8obIYDV&pfn#)nlCB;Aj-d&8c|7&{0}wq4{FpZYV;OrG@-^U zqsIJ3jpeAZPg7&}P-CB^#!=LGh8q7qHE}jINli_Tqo%}CQ*Tn!%BktYsOh_@>EBQR zE2$tc74#MrTtsPIDD7Qp#v*FQ5H<5TDm0s#RZ7izjhelYn)@v^Z-AP=nwlR=&A&p; ze?TozQVSBO1z%7L&D6p-sYQX*qEu?p%hcj6)Zzka$zp2hBx>ntYUu-N+3VEuVbt>7 z)Ds)2C%UO8zoVYoM?H0cdg@*3sb8ru2^CgDtth8fK1Hp(POTb6t*W6`?V(oHQ>z-O zRZY~YW@=R{wW^(3)k&@D8u}B02d>s|>?(jYgR8<%=x+^&P^vv#1a69}!WJCO3xCa$v!egh+h*OfX%=G zhP);M$SJG(=A`Ra`Gye}{i^Oc*Y&=5ADIe}Q&;KJ=k%@ey-8g9R(+Cwy$>GXDMIoZ z&gGyFfSPh$|4Db>b>ExVrSE$BC#(8=Wf#G{ww;G~lRX$*y>{4~Y2)m{_F!j#2DbVj zcw~k9)3BDF&sYISw1Sfj6*wFiTR1+U*q_yzrY5CyT2@w?hLnoZI0t#Hda_vdzgnm}5V!3= z-};>Dvw=IsMM7C)GdnW5ob|S}E)P z$MM&D`H=-v81Sm*GyGEsd;`+y9zWqS#nqLTST%%{=-8FTo0AVDcV%ec`xuFE$O4Xg z4L2yKpMw>p%|hGYyBT3u*MTEPlrpOYpWtH$(Lg?b1;4daR9sb242~Xz)uQuLVk4Cg zx7_D!n?x{Fk>m8c^l`@z@_V)=;FgQJjR(?tGhpT7 z0+BLTtRZ6YiVwb@_lK$)KCb%X`;TsXpurj}hIN-KEOT6XyAJH{?hy}JM1!YXLqdt* zsf}u)97&WTi0=sTj`fqKEmc*~RrJzH-(6U*A-?yC68`Ur1KxZ3XG|-XGHM*bohgej zz%J$K+x#qO*lh~ZJRHC}Mz$5UXNVkva!e}&gi9sc8cQ`cSNqSfWNR;LSHb)Aae_W> zP^vhZ&}`hJwpR_1H0u`OzT)itCRH3`eTEbYOPgEETUAGzdk*3N&e6ipb(i&s;(dFl zU5dBZWn{~MHI%%HuUTikj@Mef@LIcR%dm|Z+HHm-4IYKa+2s_#k=z!gAbQgzc$iSedVgvUYrAl_aktz%WY5xD^+~e6An%{)uL+K!D>o4r+hwv_}U?6VK19or@zz$fc zLeqbD)WG3-K2ZIrF$7W}#{hbLn)$ze-1z{^9R2C_W+IxsDiQnHIAbPsQ>4{j|b&t>NpStTjXCr48NWu ze7yTnY6Tw+7dcZb_=q^&#;76Hf{%#f4j|w0xv-J1`CBX}%qon0ddIrvSuaJ3@vsRWkO?G22|H7Lgx@s5As^rgc-T+s zm!56@Y{yHHFVEil^bRrEK*oYOFp=F#yoP(cGo>B^_EPZMB1_kke;{BByAhK%%2 zZcA!TZ1PRPD})`DIW1W#Vt^P$LC$VX&g!zKN>?QoCFUpR67>V0`VzijJW-LcJB=DX zYG14@-cwRvsy@B_)b^8Ga+30siW11G6rbFRf-J~iFo+;)p`${L!%~~#TX%LO_{MLI zjfmeSE-$Tswk0(sb*1WO*S@>5e~TDmT)QnQ3j{qxF(v zZ%bu&{$7%TpYpLzPUOf25vjmCBKww`BlW&R(e@wn3oFz2=KH?Bu&%6ecVm^WrK+*E zq0aV%^_GwA3HvQ!d3{4=V|BH;TGd$HxTmiE^;v`DEfnbhc zP(EmS3oQAMict)naLrHTCm8(EdRmcFom-HrA{BIQZgYFJW{;=`cAAcGcoja#^pFAJ zZjsGwk5im0JePY)ZPyMS5%w0P?oU;b?*O2UgbTB(^Yef~X3<&st)11HHrRkT!jbRj z)YLRXk;bllctn^RR~Q|wOm2)gqqc?9*$@w^)^q`f!!W(jOBdMCtm-`2w}Gc;8ZRCJ zA#LD}aG=q`FLU-7npa7}xY#Wj8&w;(be)RT5Eb?l+I7$KtUsS2AA?OgP-JS~r6Lw< zIE}|Znh3Fou!XUP+rxeSfQvPJUuWInq8?uvF5?F8S?|5c;d_Aed!T^--_x4#OorUE z4uo)g!{2S=6?M%OEyYbBjRQWg4_jNJDk*VnLcdSm7nYUs0jqHk6%Qx(24DyrE^29R zY_8Lg->uyt9EfKl@YH0$8(4tJ7%uP7HFeeXHFa2TE%mW&q_N&!T2o$KR#WbaHzg@f z753+yRFh)sRpE)e=!1F{#Fq5YyLRSjNU{B@FfYDveVo#sjyG_xg1^&klPeAsbZ6{U z+t1^H%w~f*qtG{_pdj6(1odKSPVXvEmpARL*voG+)i-H?JqCnbdz-rtD6xFlD44fp zcr>Iuaer{INu=<>z7Tz1_X*jgvd<CK!jVx0^8k*;|ucv7E(EMR$Do`~TPLX%v%N(DsCImJZiPz4< z8&nWMd=8uOgD*6&iC;?ISO;30QAy$%+WZlPPqslIX%$q8LwVFyZpI+6P3)@#) z=(Z+HYn`U!T=SWpvtm5?dmQ>5UZ#QpJU0jZpy4N-=a@4e`34OETqzfTWw_J4_y~a8yA^GvNjY=3D?{0=e|ew%(|-Cbb`tIr0nrTz?mx zJI~F))dVf;4Zm854V7sDeJ~paLe}$Jx{h z>omJ3{>8ol4o~uneHx*MI#LWIls^g+k=C}y6KYxa)BO1K& zMAuc}xu3i4V@fG|SYWnU1mMfs{{-VMhmute`uLYsKTSEU-cwRsU82$_r^IRIV{tc; z!XfUSuZ%mA(${FI-qWbQbLRTpU*MhiwvP|_7yrLHfh~O;L1cI>S@Q`#z@@Zj9w^Wp z%IhuY$rAs(_!T08tv(`KOGM)rtBqNPg48^*sURmaMH$1LYP8hUHmWf+g!VW>$@ldd z3B$)oAC^LA$!$43d79Re_VTup!?}mE4`zyCNhQ5Y){z}bvST7#;a0sXGbKAEH@76G zJg-D-%*)M5R?cE9&c6AMphNr`Z}=*C*Y>YtI9MqKZs+JhxhsFM0Wuu-4=oS96;^L> zhP_4L7dI*Z5O!j$@?p-xkepZ)L%{YnNG&OH_Q88G3IfXt+FJtQYnvQ4+xZ(Gh|=2u zl=k-H(+y~EJI(|*haR%v66R4KHVf#oM`dt`ZX7#);~4fj_QUHx96Jujof~&<@PEf{ z{BQ?uZw$XN%$nd#bxMc)2uB*&PDlgm?lSLJ-KbU+a)m|a!d+am#k^N_CzspX#yigCz&>*~?4{%~2Oc$Gpe59JJG*>$ zwx+t4c%LdET;xjM9Fs9)cV08b6$7vbOx zJOsW}*x-i*^T7=q%x6GZ!roDVu-5E8Rj3*1v=oTGauNn%5sL1&+ z(a7N7ks5pOR#;0A2#E|rNCeh`{Hj8RCo+TKwtJ8-?aZ1ckVs7+k@|5$HHLbqfn{j8 zHCO?p+X$Y^n})eBELGVp^wPP{JZaEu1n&l(z`il$+2QewI+3B*a2kjmT;PTv-?ebE zW2rgZ7C)#{co)7$##|@Uo+p#VRhgMpnX2*QYpcg=?9UI4QrvjGcJB>MO>0+uD})W) zGO$=xZK<|clwIb1Rr}OWHByNs-+iNzjuYTuV_5J(Gro$J^M^%tmr7R&6zt@~t-}ux@C8S`DpH4EjY-!mSq0Y1AE4;g_ z4w(6)zq-F)GRC|A*OFgP=8ScTlov0fE8B`8Ml^1#l=?F$7$?m9!eDrco}}O z9WVd->$0y^_!52-cKYt(STYxI@bm>(Vcf)iZ{g)i+(K$FBI#=H?(N&Ex2s4IDbC(a ziZy#?3cdSJ?8f6t+mgjSTPq)~NmD*iH%h-oy>i!6Rbe@mQ+yys21z8tiI;2L*I%{$ zPvu?s_B&No?`W!Cel_#u{oS?uRgEX=Pt=@P*|f4@RclqJ&+cch;w?>A`f<}u+i!qrJ~XiRou0-c4M+DJ6_QxssN2=8sj2M2bC|Pz_-RI{OEp=dA%H_KUQ)dnH!-k+ zVXd9GUhtWpumFaAt*#nxyL?RC-h&JFKl^ytw(L?;5S3e(o2LwFuqPST!GIx^IHU^C zP;U@b;mOWXeOtlmjV#6Ps-`Q|6^)v`{Ccpsy0RCBKXVF(&(BKFORM&^kWSKFMmk}9 zKi6hI;;Y!!?w_T3XrVjXA8gYTU&5xRs&fkpvon+#d$ZdL)ai%7PiFg6mvSC-Y6dNI zR*wIrKJ1Ix?nCOf=Di(V%C5qW+-7xmDuGJ9N|ptd6OZFVH=z)>nZjpJ!rdU;MMIAA zqi2w@Tn#x8k6<6lLzzL?UxziRMPYKn3_+bu&VyJju8`#XxI5?FQ*+U&{Uc z;|MkgUiB7eZ~}s4F-0r*X|CTofA~n0e9)xW$l+t0nw%%+g=J+G#U;v; z+T!{$HJ|FhC-he|s^&rfjf8JxwleshEnMMDT!mZ+VSQOKESMlhV;@Lh9BGY?T1Q%= zpRn6*+Q{_s%NT_-|BK(8FM%EPvit&#eVl!)5Qjp3&rtX{(2HXsvNo2(vqaW$_Hn|i zys?CkULWtB+vE@&Sq_m92*=rjA&zaaTSzbtCIhgbCEdK;c8DT5c=R~Z2OSIWpTqpYOL;(l`zB(e?I286f^4=BL6 zlLDMC>@n_ajaS9*%rlxaWEKhK!|!+&9ALjesql1%0D}#zSrRb8FuaocFSDv)#ldj3 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/fonts/bootstrap/glyphicons-halflings-regular.ttf b/static/fonts/bootstrap/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/static/fonts/bootstrap/glyphicons-halflings-regular.woff2 b/static/fonts/bootstrap/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/static/fonts/fontawesome-webfont.eot b/static/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..9b6afaedc0fd7aaf927a07f82da9c11022251b8b GIT binary patch literal 70807 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 literal 0 HcmV?d00001 diff --git a/static/fonts/fontawesome-webfont.svg b/static/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..d05688e9e --- /dev/null +++ b/static/fonts/fontawesome-webfont.svg @@ -0,0 +1,655 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/fonts/fontawesome-webfont.ttf b/static/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..26dea7951a73079223b50653c455c5adf46a4648 GIT binary patch literal 142072 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 +|+&Vdls@0SAya!8#E9iVniRwHu0GY;H*n zR85WCMp8<;snu)zXP=G#Xp%p5&d~RHxMxCJ%JB}XSeUWMFU9vZy3ei-xcz(F8k=rp zdyPM(m0MZZ60|zi?q$sAj;xPPN%hK%PyX-8mZZEy{;|=m@WRkFXXA z5nF70;)1&WoP37EU9F}3icj&lSaW?;#r|w_SUit?N9L1_cPc}*K5%Pkt1n=2nYaoV z5-=GAhF=RUdZ;btZBMs=_tMe1fL6m~K|7*rAS?BN=yO0|fNo_f%Xms&H32%tGnW7tmw`>^wOMdk3PM6+%w}g8kf6c?98ir#!ZcT z6o%=3F`@>TLafTh+!$%g~lJN`>1|lZ=iJwyN^0%@(IsRoHUw zXOYP(ZdllU&ZNn)iuxBGyy(%3XGgV=Sf4qC*5@Qi3JMh0*%4vsObbtU5^D;iN4f2+6Pgs9+! zFz?f{)81^a-WuIAtL^JIp2gF?`W~IPb9;TI)2_;waI30XdAik>bo0GGa#)5+^8=>@C#`nkbj4_os-y*V4S)O3m!b~)n1PK0yhRG zFCJ|6G}v5j#sj`KX03`vTutn(_3VN5 z+jvzt8c-Y+F6Z`3c*MuR6w?^XLbtJ2dJqEK;y5OhaA?dRX0TBf2N9BH2;omVj@`T+ z^e@r&*zC(kl9AaEDNC?)S}@R=cpwzOCJcry4fQ4&6xF~GAsBB@;n}6;*v^6QRoWg8 zmk+GV=2fTF+_>bjCM&~&JLS0QRv8vO7%|2E@y5S;%&}E#98){9N+hCWJEuCFZdD$V zWEJX=F;^A3s@{Y#=a7TP%7%Q=9Ol$GSJb7Q2iiMdczoWehupLEUvB@rtXEs~1@o46 zsE#VTWBUd%=EqK?$92fTuAtm8E*(tN)^lE8n+TrrqTpS|$TNgyty~Tx|^+cZ~{(HPNg(I^#1 zVW}f>9LN9dc8|4B_^|xw@h%_j^0CHs(c+Ih(*Mv{e^?vG-XGiM5qK$wo$~ZY8s!g^ z(~Z>}Q`<=FZEAE{Lu2!&g7@)1S#p!guN_B00#_m7EtYS!sLR#tlSo$^xU z>4D*T+0~~?4*g~Lsxnfb?CPl>6MFbDxZ+Gucp!wyAOrYSSm1ut(Ku;za(<`FY79W3 z5wk*YrXv47#=-B@M6-{Jqav=9r$@@j17t=)k4Nd?|InV5^;d$T;p9FR<^F=ihaAcJ zf8EDE>Y$Jcy3j=R;79EuKOChROj8l0467IwI+S(h)JaTPv5yiYEHrV84<6jk^V<)yeZDG(Gfe`bCa>ye`<^P@Ik^2vw%4yh3t-B{ zz?*=+(&6h;Bemd~;7vMO!BS-y1`@n1xD>(L;>D>j0n@Np5PGuQmi{eU`jsumaxB}= zK~20bI;v&S(|zR@kcx*2ZYjWYJuix~nBRGvia8ZL5<5*oWR;F&&ey4%I6w2gwaYzlJw+ck|KivfE=bq4#PSkz^X%0T>+mLh5R}I@eibEuNdbVuPoKBJn!rUAw#N!`*sw91@KDTTQVbuvE?d>K@c{R;?l5RPTg2jmZOKO~DO*D>KV z-vN2Y)&pDnxD@jmk9%WYwr1(U?L&b7gWKio^bQzvI3~J$;Sd>btm%;fV%Ds?p^wE1 zea3*YdbKgI8uoDqqO1?qboKH4a6N?|J#W^s{a~f;@uC_{GmSvj^xWt~Egt?7v>2$0 zM_04h>L_XfJ1t;_^aJ4co28Xv^_F#QqOg|-7eZD5rFDg#k?1%a@|(I#*w@8$%^wo0 zo~-S=b+WW05Qoq#pyo*@iapP6><7w-_*u@+>y1LGpMGbR8mUuCy?oVgb5?jPR`!~a1HNd=-@4m) zCT!=v%UU#^iKJAQ%*BFZKN<%=LI-H8>hs6sMJJqE4Pz!er>b*r$lC zD_T&NcXxP3ZB7}YxAHl)IW;Zt=Fm?ndMb=%6&07`%yfP`PM25kHO6;JT{NfC#)qfU zz*O2~3ws66RJK2_@+Oi*pdIBIyVH0WGMwO-ah*HtfwQ$shV? z<^7}ICi;^TIF0;*I)n@geSm|Cps`FL8HuJkI_01GBN2aLvQ-(ehgYoX)qY3hST^GD z^B1hP!b-t82+Fmv(rz*97czEuRgA9xG_MhbIy$xCx1Ib>{(?Vp(wirrrU@wQh!iG^ zw(Km*3gM)6Qd?+pL_f9VW`rTI_yB!V&^Z21V#=w9TEP5%{p9v2~JL`pI$?%RFaUI7BAW< z-)Mp2O7t8D)pGi`qZv=pFqs|ZPuZ;HjS=HiS`(w&GPV)J{Vjj*=>Cp*5jsm=vyuj{ zEx-vBl715@h&g9v#1wVbg;6ZR7_Bk&g^?*r@iR(894Y((8dr&WbOJ|nJRdsokn)uJ z2T)9sm4{5rag*v7TcxtE@DBI;{ZG+ML;&S~K;kLC^3%dQg?B{KyoBpi#;kKC>b$sE zrzv_XGeQR#D9ce5RpaM=)FLWJ1$-a9f!@UNYZjn_Vk}B9NxDM`8yj{5P?qM7hz*~7 zieMyWIu^lDuyvHdo|307i@~R!(g5<_C1jx0>K_(p$>cezVYo#2Nf??zz&~wY{J6Ei&_gZ9Au?vEARo4!<& zn=H)%#SF+HpegyFF-UE}9B3d5(Hhez1bZ^X*`*TLf1%|_l(mw~Kl8%Gk*tERciJjyarf|+v3 zn6AKlW#2pXL&KF+evpyksJ;~K zrpd{Oh*`4-re-B@S_8^`#!6b=zw-Mp#u;{qI9}}E`9V$QKgBa}=oKZ!BlIj8T7Q5E z_3)T~44!~K;U^3e0<7?Et_qt<02T0}=^s<{^HyW$6kNOeulU~Hvxh4AUv7UAY_uAK znbYs!5A!=Rcmhi3V%0D4TOYfv;6Cr1y+8OCKe}q~&;yS{LHUC5Tj2;(!zQz8N@1E| zmzDt?wNQ#71L&=fWA6j*6LK}O*X|JF2T(=OK55d7_Cl5=Q>leyf>7876N)=YAF?o& zGJehT?K5DRl38f{Dsfq&7x(TGh6;O9sRgNxC_rXqz;zilUwj|YTI5?o+ytlvS}m~1 z5)&mjLN%W(Y)iMdrBOdi7P9R#X0-FX@oT(4)t*W5JCi)yfg;J|LcD+_7iREwmcrZd zKw(=wy)OgYx=_tZab!vz8z#NXjlbAUAbV{gY9c?aUx}(jM^F{Nv%a$fT}|@L2egIS zN^6PU`7GXRj=FQ&>e31rp)8~djsIgxC9S)KS~if;;8L7Yg_;N&RJT$)gAC! zBiJdcpL+2&wvQ+glq#nI!bAg6OMobbc>s`WV)+qYfO#*`U4&jR^ANiI#b$i4woK4`G|M`MbI43tIiX5 ztAA0ihSZB_w9~ZXbnO;ae5Yv0Y1+-Rr)&t{cgki{`!J71do%)Gu^xwkb$Epg0}w_` zg}sK+*VT}RLqVVLFz6Q<2D=TJJZDe3D#{n%#U&L6B7%n!?<%c9v)Jyg2G+USn) z((s+~y^VMjNDg7a32R2vQ--MFa#~CFx2Nd>XjH#RsPpmUAai(_JmO#WL46Vk;Nasv zo6Yr_%VtAJkZ-vB>R3AD_@AG5`2)`9odG|)m~VDy7K`R6?6bMSwL+AMAK>0B{0lbxS$XT-PUUQjA5uvCK?omDKi(5Pq4U1k|vfLj9UAR zd?K2UCXB9syD`#?ndHCdYG{t!@SO(s3<#>OhU1vnK0!@={rp>RJ%7`*TyEMXO0loI zd|&NiujKQ_xUR~oDtY~5wOvcP@K^g7Y6V5rXF?jxA+j#ttm0?B#sUUg;(v>XFU~B@bd`&WCfFQJ7FiioqM3%DMKu^L1mCV%?{6T5X;Ykzu zyz$!ac4E<21gq8rb~F8J5uOUP7;pXh)qw~0xc7!VI3@J?G=k zZ|?l+SHApU+LjK~r7P0YV;&iHO&1=#Jy-#3Rk6l@{RXC8ux`Nk&gRR;s|&Kd*-)ff zacNGyeo@C{zcS0#mbv;Tk8V%++_E*Dw57da>*`%wg^UC1268huEJP*p(WB`wcQ4q8 z2L#ehhlPMs1qKhNYZTHYjcC?RNE6TO>pOGeOogqyYxl}dGuI=VxqhKLpo8LHyzBhs z^X9E;>&r3LxMJ(gpI=wHvgVfJ6&iBTZ#3>o4*pniiGt*$(l8Q{gghL6oB(z)7c>#A zV9Ed|z;PPxlXXG|&S5Qg;Eic!OqgkJ9QYW!pS{BFFFYF!-0+oXLv-ia0r|4PT}HZa z)JWeI2;9Yf3H$J0-o>+TZ`*L~Hz?@LH?G~V?d_NT@)tg-A^MdY0?}yT?48C>X4U_} zc#DPJsGn8;1`8Q~dV}QVC;HLW0nj~_@U)sKodwA6gautYY;=5M+nJwD}x6J>%{@ za&92-3HAbWp0}#Q=2Ihynz-yqK5`4Iu&{g}J!ikM?KcZvVV7Qe^=GDE@Gq0TclY%C zChDhQ@XJTK`DdMftKc|vo@WlKT{zcIGsHucPqnVM(KRE*duxc5c`9(UcV#%w0hlcE&*^t)wcbIG_E}7eNE)V}ie{WvxYtQ#SR+#5^ z^=V9YvLU1J9j~j;%I!mkbdS@q*2*&QvI<+^5u9_XkM{RwX(ywYNf^tM?V!n;n=GKu zl&*%{FK$|KC&!#2-4@o};`*@grihPmuT;Ks%)K&yFmQ##>|T601;m_#Gv5H~gDX+q z=pUQr1LAs)jxZEQNf?cbk|Pc^C^LK=rkY4Y(^x_l4ADuBk>7edTxXyUV&(}~L`fFQ zQg!elVX+~J#aP}v<0_A_7-=hw0UU?EAc~-&F_aj-yy&<@RjWAmkxr)1JoZZF{)+Xi z4uFg4gk7ivU-1?NduWmUB}_wfKC;jRwrJ^&&KjkSMuwiwgN0+7r5);N6B;z z=E=jQ`9o6|g=*T`7LFUBoonEjs=<$s^x3hET`SvrTYK6kS4}AvA#doCs~;6PAx&63 zwW%W3Qr$Rn+BxU%m}S;6=3?n7rFQkRXLQbMtQKODAs5u%d8obfjLEtyT-P!!eg0R) zeQbzuos_qi3e-%U-qO9fXXTD1XSc=0!=tX4#W8MJSEPRdIwaB*1PMrVO$821r8B9H z6zzd(Cxu4nX4o_pT^ckl`s#FF$AbmzgdLEEbvKQQWeNTQcFUmU#{5F>U`X?|gp!=gfJ-N>Ou=e6@kmnFPjGwx!rKx4v)bVDPf)A0)wwa^AL?bz# z&wbB${@G_)&-X+LKy50dC?R5m@C3hjq-gnLG;kQll~Pc9N{NwtI0=yj`HmO4%A$^H z9|>$vmIlA{WJ$XFq(9^5Z$QdlPZ(y5VXn<91z*@ZwO z@Gl3iOzQ@*?c^v}ebUvb!2Cm5i(OZEK9X{?EaHX18#Wcm^Q_0(uk)PS$iu`Fj=i{6 z$kR2yQ_h#3z#3O_Baaw; zVh%umU=PaymdSq_^1ejT+CnLw$zxDg$!--)OObvBz1K;W#%70c2>v-2xx|+NXp}>;$Qlq03pd!>2fGKQ@#{QwTnm}X1otMZ%7qMdFND{X9AhA zN9>KY6IHnrX{WC?n9_?dg9#C~_JEnOa19kFMXB4h`gnHru3f7cj=X>MF1f!T@^YT8 z#&)5G;+&p?HRP9?P!s0M+?Q!KO{;engyoT=$ z2~tY7E@K=V%C9**&G;9U6<-{~%jebB8(Z7vMrvy7*XmQUb!LfLVE?kG($VAYf}2)*zrD;&}Kmc1UNez9?=9YA#=XCXXAd%6=8Zjj~- z_A&Gygu>cPA;)tV0sO1d-z5N}nIY#Xj$c?BOUHA-c*k;bu7Ju|?s!hg(HsJHss0I4 z7By=+RJJ-87ZA%~kehT$K?)3mabRfBm2?6-(+!R#-7yw;5S(eotjZa)r>#EcI`!t? zo>{$WeCDG0)gfmjxM|kb`y&+(d~wUa-?e@sc;hCRI|#cb8Fn4=BbC;MMJZ>`b>~$3 z^{s1LyRMqXD*3`~E{igK8Cxl@nY;ay2Uqy4XD~kU)Ip37=Azhss9;%1v*>N>tS3~_ znW3Ik!g#H79fgPO{#S-4aK`OjaoCzm@e9#H8h=6s&E4|5(QKXJ5P z%r^DGWRPfrDR3OwZ|lNY1d}eP7&x|)!vruH>nyo<)+lloCSd-?rX^$wMrZlo)_JYz zx@NiWwdmrehG=2!Gl!md>3P=L|HMnTvJ3m<6&_& zB=5RdT?;+j(6l(pAHDUZC;D0I^DjMd=o#bTKDim2oOhi~TeNIt51KDw(VuX`-fa*w zjoF=G9lkbYC%5#v0)c?5*TQ!yZ9d0?4?4YViqhRxywTRE zDLa%luk*o=TD};@=!77`0l=`G0yU0=ao;y=epXT6IANyE=Fn@l>nr_^%f?r@ZJ)3O z&(kd*tFqc$i$mj570hcNE^4Pa({fs?kI{-v09JvNDMZk>jBozy*(pYG+OEInTWmJFkC)@9Qd-v|b?j1j#SJ99RrZk3| zil*tZ%fobQ!?~Va%E}e12X9-naPF(abT^i)4j;eGBavpXO6%ir9l>ds6T%jbo{~5a z{pyCzBi%-#6HA1a3H@sb#*0B1F|2`#m^?ngUy&;dDJ@}309vSBd1`U1(chQti&P{V zL!C;ha$KS@jaVVhWcB#)1ofx4UYl2I>V27jJJy_=Xib4S{rugD^ZUMe-PVvXKnR!l z66+^VtO%!?(`_qmn=|2=4F{g0s#84IwrKJXrmR~Nx#nZd;aO^HEK{HG6>^&Hws`sc z&qQiG^B2TgXID=1vek+67Q_>aW(Gs+7v1^T8O;p~Gd!1BSaIvZOy#w^nvyg2Y&-wL z1Aq&nD}mgAr*%k*wv57P7zNsZF&s1|z*@RX6*NzcN-lmpOoFadhWuEG7^0yP*oUk} z@f$A*Pf0FGid;Q7Jfg$H)f{sNGQRp6b=^6+TYn0pr}5QEXDsGPHzvkarj*W5W3nQG z@nn6ii*pAyJTsxb{AD7cg@3}7^$Fu$F=nyQ*4*=#Zn^6VY^t2HPE^EXqztKk zHSNBxcbym3fW7kC1tef(K$%|SqIdI|m*UXwd zBN<<}{On-sqFdpGNTb#;Zrmfg)kW(=!I_H^@dbh&_=22Oi5~}@bW*@!IXgDMusU$; zyC(+}E?<}A_X^KCSR%-RONTNE33v<=KLl75TnY(13FeCNleJv)%)ZqdcC4RQ;p_HQ z%v-->!|J}7&EMp+`K)i{5J1^?n%K(n=a*hTzs1wGXl67Niq2fr=4qLK{nDquS$LU` z|JKtKVA*%7(96a4Vl#|^WNeVK#AAgZULKigOt5*OXrelq*T_Zc74|qKfH1XVJO}S9 zH=;-pVMGz7idm9=uozH~SF*&AmJBn9tvo7mCYQUc~o6zvNla70GJ zB23FPj(`Jik+CCg&kGDR0O}5Z96YA6yp4MutV-=QE{midzL54Z5puEp!iRZ3gMz^3-{q3Y;~CO-G1+Jjp-|w_G{rR-ONf)52Bv=47`bHsN##K5 z42uX#y2lagV=fv%6J}agoAJ|fnA>LxTTLA#zv~%HAsH?5J`+M@kj)Qp%zmVg-Rg91Vlk;XbuP9E7RuKqr9bn-FRps7+i7DW?KK zcJ;yS)*9xcg9U z`Q0yF*_26DPn)@Lo6j|bDcQDg=CtZmrs>L;?p}^aYOysv935k^hAw{h<3H|O{PcT$ zKYqOW>BG6X_ia5>?P#o9)Yh?J)ohvuS9bQQ1s!dR>KZ%LGq>J1HwVp^kYYleNpY2m z{1f?#gy1cbgqE;Px*PaILj(obucu+Mjzqec4VRs9Hyo(fGVN_hQ6ZW$tb-Qvw@r5g zC8j&lDNx$5D{H~Hgux`$$nZTDeikikJXUuNm=*CaPlt&h#*Y@#u(*Kju{fMoi^I`s zwOV{uYeu!$WZ7nmYBnqU!>v0NH+BurRD2Y}JDJB6k4Jvt;PwHJH)Ly{v})~)#xs*= zL^q~W=f7~iCv#Qxxa66Q*|n=CHCTfadS-7BB zGqj41GjBcX+Ot+&X>F*eh(zqMGptvx!i8IwbW~^wP_504u?9u9x?J#e?Fxreenob#{`Ul48F-_ci1d8n_~4Z4ov;yl;%rjcI}?gchkhm zP(`R>ZRMobCp~+~%|F|oyKCr^*MEP~Z@X}9{`yd5Vt(%I#SeXF=hQbR`+EaR7udL> zSP@u~zcB93s+#B-5qS6~eat!`ToLM+IRC%@d~-v8WB8nL)uGzN89!%%JD)VZdAxI6 zb@dhVE6xo!Jl1%{&klcW#*}G`C)n1n2(Jv=yk1*KYj~K(gwa97F@VMxI10VTK$uh- z)RTx&01lBpBtf1OMAy||Y-oHa$>8N({KVYRlFxv94Q`GyZ($ zgnGHg?$g`4S}V_~a_PQ$dn)FZt6h_3PO|Ai*8A_fd7Z1u>g#Hq8gNxNDV3Av_~&Rc zYp6P>vbC#C_t|UY`Uz(;Z*I{#>yp}RTh;0{>x1?Hyq^4XCRHj;)vmzQ)-Ip5%2mgA z|9dYB>NeEvs+Qfcl)c^uxrvGMML$j3_|bdQNe*aA--sW`n%|T>V`!UErP3Zlen0&s zuOKW~0bgdE5>42%LO|9TX8sQhSdxP}=riY?$3EjYZR8T^c#7>m>nvlVy7Gf#mXMHZFdRjnAkv${6^v;5DXD^(5fPuk<4EBeeEk7{JiO}_<)x~`<++)R8V%We zle;{+-w~28ytk7(HNA0Sqb(rI6_Kj2%|0R1GD}sRx{ps~lRm9Y@HJK@Jd^eX!Tpqz zJnS61YH5yE%K_Vr9$jb5*7p!q#ckm zc4#YRUch=k`Ks}g&l^WxuWx?+nMpgZA@(a(lz>2{%0oQtQ(s)C%8E|M^|#V%b-rE@Jl||FLQEgRYzSNzgk2HfK=3A}Am^H;nKY!f#T` zrC`pKf(S}j%9w%tLD`CUHFCaW-%oLG@?8yO5d*(L;cW0u02Ab_IqVZ|*hr9+wHfa= zWxK=g3X0hTAqe^!lp%Jx5X8L{gDf7@28g~fKhxp#Yp_0X`rpT~k4ZU(de`)fxTWIq zz<|?#9Ev2~hagLSgcr+^w4EA4ZJ_TDO+%(6(*-p|1PZ1R>sd(g5M2i=*ryKP;ZkDc zo�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%0D0!#Bo^>xe$Z4SmykflG_VnkLvLv4@e#4_y4Q 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�>=olG4!T4BYNCc4f{&*Kgc`m= zjJH3zZE>o>GG*ti+od(?8;3_~`^-y6Vc-7QLko9Ku^3YMaD_M01hvF8H1d51bH-Qg z&rU;(FDDJ`vnPQcsLkm2u>^3J_mzRA+|DUF$&Oh_oso^^4x1UwgG}Y9+56ML6H|6_ zrJeYDbf4FaXVJmTWa49(C+jOw%o22n>f)U!(|lA_N#G?c;Xg$PBeEGoyNtk7d|nb& z23S`NlA1R~aYuq=Ym%jRMLT~X>RX}|_^4SV5%lm}!HJ{gma-}ywawnYfA+$h!DIK& z_U6JRcmVI8I|@BA?$$#`ZRr(Ws}a-{l!Finp^uaG*;;LRp-~SSZRuY{mL-_|)wwRH zj?fh;w0!MdFt@G>)Mp3q67-#I>7?CDiu!xq=&kV10zYqC+TShTe}2C%d1LMD{kp&J zpB%V zqHt{!`YiHsZPSCx!M$0Lx~Y4leVb|}&Eq4ldP41et!`GUllxNHPEJYmPdnS8;|$)12a(P+_;ag~KXu(rZ+JCF0=`-mWjRgwiZr zJ%f{tVMLj&xI(TTW3vp9@hJkAu+F$3ehfIM5tFE_&RJNu=q;C!u_O=$j3Y+5gqD#3 z%;x8pv-_<}WTl?G5XTM*p)+aOMb*WiEiDT^?I@B?m2$!owj$46CYxg2#D?w1eAhOOnCIO0~Db=Rz}~Q?1Uc$ahEX zgAcj$uZDeKjk~FA)?S6erp*>0<4hQTvwZa88N<;CFmCvaxg+J<#@mvR)0~Sb;DYLj zu{~eXwmynPGKC^?U7y;OicY|t{?CFb8J(8+D*AP7RD~%Oh*+xx(AO-a zNi-CUkaj>znwpIwSc=m}ksD971{2Yb55}etv0H;^i?bB{#Urk*19Wkv0c82bOZ(*Q zw2U-uZ-`8tz5nmJ{j+N~ChIV?f^buL8 zt*`XT^z8E2F=eU_omN+5_^Y|(oc@ZDhMl@WS^nYDoB`*~c?Xnv(ZvGC+G;<$(o%l( z#DsC^kx_H^V}1!P$@R|OKX!1=LPCsD8($Snw;erHUI6NhR&T{ttu|Yqj6NpebQ@^Y z8w<<940A$cS^ovzuc3v|-bfg#UAfh*e+y)T`l`CI=q$ccl_0zcre0~ z9K$419@2Du&7DFsZ!ilq)}tW!UTOG5o$q+ueuD@cYM`6a1`!+P27?N{uUBnV8PK0p z2ECe1R2ew+5FnGQwkY+$`;yeO!YF$&7wDB+RdU%-e7?mfyDXQpD()khai>bpwk%cY z+t1U7bM&gEYP~_;UanHebxK%+MjH&^;m8w8om{SFPbqbV$d!a7!6}1MgD$4SAg-%r zOcv8iv_tTSZX5!ZXk9$4vpeLCs7xl9VULXxCT^32Y?^TTK8_Kq@2MD6bVe$Z8tyPk zUpb^#i+a%RaM{SoBda92=sf!VwWUj616q&+v^4a=b#@}yz6}mN`pe);XuD3W)q#2F z9+D4%!%0ZJbNaYF>2fx(^fmN-kNi+|kBo3AzTUZ*)=+O$pfDK7BSwCBlHxmIj#7!c zq;kw55_d3UxH$g3WY;uJk3A$f{=iJNB3Gil{l$9SE~DsqB z04j$X4V*SL(Rgat?vo^yn*FU*T)}mk9hk234aqnPb+ic0yq)TlFfz^}cw`_bV?9BO z3<&r?Y$1d$(g=?{&^QR$LCY!h2|NOiL>lomXhHTrgK?2fU7Y zp??4ijs+IdP{Q zPsimnFv(FbnEjc0+(X0Ny#mB`R{5xUS%5nErM^;VDnj+sqamNDX0HYmhz$^ku0k6$ z6_vr5Ca=Mvrt0ZLB1lv^@ba9(7ehZ)n{iO*+U{9+WFh|J z)-S9bwrJsz_Wnl~FFAVemq)n`N0%%FeHfwl&?&U^{DHBf z_nn2q(GO??aj5{-a$sFfnQZ<+bmh?IuWIw^6eI1mUvEByt{j{%E6V}%_JKP;YXLXI zB=Pk@NZuZpK;F4<#vidUOgx~42V0Hk+5e>;w!y08iNndu!2caYLW1JM_zppE!o zGIlBF02?44!v#xJ`5mu7qsrw$qIKkDMLi@NhiNHMEV2Q%588%)26C_h$kG01H*S1( zBgj#4s*GIE;?q??VY4YyN2T^VjebfUg@dU;G3f0@p4<$aM4p}>a`48AK}{uN?{m2w zq5O2X6v$tA5$E*ti!Xpf8^@2^xN+S0$o)yV>6wniD$^jEi^^uJJdJ*|;lL=8pQ$R* zk(r*GWVEUER!;4-nth3hR=wI5ha)C10j7*Rdbs zM6MlEjZRinlG1m~wlC1B#~w$gzT7r01W)BT!CqJY0=)iz3BBa>7W7XC`y70DY~RS$ z$5Hc_Tep4*LXSfsG_LKUg8(fS^mm}QK)}(zz?X*BIHEf0cVHSYgY-Eb5K|ks-^~zA z=pwh@VNyejnXwQhb%=YLpErpbTvWX-P~|312uh<@q| z{B`KqDAU*_IRFmy3@_4J!Hv18AD9jAr?`(o(5IitG1or7JfU(T2wm7?C|l&Xp!z}p zFYwt{y6*j^U-!7&3qQxNIc3;;OA8s92hJc@Tq3t@6EXYcl1Q%k|2ED!kH-yar& zJm~cf_3oR|Tnb%as7)P}FQpuY%-LX$YSmB-n)bB9D5&Bb;s?T^CSS zZbTQ6I>#u-15?!Uh@Y{$%?9jKjzp_Ftq^BBLAG?u_K7SyDy-PFV*n5dGjHt*Qn%aO?TP*;VdgPv!KhysZui7>Q6UmSS5Mwpnhi`0cNdIVo)lZ4%%=! zzCtyxSf&b9f4o5nNflIs{z6~AF1|o;{V(xRAUe02nKXiq1IX^0%Z)!*AYBH`T#$9+ znMCU{>mjBXE)am8bb?QU2@8AU_ka9qMZ|gp{pdsAgu(pCM_~9MU_SWed34_!lHd1Y zr=Gp_OY|ey*Pxh&id#>dXgwie;HoX(d1UwR1`pi*2$~z2b?e>~RO+}2)?EgQ;C^%x zeH5wRtcD9Vg7RgO6XYQ>t{~}O{F`(~!OnQx&sQ=tv`T=*$P$(9uvc6ps*eE1c`$kGNibUQr zrdYFGZ}Qb<`X*GlN=syT`DD(t_IdEe!6%OFo0F6+?Uy@xYLe!*n*b&$92|MiMf7zC z19Goy1S3FykUbv#Ma}AlFM_#$=p)69AK-^O1xvpCrGD8%ijxGH&jYz$=}^$Cr0m4u ziqh=Vs_Fi*Z$IjG*AILMj9D-Q%|WlN>tHS)pV9-zKZsiZj~tGwxDxeGJU<1g;fI?L zJOV%48-F)ogcM34p!XL+5A_zP=Pw+4;s?x+&Cb4%-Y#He%k{ z3lDyN-?zECac=+1>g6L<2-~wECXVY}eo}oW}bDA-zuF_pgiMXQ~ zu>-mp(M~rbKx4#CHZ3KgiV48Z(uD0~Pm?{mI|f*u==FK%cAMy)8jmWM`{vgM6sLRDY=YjvL7%N;BKkhRvXc7> z6ya0;6X&%k8yd5Q1XtJCvr5yPCb`}?vQO@i5}#8C&R6o`(8%Ito9Em$@dktJyRi?? ztjy;V$b+q4ItzM}l~TU>2^mUI|7`S1e}UNTG_;XeNFq&Bx-?MJ=vG zRdyVi3S#ibqAw<06unKn#A`^>TG7vFB$jVcoETCD)@+vz~WHCnj);L&4u z>|L<1EKA81`FNmDE}T9&ylL01o5PbNa*fiIj!YHhrevK)E-S0xUU*4{nm-re0RkgU<-)t*Z^bJw7OGv^Ep z&EM4c#Fna^JKi|G!=C`9a);TJYSOXuY_|3bAY+Yp-l~=F*ACD1rpgowt4b!!o)+G_ zd3}-|lRnjk2k*V(CWT~CX(&|Q)US37)G6F4U|YE@QY zY*ulBJTFnDnG0msb%S?GX-sG_67_xyxEtT;SmIXjE zyU@D^ZAx;v)v7;d3^f=OYWMPOyEe`&D{i=P#f~Y3rnJ!#Q=g(fdh|ign6)RSPrYYS z-^57cfQqUSHg)fr^ZNFYNKy>i;P8G0Wn-6)&y;CoJm8iVJU%MpJ?)%=`b@RlkbA%^ z$XG}e%E>=<8_nJk0r`r7@_?5YbU z^;tHzuAs1L{IImh;Zb=x=ETXl#rHsC-b5x|{_DhakZ5VmiL(ifp(}UU=5~f$QA|sJ z6yuWbaV_eY{))AF)L4tU(T+Or#)Oa%OYzhZ?|>;T%!OOSEOQMYi>M93)D(5;urw0# z+Za8Hw&Im@-g;#|{65UmGHr_u~_`0ozW5AJE8hzwFj%mK8&SH4z^&6_Dd!O)N&V}{~R~N*Y zn^NUY-$PM5bc@;ef7TA8iIw?_FN!wiFTEsMoyV?Ud{NeJ|L>aS_UmWYd5v2BckN}w z>!=K-m|(@qM9`#YD@CpK|F0T|w;)Dtm7^B1=$C<5m$t_Lu32Co#K>g8E;b0xjb?1w`#bMcpv0|2Ws%mv%5*UKw-j)DEZH>^*wM1I@pNx*yu+c7bFbc)b zKl2KsgD01OUaAhZ$-m@&R<+45aX+_4xSubz$>U|iI$SD$Y`zhIMAR3=<#AjmCbk() zh7~C`WK;$nvI|mt0xbgfRkzEw2c#0n=nX2V1mTkeGwZD(qZD@@1D@NBQa}PdW7rNx zZfM0!Ity@s$2@y%zs4?*VNPspEKKpWo>gLJQNzP=_p>|pG^ZR+mL~eZ)cpiS3>GGG>S#B>ybnRgu6g!i>6Fgi}37#9~#|dAa9?-gh zv9m%%PVILG+{Cp6AEdsih;tYlxNgn9Ml;b}@7}s$bW(!%j@8*E{Y&2gQ{H_S3?~&H zQ2jb;E$GW@5;&Fza;Sttz9}=ornu{=E>Q=3>e_mTw|{d})7yg!8^;bWpX-)Lw|@il z-=OV};>M6Z)=w?PbcWM%8q5|-{gz_ypo|-UWdDY5k58L+{9F1RWgNr*3->??BWF~E zO6%|+NCfmu%y<$059tpNxEp{caspjsmq$*34DK)q!(r$WiKTMGx{hYaBYcR`Aqild zX{?)t#CvO5)aq3)u5W??9I5Bcl1Jp|W%NH^+%h?*VbDnZyden>c<&rJafv0z9PI0x zF-@vkRT5eO>f6}XZ_p$(90*511(4KCHr<|avsAWzJNk6g)!+SYuG8Hzt zLXmy@goX*Xo7aqPC@pJ%PxP9Y=q)^it{gZ3q=)kI5-0VlTUvgH9LiK$cDO4S=Q6r% zFv^hKUb+@N?UGL<4`nRb zf+AWD4jYR*v`(VLY##w63aWwN2za?Xyn5;nv?FhO8GyZi0rMBkY&!&IJ@Cgry;(I5 zeT(kd`O;62{rr#leY9}3)Lu5MuF`DYdiC{#@Qby7d3)ceKfeA#$BPS&*4eH7d}wQM zFbq_I#^3({MojLral(+bLyD~$0Qg}WZjbdQM&i!WGd;LL>Dej9l&!u zAVY4}z&|Z?NI^_K%ma zV{Tgnm@PJ* z^6@cHH*w|YO!M-@JC}nh_=w(}h?FW=Cg}~L1c%JHq(c!EXyW!!ipzwWrBa!oZNJau z)#_3$sdil>=FBONkMPp5(cUY^o9xjWEXg^!3Fr><%?(6Jr{QMv%!J&WWQ#%XN%rRS zvd=M1E+Z8!n{1k+v*UbpTCa;6W7onDrEY06&&l=SUUOXOW%hJ!V=QyMy3v>vaMyS; z{UudtBj)ZuzklwCw5k$+rl-aoNHUfT#4SItM4N6eOLxub71kRS-E{#3JaQeB2cgO? zjF#B__-Lqy63g0Q#gRxcfX{41!=8+6fLpJpol@2`6sXX@0QYQr7^uLk>ui<~x^W4A z7Z2usdoe?pNz~`CM-szpBKuaNY}#xgB;F%#=~IojE^i&8Z#WyUh;HA>V_J`!iloxD zol!*0L}z`;yh^{I6*3c)%G6}JWz~DDw|o|uTWihT*ypg8Tms#(9<<)zvJInLyp~F&wFb|6OwB?fCz zx;NRVX>hqJr)0_9m1{@W+&I1}Kg}SAsvFj=yJ5__btg5CEgKvfn$>UAh&rFzkk{9j z?#%1$QK#i4*&vu+XU)xV7v`p^gy5J(H%%D2YvZJnqPp3$eBP?;6uDgQ4vY?H4FHr4 zbtSk1`MpyTO9G+bfIyWm-u6zkS-)ntz}4eA-tjhU)~h?{N)zBC=zbOM>0`SQ(vjRH z1d4`1M-NZhTpZqvg-U6N1%0OlJYz2dS}$I(1FhK=?;|ZU!C{cmx_fsk zx`>b9J5q+`u0qiR-?QLtkM3^md}?U7qQ`~1@vFp>;WaJU&1HEgJ_peJYi)H+`>;LQ z=NDTi7;m5XTdgs_t3Llh6ZF)FaxtY0<1$bqW(ubcFvCtYw?)PG&U2xe2!liqc(jeg zaKLVseB@*ehLo$}6oY|vO2&`6I${)?o(LGaNFoO&F&%BhlOCqg_(G)j-Bl?;k6ekQ2hygrlr&@mJaf^ zG2TJa#Ts%ArdgfP4l|3$(Uk~}5Jwk9ZV-;18|~0pl!@;-t$d=ZZSD9?(+oSt+%M{= z-#=!DVcMqgivGFx6PPa?k=vgoEf|^Y?bF8#_v2uD3(T~FBUUGuX+@2RX(1dY&;7UtE2cuN0TN2Q- zczV-<;@BA39Y}MX<`}S@G=g?VDi1ItegAi&S&vd{)gcdw>>gQ7rEeOQ|;Lm&au{-wdZJz|r zfkOQMT;wjMV>~*EPT~hZ6CSH?yt$^JV9lGL1drDeF)WVFj1Gpq*jX;d74+zW9s`jK z5JgFRf+HTm|LkCDB?Ko{qNrC{k?bP>K0 z`CPQ6iRyL{`Aa5Kz%ZSXqE3mCgrfHuh_s8!3yHLg5N9rWhi7VL*3`_5)X)=G^Qnl; zw_erOVzA>LsN(GO9BGW+d55H{VQKOjlo|u_Yc}dzaVNJL^*lbk5RGP-{|E6tnE`m( zV_;-pU|?Znn~>EK5YKP(m4Ta`0R%3U+O34q|NsAI;ACV2aXA>6KokHq&kFwl004N} zV_;-pU}N}qmw|zk;Xe>?GBN-~kO5O20F%B3a{zeSja18O6+sZ~d35)T@y3fGq6Q&K z#3;$e7rK#I#HAZC3j?BvxDh4bLd>f1GyD(1r5`2YE}ojHnyIc#hy#b}sjjX*_3A3Q zLx->2cdqy~Ai8-}Kqw|zLKX>d100>d2f05;+SBKY-@SYl=)BsaHNlfE<$J(a=s$@~ zkTY(uhwf_Nf1JH5HglkJ_29cByNdtEyC*-SJLiR`vZ>Ym@hmWx+D%f&8*|-}*WA^9 zC|vGPVmD@8mY3Ppm7*t+{%0 zUe3$xi>^pnz8{Jn_f~|n=1bM?e)SEqa2%j_*)p9oJzqrsHG%rowi8W>&^oC7Z^)$1?lvVE-}Lo@QHl zAL1W(+s+g7l()H$tJP;Fxojr=rqrYT|F@BFOE@$CO<+ykvB!KKV|`KCY0giue>u#( zc{#2C@38-pdEa3_E##M$xm&<)mEhC7|Heqkuc|}82FI1g#NU{8W7k|?{$C5qC--HYe_r`&3)yB3p7Z>}!j{gtvyDj>Y-#^|+ zcb0hCox*KUk_P|)U@|f?GjfE4q-ci7nHiapXUxb9%?O_SCg zYG8Tb;G)Du%tfl8)F91b_~OjPYA78lfsQP}EolwL2G@Lphxx%+urF=L7E`j?( z;zKG!3?Xg=62U>(meH3PkvJp+*@7HG0-@+oVkkdUA3BPHqf$_Xs7}=Q^3>(xZQQ|1;%Gi}-7!k%8jftj4 z3!`1w6l^}W4eN}7$E3xmW9+yToF*0$TfGXlO1sJu7aJ#uv#pL?U9;K|pSA|ErV{Uu z7vkITz*_EF{o1Dqw1kF);dP1Y6ze7usfqpTY3n_N+70Lp{0-en{z*9-IU75OP+}6X zmN@-wWePNfm{PupwyB4NB8f>Vl52DJ=Gj!)mZUUzT6vmlD{ZTh986}CyU13uCp|bl zKAn@^l&()7&cJ1qWb|!gZ*yd(WLmZdZLg;IQJ56Rj<_8)J1kTNbs!6zMadFpjb^jI z^X^RCX`o?gLYkU3xr?|;>;F+NoY zeUm&APr%dhCJOKcB?YYo1BIkQVWE9LdOv6XP?3KTv#7qvS_~;B6qgm7_)tEFuj0E8 z5Dth00RoO-^kDMA=7T^RVWslJh{N(Scv<5S-?4(12l9WjXPT@{TrT)@7spqu*^mu(jy{z7J269H(fNKypn9qXF zW}el_W`F8!6#QJ;B#?vUBzc$Ic@BL}sqj;jC~W5`=K&>EX}AErAi1D#_WVL?!M12F zVlT=rx>|XyzF&DNkSa&jc?o|>e#xTd{l?QEG+mnU%k<0cw(_=)HqRB#6?uC`yR_YV zm2g$8P0-4($*uvqC|$2^@^@tis6%)?;d+Z6uQzlu{viAb=|*?^Zm@6IdsscDo2;Aa zo8!I4Ugs_7t&Ce{1Jj^2jNLB34H&t1D0ggq@qN0!(SBloQNQsn`flrh^IqgV#UOmJ zanSXb)l_*OeP3w?n`vg%gTM#Ep|GKjhdB=?hUvq-k1&tekLthbv&337mf6Sr$AA@U zWm*+h;0fUg(^hITJrh40vLozlyTm%Z$^ke4?VW$5R_*0V?;}v*K zpFy9=pVhuh-{2Sc7t)ue|MD-B4qk@<004N}V_;-pU}|TQWKd@S0VW`31VRP|2QZ%j z02b5%5de7FjZr;I13?gdcZr%P1O*9Vb%j`1B)Ry31e;)porr>hg>XqOA0)YpcQImX zX=!ccFA#r)#?C^p@rPLXc5jnhVunmhg@kw0IK01$Tfoqc zU%OIon{O6h`;xE1J|-*RjT?!vdj8YXsmZgNfjqfHi@3S5~dxXNS36I^m8EqcU{ zbbbI=6OB6n004N}eOCpT8%NUJsur!ZyM{0`)2^f*t-?+mhnZ0sNiAutk!C!w;A6~P zIJq1%Gcz-Dj+q&9%v5h?WUs&f`+k4x?&_X?4fS4EwWfIL|NY0eNkLOQrHH5Qp1Nb| z_Nlw3?wz`i6y+#S1u9aBrm0L7nxR>mqjghvPTfCs53Q#Sw2^kB-DwZnllG#$X&>5` z_M`pj06LHkqJ!xWI+PBh!|4b*l8&OI=@>eej-%u01UivUqIp`ND%Ge?nk;J2A~oq` zI)zT9)97?MgU+N)bQYaWo9P_dLg&(XbUs}`7t%#^FVTC*4JN(>-)A-ADJ+Q|JMD zDm{&!PS2oc(zEE<^c;FFJ&&GGFQ6CFi|EDl5_&1Uj9yN!pjXnX=+*QZdM&+uf5&9^7j6P1Epik1L=+pEW z`Ye5pK2KkuFVchbCHgXbg}zE(qp#C9=$rH{`Zj%szDwVu@6!+Hhx8-*G5v&oNv%nH;ElW+@6LPhp1jx8p}aTm!~61nygwhn2l7FDFdxE)@?m^9 zAHhfRQG7HX!^iS*d_14PC-O-=&kJ1T8rNB~#SLEMCZEiw@Tq(npU!9SnY@Y5;#2{BV8*KawBCkLJhlWBGCX zczyyuk#FNC@ss&>zJu@NyZCOthwtV4_lw z{6c;aznEXbFXfl<%lQ@jN`4i;nqR}O<=64+`3?L=eiOf$-@gE!T;oc@xS>${9h%ZL9tRQr}CdQhTd?)V^vzwZA$*9jFdc2dhKWq3SSoxH>`|sg6=dt7Fu$>Ns`0IzgSN zPEzw~K~+^v)sIQYAx=G!vZc#0DtFl#FbyQaw)l+>nP>$NF zhRRhVHCCST)ixEVP(>=9dY~AOo%#7q^Qf!y^OJfZtE*XE%j$Yo>#Vl2x{=k3S>4R) zO=(@-lGZw{^_H{qeb)}d{3s5cP9ZdQ&>57>c*(e)Z}J0aN4YSvgEESi8Trv_E)GqQ z>pAYI6b)Lg9rO)HgCcAvjMy6%0yFZKOmVyCjatsQl+<1vDX-Tngie2KyQ<^$^HE@j zgWSLynUc(ATDBYIB4=cBfoFGTy592G6$9O+Nuv<^sPfLZ?X6UN*IsRPoS@?xS<^Rm zR18cnFyWwttt1n=UT2u=xpu!Shw1tQZ*0QylIO-F(~|vEG7}3-XLjrtwgnxpYl>|< zsa0h6bMimTwLNcGLNT&~Vcrj%aa8EoBNN!Uo;Qxrx&7@|>j3X0N(nf&cv#Gr`4kM?xn!{Nt&bTY%Qe0*yW9NEy$G~f? zC8uk=qVIH~I4}j@j60579@%~ido@A9?qWjmuQi5?0EtDXOiKQMlw^@$eXRE6V1pvOM#c3e0I`E zjxg=JaoB<|$|Gl-nUz#TiCy%DNj9SKaytcuWtjcFJi*9*;zcxCL2`^oUU_;YMZ9oseIt{oHtd))O##f~=` z3CD$z-5;B%Jn>iT@9-n`CvuOLjfrOE=)R9BJ91%XdZI!Tq>ELu2DY#++xU_RB1cx- zkhKS1;A|K9+U~R{zSS9El4#k9M3<@KAu`B5Y0adHZ^`0;r-o)VC$~8)Wm^tsqd`1s zhq6~VZe7;GcF~?r0?EL3dzB=*q%oz4c_l>5y3Tkg;!Isx^y6?K$C{PfV*&{qEqqQw zh%+w8;{IT@(syKqcB+FkI$)W+D>@M8;=WfBiKh$AO)hWREGGlf#j*pJCTA_AGZ*49 zVn{_KCYJ^d?y4XR)u1bvLewD68|T`_bt@gXwI_~^OnD$QX6jB%sI8b-v7h$9AsbRf zwstCV<1RhP1nYL`iv3+dm_}l_*EWUaK<@k?AKBqBEJ#F^!%VjW$MiaOXv$D-dQbBG zz>EDHe3=)G#N9&M*b*UBCys@Nt+6y+EWUMS4#XOD@kOvn5GoqP3jt+Y`a` zMgLt%No`L!u4Hn?$eD?>lZ+xUJ`%k~Mq+D8v>gcdwnRjUd1V)yXo)P^C5a2dbKlG* zE^bXS*i70?m0Cn9ZH>AW!A1iw6z7{#7&{RdD?wCPvCxr3WsGDPPogq1Ws**Cgm&z> za)N$Iz&`TMv^|p5?QzExMy5M-qDl{2l2x`E*}9QDFi68xZ@yM`S&%N><`z(9!lK(V! zqj+lY^0ZT%=akt@JG>+U63oPEQVmIwg>Tb(D63Zs@o-`=G z+gCB2Re@72bCbur{B_EKIZ^^kPAfL`t}wd3%52tD)0spy&47*($S2%%vwRidv+0G2l%L^T!N@gXa`J zt|{3iv|v+?u%Dc+botAZOjmB{v8>qoR>gsL(Ztooa}Cyry37_bI-MDE)V%p^?^HW%Mek)o#@n%rtn~*LK@x{`ojx@g7UMt!j`?QC7>(%&B z$2(z%6C$@R=9_mit?KyP*!f2mnzcOSf3xk*iLkY|?(A4>KB?eVpR(|~pY^*7*4*?g z7iuep%c$p7n=YKwG2OjP_ILJv zr|{R;w_MiVr*l3g-%{t4DX-1)+0(lP*Pk$(YgXiK5%X1bWo4m2UU#cuC0|F#9w+}p zo3e{ECLB;c9-hdPrMtRA-u&F8z_&ZjdmsL@sqogkKLrw}=ksKQJfF0AyIQ+@d~JV; z_vAURmszsUU$b+a_}ZTh`;N|3t?W9z+T`ZsFFNPWFPo|RGNbavszoanGK6Z-E39SJ;) zNkd9QERbP~K|fQxI71Xe#=<_Q#SBS|9jppsoA%DNoqzQ}Xya<8aMpEPF`_%P3PK;O zidfk;HOt{j!wSa0)7!RN&Mx@u6sE4sur}2@?^ z8#Wv}By~Bf!NfsIfp-F%2lJARq1+r0sD1m@v?tOIVa|WvB(^#yUwRlKiEL5%B-7aSVOdGDE4Tz?STjD?ZQn8?U@X)9|BYs-XttGS%G6k19) zHZZ)DTJoArfLFm`7aNe7Jz62nVnrKX+wfW(HgQ z!I6O0K-P>G<)&^!fXB<6<#Yj5Ot;CQ^kxN!)^r`A$jGp90LJL4HT(bn|35uxh-~H3 zkzCt$Y#@RIRR4qQkYX0n71<#4F$ZSDx}G=GREJU13W|b66FWM;(5@0Om2B6(YIcaP zWzq-i(r%LvMTw{f-=J$XKJTMs4>wV%Y>IzEVU*kol6B&ET`u{Bi`MzTSCT`uhLOl5 zt~eBSBcJhkV6?(U6(2ESP2xC%nCPpZg{pVyJ$xt8l!7p(iBx>7@G>tPicRz-o?;TS zAc%BXBq6BEkdVU9HDh8E%$lNuTspY;0^V{*< zT0I?=4BFN;W95x&`CqzjGwkDxzT7BR$%FRokJR~({TJI#VP`7_uLYgoPv)q!Qo$#( z!p1d-hN3+`gy+Bi>und#soPAyh@A|i9y+kziz@VAR=x)E7vLBJ*YNz@dMkQkgE3$T zj8P+Mj2`SSl3FmLwh=9r!bX)6X@Oz|Mj|rLJViyts1xlw>+~XZKhd21+u7X|4jO{g zQrUr8>PS+t9YoXnw|J^qEDbe+RCK0xVic;JWzW3kSx$fJsdGk7L@NXT`t!H;^tSJ} zF$f6=hm{!5q+o!y*#X)_3n-E%Hez8=HYlKg)ff?2vo>c=SH?DLF4Z|*x~O&?AM2r- z>i?`HLuRygz;^l&ct8-aElRjxN3fUKchvrOTM*bmgTNFM1i0li18s9jJ^;o4&uQ=3 z&lB?)9&iQ2fJP`XVzs;47=B2}T}qW*l(A~vxvkvPM$Kj|ehWbS$MeM+`e$bkLZB_6 z1yp$MC8?@#Rn>K#jBRBH&Itx5zxuMe0UYAxJH`R%KsV40bOSwbPS6ADvicnlFJB*3 zIKY4nl<#ulhQRRubM~F{SUqRguY`ocNC*+2of_?k=#>^~lo4at*^ZFhpJdmQUomVt zF=>I~Nuab;lyZdEKBKy-?Z9?>M`GBvv8hxsD(~^qX4Ngtc-Jjy?Av>yj4=YtXuz<* zJ_OGwk?J$`Gl1bCq9nOG1R2{I6>8Of|L>dZ-#T??cF!L8mGY?w86}w%(Y+h$gu6en z46tOO5H%~Z6aoMDzh+hKdKIkFjacGX96ah{B|v6ENKe8zo5Ki?`f2&=N3Va4d&C5< zTh+4CO(Ua5T5AU)UzaBmZhQN0CXqL#v$Ru6?Sdg;!$I;D0G6^9#F|iQrFKE^=O>Bp z*z^FHmAB3Gw5`>DRZq~pm)TC2skxo02vPaQz=Y7tkAe5o`pWhy3m+mxeo!2ane3`C zrp(5-NlJ2PFZ8yfdJX`%8MU06L84F+A-l!-n`Ow0lyTvk@*rmTFvV zY-FT~!RYn81tK{T_w=S^yZ{QYh;(A@xtZh!_22qXZ?0Hk=+0L5j4 z)ac;E0U-whAO`{{jdhec<9`D(4Qfn-G6QlQ$aUmeaxAsZYR(xSB$r)XG~tAogd3jm z(O#Tg7&;qd_xGk+r2s{YwAN_nybq#T=knXiFUaxU|J}|1e>cGH21s=`KnVaT5ddYn zK}Z59&Hx~(Z8k}{brjcWv`*_aTIYxcWk89u1T{`t>!J%X<7^h}Wm^|So8=c|7vx6} zE}PBGU01KMXoHd2rH9%TLV-jG3BmGEdJxM3iX`c7GUo}b8(@F}KtkpJa5sQ|n#}Hl zRf5UJu~hFp@n3{V>*Gl8@sBhI-TTax^L z2`~U3PP>N#-~+9HH{kQ75mV^X%0Np1U@;iG2!rpQ15U3uYY@C&;m-kpMeSkjB)}}= z&#T7QzkdY$8%knBF~_JFfU2Ec9k#^}%|6`oPj3s-dTb!@@ zVDF5cGAKn~`~v%Ht%zb`uD#72=x{gsxdZ*bjJF6e$m%vb;H(>dcEJB{Tf}0w4%aZ;+rPsxd` z-jM874pGC@vE|ubCl;m5*h1%rzXh87|mf(IBA@oeGB zL~pxL)g#C}}arC5MF9cV!wjLDJQgya%j}N?jIBG-b4iAj4<4 zlEld6V)2wdYCw?`rrc#!cM5fS^8mGP$|KL;TU7~r zGdC(KMe+k?TMtAuM`}U)(V`6};X3c08ROF4%*puFg*dkSU{}8fMilXq9rI&rPcE9T zzB&S^amor%X-^m|wpP5=)2rRR^4@sm1T#x+H5Qbm7syI#!In%QdwX7_6wwi8vw6E+ zPhK656G5Iv(U!e{&jAe|=E(Cyny@f~eX+P$_egGmyN-FQG}UxU6cX)Y0VXB|d%#+M zbK^$0$;bPAa#)N;8#RfAw9C5QQ0j^mA7(ZDg1N2_4qpLk^Z*Ct+YVY2v1^#2?QSUP z@(J%8p7GI9bKE?YA4U0}C!9JW0$|BZ#Yg#+Ip_JjYii98Q$seK205hq5|klTUb<pH62cdHjPyA-yyO8WDliCYPmV}O>Z*bfIGH=i%hY&8~%-_ zq@A(auwN1)?L-bdpo_%LJnmB`EE)Z`1UC&YSOZ0rIGt{^z8^&^Kl7YC(^uF78k6{qCNO5CR_`RLNmIW?p;cTUQ>qM!jnq-G z)M-DPpgwEfJhBvztR0BSDlKaw=~@bXZRd?SzbK4~E_->*%#NwuknyMOC20Olk|j$s4B%)(ygq4GCl(9FtDjtP0i)u5UIbf5ZKkF+ediC9-9(gyn2Hxg}K&H6kDgRvavqjVanh~_ak zW}S>jwn%N0Wt)hVrnZb(NrE5>)ZhbC%5SC;8V*~T8mhsta#@VH*V>HwTtQ?hF_stw z_S=x`o$vJrtJ@e)7)o!=y8H4I0Ar9*X!e*PQ)xZ3^dIjGn+1)>*eww#yx>grdf|lT zOGFd|y@*2uI!$A(~ZAQzG#?NwLVKhKmk$yrF%^LlA+V}4 z`WLN8Cpy+i8ee7=$}H7G17f5BnVM>&L0qHGh_dxe;gqj2ASv0%NRqh%VVIc}wh4kg zuIruYPAFB$I}V$;vvIJ#o|W}%apTV6(UN34Xt3MSGhk;2tZRA@jv}ok<%QPgyvr!; z^EmwikXTsIjLb@F1z)dsvu|C~o}?Zi4+6Zm8cOLnVKmw{q$bxeGc!Ha1_e2u1u4pQ z%$~0Gz9!Pz%}P*K-u=uP%c3y)+gzA&tR$|ssYvSSSrCXZX|}#O{~j-yX`_9sw=^t& za-`F6)w_VEa?MxAbz;vIi1}&UofET0w6Rv&Twwj%)$YyCPM*ueQTT13i-(oa zuABu_$-UL%eaGoYdH%}Dkz6icEz=!q@UG18#&iF{bgC-O_%$SWj44gEFRSNd(P*dSWR(;J5~Dnbn-~(&xmc=Q6j{gMO~} zl0n%BZup%v+w!?sJK)IVEk>MhYGl*SFiqy3_2nW>JDsr_qHqgppD^{+|!QyxBPNU-f z-m+TlL&$YrIsORs79ECF4)p)nR4;j;|br2w8KMh7-DZFNw_NLngHvsG#5zrM4feTo4d5-gV#Wn0JMx zL{G~N3MMhPR=U_#c)M+f>sRRPT*}{nnE?6IjR)W9d*s@3JR|Fhyt1Q1=bVcvLL#;W z7ZsO*+^`OMF+n6r=r>SpaMs?vF;#eDEQ>bHo=f$TaQiBYRX+PYHWSB)ugsMgJMuGlbWE=(Y zs^V{UXYStoguz`1l+RiP5%vb5VC1!`J$CvHO-16gJnT}*+K(LL@QbEwUeI7Zr|~1YSF$1QJ9~v_{wv0 zdFcKolqdrNj!CY67*D)7m)n35Q?GC8_ZMX3ttWIM6c?M1`)SFu*a0BUnb9>r**B$@ z(e1_QND`M?)U@x0G?Jj$0Kz?P%!2oqB8y60W~Xa7{K@n-;?rlY2;@k8BbI%;{t}G}9o?sshTPXe5E?;6$;c zxRe*E|LaNN`R!0Khf;N^ZZ^%2-aK1)_&8E`ig6j^<8)C;oTQ#%APT-R!e3SUT9}iG zB<@xqnDHK7SVwZ_4g)<4n4Wi>MBjBvdawc79BVVXtej9q0Cuimo{KI|QaD`&8Ds&k zizG(#8+<AVw$aL?|*SX?ZT2nR86uu}%U4*;xY_p$m1D)CFatuZW_|p2?*xV(a4lKCA|o*hG9Ie3*8kyc zRqjB}l{*Mj+%BHe*?G+qtHN(x+m!t$2^t-3$FX_&55b88nGpnGPCGTH8lgzP??BE0 zRtdRVKp zFtkxy7Zt#s)~_``-I7G{a&v|8tUjzv%AZ7Qr3pYpJ^f5 z@y|2>2l<&MmWu_pqvTtDd)gv_`Z6oz+dNCsnF2sMN#;RYRClO2h=(QXruh-3y$ieU zY0p1kh~=ij{MrXL9S4i8L`fzg5{%R!PX_b;Ih+RB^8OeZ0p3C02AaJS0*?)W8}FzP zZ9DAXr38a0O7z`hD>cwSt1z(Zm#B58?~~b`K|mxsJ+FWl#rsbFbSrx-$<3~#<=EPY zO5)h={6-i zVdxKkACeuEGyj2{G=q@(7qG$3D<|E*F~5_hD^=v!%v)2r`n}tt{x=CSD8+<@a&IyX zPcf<4!K)o^vFfcYu55*;Z_p}bhBO`y)j+#6zs}}sbG)f}h9OZy2>9&Yp7)?O=eg=1`Z6%w_8i2$a=9ju zQWI!fz%{UdrBVqymZ)EoIv`X!gZL{=eylpT+q_cV9Y4YqG1jhxn$HLq^&sI~-su}5 z5ZsPnFz?Z;W#x-j&aQ~mdmcnaZY_@_`71nkpkEmga*&6}`Qju-y2Dzv>zjNphJ^OC^{DZdLmBWdDiFQ@p;iaj|T!%M~ZrSZzK& zRbAH%AFNuj2z5!>G^q;ralcEVbTOZl8J?wbS-p*Tl4;9LsaJIW;yGHzRuN8b2&2(o zes|EI!hK%fP;xpDuZCk@!TP95u(@&8ZxqAC|4U{)Ss<6p6?4P%56|av_BibW8j>h$ z$tOOJ)qxD2t2(9#qcN7l_{hZt6S~@mjVwZckrx`ujbPu{n3s($zV) z7wjfs={`H|k7x23G$}{<>Qa-UY6VRxR_Z=AY76;@j(2wJdI?GvDy>dE0Zp;@n3jSm zQtGi$8LEzcjg6v`9#><2 zFyMvd=KjjmR$5ZyO3e3Ml2;1X^DW>?#co3+s|u2STZOQzT+6KR$*j8)55IDgisokm zt$Ky*AoKoHnvL?;5uJ>5yR_Nzi-mD~U&N@CgL$o8ssu;MvAv@l9AVlUYb?h#W&BLIyHklQhXwn?z5t#!4T$Y z9;kSLF@C9$Tp0(Hs;SD)kxV2Y_3Ogx`?|iT&FzXh7JY|sk_X5`+%}t&n1Fb{eZdqD z^`N*j$;pt^R-3I>m)<(>q2*P&cpyg>uAEkm5FhGXe5V<_!aP`UQm95P!h~V!3~ZUn zJb#l^#ZQrzVKZY#ShF(H(^_}raK>o9G=%NU{7Lj8ojewe1`9XBIbi!qg4)rzJ5nM1 zz(u4Wh01{iOl%TEF%=h^X?GgT9V9&?R1nhe-utCl&aF{_yLLJHaMtYUt}ppB9kajrpB)M4H-`kF;4K&T~|cmwL>_ z6N$*q<~TQ)fuKlB7LwC->B9;a;8YpfDcZ{6wgS7hb-TpNMA2Zo$?1E|Ex){48B{e( z;E(`-4SlZU%Yo>R4&Hv$I?fSwa4Ny|UgGE_2>j|xUNSBR1_QH0I^C+%Z{Jl^ zZluK&so$l-%s+2t5&rS+R$<+?GBN3A^YfSI*vi3BNbH|n%5NOM1TeRa(*;Y;ly@+P zuRHwJS8wnoJ3gawN&=32At3_l#!bU!1@ZU@1jjJ@h(nNNqBjbLdsP%6{i^W1Qahxhn^0@qJgex~*H(n;xL_>woo<49CLf2cS zXleQ$S; zk<9RONVg@QZT`8RPZ!lqm=32Um7{@pLLll_&SJ##(zwfN`7q+E>jW8&0r`oJ1Kq*# z-W3;27@6h-^FZb3I!VvqIjV|qige|$4f(VLU8Z&ftm!fSAg>BP-7T=Rxi45!BIt7@k$f9_eVE~!h z-*DOdzN)>EC^Ns(+Nl~e?`q>H;cgjw)OA^WVsz2>kDb9O1tuNXICE73jV+PY@a+5a z8J);KDr{SvM-MMmabeN^3kF?5=Lh}!?t2=R70Ldg(+vy6ERVAT#@HpOH+h|U<0lS9 zZ(aZI3jH%hY~}tIzyBWVuYUz7Fc~p! z=Wv~)pIBZDrZQu?#zYy}W}v{?47{f0k!Lr7{-Q`llURH2vx z8$L7N$0w=Pwb4X#SzYR;=l7${OG#SqIR?Df@Y31Q$98c`Ps|6|D@pFW+`n97xiO>F zJ86CGh|#6<=OKTId%1vYiq=}E3RV`;T4Uj|*9p(g;wrre>TtgQGJv|#`ZAa05~zTl z>v@Vm|AxZF^OgzcCAEEu_4i-M#P(YFh=MwAZ<{6_7PzJYwgfmCJXP-sV(Y|C&uGr( zA1NxPeV1p(=|ij!ntWjjvfR#D*JqrF0rk^tSJ;Xybh9S4n-l`#Z9i?7$IRY8&h^L3i&V&iIETrTp-8(BG}3-wWOa} z+0YpY#nQ>Cak$Nrr(nux!*jE!K>(k-5(n5S83Z-QYFLhWjO#&$3}7;X81qbY0H4Vs zL}7#hpcal8;0&pZMTp%7gt{e4N=6DuFisazKV?BMLmr9%+Ze46%KPQyLBBG<+;2Dy zRq7*JW6oXzS(1&Mhb+J&6t`HE0!?*63R2@;;2xkY06q9*-anLDmQW z1VB!;h3bDmxFa?syVLOJaR~eNQ4YhvQX*3C@>IIa?gf5 z13PIP)$$;xClq-tg^nP_ria~G6c{fDWaj2RL&#S~24e_|agJQlQPgOdD*zf_A2jq-oo9#2* zcI$~PN1lj^6%mw+XC1|%b|yzRMd&Pa^T*@`gMr~EOV{^G9|PPdK)G8kp#d>!rH_Qh zXf7wSRM!`3N@$JMAhu&{!gTeOTo+rX+utp05M?tTU@c=&r5u#St^Wsu$tF>Sq0>hv zAeoS@ED?ox!fFuncQJSa1^bF`gn<=%mgO>hlu0WL6Nm;Lgu9qe_pW~22$O&(Gr;P- znMWA~nx;I9UExBL(CHSG)HXF9K*&ORT{7Y#UooC4fsa4riR3vk6q~%0^-{RXgd%)$ zn{r9DPut}+?gm0Ht73gY4FAM_`q5Lcj*vWk8sPrRHZOjx$Wmn1-qmI{#7s$Rgz>m3 zHfKk#q8ihS)8?K!?OYf(b(N?gJ*TLmFE9@>)JmNqM;-O{cv?DByO_oMZF&3sGp$lG z%aK`RW?zqLzc(sr2q8r@;m4({KZlaT)Qv)g>2evqTIT+IEjmdZ`hn-kY(FH_A!D4!4b*-E2K2wBC0Z$lf1wmjobKZ}t^e3mY; z>2X%f!$!=1tvn!#%5!XV&y$oPv0=^V)X7k-ebZd$>6_EpQco5KXmD8?B?|8%TqPnG8%Xw6!#MQC?{VQ>(a{Q9=giWgVZT{o8?GS(CCR~5DGcz~fy$`6gB5}fTKCu-!| z7!y?_Rjz)Oaq`YNxIDIt^i%r`S7%8179H29Ez=6>Q94gkIhy_#e^~*p zj9Ql=C4w=fjAi^-F?L4#7hx5DNItq>z%KazY7N!xqRHT7a0<1C$v?M;$?#M-4T^P~ z{Lv~c)fJhwFVMg#NYHFq%X9i{b%?pH5dp@rluufMQMv9ca4KcA%$cJR$VFOsEG9UX z6(vg&#f1NbuQj z%q2CN#L>g2+aB|m0jQf{Ztu{(S9fs2{*t-m*sW`1AP!%7!g$$eDM&q2ucP4%RT zied~+9UqWg3!~r;`8!ndZWF-g>wH9{g|K}QOS_*1_@tPx(s2%A^*RykCqW&EtO`+b z!b6tDCO-k#-K?EVq8-XZBocg()y9hd#rI53^l7N@m}POshH$m)%}fT7kOQJoXFG(3 z9!|4nUQ&}1RbqPQUV+d)^&i5XWWBs{EH8FTPa^y4Z07b7Aq(~iqnKxD!?*A$ogn11STN0oZBpRpVCM#wfdInAW(}SRZ-Lns0XTW zc^T)o18(FH=_Zy|x<#R)tUX^@x?x^|S!$~*N;P%j1epTd`wp!7x5wr5@9D@uweA`| zkH+dV()R8*S2Mzov?X;pUo&MqDgH2cHn|!`nD-U1dWxVRoa$9Y$|*$eZ;`N>@7@hy*@SSlAfC9$%<9(VpbH9BM{0l=rNQYDAeNK+OXZlN@RXEa z2Q52~oDIRhMPkMaI9qf-8^~XZ42%S(Gz^Xff;Vkma!H>zd+x+R5N6h9lGHB`2IoTL;Y10a9BZD*XHr2i&OTG-9 zAxi6~kr^&s(u^1DLk>ZXV$@c$IT+`JC=AMpCn0h2YA@IU5d8&5#7p z6!G8w%naQ!xRjd^=s~LYoV2BUyXb!sZQZ4OG9c;uGFU#Mh#dl)@7XH2KNgC=9YrLw)N&ODx@{*Mk0|GkHy(LZ3M8AjTZRh2Q0p6f&P$w*m?q_p6}F-AI5 z#>>))`Ja?$-pGQMF3aB0(f!!z3oya)*oxJB@V31=wAvR$24SsE!GNd>vTg*->g7z8 zjt_b8;=h{~-j_~nip|=TEF1zE0!!;1j6r{^_v0{QDO*xh#7WFXkI8&0Bp@eSNtC@3 znokczW~+c2T+V(W)*^9}1l^}Im(^>CFG|!{nzJzdrC%YJcE5%Tv>$xogaX$9WwlzE z*tZ^K%$42pD89!XiZWXhd5BSHqV{7Ha*)YK_6^v{`7kjIi-E>qxK$7 zaSFZD?Ek0UYVp*G0%df@N;9^pvLzQz)F&&enZiKCcgJs|b1h+I9!2JEs?)(SLJdN{ ztIp0RfFlpkJRZOPd{-^%-Zs4qhe^=FMjeoH7S?(AR zzE0^C5$JZ$^-UkzV4sICmKnbdJ$G`7%AyjX_Tg84oboHCV@Soms0G(qpO&W`O~V*4 zpm+R>IEM)1DVu*jdtN`0o-&VU1re>uRxtPsJ!lLFcLKS&1-`Fb&**uz1{WBpD{`LK zD5ULbf9}U+E69jHqYIibk@OLu_dqUO$WiB!IFfb zcW8mZbeiv>E#riBF50&O!<5vtoAG0xmn0|k>j2&)jj};eH*%CW{pKcTz>t~olNWKN zV`nc~JV)&yS5k7c?s<Zh5Bp&#U|YG+y2dS120{I?|%!U+9Aw$Lfg&7#1xTxO{Ph1C4)@t!4C( z?s=Fk>by=(qijfeL@7sAE3SF~)T^hxk3#(~OH&4+4VF97pT`x1PrV!}~W-2_CF zc^#gJ0{Jt{1lWq_LC;~eZXkpwa_xvGT|1qB0zQ6k^F1I^vjgzuL zp_J!x$q27BgjD(^HQI>mj3ESQ5hx4Gq{d2~75$-1do@pPBWnJXG*FHUZthH-5Py$+ z<|@SaNdp>6)E_sm18#Ik7@@SnxG=C_k^=lT1MV~W$59+jV0dC8{7z)@x!fIbq_;*t z7=eeedeb!0pyUy+V@Y){WQO<@tiEa?^!39d?qJ%`g_b>*x^%;z#bhdKFfvCOYoI~D^+Ne;M*ym6# zLCMmGvN;7iaKQQhw`t>@;j&s?%c#qn*%ghwDTV86+`) zd+qJ=Ob@MfN3Sr0yaurt=9>mW>S8n(neW(V0@P?XV#UV$`K%fCn{UjgrRMoy2m-_NkFc;XFAO<8}zHn5%!%F@d;j5vExe24E@G^=!nu-uAXEEO0k( zi;`mrSHT#su^XFL=UDP*E*vm5zrq3?a~q)VHBZx&f|I{|r z0Y$mTGgZEsbOy>A6$xo|#8)*ov^j%b|CA%n{rmJ8L;^fMF zdWTZxL;mixbZGU4Bc14MsW7)v_F<1EVq2?ws!kY^N$7NX7=Rdd{%y;M7l1Lg1bp&!DBgo3g_veFW>(PdRP=)sM3dB0H( zqJ%j>Y`_uM)CcxY2wD(DmBSSI%jeKce9!BN7Aq{i6#rtkCefnI4eEA(M1snBID_|` z+>1M$O3;x=K|NkjPbP%HK$14$Ecbyn;I6^5bIQg%vEVL~@EO4g-mUE*MuJ*WxttK4W*FdeGA0uH!>s{1<{8ET;{QoljQee_e4 za%U_i&Xy<=9UEFarU{*`@sZ}UBje61+UsV{X3RAm?ur{SRTXfdVwyqhJZQbS<^vr~ z5C|O0Vn=*%2e==#PT*TxJIiWW)&XUi6g76YJ5Fop-{cxE_H-17ICs{Drn9@WA|ww;1@AE9c2t@mF!j z%wQP$CB8xbjo*gpvUH`^B?{DrW&whtlbp3Pya zvS)^;tgs{1+|C!N7haYh*d& z!2KXongxM`ci9_;k?o+074aGN3}`coOGojsg0Th|Ij;gp#XQC~ct%FnSfA@fteBm0|bv2EfK_wynjE ztpD>}%aa$&a`f^#DeqpjPKDT|o@gUhnHiqX#Qu+*beo(U9y3I9W${?O*sX-0ABi88 zE;4RI)GPBBj?UHcFWM!q{$SXweug&8aw*rYxyYM1>}U|GCAV0eVik#bye@p@#JT(I z(YPdfMPJ|1kmFKrg@a!*K00cbV9PTX^Qd-l=m(R9kDEW1(}jxV;rZ(#GlU7l4B`wQ zdylX*62T!1L?idZaazX}T}N-9fB$)y3~GrfjMbP0BpluGmTcH*Up`m0#p*}Q%2trW zVGe~6g*QAR3Cpr~0en&oo^PE5p_1X}eYPoR^fKG9r=v<(ErZZEy5AZ{sY&H+=H&-hQplxt!B{^aaJJJkz0#fkJ3yZ-Sk{LEf9EFt4w%s8N#E^c@hyzF* zNMovSkEY3fHji@O=bqVPJ=B|QP4^V_32KAhDPS3%# zfOKxYL9d-IUFb5tmYB!znv`-0(ia`gahtxZ`x80qt0!ggi|-*;qR zd9BI8==N}!Ax~o7>zzEqWjkLg7j$xP2*_K=pc-HZ=xzv$X_ulsx>B?Kk-cA_R;#5! z^Qj5+F`KXRgSL{-WI|cFg+GLbOTYw|{QlO<1@dl=TP&WfO{eqWxHLCOrlae?u2>t8 zFP_bUi`m@R53%j*HB>7+z&%?ix(!IG1B+W9Wt{*h*Sx!~E68X{p!0unD>hr|DGNdW z*-PH68+oQhi9R>GCc7No->107UATPt@N1&=iV&L(8?&BHrKeDMUMzb0^eiS=NW?hc z;*PE(a<;~5HS0ffgYc>;hiYk|)R82WuMpWv9O_WAC>5)hhjm3TJ2}_Rbk{9e&s=U0 z7`B_&MKqchjTWk(*5~TnG|rJ* zW!N#jb@|$QZvy!b3@RjQkK{r#?{kGgFwB&Og>%NB%LJ4ceW@lF`J9{z`%6g-xz%8) zv&sRrz*TyQXWSyZxqnR&JsM+Fw|tHVi7mV_xz;gjtusfZZ{>!o57;Vl2g!SyJN-jY z50ai}Y8y^*J&K0k8rpo1zV_z5b{tatagXN_ zP?wd)vm&q9(R>db=(QyGLc`G+bn(RbIkpy?ZnJ{HY>^auqe5R}I}}Ua3a4LVCN8LS z@2}&Vyp(v>T9;|Q(DV7@t{g-vKXP%Fd8N6ReOJ5fMK0G}xZ}g#F@gvm9?pqgYQE0b zXc_R+-6I(>wRYMwFwbhINL7&n3T_kEObU%wFQW=Al#$wU+&*PSnMkTrQc|aVoM)FKI z(Mp>Jr$B^gD<$-V+&UxbwNE>LR8$k4g3O;&QrPTlv?$%~Mhjd7m{`nw2^*KC6ux&$1XrPX*#`ZXJBchQ^a`Bn${600AM2?b9V1;oy!gF@QwM zUs=l?6R;a<5EUG#SlzcmJrqv+7YK7nwf?eyE71W_*dth(l;w1V5aJ!g-LQ)c3PQY4 z^&HR}b}N-LqY5U~3Vm6LHu#jn6WzdNb$Y^M)IZG6WyNZ0lw#94ysKJ?bKb#JVvzZ@ zw&549h+Ve|Vi>ed))=lyA-=jXd`;;trdnjMVYX=2GLUjdAcOSUZ%S&5x7m78#T6eK zi;^6rwAM8}nzv#l{A4s15=lJvI#W&~$EyUm8i)zrK)f`+>!2qd+G<`xQ~@> zbS7j^Ic=e{&W!dZbu<_=pEuO#J6%65fk+}7+$zRTF(r)0G=Syh#T_%VrY8QBxe8JO z;FIN()8ld@U1aj)WT5SdSq0ZGo!Ue7FC%ZpJ;6oiPpF)H1w+?zc*@tNrU@%r2k#KR zcvwxu3ABgm5@P(OmC1#WSBw|PIh{wI>fM={P~>+Bx-3t4t@rMSi4_p9rxBeXaI@*k zW6f=U04`)m+AO?Oi6o&@!eN-oEp*Bh6YR=9`E|F6(KO6muh?BqQyESj%$SCD0qT<(3muW$T-tR%i-k$oROg! zBa7zi>Cby{T3G^P*WB0I^wKcm{i#^~l|#WpIvSeF*i`S~m&;&Eudfjq!Tcbq{kKIE zNfH|)D((P;?cQ2~2KCZx<1^o%B)9SH$-9qF{O>fOR&l3bk;3?v>K8#rfwhmVH=}Fd z!}xU=;_F0L*VqR}ZtsrhRdv7Wha2Bj9UCG!Q-Yf?AHou>jTEHq*Cu5nwHY?^HpnP0imt@$^6iSd{wv_@|B8}7A|pDv_fuPm$-xzfR3HWAGz zYOsIPJ>cbxEf}fx2Ws|3s|*InxZGYN5z29dpup$hz;lH>G?EuE?=H3?#cBk{ zlPZm8`3Tmdh-3)}_`0!sfZA$2_ymwHaG=~Y;F0x(K-ZiW1A3}_-SmN~x(`rZSc4w5) zon>S?63|bBT~Qse%V1N|+&QCl^-gE{K4=B}VhF7u4=BD`&{mmJw63ntYTKbk<>Ffs zwOXA6yCz65F{|KUoa?!)Z$->B(obbY3|Av)MK!j~-1ttNq<70h$#@p|cfeR)2FuzJ zT0naGT?(A_ffCKI8V(KOO`~?N#7;k70DrbfG|=z8SV$WlVG=q2e#dZa4@Bb zcC6Pa%*$4H<^B_)WJ|k@c(0`E8csU5(o~={_hWv__T{SG-!13{z1gH%N<;7md2dv$ z#|m&dvW^Mmu0iq^q7q&DME)drBKK^?oV*~n0oF@*OPt)J-PwpCi`SfckfP}KMU5aw`<(x@05a>D!-`e8bjo5a z1>BaL=Q=jg)2B`pJKbX0pG^2|&$dohn;X{+Ob1#|uFywQ;dz=G9xVC^8Z3s~V)Y?X zYuJ~PU-$qWc0`lt`wI?>Ln}+Dz|E*An5{Bl=ICCBFTrnQ@wyfRZsB^S9!`5qhCl@k zbDu4q{5U_UxLXb!*&pYMXl+SVLpWA9LsSg>XZ;w%^=^X6{Zi@h0n+NI@NwR1LX-{W zKfP&MiDIcJrr4b0L_TAM3NHC=a`T>RBWQR*Q?=%FfVDezs2u8!9gW}X{BsTG?2-w# znNHU{Da*=%bjrcH9K&Kh;+w%#aQLyEURE7ktEV?DP3zG{&2F*Yf|TqpUy4qi_em(=)%m|Lpq1GrYMUIGsWL+ zj%{fAoJYKl7aZEL$3ce-oyrcp@!U(>l&`q)HoH2586HRA>)e)11f`vj>k9GzZJUO# zBTZ=rIpUFWFGV<6;Ds|t!1&=mB69{)%|~^X?No%y@}+YL;AefN2B45A77g@7bZVpTI`S?Mht>;;)SsKUOU>7 z053q$zwZ}ZuzxjIfoh{H2XIFKh5`!$I$zWgUdn8&j}ioP6t)~ooziC>p0Wtej$?5c zf1GBTtYd}rJ5d>9qlIr(pVDH5S`xeKdhmAW6DojPA@elWnRB(5n zc!$4ONq=-&0^U^L8{2Ry@a&UNiDMYhm)F>HEthrj8?W7^daP>VK>>`_fo%nQgHZag zFZq^p+_>n0KQc_!_#D7KG8UUnuHb_;x=ol|e&(E@;) zk%}M@!Qr;T773g&JIPpC>XF_DH_()5@U_#9C09npUD_ba*hKQDKkhv!6+2!=UY*#< z$)PEOk=!F{xXZ5$0wQR@pX2J&2_PnAK3+v$UdFQ2V<MZ$lTY5 z3@iRCqz7V6+Wpc^ONp9gU)2fbdlG&ve1uyO<{VS$|*DhD+c_zF#$Y}Ao;rg*|Takq4Q_qHQ#H=t9C3Fn4 z?ubrt!)VeDAq=AhN^0SRbTfqb_I@WY5DqUjDfTxVhFAEXGo>5(ytNZXXfxGRidD%PeG(t(c) z?xL21z`aL%vrxWijVUnKPM$d-4X_Pb?l_n6*p`uPQq(lhD_vwcucYk)fmJ)y+RC;E z7B_C_g#xpWPr?tXbO=7A`J3JDuet-&sQAt0=a}SJK8Y_s_DdC#zgpNr1mgacNHXJV zNwp+5cj9qx6A`WNqsXoBdZq+!o}KlzEQk|M*8)4Rkmp7KL!SB2`|HtAAI~7UO@R~XE>75)A0;}7fv?PrI`Q*@hYrs0N8$3}b zP+lgc&SSiiZ`U`k?M3&&*-!NFkuBzjP55w%6(HLkq z0KRlKjP8^ahBV@K1L23?%Nmqdhzo~x-@N1x&B(#lOgl}$m5>rC8iZATzNK2UYDDYG z^6Hv%S#!0eA!B!6eZKX!!MLQEJ5e2)nKJ9Eu0pl(a1CNYt`&jeQ7ZNM6XSBzMTr~( zLLpFKoOC|lqlJ6FU`^Urd>bYwfAwZx@>jeI7lId~;tDRzt*;-_`KxS(R5s0!YE%wO zi}1+@94@jWZu>GJv~(7GK!veIs|9BS0;#;^~{5~}liwa z0(cese>VJyWDsD>)@Qf^Fg8E&m`!cwe{#afXAHG|2=k#lE)LykWtu^vN zCK4i)Oc-}fNiq2x$Gby`x#fn?a1N3|r0dwNB^9E^slAe%VO>+*CNQgWIhsP$^{xfp z$aDJk-!jX?W?v4tboBa}*{PCt{zd$VyxUoOL|I!CP-TNUS#qBz8<(AaH?95Xy1Ls_ zC3te*$&L5Kv9o`>+*-G?srvIr$L;PRF-tB{bI)xKbZv8M1$Cg)ji@jg=s|P^$o{22 z`Fm0T9`a>daj~1ihb7K{yuFb~NR)yf)pZ$1mzEWGpNmQ;TdcZ?Upv}BL0zVx znc~~^doLSnw@F{M^h<4XL2D~wO?#)-JI=RkVbKT4+6pa{kbHcTY^(N*v1pXd0MAZk zq)trD17384M^wRwb*p?g`MyHpA}R+w_Qj|&B91m5Kyz?&Q{WYRqY9igQu~jECH>w? zTYKRQ#ufVGrv4NRTMnQC-K!$|&ef+{51v9F!n?yiM-cm8=WWE|PazMx2ji~rj9A_U@g%R^@2VgTSQ8W#kDEeIZYI0q3Nz+ zUEP^_5O!Qj)K(gG$dI9MaM-zA2FFsmlh>6%?7f8s3<~5q<$jny*+7oYoehIOXoHR> z!k&4+k)#E?_WG2304&Y#Tv5W5t2JHL6IYOUS)pghSwWo*_VC{!D*Np(m0D5DS%Ku8fIvyqnKzW@Cn-%2maOCiD( z<^Y}nKMRwn9ab3|<E9vcT?T{}8dDlb;c(_Ws43WuKP+m(-P5oB{q-kz-R}?{R1W^# zUkId^T>$Y{yl9;)xkJEgKsWgEY=s{U$HVDQk<9-@CMS-CNbWu=Wr!*N%GnQwmkGd$ zGnY?GF!Skx^yJi3dAj#B>HI9(q{Yl8-(w^ z8xA6G?*2ee*lJgwXQ{pK-KTno-Xk5a+>C;;#f8d<<| ziTD=wf@O+T^5c7@V7;SO_NMO1T$4)ob-?xgy%aro{Cce=fHtAR67e^D%ZAepz%%^e z@q2Yc_uKFksMhqoVIPgtX5}QdSbL;le&P*F^;Pe*&ux08U*+!oJp4lI57_MkgcfX`Y0PP|5w``Mb^!$Tv z37p8Wzqr2@pQL?#R4p3qg@!RdS=pWs%sQI0+YJku%rw5I^QBS64p5$Rw#;-ssK?40 z$w@ReXONlXm^8xt8BfM*shyZP*sCsOfHr>Hjd^;=`gUHZFE7YJehmt>H9= z=j=OaDz4DUF$5p80`gY&Q4P%ZaG%Xq`_R4hyF*IdK0~+`+HRGXN{Krg*@yL@(u97~ zUR0-8)==i>GEydcD$iA>FjUDf5z-d}j6eJX<*Sh+R1XdPk>0ZCnguv{{)_=Wuq+{@ z&~Wx5cShc3Z1C|$=Za<(?VCLV%WB25)|dzWq2|j(wBdI~*-JxCuzz%1TWCw#VTi7z z*u9SBFzbOvvyD{+gm^>-M`5`^a}_R|PX|0+kU2@juQm(kuJBwmI~~2l?+#>&VUbAx zF7u9LbR`%>y{I_Q>o$ul#t2jIHy>Z;%SFP+hDeUmz7V6X0XGql&g4$f(84!SjvO8s z__zv*LIW;OixO|q$=Y3@y{WGxYgO*P1A#e4&|jVQ8>*Gs9Kgp5GQBiRvj96c+|>3 zzNM!bN38{TzJo&TLlTr#EIezqJn{#)-7+c=2N1JAzx_SrogaDy#@>as(%{jv@}m7W zL;+jy=*(CMd#9W#+cjvnmsd~2)#C_a6tttHI&NG#`J#nQJ`vl}0>u z?Np|8BLXOYQ4Qi$UbWCq9#2<8vH`!5Ynwp<@nv|oni^(?32Bfn2*O=S&p3!Lj5Jqi zVVLfspbf|NodW{V&}M+!ytiPA|EqVbNO1)(7Q25{6MO<*Qfv9rowi_M|CN^9Z5$ju zRB8;&zE?Nw_Ie{DuswAp$7(h{rv zA>3(Aw6U;4lL*`siEQ$?Jr+7K;+!_O1q-Bx48jC@yObV1jPYT^3(nRUSB-%oRPA${ z-mq;|sOss(ny-u|aPP|b(kzx%G)qkQs9XN|fs07@7K&bjut0fziLZcZaZ>2mp^K0g z4nwJ-vMDvaJKnODRA>mUu@=sJMv?ovU<${}dr?yidHn$6yK8WrRgq~fp}U|S(L+JDnQ#c#8a zS@H~8(j_@Eahcf)or>Moc+cjvhgPYsQAa1#5QflCA&MPk-2%Mq+UT*yIP za*clLeE4@dlHTi;QJu?+O7a_mjAz!=@opUwBG~NMB&$<|w}a#R!i|&_+UdBPAyk}` z&9FNHhP<>!h2rV)lk#8zi>C4U_RV(lrQqG9Z4am1E~_Ec2J0N>9tIQDJX)mO5Cm!N z2ZJE#$q)M8a^Gm24tQviaK9%O$6WT@F~-{F*j_zvNm38hrFCG`pp=Ob)%$9;}qalqY`FDl(k`-Dc6UAr;+4_SNm>} ze3L6dpIYwDD`yqegNrBw5YnbGHF$>Cw=t0auEj$nzo&P#UfDOGFnFS{S(c5lBzxtN z+YWv2y~gxW(w*s<22TiRAM11B21*)Z*~Us?g&M0Xe|)0k_qm6)NAkHFGpVLWnUhF% z5sGr3u{SJe|7V%U-}9{f-`{^M$F9h)a6nlve0HqtAiaB_w}2 zF7ZU~ht!1?{fF&Em3gEm3F={lT_^B1D?UXglH`#)tF=)y5y{hXmzLGi>b)TQ{<$i( z85wK(uceJ4h^8h)`=uzFJc_Dgt~WOp7_`m?8XaN88$wHYL}pHvhHgH2`v=9qRA`JDHc7o_^dSq8b-Ip|1Um2-X5O*j3@ctYO!Puxe&S7 z2=3QB*^XC!rk9%GgSxNPS*N?jhJh@5^QiJqj#%F}?wC3%epSQz@KVWePD18?#mtF5 zG1{7xMe#G8a!aR$*x#S5`{%KFad2XEzn)><^k+ROEN`1Qo*p&BX8CmM_ImG?v$}s} zlvdS2l|uUEEikm$HSujTvp9J}%J^Q@U;sM9@X(cGLv7asDP?pu3pM}mDR|MO@^J~{ z#Di&l$?-Q6vA=ZnLK<`cIrcZHem=NVEvC=CSc|G?PVXw;`#f*EXCq?H*xY;H2Q~(7zL%?%_?mka9c^ON<3*G2pyG(JN zmaCTi2AE=Avh}65%d-9>?$6syqVG0WqRF7O9Q32_7LUEW`m`^#ns3bt?F--!hh)=w z`Vy?WZRO>MwNys9RvrXDOqK25UMTpi`cIvWL_1efn+1d57?)n@`Nj5We9F9PuDN`8 zN)k*ydWo6pNy4~zfo`~KNu=6mzS=`&F;gj)ft}u~aSbL8GXOLkhx>~#qvaP&hG>Gu zGC^OcZ!`Bfz=dKY<$iJjQRXTYDcUIX-*>y@Ye7?=!(Bju6I=>~ zd81ob>uY-f;Gl6jU^!*O44p>CYWdazK8_DNx`jIJQD1P4j$brFlt5exOAA1?&dm>~ z*A))5u?J9K_-IOPR#2hI6jmDgGTq!~ooHmQ7i9%oG!1B1$mLy$3rn3*x}q}mCf^4m z_yru!x2^q*R$K{nlbe+5rD%&>X8ATh9Rb<-Dc3Y{@u+i(L#bvLN`Xw&@D(%ky8eKoo3=Q=&c%Z&5e3UX%8l*>X zDJsh(orEh9*)2};=Ryd-JcvmD0thv58)|m^X}}mTVFH#*ZoI|j*c24lMrvg`%_wfOTSO^2440d6yn2{XM#1*UTy%L)N9dKNvP7N z_``cHxz`jhk>mSqRNbSyM<0*Btd# z1qd;zJP`g+tTH5kdTYOvmP9R1-K{gFQBw@66kFssh@8`rx$eXME2TYkNHmZa;uww` z8YkBklG79u-=fQLV!Rdp*QRyJ4TH7_?K^}iM=AfAxIn#~*?rPvlXKzZQ_tO~4@a7Bqt;|LqMhXY`qM8{KSBv(*xu-QR7VU$x zXD>TFLCX$M!$cvLPhIkKi}Y0KZZ{QA`b1|0kKns`C?>QzP>`BWX>6)EZ}p6zcafNj zqXmadSGNS|lvqKDoj-1oj{Q!Ugc)V5vwN9sqJY!v+%!Y^ry5*dvA9_IVxEE(HvLqY z0>;ae$zn8{CZ+Ejf^>x*-gpqOt2m02$e2Bwt-Ry#(ygA-njwU2#$tIaxH$GPPh!H{ z$7**B6SI?Z7Y$zvdFfEh?wXxA;6^A*KI{QRU>&SBX8(x8-wKBP_9k|L@irRBI>Y9~ z)gXz1R~4@zEg36%Y{8%ejZ~q@m~QiTh*3mgxq4 z!yK*uR3?2UPcThqST;X8LRp`JxeU&po<+zZxo1AX!0&2-0rjL@X*4-F2P79747b8_?=3mCA?*tT#hO6q>vKK}n>;>LpV^~FpWo53wTj{?_niHX1m#Vyr8jFqwRpXVEA*_AnPsQ;aU z{cl(?a|NpEahLFB&Zkl;r;{uFKOY6WB{ZWxR!}5Ad$gcZpclk!QBX#(03s}4g`q$B zIRpzLZ~L&evh)4VPeh`cO1*|)y&!@A&;>&BPb84Odr_K8eo7@-R;T}RRHkH19l#Bq zG-NEQnb>_?$HkxD^ThV{Ogp zp`u_gnw+!=EhJb=OSm!1bLY^wcs$-BHD*#-9nT5P0IDQYRQiD!l9XeTN*cqI!`JOA zm30E+`mRlqF~ytq0{qPMfI5+>Z-Bm}KlF*_+n`cKNHdP3$W}c9Op}@#xRnv&;oi|G znDqS6*Qr>El&$bBub4P=&!Pd-4cJo^C65|qy!Ve(LCR}#ulADQEDwiKgx&dLpZ0lV zA=x^Sw#@U2aK}J+y8`S4AMvARIPQn~y_}vu?diu?9Jp|EPBz{)$7k7Kc;^km-!@edDs(@cz^EuBj%D*1>;T&Eh$j{{j=Hh$ZgImH>*?5U*7h( zTj;ZWPT|@{xZ2fZ!?IAaT}#Y?UUn4Bb)~Dp0UY5Z=CJn2Wx#5JrLcPHi3!`O6E31n z$v)n8db;)GvIe_1A7J;^UFEJ#-IggW+&bufx#VuQrGh`6;eXWD!?*}+hOq?wFL_t? zlau}A)l~=6lJ5%YecX+V^3u+q_G4WYl=2r5?|1Lz+QTK%_)#6X$Z{#t+jR|gtlXlWF1QOv=3yS9?Uxl{um>lpzPg{!gSEd zH8I@_B1X0t)OnxBz(jXyA(047s(>K^hcVnB<2Ek$!@da2Iwg}!9k4jrIDV}oCR+MI zb5XsgeTPdwQbY5%YjB0*MotpR#QWwp=c{UU7#GhpbW0=KO7F z%o95;MTxTad$5YNGBijgg^IT#A+KrHt8oPhci<*8&NgzsvaZmxra(kIYN=O9w)(Hm z0m}7#ed21{8m__Z>izu_WTX4x;|H93a+nfT6-n`w8ogc{!w)~NubyRl3bd;vq;tpd z!tUdFY$C;8`1_u-y^(~MiX;G!fFS>_n3m7=G-%m@xqN<(3M|er=rI-%ZP1F)M{8c^ z89jb03vdIpTb5)|=5>r1 z<%Jc$z}3Scn>w=b0DVSBYvf=%K0S7Uq)HB)78`A+>*hqQcIs4qyjsOKp%ako(EMCV z)@v)LaArGNk>iO$y?Cjo5Aqe##aTvNLX8Yop25_zX5L`eoOIsMhEWne^60;Vtd48p zHCW14JY0K^L2y@h6>`~lBRS5b2|FbzV1?hP9Bof0qv2lhU}mIandY)AvpPUk5lUnV zx;%KguFz0O&|wT>X18gOGvOEkkQ869KTS2?e@LQc~H`x$ZgmWB?(}S%Ysful#ryYu$&7CMR*3B7I1M zfg@N-4G08K`x0x*~YH!}qMnMVzPO7yOw3hnsKZE*wE zS-0>o82(m@^+4RStady(bwI6vSZQf2EMgX^)d)hSH8fmF(zs(}dRV4+Kl{nIzg8kN z?!|&whQI%Sn@8gwv2s@b&ZU^83JX13`EP}) z9t-E%KLjh6D0E7|!qozP0^X0ZJ^W0g!Gvu~!M3_fwU<^^7`ZS?sv9Rwgx1=@p1Oj% zsJb>lFAHC3pBa$OWo5aB8#3Lcv^MvSwi%?XVR)7+mlcq1pNX%;=|Q~pURj=Y1FC9> z``IAu$a>fd!QTM=NG2nMv@Vp0%vmaAg&;Z@OLexdo$6Bnb!Z-xHJk;xfQ}zOED(+A zwicK7Mlga#6b5vP*0P2I36z}b0h~$g+8Z4OVLs&KF^5|jD!Ul2Mhc@8Bdk+BfN>zN z`Kx&D&YjNAIYQX;^8o^#&MxZ)wDmxOzb_+xN9PzBK+p;gO-8RQiwPlbY5f&qlAW#jQ_=3vpmJoGQ$F?mxeVZq(HJn@?Usjwd#+e|4{k!P$io-0A|}0wrfuf7Yce zz;FKyP(!1NHhDdMxxat9z}XL>e;hh#Z01b!SFI)zfWyBW&B`Oxj?!eYOr#+s}m19)1BEn zRDWhG0=9VeY+3qz>sMpj&jnPv_YF-d7?b5hGVdN=2r9i@$AJ zn}7T-qn2Iz{?fTCZp-UhN)PJ}q^{f-zPLNXK^#GUkpo=Tc<>+`xk-2#uqcZnf+$Sy za;)$PnO3->6Vh|pKGHmgc6Y9*hZ|pY#PJ*P|0MqN+qLsMv8stj$Hs|Z_B(BJt_q5V zQbUOYKzcN=K-Fj{3fH+-c5Us(x!~YALck|r8ey9Tcg%|iBUYBy#Ih1L$rOw-_|HFs zmH--5NkRJ7>q_PItqN*j6acqr71EMnLPeiOQ%xQ!BaQ7%emAlIT03FjCL$hR9)_1K2VoY_IP?yI$1D(dW%#gibni_-3_ED@NsF_yV%u)N4yM%g zA^NIrt>_%zINsU0M5*Cm4L%%RFbgz`J|7J9+<|#>K1nU$4)T!FWJ5&6E~{M(#^=Hc zf;M4CF-m6SHODn0)vRS_HZId=BleOo9*)J8zdgV(zVhgBH~5{87cd#j14d6@fD~I^ z5aq-~5LE07@4k<&6HFpRWKOIfa`XWa+AjKH&v=Kz{`JLK&LwF+q`tPpIBbaom@eB{uj)yuI^5Qx}w&Afqffq5a!_9#dJ3gn-v#i zHEV8Ylpwuv1qEXmk4KpeVOJMqYcynYG3e_bf&h`|>im0wR3K{A zP3!jUH;dMLRkNbm?X18h#GnC^s35(dzL0EuTXrgI(Y?k)?&MNy6~mTW!ANo-54G>$ z_Bt$3aq`y82)BxLy0jJo%O;SIjVeF##VF|Ha*s1el= zu+=!@a1x@AOR}Rb+{I}M+!1;lY9l9EBv*R}a^#y90F-)HCtHvdB-rs^!l(9}|E;+l zbpZxrnQ6)Ik{`HNMztZF42*Zb&De9!cnA^v?g2_!e;nnkd!oouwUtxRU4X#Ch+|xM zvJ=a}Rs6FKgFL+QmsF9Ts6=1YPH&ms1BFPU83eRylL`=s1`mTteIw*@IyXq<@!iD zE@$59Gv(B|kO3?1ynE)fkZUdYIR74>@_6Qk=(Pnl(Uzdb8@G{ zj5KfwEWyJOI{ElQ2es+Z9ilH|8cjy8jGU?b^a>O@9a~x&3z2%njR@9-fGrGBp|3C=dj6157%&nOND-8W z7FzPBMO;2L4jBOP5H50nJ2X8|DIn|-qkUscD6b$UdOH<``?;qldlVT9oI;^a`e*!& zfqc6i?N}Em_GyQach>gsU^tGdeKR@8GvGRd2azX&o|-ipMF9j}6S2xYI?S~?*qN$4 z9TxJ)f0BOwM1P9!P;u&zXu>$gW~a7IK{pO)vW3gmm^;ou`8pNs3fEfN=n(>D&`RFN|oe&$RPJrpGb9q{Hzj8p!0SU@mmPX|q z>o5tkL`a|_AmK1QaS4pe0I1QBuLfeBI7sj)QY%->zpHq{+Q;7jZifv98JqK+&Y;-z z)?U6b5tJ-qjg=x*yEnT8Y+z)=W=s#z%8a~h$feY@?zLCy0IHeV-;bA<0Qw7FBGAz9 zCWiTfHlX-krZpgG7NoELsRMR8T|p?iHcXR^NqOMp^7bpZih;yB%2duu5 zey~>Gr~a=^@*HF`U-%ET&#lktpRD6h*fX|09SopOhoEGC0Ygp&0$?(Gx!oVVP*j>~ zO=<>&5gcsSU!@M|+u3{8C{T~KdtP9kg?vF<$j6;1pIfhtE$9--iD+JSps!0KdaU;=%KZbxQEMs1U>(IK#K)~xT|j13ktHoV5@-TN-zz=6KIXlwjIUny@YscefP2YEl>GI% zv%d7ZEhnO*Lwvz$@$no6nUQl`d=>aQ#T1)$M_o{{+%0ZSEZv&ev-*KeYCn$V&`3zA zNRJUWfuLq(MaB5|2n|*$bqhMkE<&PH?0a@+B|+e*jKnuSq&e`^BAWn3X-N>?gznP) zq*g52KgCT-B5{9Mm6Bp_KTwtidL-_L7$hP`gg2~in|=dqMxw0ChV@E8*?Z>JXU28I z1s@)()rVJT2C7E<{I^-T@9;d|9)}B>ecJ?^g22;c~FYh z)5tmi=g1mtUWG!g}`QnMLkR7)NH;^^zwe1M)1gi6C13MxDQ-3p# z)bfF6`HDZa8c_~`wWir>L~E3ju+~O=%yxkGT*;QFh^YV&Po-uAE+Uv{B!3pArHxtQ6`EM~~q76AI ziEIO9Yq{=L1#vcc6)ri6Oe2qvJ%2ufdkAio4K6?5#+PMhhx;$EP%toZ*j_KX{fWh+ z+a(FVsh8iXS~Igvu)Q?4z9r39NY^E1%{<;YONRRM3=zoo!Ec1ec|+Uq5UExNY3_!7PfK^=6vg%rhoZm z+G!nBTCPF{n8P&{f?sW-^eB@j1gLAyLe$$T`+)< z@cOV-L_TjdngB>d(=wf9MKVz&CxDjK(UP+$H4nne9ZOMv` z6XR^V{YO3>wr;=+?>jd?-F_+pUtd4J{b28KyIWiHpuDZEZuh>smd3`k=0e@@4#IH* zSIu(%ZOGeB@Q65BX-r?nR}46j!fnHxr@!j5`<_%6Kk2h~MeoYkB6LP^cKPgvI=heV z@U6$WB&7WI5~?|UNLAK@i8=&FqnFVB=tDx?me6LfR8%&!e;j@vGd>DM78!VB7BO}p z6dav+eTk>N?nd-5Su$z(#?)gq(?cxFGHKZ@*EZOaHB>!v)N_@Z zW+cwSXW+XH`dm`hra9o#2^QYbltx4mkO|nJpF%FF(G4b+v{}6wND0YIN z&H+erbcD4QMQU88lPtb?9KW7g7Dz|Dfw#|!>FSEbgg&=emr&v8Z#v)g+gSK*i;ibb1Nxbe;4pyu6-l4cJMnOq3zt3)YF+JA z#flHQu=M?#zh<0qh!{pgD}2Alos1>whczQ5575pKu1O)ISIpP?e)|vV26L0 zmpV2+t9LZ|r+T5$&oR$e+CSZX@L^!>8(fri+@ix4x*o6QSU$of7t zaB~F@Mm*+--J6m$+>v%{Z{+wgU4_Fw=k~6KJL};x2mnviO@~_^>NB8 zlz#MW*HAF%c864;6nC*#A((j8LF2FyqJjxyB{1M=h!s*L(3z-li-Hd+B@1K4QacEZ z$QXsmq=Za6=?sv|K1N`mNvmM7k#qXbWIGUC@{xh!G1JGCPP; zf8%x5ko_k%M9gWgX<7B|<8*M!{I~za0SRbHbLKcdeQp6j>yIg9sk2@19vSYM^|jcr z$1Y&EvphUzI=T=6JD3paQ_nsBT>R=$&!xDSFH|I+=Ysn58{?EIBu>!az?3wjo~?J; zEJ=c4m{$c+M5RNg4h=SPjVNIKKuB|<24Uu_Q%-n1e)P5lO(2jQ_UF* z$BKR1gucEhldL*pV57ULfH2_A<}v^L8N8!Kt`TaWlqG8V2xN(ly zKzMBQ&KQ<96)2zG^UyPo@ZR!lO;ymN6=^Rl18Q z8olR5G0Jnn<;nDw0C;3(r2u^yj~=^Ss{bto6RT;>-*_Si!W3 z@(mzH*642k8QEpqx6em{--_zM&36@DTc?KhUU_##hPMm_q42}2aF}z9$KaF+C^Zz! z7yYDkaNtaY5&(^mClKuEIh=mKgR|us1}e1rK{`X-mbZZc5Fio-=!sc0v=-11v$+E= zCw8Z_xQp`&^vqn*sUTjZ!Wov}_LCKg$B*YI?$Ocil)25D54OzDEH2JW&-?k!Ppc*8 zTMlMqC=}#Js6X||-#_%EJT^)uNlXf6g5aWQcZdp8n zgIM`SCONCCtIdta%9B_PMulf{El(TU84@O}+o}?C(8lBI+H4H-H-$(4QFv_Ja$w2W z*>e^cn&hU{ROxX0&o%$>YLhxGghjqC*)mQTTvFTjVMj2ht*E8eNNODqZV;Ka?1%ST z4o)+Gzn7pQt*NC}r$;bYf>nz;g5RCGUPJ10Qh8kxWDQrRxA;fqSC{4#B#OO+x%Zr| zh4>`XhJ;DiU;@I}XBAu@MHw3Z z=qRc(RB<&dgOR43w5)P!>xmC!(F1r#bAJ-0XyQ|WCGG_C}#{m}U5|n8JNB5LpSLoJUroD(Pcot2Rt0W1U*4qN+ueqNt zanZfEJ66?7J-SXp3uMRlIJH?;O)42_8DWa6p-O6Wl-e(Md^~T~CnK$z%qDZ%p*a66 ztgFgMYAJX6;t`eA5@Z&jUkH#06|QQJd5`?kzI~fO7b+|&o8aWkigwcY3IPqZ0-(aG zWvK^#ai7G!fhACQrI_Z`P_v@=tOkn+iv~hEYN&Y^$D#0I3EUebyH20x_^`d_=F~eY zkL@sy((EWe?M2!ng&)w+4T89DQ_IE-yU9o}ydF$878(kt(#ZDq*T5E%_C93OQm=)- zUfSD(AL`y7fBVN>1eaYYVAK40oDf(TpW`%~^mgs~!A-SYf=YPyTR0P5@wUxH^ecAog7senKW+RGxHL`du4I3|Hf=VzB8mPIr7LbUPP`;Is ziIHPvhKyWR2x$Ul{lSC1y$KK4U`H^>&;~@0fJD}Hbmi0?m1MA8mBEjF!Y#Le@_%P` zM*04k0B-HLzEw}Jf%>|JFJ0GHu^3Z|92H1bMfnHPh3v@6WNy(h&3&IzB%3Y_^j{Sv z5sa217eo3gr0e+fB*~;G6H)Lj>ON6BceQiO&S`vaN0oJ3M+~oW#Kmc7-*WHKgk0?+b=l82W4Qko8}#Uq90`4{bypRdneNQHhy5>$CE{HRWb$ z5%0N%V5PLM4p}h`IhNz7@m#)HZLaRw-pl##-}NpH9#`F;n*>`aS6K_QiiK7d36>PA zX}1!`<$&wzV{#}ubdr8fQcr(lA8H zj>95CF8Oz)?3_H7DxHH~)e;F`|MBi|ucCdXD_xEr&v$m`!M3llQzBP+tS=!9%~m1V z&e3qDM|8g|(L+=_l6?50VU<(InKK=IitHl1BG{=sFCx_tg#Gc&U{ib;Uoh|N;`;qR z>R*2yx<{vPF76-Bp7~h!pVPqGsBN8QcTV=B)rn@~+ulYw4K#f7R%Udfjl0eV!=Ai}?lZM?lp&BRR zY7<8k38D>scz1E%zQr340j7{B_%Lblwo@`~{z%m$je7ik!-mJ6`S5OtW8$CD@P=6qg+K!Orp*pP@nTz9#)pr}=E?7CwfS*Wbd)P{853o@Dhs+I2 zii|)t29e~-esLEW^NieUx>>!lDTU31&U4gj53UEjNP1)r!O0+ecNmEn)HJG7IQ3iG z8(m&}v~`tSaDjwo4L|LL%JYm!KkI-PlD!d(GU@C3%*($8WYHJ=%JXn9%|9x77d7^? zrM5bHVo(qBMATp6o~u8Y0~iL_cb&YQb0&0V^A$T>k*7bNa1cTnQ4-f%f4rNneQU$9 zYIF0)$MSdI(Xa^FQDHq`dM`*sP#j~USiyFgjwNI>ZqmsX^Z!b_Ps)JFvkdt3M7D?2 zmfhb!D=PZdZ-;R4UxEbWZ$%`zL}`Eszu$$=tzCbx7eH?My~&pb>FxH3+y$%UqPmW) zXYT#|io`W4LkKyX_;?!W+F=ypO~XQGIP;1OkQRkF|2=S~KthN@xp3qR!k&=<5IDdC z2mU1~{uYrG6PKjoZHweyR_JfLIcBB#7VSZH*e_;>Qv9S`%?A6!#LsCxU1@wSa#;!w z3AVkU0aPAFKRTYm@HGpGV%f5C#xokcno86cXN8jhrmQlI_PD{iz; z)rPzZq7}O(`|2e@v@f9achN0|8U87$C`h=#k+#LmJH1IAA@*$5lE&uFnBl=T-N2!R z5XL7_PWV6MbXjR%c5T^J??;<`RWuCf{8JCQh+eJ5!7kR0X+xeyxlKJDRmsf7POmRu@&6p@+4!DZo`-rvf{O1ncNR;BSAC}#aF zQNUh|u|5g<26rk*&<(YKAU&W*f6z@p(nt#&=a~{*mL7-(Gw(M8lY?ZKwXZNt5e8h? z7zVhEJmR1fKMV}RBK^Z~`15<*Y5bAGUZ@uD@$O_N3#5276YbmW8>VFuRB)C20SOAQ zAmFt0@e+uxt66}|A7lxKA>lTbkkzTicWW#vapaOcMfL2ON5^W?-6eSe^Myji?ulqzbGzeVR_h-fHy1`14K}`jMP=3dv zTIKh`05L$$zbw%R$#7O74HyX2;=2FM=If~d?q>zk@LJP#M%N&nPQy!evYNlsPyW3AV&kx7rc{Aql$HWbyIHpIzMT?>v$T?h(}|X5Tc(=E_KqB^Huj>eLaBQfP7O= zr>2TJY#CW4A-6a=X`Z-d&Ako_yuhyc&G@Q3<;tP8)Pq0hKbVutOPQ?Rs7k*=5BseH za!*}LDX>b7X8Z`Z`in(Lb!U9FEP~4YT~R-D^H-HEP=*q3|7sBvWf`dfjKm=_A)`Qq z2pz0DGGas;WDK1Fs|gVnz#)tyivrMM0JMzHtNDJdt>>9OlHwRtZ}9jZEj^wP&_B7} zDfZa?0Wy*@;3pQ)=+yKUWKMmDv_u@ETB9d&t8ouwGYK5qUIF}TgCUJkP%N$8y{ml& za&DtM2u01k$qP_D&ujXTp_-{;O2pERocb+Dab>S9he=?E)wqk?^wy~J$*TY<0z{d+ zd2^29{*3;8+A7a<3rx+lW9al}GRB=Ucm2j5H_EA@!MU?<7tWrexL##liQzJ%`%j=^ z&{xW@;nJZ&skF9E8h8DM>}^PpCrm~4wKCbwnnrUmtk*$#p-2)#>&)4v`>xzu*l49%%Kn}yc@u9|gZJySC-A#wM2x2$GX_%8YAMXCCvv{u<*mpnR2W>l{i zsp^-&k|7z}uJ1~nz_}}Z8`P>=WfGdIUoTQbDclhk(>>TKllrr-aTH_8p<*@jP|JNB z_EH_=nZWUg2NbZXF?nm zTzjXmf99iR=nj-kDLQd%|7YyUKp3QE=#S5Ko6Ud%NmB%8CeeVdbXD*Q*SUNRMZk8Y ztC!u~J=A-|p7YURVbfJgc>svkhqoGN;3be?j#q8kRMnZ8={sytTE21W@zbfz<)x`< zlP1_jBziI}JtiurU~se`KQhv{)$o%XlF1*GDP3H!qW0Gfl^W? zcg#xaxL8&4cE+3Ke4xG%$4^?P6;i;J72C$0hNmJHu%=X8lp-l$GJ_LLLTvY~ zg7Wmo>wHyf}ddYI^z>hTASU4ilR1W7V0lnT2lPX^IKFbc7e#*;Fu+ey$ZKcBtG-kS1Hi zT?Bwy?;m^)7x^etj$>iJ4F+9gk4E7=vtiH4!qXG9m@Cw9|+bx*A;Yo;2xn7Fa(*v*2 zmZ%2LXm_p3J1H;Trfm8*;~+!4U}LPF3NwU~hay={X49Fl+aP(|qG2Sw#snuv>jzy+ z5E#in5%pb-%h9!{AFxH3$W6|WFhmqwU|&QU+F9vU?HwkfM_N>y#%_u}W6&zkZrTOb z)SW@H`G5y&eGzi1wQwd~S#OU>2#ooVlgC`8SzXKHoN;z z7Q>~e!{RS20n=))2jE#HB8_O#$O9pSau)u;w%YVz9BhC>Mf5l<(o3!X*?3x8vCA$> zBBl56TO|edp{ZuPX3yEc{NV7q`L5j0W98MCpEs_}KNixYNM7UK&d!V76lMRoj<8@6 zkMK+$UwW{6eAi6tp01CD;llVQC4L@fpL>Bxmi{N@-eG|LxP$1~zMto{COLfG10O-+RZaK;obD94Vm_vVX>qG?rQw(m>(0tSj& z^9^dcx+hG(8j_G$nRX1qI#RoV4c=`LVgtSN&mA84ZUwhS4dc zftp60ZchSYf`S4bP#4wsNi#Ciq<<>28k6?fKFT2eXj;^N=25ZTldj#d=5H7CC{v+H z(rH(no}*H24+GWr)YCCx8aR6PJ<&VfANl!nWPcHWkTVCIcQg|jJxlMqOV?g)7RLJ# z6_&|f;_-<3!tL!G{qRLJZDtw8mntY+Hp;Zpx5pm9V&46mLBNQHYM8t6P>wWzToI%U zBFoGVpA|-=90ckE8iWp|7UZdJ#WGnHB`z6ZNN@oV z48I`C2%?u@%8Q$OsL|0`^17gMj3TI57c?1ddaVlIjRwILKD2ur;O2LGz#W<{5v+T^K73(vt`1FsYmX>h1XowXsSR2v!@R_^!S#kr@)nYMV+%KN!pSge1#F=49D z>e6|dp_;(=j$!4Yk=mTn4Vj6121<`ZXB7yE_5>NTbjAa~qUtgm7+q)#{S7j@6g1gk z72JfzHc;5OG^A|yOd0da74fK;E`_3NRabiY2KAj}*0Zhm<>w z8a3h(54zJJtM8E$+;&C;Pu12trMFUuTO4kiF@Jn(01)Lwy+QO5$BcBb!}FekxlsdI zS1|P4VL9M<1U;xn!htRS?4B`iv)b6(##2QE*}4mx2tW!VF_T!yv`8#^Bu+ z6i)06_lv|Sq-Lx;{bK5_+l(-xRUr~+@MqFyz7{EZ`eCx-ia=ze{E#3x#AI9B8bg)I z#cZtRX`Re$hasKE`+g z&d8x)Cx5a0W9f_YAzrgio4lA+tU`iilhM_%tb?UqTBP=ea@P*^CTYZW1~@mQ4cLY? znFIxNrjti3U5(p-3~NtnR^k#%wnAk5gmtEKbe}ELE$o+6igLy7!_^**6p-;1JGZU) z5Gx^MILp{zgOPRr5)D!XE6CAoR0dyO-8NvwAx;uAJH}m?U#B+2TS-3E- zWc^8ZKAUpn2;@wxc(;rDjByIIE~SWX514d~(e_CtSDDt(pnFsEe5(nGR? zvdL57m8!VXfC;ogD|DLCrEDTgIMjsO{ca?KX+$ z8SOLAINqbW;%gHbEh^EVXFFQDOB%2^mFO^k&-8D4HaJIhlnjMw>7xdzF>2Hfvu;Xf zczz}c3a?-K*twY~Nvx!17tO>J$cD&UM_TRkBs0;4kMC<`0#V#K1(dL&r8!B0^5k<= zzoojCEh$NJ41g%f?wg$p%InblQ7Im4_sfDWJ_@E&P~V5-y3nKRII@A6h==9{+Xgvo z$TOD2C{AkwlYG-Y1Ky|Cooas^{th6nwrRZcZJkwYN5(DznV{}3`=&o`9Jpxag<;6- z4}11}$VP&W$o>Fjd(GH~6Z1axuWhpb%j2H6o#RcltGz#5Xhp`e+@RTGw$YDZF`GAU!L9&p&}}xr)1POi$ijmo2BsiEHj)IG zoe+nN0-u6^e2EBsSnPpcoDAm755UHYj1t1^zk5e&uQ%`u-}_TVyOO)5pEG@T2Bz6suUCc`POVE$N0t*q>R+CD#j321OD?VRb=lv9g}!v`k4I22aHMN604{ihv|5G;p&GS4|0Qb3~woEh+|-KRGn&W}-E z`WJfLxXe#s%0b|`n_k-_k#*}%t8n80{`+GTw>3$0igU1(8`F!9ES}$3x8X2f}xTWf(Jmr?qO?1;tt73c0RAoMjx;cj^e2IA5^sDgnS; zB7n+mGZYknj~{b`aa#!xL~!3=86t*jE@5rVKBfatovc*tES1Ux@c61WVH?Uwt8CaG ze@>7lx{2L?{vk8y28yM)X5vP)om5*+@VS#7SJ3{=;Oh?Tphs8A(oQfhtnNJZdcV$yVN zS@j{KV>ql&I4o|D1nemQFNrh5ePVKAV`cKZG-O24IF0M(&rFJH$LalfUZLTG6rJgkqy2_K$-|R5q0h`K;~2k*30XFPFY!^Krrl; zj*ZSRb--sEDzoBCgos=ajNQ5O@6A8!YCRBb!*AFB1K+8+Kt5^Oy$j#-(wvJBC=K18 z<@Z~KyBbdzU9O zA(8Hdq<2!cb?pNOmq><7z*yhayayHDPlNy~Aa+5N9&Gk1TMDEliZeRV7P3 zY-6DZ1h2;ev0~J+ncaL2hK0ib_LYeA`8%OP%zErac)+ub^^jI2%f*F>v2J8RADQhO zBBO;vZ*8B0VKE%I<)}jJH19>|N5H+dvDzn}SUbEM0g{S&N49 zhWrzB*^m*#8VvOE`2Z#+E6XjXge*9KH)NNWr$KMo79>?Dl+>bA_O?y*MQ)ABYWBBp zlcY(BM07_x-JW-~*A*23H|mtLtqO1uq|ugDN2CdVIbnjB1@T$CGFrMCDkO~p;h)D$ zj{PZIP~ZR;Zq}~&)6fspG!b+pw5mg$y-{)|9a=ZW>gXDftt3>A-^qq5l@Ru1wF#26 zpxAQD800J=3>>T=o!+k%Qo)*C8MY;)uo7=xC|&3q1gBsxWx-AeeS$;~l*cLS_GCqX zPlDy}lb!Lc(FFwwX;OU>BuiE|sHJ16{%0)n&|z_GnZmr@{$bs-Ohc1hx^v7pb1N(J zIFcTwONVBksW*M8H&>L!isw$t`cW7vSe)?R<{vS}j?m?W>EPWa=NDrHi=BMT3EuzN zv*J)en858U2wqxM6Q7~-6fkyZQH<7pFP77`*k_fJY_AwC<34c#LAc+`C@1l~FHT*0 z?=|T#+v`$h`n+fNnjWb1w#c%0d7O6M*`)WNg++cQ5|)$UXWxc7dU<)@R%3wL%-j;b z1>gcS=~!Uf9zbO_AUjE3rrWBa?bENP+0v6ClvB=UPXapf&7X2$rcy}=Dnp_tQd6tf zuHCT+AY`vD46-bU@BlhGp`!eAW+p57_cbHto%K+9HV<+udATq&&)NoOkONyr%zv+D zC1+-~v5B}#16d-dWPTP2vYe_^MtN~H2teqU3RYbmozv$$`|U!mOnk~yUl=+6OY5Na7oh&&|FF1s z03^}F_}+PA`T1lTxq_@wEg5`xUGR}UP9dkUu_h5J)U0V73&BTvq~sfFvUEnwe=vxj7v+q^*|n4*E19YH?!@ZRxp|6rvu z_}1bRKqiB8l1o~!=Qogo;mY=q=(#P2DMcpR3gya{E7p1jA6Boku<#QUc4S9LS#@r9 z0ui@n6$%`PpI3iUmby>ZoO5Z3P^JedNOgu;^kX}I+F+_LO?358D@Q&UV7Ao z=)B;GM;+2p|CT{x>~uOiD$KEq5e$E8nprVp!JXx9`&(=Vr)VhSZJTAsB2GUizikFL z32t``DxDq4aL^Xk)&<5J8tHHUNDglfGah;7!*o+q6bre?RP6;`lZRMyn|Y2$&5E~Z zVN{qmu}JSH@qRG{!ixw9_Ch!cQ@G@k1XmJt5nl>^Q%97I^^i@>F$aey?1oK`;Z3LN z{PM0NJJ#D86$Bc;VuFR|5F2{!jPgjPhK)YOXItygPEY4VUw!$t(x#IHShe~7pfj>5DUFWgS1UL`BkM(EVytMxReBjfY)b^ukHR8RCblT|80 zO|I}`EnUL%j!4LF_#Umd+mV4*?Z+-{AkR5lk}Vh%W>=!b}oYUz?r6jPGWoKI$&O9Yc0F z<{m!R3afLIB_zLTM1hk{!%-Nb;>O_oYuyN~`7*{~?)3+x+{yweudSUPL=~CZ(xA%K zX!@<*gqU@8!|0=!?wgZlOyz*3D&f%PLfm20@Tz<_!7boUhttq>IUV$=2Sj*qfSI8_ zU0;>STjCYujx_xGdL_L2doDucyXAnMP|`~)OU81w%KEpczFfs_+V~0p>nyb%4q^dF z1Ya~wuVYf`Mmt#RH^h>#Hc72Ps1TRCjap|#tE;1|Md*zgwVE(YP>-pvjH^|KFyfT@ z@&56^_lNlv$B{RsP2+D&mF!11p%Dz%-RM{azEmWkLzc9BkvIxWe zkS^1yM@jLmlBWPfE$O@c?;N6NX)$1lT$**z%zxX8CgIT!nTFad0u*1uZtA);2{8FFAYQiX*8N= z1-@pVD)2D&Z)B)`PyuoHk&h~a>+BU+7!WLS^5rBdR`7eGk1pQCQrGNIS+Rq!_oFg` zdH##9VwdogVuTXxCpEUoZ0=0WSlyjdwfO+quJA_T&Rx2?+DLd-HR_H`et4m(69^x& zx;-&xDtlRP{`6$;Kso;55P-i6_g&7|7u_ObQuuKE#6pdyAo&lbg8*WD?prE2_`a^m zt1N>&cacwU6Nnjw60A2>lElPHYid_Gsh;RuU!X2P2$cYCLsMJY^nNy-WEX(_0D9XC zBePj!h?c=k_?KELt)2 znC$n$E&nmC7E^v4GbG!Z?VjK`p9l)8=X#t-+aBy8ZsxP;gh-Gf&e-TTw+(C_dxJ9% z`)jwEd_CV|OA8!pK9uJmkM$Vk_Fb5;bv*8tR=7DlTOjVbI$e78SJ3kZMYF z8a-|NOc1H8!9#q)kv%5%P<~vFu^mqY9pwrOg~oAM1Oi0B3eC)9TdB;I|LQ*6m#^m` z<~5JQLPr#ks|0xTjDfKSb8wF-9}N)S}21$Fey)hnQ`#Cjz^5 zU8rMsBF7^gPCB^gv`gf$Xf`pKX6LJ#Rfld#5{i=MLbrz=PvQnRldK8mkfXPK<9)CC z#b2C!LoB+hitXQvePNsSM}(dw=6%pVYJ48E3bW?lOn9fj)5<#$DF|4gT^lpaI4sjo zXAgI$Y);@Sl<$%5l+MY8zJj?B+1HdHiId&&GXM7IJQ~Q%%=m5%aF(TZ|GQ_u`A3{% z&#%KU!05eaN2k$8%MG5RDLc2&Amgymw9Q>Z_>b1r@*D~k)49^(Gahii1A*1t=i4u! zE3@*eZ-LGy^{=W%E>almB3Tw{zbSp)Z4mMymAZh=s_ul`gH7D7d(;voRg4b0{8xR7 z0-0;fLI0WJ9~Kql{v}W$d<%w$2*^nG(|usoU_dT2xgKN~555JKWl{~-eNA0_{g}_=r>Mh#0_V22 zc#CT5uHUO_Ibj4};zX=!CDBQ?L?`2!|K|>9>KbAy)oCvGjG2^^caY0X#>i#8Z$R1h zccqe|BAFOXsT=|N5I0Bcs;Zi%?X1$UfCHlEienGwQQXxTKfpNku)z=CRQ&vZ9cwBM z4oxtT8Ox-O0fw2mNLc2H0u}3RP%T&liR!6~){WAw7Q7(LrF)|t#_xP4-is!u z&p$P}XZ+HC`(KmV$sZ~(DNq3`fUU5b$!(9EBnt_ zwm=*YeC=Do_-2jNu1X6w>nR*@xEK_wI5Z6<8AyLREsPWBsmoX8G#X|^g9S(z)iGbYPT3xJX8|#FZXIS4vqvc)2#?;v zUq3;=Lep}wa{Z;dL-2GYV{kNMPcU)qOFQWX(*L$INoX<;p0VO&llFKC^_DlB)M^+@ zi`#7Pr7OgBFwTS_i^5Q6(_?2aVB@1v)lZ*0+Z$N;9i_9!1vg_qBpvjM0CI(GL3z=V zGHRIzb@GfF>mp^wI$jb;1ayoeG3|Xl<8S;AE>^u3249;|cd4)iOB-@Y zz-JkwOUB`?14_{{;z{wp)M?%7#NV!#q?Z6is1Y89A-V$ts(8M6by&6Ln8q=RqM-1- zq*N)5J=h2CL4J9aKbW_ATR=KlO{Uu>(o$*uWwAWAPl$ldi!G>bJAwLE8Ez6p4*H;w z1PQdkeWI+u%$=5Cd$^V%@bdrbi)q+Sz3AP_Ne8!?x$Uaycbm;6b!-I4%VcWW#H*z4 z$BT?|j(3n=vfgjKgEg((&)V@IC;DW*&hD>m@Ke@)9sjgl=2+HH1YU@||JtqF-k0f8 zcf4d%N#L^r{Tj08Ph{~Mj{>YJQ%4%KcsfuzDjMeS zsi(5qEM>ccE04)kXUH57?rEeHe^AWK85z0>NPPMZ zsC#`yu<4O=z*7g=sxXc-hBvByvR#@l3)2XU`GcEG{f_Za65Xc6F9rIjMg*v}rO{lE z#@sb>+7#Y_N$iPo8_|V=wY^GF?hr`as;V^Lx^U!{a`RT{;{@#b$xi|OV*=}yGn@d^ z#+lwGWj6%!r(*z!R=_(Fj}gGwxUjLLlhlJD+{oyljd7M>UE)udplp-Wkcn~>kX>0O z`V(Os?Zk6t@N83p>)0+6D_Z~9zPwty{<7UIbD`@c6^t3Y=31F)6Nbf4o!CRx!?9Mx z@aXs=3Kp3Tiimv7)Dlo624=rmQ>SG0`dE^IoueUS(>bFR;4nd(uM$anv<9OYoqc3D zaDsX{6^p#)0V#HU3+A4pebCoL+29}>@EoU-dxZddhf(6jjlidtBnUUiisW&D`w*!* zGD3Dg^71YvCK&86>u2m^xoc@N_ZQ=b%XEIw8k*7oF+2hpe5^p|UnwJF19)GZ&?_$z zaeIR~1_&D4mP+7g2o@#D6do*TY?^`Mxpb8u{3;Y4nRK<+hLWEpRx(o+W)OYr!7Z9k*Y?$Ir=NaO^%<32V#78Uld zxi7j}pXcfqsg*x+G{B1g?O@&yBa#s8cMpF1@lcvfK zmd|rVz0VxJ=D+}m*|MzcF!QDW|M1fC`TXlfQxXB8) zg6S-V_zA&t-0|z(6{j|}@p?xszT;#r?^m(JMh0r5oAbkz*C2%Vm6UupeKMy&G-^4!n2N`G*|Di$-oNEa3yoLm(90rqdO~{>9mSfjQKKY@vnFDzI_JxZx*2J^8b1Jp4YWWk`L*< zME(y0fa_~;jAZ7f)(o2eg*<%?<6aMyyNP&qWz@bhI$UIcNar}C=|z5!eo8(sMo`wW z)*@?_dU&Naw=W*gBvkPM51-!3yJuJekLaMgC@?uP_UNV!uN1(aeM0c^d=H}|z8 zONcxfN+hI6Nk!|b+mByAn~iy}e0MI^CiQWAF(Z>EU9gL@i@6+~Ps%lkn={}V#1HoZ zzHP9F1m-)~Ahev#R*3>TS2rxF;a)^T!S&MS`Rt;0NL}6JWJGgdAkW99%PacI6Pcvl z6dw7J5knM zX)I&RdI`Nm)6PoNoVN@3tnLlXV3r7XUGEbw*w&I>D`o2RZ*;`nvw*Lg@uq8zU!AhP0+gp%qPtU zG1~y^<}6S)Sm^I-XAE1iS^gzNxrC?ir!r7g$!;%alXqV>)1 zeF#r*k2BSPgm{p|yw+1D@eC)2p@M;}2#gN+hnjT{@xizPJcL7?qHN4fu zv6uqfutQ>H-Y%@+VaBFhaLy1bdjSdY$T^QL7aJ2R%4_Ck@+CI=ocoOZgZ&%y)~(mu zaO|?xlozt0g46x5x#W6=P1oy-?~{n`1%K%!q$T*nliLKIg$~4!Qg>Am;ZkVx2MfOH z1fdR-G@%(l)Sa>fKfMHq-)_*qwMYAfz8E^=qA-Ye>$t~YnNOaeoF*TrHyqE4naGNt zU<-oThVFhdFSvJK2oEQ0d~9})^u4y=C~RrrfKYhg@JRo@Cg0?fbPSq*L~4xGul&*= z%fDU9ckQVzde*DYYb}qRZ}M_K6oNTxZYYduNl54=pbS|7m2y@v$7e{x{3Wn+BavTxacfq6B_O48ib{U4zFc-4^Qb!Shw^zhw{#^o0-l-qce*QZr1 z-)M95^ySl))qCsj*4I7M1F*(=RkwYtzi%{E7Cr}v8Vmm3anKL`{FR$2KGoF%t%A+9 zApantnYl3NP^6hqQ|TNe{2}r4^-W>dN6u+`6HnQgv4ccjo0&`ZeFtW^$aPjnlf-m( z^7VCO1b&FJ?KC=b;^a86PHOr?x72<6l7gf_=%Io0=S3exA@arguD!VS@#vs_`v=|+ zDAe=3MVbAazv-8TEo=QDKYA^M^L48W;vAwTszcBLD=o(`!?mbf@gp17erwau8w5s` zAGb|y9S2%TRIOZgdU{Q(g9~{vlH?s)ls8h88)}T*XTB9%K2RwyERf3z^Q8pLG!_Ff zF0BtM$7-=#wGUoZByoS0w5VWHVS#kpb$kw4HEyNW`@{EJr|kUs-=V`lejGLm&|#ep z-^a?H{`L9b?9Z?Jx{kVcjszH>#fN_WKWoxJKk#sC^MTetDopS9idMT)(VUWtB9XRX z#^c-GEZ)bT5?GWqlubw#*H10lE?!ua*jgO0m=Qk7dhMJ4egYz|5I$n~YjH}YFzG``qE~pt#hwl0z5F}vi3(y^4 zQh1GH!T+K7II_4pJ_y|Eo#dNV%1f~J*Nw`U7kU0J4_xoY}!p}PG9i?SouaL>CUr23&^GNs8e>1h|*9$p(|{X3sce1FzYTE6h>r+8K@{WrZK zZfQRMz<=dThsQl8tuGtIrbIj49D-Z=p@tLg*|Ni=V}K!7~6R7 zZyMkZ7bbZVHWpp8b5Kj0Wlqxq*O-umkP=sAIha`w%Yv0e`kxnIc_E`vRa710*DeVi z67a%($k}y74-4AqfynHLnBT-+h zS>JwUZ}gt1pg0bTFRcn}blC$~pWd9B8XJEKG4^@I;Z3C&f@sEO?KLL88*w~Br%?gNhrJ;Fpo6{a__TI5ye3bp91H&y3KA&5jr~x(gYG|T&?3%T3E2kU$f^fjNMAe zPo))P-a?{KfN)z{DW;19NOCs~e@rHWyP5RO4Q&n%#!PViNoGA;`t#TtHs4|C;v>84 z`M7(gJ!uc!!E^-s8<&PU*zNtK-HO+s-t$uL*gMJ4*;Ko^u4L0&Mz?#lP0m%GEraX1 zw;GxHaU+y7Wx=nPcN5mr!b3kre=IfBTW6qk2<9kYZgcRDUu_c3c(E)RC5CHU9TNV% zd*zERS_}fYPyp^18RQ)r+Y?~=YL84Uti>h(jnqVoBGle-z)YKOiEr~*HbGYa(Bp-g z>+G~Nnw)~65boEy&)DsXRX|5hnc^%pHYqLBVG0G)kb(?!_0`nY`m0u{a+h8G>JlqP;!JysP8e zFO~4GdZ{F4nVv!1b(Mt@pd83uUsaf_mV}i`gM8OFGfcp^RxmK~3C0$&Rt za!5<0i2zh-!SQZQ_?Mc)=!QK2mIlFKE=^sde#a<1^=*PxOv8a=*vet`0&5}gD`Aen z;l)f_&{d93X!P7H3DjQoLa2I%Q8K)b**%R_0e5-SsJ9t$wv%TVtYYZ=v{Rbt!n1y; zKh`mEIObf&G|g$+<)F`@Qv;HJVIe;-Up+ntT?P(+@WYq_6`S_!*6{zll1uVXNfWpq z#srKihThX;D*xX9`u8s*&2F?Wc4j^8#@P;)l-EX0Qz_Rcj$ZaYYaNp;h#okL#NU%A zblOz1A{tYU?Uj_-S8T6~^sSf5%0krEyv*4C-Su{Hg?UreRC(FvwQdFer6DdcLN^&U zDtz|jOigmSGUn97`88#EhV~qOBzJ=$zHMZ-Su?Y@rE}9v$Mx{DJzE5>zN^cO>b?hY znfZo{Xa=bM!v1RK+NnBM8f$5AFwbUtu3MBHG-elR7d6hXWAi1Xp#Mq){Je0)v)aRl zo7BRi4yl`Fd$eiZ$neb32xHB;Lv3}Z#;qz|r|fUr7~_+Ume`EJP8;dZoiQ>3(a*X~ zmz7SJ(hSq3{1N#aw4ZUU?pzFqd-%PB!Q14I}ku zUKiia*W0(-^f|8GYxwY|hZXeG9xKTau{ITD2O;TuaphL?F}XvcWRjB_#xgM(0WXrz9w-9O8XF*ccHBCU;G(csPC{`0$#H`BON=Vz%lmRk=Bcv5(m4OSCBQ$CAAy69x)Y!nP zDGIY_+{ja^R)Ub0*&Mdd#xmzRK|177hTi}T`&_K4){sEEqz&At?YL%e==H4OBJl)C zQtXlwFLn8wJs#*~KaEoL6@C-S)<9$7Lzk~ zZe6-%$8EBl`fq*}_NlFpH?Q#*1JVFBwk__HsgeE#I35_GUG*o!MMHuc+u*9P5P7N? zTYL(stuFu>yphGDY=;}RcEI@jY)l=dh5#pEYmjvWxXPD!k$9G%r*DA&5r0wNP>* zH9u3cu~pcAbl2-6aj1V#RVZXCq=lfbp}*?wF+iIkzM3`-db%nK>O1N)7K_0mKAZky zxM*N_pz8y0@n`rq%qOEy_%*3WVWNZvT>+U|TC=J`{ zd!a-n8Uc{wZmmU$$CO4{*IRLGjQgy$WX*^GL*22)GPtc7+V1e^z5LGu5Dvh)@Ew{h zmhT&F^%&HSM4W5@><;&q*tBq)+np#dJI*Cf*utnWl0ny_nS*NPrKilgk3j-h7dlX2r0yjB23e&X4n@ zkq8}ertsy7 zw2~{maay8K(*wQ6Y-P-^_7NK`3&S$p`rH^;n!`#v90*PKH4$Qn%Mv(xQ7{~aiZQqYPH__Y7Fo`?zT3r@E zTKkEUDTG8`%W2q_>DQs2GW%UT=k$W)&cfw*J!KB*qA~G~Dz6+_aUw)9Ia%^VKRa$TvI(mX*tejX? z-IkX0H6q}kfG2Sk3tTv2A;(5)#S`*m0WzsD--=%`-dR>Lv8rlyV#1@R(Hry*2X45t+?a03E#FO~YX<+p3_~h}=`n z=bNORF{`iRa^dM&0!UJ#<5bCPtIvxUKCKA~guJi2ZX79${dmFj*?k*&{ELR>JWI3T z1wH=0&9e)pp&ySF0<%%w+xIIjXtV*rlok4A*S{Gy4e$a| z@`d|@nx(ZjPN>ThB);y}2=n4l?~(c8Ihc7V%^|$9qLMMx~G{N}g4kgM8)XrTe-=pt>`J2@-}{2im6^tI_p<9|Awv(Ea@H5qIyK z|C%H~;B=bclD6t%#@_Cw-8{G6iF+)hf@es^%8jEpYZ7PIVcs;iEM&&?Yd=Z?XHM=75Y&5@MWl7v_QNt>L!Rp*?)46agS1wI5)waLq}8X@(^ka>hzm zioIuv6A1DN2?yVC_9Zz=8?m!(=zPWurQSOwY7#zyY$kmXxJ$Z_Lk2953EY6&bAId8T2 zMsbs}j)My;6J&Nt#>s+*o{@=hjt?E8QzK(`9rtrldq-Lro5bs?xba{u-2xq){7{0} zMgBBm&GaEeBSw+asPdv|!HXqIcaKn|2RB5;^#G_tSp6@h8(r(TR?+KR+gq#mL6q%P z(Gz}wwhfft@bn%g@1%WH{!pVo#h^7H#g9ec%rZF>6%(TdeJu+ zn{3z&vCy0>4m*(T8KOEAsa8iG`T;;l^ACg5PgU-pJA7HzKg6hCTa$W!!-o4Q)tgN= z0QAE`2Yk{^6#B73=v}a`=C<<}o10v;WSm7u3C-6u2@|@gz_|MQBz)i$qNKPl&kF8*dfC|gSjZVda0xt&$m5t< zy1W}5bI|I>fzkh#ow*=D77+pjjUX*IQmP#WaN-!qQC2LzlcmMLvaB4tM@?9k#^;Sq zFo7lO?FTswy>WWPgloagvjtaw>ZQe$@!Cx~8)EQ*bQ})s}Q!FOGMaJDEMo6ipeg-1OO0f!x&S2-^AuD9-)oi3UGM=>Rj{yoEA6 zeqrIWIi3P*bV5!#&C@khPWA3^6Vaf1tDfalSB?-lxf%A_* zP8h`(^j(k0&D_vd&X+pdr{wNOvucmOsm*19U}vC7Bn4&b3P`Xly?m^(*`;Iaxl_l+ zYLG}F&#wKhRReVN(m&?B+5DKk1t@>i_xm5%Y6_`?V85Va=P{*YZP`XJecu%MTBlae z76CIrF-vbXzn-<@Qb<(Ia_En+=4gm)Vzw|hM^_&u zGDz7Z2JusmaiWx+Lz6H}u%+AXw{6?DZQHhO+qP}nwr$(C=bO#U;;!xwsEEp}ii*g} zljqTi;p*EiYj@ICDW#-nn>OL(A#4N`N$c*yt0nTuO^RWTzUS@~`HqWE^QSU?nQojH z29fHPY=HkD6Ja(=(ctJP|~bZXW}usj4A-Z+}_pcSyghq zTyh+#3_enBFAKfVZ8Ck^WXZ+lIS@@h0~fwe-mQ0jzOP;>+`!V&>c#n{Hl1AM@U@{b zj)`e#1oPR9#p={r9AwU<*W_yR{R*nnTes#6`(-oq^nKyN&yXqTzx+rD?<-Y8gYt8) z4jEh}6>Ck{1d|9#PzV}*z2Eo8(18<}Qc|d4asYQKC%rwh~rIa7Dlv zB;C@2Peyaa=$a6ij-3H2-5Vd~y6)g9lX zuwALV6&;Fs#59P(|Dt8b49gcCjr=V97naU0g3g5lIq?&TqCkYug;Vd~%Y=DgIMa{x zAxH~^&0x#UH+H#$I4=k>^B|V_>^ngjrit3Th!GyT%o>tg1qN-EB4_~UroVH3zP!9z zgVrs_dVGe*#VQO-)t4k}H(<6xBqKhe{1xfFWsKyVpGBoEz>^~ZDv_y*{ zn_EXEC31+?)(C?T3M@0zolDttT#qXpYX1~}#hNX5Hzas znkT(wGajtY)~5Puje>kgi~O_spI!UI@d0dR!4lA6CbMwIAzu#!hnTW_;so$zcFUR* zJJzzovwOCi6HFT}(Ngp&Qsd&)Z#C_Qy;&j{3&*DATi?8^Ap+>n4VL&{4=!3LmC~)B zxll3~XNPbm7%9Bpp=CPFvsgLz=n!gxhY=DvY~K(!9S_T_M@+)qKby`vrSP$R>C_t1 z=M`X$3K1>{WE4o_kuj`^mls$X2r1M1Q_u&<#zbAI??j1-J(%>F>js9()xC3W>zN_R zBJf1TBtcJ{+H^Lks?3?X<_WSi(i(Q5(yITosbYbu!BAv=DN_ZgMXgY_?JGRP26;Tk z{o8P?GI;T-ua06T7RU8dn8rai1O{9lcouE?P6Eb;9!kg#r)!C$!DqZCJ>vd@1q1?s zSVt>krWcdXVyS_O+lZ!v~E8UhI z+{50{;4F|Z0b+5t0;2FfQj$M1s^7a2%j_$0|JjJ3^M{KsR=$w%V;Z-8{82U0^H>)= zmxvyyfiFH@2Ea}UOl05)_Uxd#_h&&9`}(-&gx0;2Jp%CjcG8jB=inZjvk@|Iq7ZDT z0jzUFo5~FuDKy|{+d&9R&1vtJTN&a)xX_mmjx9_gD~UF+4zvnOv{k8Z+BQ7&mDj2B z%W`BN);F8v%ly`IS}!3Bc_nv6Es!LJgz;zx%?J9|%N}!ShA158zr=fUjG~vU6{?w| z>~AZ%Q;N2!_%&Jaw_BhN6DLJqC-cXjdV;q2qNh?cM+Q_m@Z{QNG4rf@ zPqFjvu8hoOF09)6I)=amiMuq7tXze!FJD2frPqKzBrB#~kR!C&?C5satZ&TG4aPWg z?@gm%9-5ck+*&%P8yncfjgMUgi!IT|1yBvNHLBnn*JjaZ*5I94k9(xlC!Cnp%n+0% zP!yzMqeWnlls-nAti9m{5qWt!T1KfO$yWacGKWE4nIpA`@Njs2`Z~jTv!$h;Y{GDE zw3-ZKpx-##(N6vM13?mK_u=-n&$scYbPFzt?Q;o?+aE-Lb?WscWX2WauWLJu+nMc8JRu7W>ugZ%{*0ST%N+n+)78 z07r^|q7gOw*Wvhg1cjPN~msPeXL$*B$aI4>|H{0Vm1krg9j=@ZbR4$WJfH}b=D zpPqxnow2=!a)OqEe8$%xR0DGl5jujQ-wchypxtU2r>_%|l=c;~KULCBvj)gB83mC| zqdQ6fK`%iT4wnv>4mXJehuc4Ui`0W&165_{#+GfV(LtY7mRu;a8A1(>U7}ZrftPiz z+t<|I-Q|VF12qu2aX@{dp|{AlfA#fS1mKlOkeEN`oAcrx#QK*)M8*hdj^lhgxA?fB zFr2R)uN}is*Lhu$LV^IsGENl9HW`;tUO)p?oh@xPP%DRMmFPbp5U zI8m$`dmSq8Ht&dIhF2haYZ6)K6cf@>;BLQ;udv^?Ys%eZza3jB-j(Mv#V*z*luJjN z#h`CGn*qi=JgosxC%=jG7alKR3L3&xk=KK5B`8ZiNgv@Zy;u!M!KwZN{mlM#aG_tc zr3F8U?&1H99wKZUxMDrvyW?;BMdXtq01fx`JXo~gwm1_eo`;Vy&}`FSZBL~O7nAsN zz9La~#j71D2oVi(=FkzD*{H z;FB(R2TH{D=BhuVc^~}(_g7JxRbp)H4#U`(4mt^^YT-411WyxV6hiilI3!79CS3>R zb_gy_pm2G`>Cblq-az3npvFut=r9XS;!h5PoQcJ)Tpx5#u z-b8T(vXHN(qMI65o4te;2DU_DuXj(EA`nh31r3b$@{z>U-sZAI|1=)U%V{qVjrs_U zdlBH{8QV?1l?m9Z#}hzef?1?pLC~L914ZZW0YUrV8W41XkX0dJXMz^<(2yxh73?o_HLC?MQKg3+&Mutx@DeLpLoeL z8UD7a%+-qcsl4!do`y~3l-^kxgB(8rugk8WtOv;FEC{FQe!r)3W)Rk`y;oS^F+y1N z&sdpPXhDrL0-By(hcUg6oV@adR^oSV_pA~gb8a4r~QStoKQ7*~0 zjOsd$qd~Z>QF~Doq322LJzSw)%In}D@R_>a0M62c&8xGLJ3pqFb}jT&SSk1X*Fc(O zcd{vynImp*u;^21n60Rottt3mv-W7|x>GygDHHTi8DV|VCvjs3;#L*GCf%3(f{td;%)hn8gEsiVcmDBRcbp0 zLYhnoGvhiv;;%T*9Rq)bVwL25xZtY$)u$$y_*&ao6^I8Rsj9_c>*q{}QG>_Km6*|z z3qunW{`82eL!fpXDGI-ryNmdf(D3|E9GaB67+OHT=wopom7kAr-7~wM@9Ok0k-6F_ z&LbbvWjKs0m^=X>YF-&gRO_r9rk{22SuoQ1&scplWlWp1bVa zf84omeV=p-eebpB^>DsBI2co{!qLy+mEh$0u}mhceDgOh(5CU>>`Y*a-TM7ahDM*9 z?{_SqL5ku7@+#YD@JNLqqu|E&gdnIWa%v~hv1Fa+q-mHoH-4W226mF^@N+*BZW@`W z@W3J1kN>}`KhKN-EM}lV$VZDrT;tdBXI6^U(}*TZHkd;%8-T7JY(z=twHR!4OJ_@t zcD0p7nGBgxMZ30nO;`w1vQ3ZTrsHrQF2!2L8Cv(6VuD9C!3Q`OOaP@6cSEP+!|CF3 zK3h-Nw$A9QIP(5m`JIvDQGx=hyOMJJOf2bWkKe_ac&^L7oAgyFIw)RMGG`DSxDB}e zk;`6J!dWqv4whd-GS}{6F*cF}r7i90j=bNc(jdN=Z-?ycem{pMN#L~N^e5;V=n7S) z>0qyaRkqaL-cmC3dYKZv+Kv4kuI@d6F4otL^H9omg9bgOGL@0JE7(nXeK+X3Cd-e~ z6o&;^kvw&oC(aeH_x-ecOlWE35h-=$4P2*-Ib-d+`O2mA+Wc``l z>KFE@MT&`iyW?h_{@yl6fAK1S&CDsbG&$kN4E{R}Iw-1&{ElYShK&N2 z)rAGwHC})k5WHhG&2W8MT;M@RQ$5CPGMHv5cF@(AL*JTZCY>#@q^d6 zdSjHhN;abs86_aX#G91Pcq)O`jGq^`jocm$# zZdg_is%buX1hftFQit5Be~9A{0PW-069Y$|Ief)-o&@PJ0NfartgxSirJFL<9NYX- zN8v!kwzHg2h*}ELf}0TW=+MTB#tB46_vKCf*Yvk>xc|CfB#Pj`w4ok-H&cCl`Fk!q zqMN&lw~b3a-ZZouWUJY#)?jIHYDo-julhP`{U1&*s^ptVmseUE`}r3Vr~&E&+a}#0 z>kYB{XklDhol=Y-v{>5yHBXwfT#j1LUW}qU8CtLxG*>~T({Yj-ZQK!eUE>VoUQ1x0 zgyLf`OTE9>F_QdnhZQogI1hZl`DY93+@)NJ($EJoF@R&tfcCBT=JIp1Z2W)nfhnsF zn7?9TEPW!DGp9%X$E^p)LFNN$1HJ-z|1ILBI=?@N{Rj4$!VL|DAj&u3IH!>#J^0cH zhtys)_iSk5YcgU^K#CBzkqD_(hj;GS-0`}h7~uAfHQum{pNftB`1!@eer2HTpV-W| z^dYY&od&}F;(I^{OUF5MEy^7p6{t&SbNQYT_%Clp5xlO{9%7djra**hJ~x7FgenAL zDPn=RD%gj+;Y%%Dxl)JAcAV=ZN_3Fn=B{jvLa~0#gnFvJ4)3esql(3YU2zp(!hXkB zNQ@lao@-N)Lrdya=g1bZbV%Vn052ujv#EqHIng{`$IGW-!KDEu)iMY_o9aFrAr7YC zad;)|PdOpA%dy48Jo)}+b&cbH>5>)`Dk=?tQ{|ZiU`b#$+qFK7OnpwQu=sMfqHqFKPFcdn{qATYd2?KDM;U~AIoLi`2Ce187n;f3=dGP~W#%2M?-ga% zf!hT?&;9KZb+j{XuC=E`MWQlz+_vC?PfV!2p@pX|X1jGR>I>beygOZv$IXs}hi^B<7Uca@Yf+Uixy{jPrcnY~b_?}<^GPfs`Z=Y8 zp>LX+&NOfr`4Y{B??g^VruXb;^l;&odC~RxMXw!!$9c9@p9*3V*Jt1ApjH7hq|MFJ zMoF|K9r<<*QX3m)h)8Ga4_Y$pn<1`*g=M0gFi!Tf@5hBS5KI^5#}}4I>-M?z8gN_K z`3!vr&Sj}FEujT#b}`z=enjxZ!%?@nJBmU^8Kz-XA^{;2A81P2KLcz-j|(Nb4eeC@ zFp_iZ!9lh6HrK+y(%5CY+GxLO;O5rgZl>$eJ3EzX+5))5%z$qR!s>rbh(hmLJdK$? zPn8SbaYOSf%E(q^CQyxevF>(o7pq?>BIwAM+Dck2yJa?>1E$rxh@Gw3b~m$UJ5rI) zD!pIT18ReiVaq6B7_YFoNSlwtsg71@3iV}TNk7bb}HEsC!ipebXz8sK?K}bpq8iqC0AHLYf_Hq(e=Ng1vlmQPj7n!HU>aAEI z8gT!xe6h>Q(%F4+-dGCJN<0WvJn=gEk@WNc;1Je>LWM$Ju_qag8a4=1{*xphNe1!g z=CBN#-#{MZnH`tOu;JX#dK*3o(ug*a2RBJFyPXzz9#Pb1mGH++i3fnd%JiMVh!V(h zock!DiD2+;C<)5Y?8Pkj>rL3P=|wZs>^6HNIjh*Hs(#Jaj<5Tac9pCUf6|k#9v&`!oBR)3vE;NYvHF0W|>< zQ(7-@r`0qRJ_;A-cKV79Ki|ITnWXWG_6{bqpZ&ANc96o>ln2#g$&CNtf@1Pk%gMI4T(MRP2MK-i-+=x6AvWx@JLG#G zKuacE#AtSf@Vvp#E9(z8UPq;PK8B*KI%;tuF>EF~b%#~+aUYP|cYB=kAGJhFxqge` z6D}MPcvx%;jgej8qkmXz=d)CFv={Y}kJV*7ef+tmG?J6&+so|1?FaArDc-*u?mb{{ zE?#{X20Oa@07ms|GdySuYYkqLIHcC~NT9o}3T?=M5$&Kuk=gqbHgu|_Zrjr+X8G@S zERE1gI7d7>=)^)ks)+1WZq?oC+oIjnytA|(KO&`K-oq6)u>}ZYHFg=ryv8{-!aLGf zo0wn9eVh43UuS1TIO&wnM81cvyI{tCP4WdopA10*j!QExyTrs!qL6OAa?_QLz^=W| z`)8;ZcZ!oDN7ekF21{XgT|sm()h1||Ph zd}yol_eH@z^6!V0V((X7NUqr&>^J|!4{4iMPHYQMR4ASi{ja1@H+t$|!}*81^LvT( z`nDDpL@j;hB{8qnDIhueRwam+mfZj2z54zrY6%G_=ZUm6;+U=QgxChs!L{ugJ zoeY53dbOc=LhUlQe|Pt6=;tswHp7b9YpB$h%({T-sKo$zRgQ`^4Qx zBtK~z;q;*Vvs7eY-tqm~DbXo|Jt*UbY?QkBByCM_zel=*&u}57<*IUZU{4@b0aORh zTkgQTB-DFcP@i9EVKgN66# zy3{4P%NF;20spTx`4-UGX=Sn{sOy7jrx-Njn0;?zHk*u)4FgksylJG=Kr}<+qtR7Y zqr(W87cC&YEkXXH0^K#nqHut!rZ&QRPY&(!27n$<2bNuzdD(5l3%OH9T)vLSAc@Y& z*YLCa5QT1MLNLl6>|Xnj4OpKBTuQo z*HLuFZq`jzR!m$qCy9eY6@{Oa$-ci+Bu5%I7oc9<8%2ynoSeD;0cvsCR#W{x>4JY_ zmvBCruZ90yYC#%Z7IONzTVj0azD>RT0BQOI2xt7DqDhrH9r6u!tiB)K+n8bVem7kG zd{V*XC)NJ8w>MD%6joOiVAI;|NGvO^6NEKM2QVa>`@+6WZt1ry+h4Ag>f1vGAjCDd zyK5)3_uiM*OTlfooXAYF@Hv5VyFAGmlbRj8^p^F&M1t!$uG=nl<@1jq<4MDJ21T%) z0JzBvWjcYkrNrGzvyqf%-$G7@y_W@`hUUmlA~o#6-s9l322ek{IW%lyN7*a|{=ge_ z`fbBj&PDJ{K2^ViQF1;Y6RQzwTb$?ph;Gz;+S1eYLrQqX0zz`7=D91Vll zK{oO(=qgLu42pMc$;HWetLL1KFB3NG2#^{5DH$SNTyA+-8*CmhM751ne;Nb>2~)9- zCd#EW4Lr&siuQT05dpC$I(O2>wq|1D;F2JR`Z1cPFIM#+e#d%$RA1a6nStNijXQX0 zxDgc8$9g_G2fCGyA5thFZ=mRRwsL@P)Q72)0j-!ghD|*=Z7y~suR)^TA+;2Z({5f# z<;Z7|O;?I`W(^SlmsU+XMAM~Sq+9<1 z7ziB;zgF;U43v#SJ)cC0t}Xc7Y#|=UqGa%BB*zWa2>{;<*udZoU`VZO0$3+rDs%kg zR;101XL7Pu9t$9nN6|?M_pxC;v0!_E=oq#^y!9J?vSJ0|Cj|CPaP19t?yNbV2JbGK z>}+@b?rs#-ZfHIC-*UosbLkIiOtbODayJoHNddD5#fLdU4Vr!u|DftN)k*d~)an*<3RFRyDEx&gH!uP$<`i`2MoFT;J~-atC|^4F%$wCHOhl7>l0;23NWsh75+z7`W_rRc)JyA~PtG*6 zg@{0}3peK%(`A)r{P)EaHA4MTbqjoRE}8w~Coz^6{~Q^@{;?Fqc2yekAg4e+birYQhk&X6JYWA4wv|`(H^|itsswFPHL*lN2ztwOLa5hXDdGez50Uz9eHe zGQhidz@M&BeNme9_M!qJTzr4(^F|`2 z1d#t6ue8(tW>i<50B=qF=@_4;g(RO$>b<+da5nyI_PRYsaVf*Uw-A0aTnFb1bk$m??qAIH1ZC3OB)EVPR++X0oIz>@c zM?bm6ARkv7zrL7Y3Y9rvD$l-H|&1bC4Y_^I8SG4Pf+)e(+k!VH6CeAH5l24 zG2mvG9D)1WEMaFxoGXFl=YlCa>I9dY<$Fw-hOkc17!D@3wVp5KH>Siygzz|aGt-9D zzb<<2sva!yhr#Lwp%Z2>M~9a%I?t!#XwIqM{{FZDy)+^1N;14K!!Jc%{Z@t6Lxw4F zXDpmgbql`LX!K6C54$I4)wlu1qozw7y@J?tvn5*Ru5O%Pi9MKxmN9nhN-dN0?c&F> z_wPjE<+Z@w{{bCT1$pDl4OO!0O?bI;EHcm^ZkPWtVRKOX-x}2NwGjtFOnj)o*gOD>-Oz#`z+VQ=icj~FIb8ut*PIvTmFm$ADQ_fxk}N>(hKT2W_139Wy%Oo_381WzN8ax2rDd)4*VGBF~9OBpaFXf>=$U>ire9&A({y(PdL5RS0a;A$1wh`L;^CjJV4vX1 zo!oNBs5p?ei^MBzNNTOBw1=%zF2I?;%{6CoCffu&x&WK8MF9(I5KSsTAv(?>BIQXs z|A$oFpmv<0bAsCPp4!2ayD+MrB>Qa42KMndK8Ia5(#E}tr+4=lw1u>T>dl7<%?Qqf zWM<$1yQ-z(UGNw5lv46z`2^{G(NPF{u@R!oE!z`y>YJToDI{yT9pBFY={q*E)ciOY zBB>+?AeOEw*ul%aiTx^*#_7t)_O^;DCsFy4W+VH1*Yl72G()U{v8V_cgU~E?rfttF zwU2qeaIVjOIR{02x<_=@3OsZ+hozwi<6GK1xDK)t58p|8pp3D5e}jpoF2{2< zhYJOY_iqExyoI={qQa#8XvMPL9VUnX9uX0BwwDn^wU(5(SHkCk@MXIoN{?Y7jV-|S z_KWrL4PM7dyMA$n1RsCE$dUA5gW&-9qM^iONk&6L6kgvTQ3_iNENaNKB}J=E73Oa` zE2GAaRe(RRVRkaI#;7DxlJZu72CQk`y{y3CLl2;As~z5R`CY4lO{jg3LuIXybX8P` zszP4(7ONee>bDOPc8oZE6ChTZ?MP)SzR7eiw578%2rEk4J!P*~ z*UethZRjGK1y;9(iNj~&>M4)9?F8_bFM0X$>W+_TzWS?Qd$cnI?VSmBA0;-zL?ru# zTeVh(4vswp_MVO29sTdQ-|IvS@N1a@_~;F~Zch$O^!L}S0Tl2;>g0@P?$z_>*LwW* zaOo$)gZ=HCq0ArRXKrsWAb#(+xnxw@Y)GPy&3vi~P$fk~2-3*;c?ETCH(e5t%7v(; zMuhA2Eo*Y~`N^L2=}CIEvn^#OSw)Ryy4bk%*P85T zKi54H&Z0d<<0ps;UGoC?6gvv$fM2Em`z zKm!V~W(1-8Tg=qaBV-#XgmGU<#V{+r?kf8B*vr({y`6XBt!cA!LrqkQ+iGUP7_S1fBQ~VfZf_d;R~v?8RPeicFye&-~|)JbUO&*j;KeI zFoHk5IVHT2G;(WDOMV310<)~CvAn0CjDu%`BPBssu^HcZGW!Mu3^ z)nFnihUT@DS_p;`!(j5%NI327WPq|qI`CQ1X+}~c8Q{h4L_btoev5z=Y{qPld^1c0 zN4QYtS#xl(P%>Ahb<s?-sUh z;^h{0jWidKpa`tvx447;R#xE6f3AKD#cs=rx7Rg;k$zVIhk37Jx7!oXL!En6&x(P& z#qf_wTlpt#mB zi2Mven7o=ow(aEMzoHB#UbWY9>k^MO9nO?3LJ{dt;JJehpG>j__h|r@PkYbMhM>i? z?Pl@cPyIm}-quFgF6VhOXY4wpch!IR^PA1~+0pIr%Uj9~{JRizx?)u~4n2a%v{&AY0kY(q=2)BlXcOf0=e(wk%b zzAMzaEFb6&fQ|otK3ss`P6aCXKbO6GHm&{Nn@a_$FiprjKvObP+UE0Uf^IUSv_<8$ zDJxL~(YBm$)Xbf$V8oEq zl2e1>I#1B2h61&T0D;nshaRlPXH_ef0c!++uQmgh10+klA5RQWZ_RrMgWTK#1xHEy{Pgsq)5BmoN+6`B#c5uwbJVp}J2iaf?Q?%?a}-?*pZ_Q5S5xofaFHv@ zJ@7fv)_H35o^WiFl2M`Bf)GKZ`6_5qV7E0O@zH(tUK6wqqz6s`YO{lQ!V_=^xgQjU zZK{7*q6jMqClEM*{K1R*RvC@ux`C82T`Z=i$6Xa2>*&1g#MZ&tyX1mXIYOp}*~>~o zTh2z{5|bagXq9B(uf$~Z0O>hx)JzXKkRkq7E=g&fJpFlUZ1bQ5m9Jcd{+LXedo}Y6 zuRdOFts)oLW;?+`_ZYeupg0SU9+>74Ct2ps+pgyS3F6MAo3CU61v6O!7(l=CdjyOY z=*1VcJpmh?rtRotmQA@RTxoKP$26t{VfgQ{KgK^naPUMt^V|+IzO_w{qg$*I#MfQq zUg|eeB_~yPUB3g)hJx)oOmd!98V(58@aOsT>1>;RSV(S`)#cXnJD!3%6xsWHtxmSH zFO_{`jV*12bd5u8H}V*QKcmPYdsmKHO2~W$&?%a6ZOtr>IkeqX=@w7SoPTv61*E0c zSLGJZcNd|(W8o3?H*TT&FX`b^4}t&B;%|Qs9of(nIC0nJxd=EJwd(KMj#5%WdoUt_uow@XV-f626w}mnirdcP6tmBOmD6!Qb) zf4ZwAZ0`kd04Pzf@x%sUW4CF%4b{y1;+;JVwC{t9wfG$t0#>D2OEqi`@!o3PPTVL{ z_(n)BEZ$tZDY(OCpF`MNSkP8Lh|Gr7x-{NBto(F_5*$EDkM!_9H>03UooSq~@D&X& z0X3)-x|87`fWzu?a6;k&>1`f9Zp+o{~*?K)w3xu|;( zxsOFg3?hZxz^GrMo~@VFo<`LDuu|J3HEI-9s8V(l`Cn*KcXt|KBkKzdM~n*F6hoHF z&FKcXVq&dXb~;y`D{a;dhwp8aO0CMswc2VOqF18K@pan&DvwmutJAEcK=-`?8EYW@ z7F=HS@$%PS8P8mAMP4rYpk4SI{FZ{RDNjfrn)&yY5pDwiMT6GBu*2WW0CIu-Ju+Uq z9{L%;hOblVFqDi|O`JJQgbTJScM4wprANJ3tpO;TpaEpBm0pVTJK@BP)@dAFS!QUk zTB(2Nf+wdD1<9T@a@^K*MdSz|#`S-nF+t3G{|8Qd+H3t*@kCR4yZ1cR{IKD9@jiQw zlL*Q-QHt>kJ2;&I&i_@2$MLW15#T8VE1E5ovf}e2_d4()w{vE`i+@Xk0|J74fqfpv z5}({JT@|ZS2$@@aLlpt_^@xhNi-;Nw7G6^fc2;Qw&yV%uLLx4C@0x#ATY4jx0Sp0Qi>^nEIi3P6^Nc=&U;|IE$@9CTVd*aZpF3bDgkw!u>&-#FUXgEIE zdk;Qeksy`#dfQny!i{c|*3bvVCMZ4{+-xLlWIqoN*5t^s4@RkvH;iC|+jTP1qhq0B z+B(EB9OY8#;?*eclf&W_^nIIziC)a_`vv%(>v<9)w(T?63l#9wd?LeivpT&!vbhkC z>sjL>8SlXE#N5t zHYdpVM;h;lnEYrGEHJ#^s$W6YQ$Ch6*Tb1Y#e^B(!e)ta_-+fm^Eh&BPItW*69z4>ga?fd>RghET zFF3D=YkYcDxJ2q}8rsujh-nC5p#X~g9`_b@c6xh~071{|N@=tlkMtuGdwpf4pZC}x ztk*H!HN3VRWo4DA*uS9gh?dgL{%!cP zCb2WAEE3f{cY5CuO*l~gW2)8shy_sUYv9jyGWTYdC6X+ulQn>x%Ge*sExLrv$6tTG z)n#2mBc=ms?Fd)`mF(?MH z{#;q>!wryHQ$fC=18QG(1)!N&0NV=a+-wTp+5vfdX?h!Bn_n$ zcH=oH3=C5HaK+=!@eW5*DIfERc`eGk%jSs%aOL$oh8L09X+eesutXUp;^MGT9`6?Mo1+?|pYp0w{c0O(dGWnDuTi zZI4~V56#5Chn;Xkaj~$F#Yv+(DUNw2?~`7jZkA^@%b1Vx#8;%9JE?j~;-p~3gTzQ{ zWmNS_;(ZH^3_qp7a6xv>`^tLze;TF!#tnh)(d~*^?>*!?75uLS^4sNq|JK#mBZ^bu zd`kysT@xPWkaPf^RDCdj&>Z|TRSf`<_JV$uuyfeK0XmU~vs9P9J9V4mfI3T=SEb@1 z2m*2RSCNe7kR;U#R4s~I0%L?{X_;0d0Ni(_Wr{*PbXx<6CgpXRS#$F)3#Kb75o8~l zNvi-4+%<#FZMnaQN>GXF1@g;kG9p!v_Rmy0unXi9&$qh4^niw+m{f?tA_zTI{hIlG zx{Ead80$>nFiX;o2$_cq)NL&rW%IIio|WN#m{B*FBrbC-p;Yg#Em;?*9pi^-CJC{T)gDLTXx@Wz>*&R-o$@duPe)W48T0L0!khNnL z#8Z)d3UFngqKTELpRRx`sIIaNqx< zV`|2xokqJ;#=~kC!m2YtfwCdqw3@Wj9|$DQ=n(C=FiPo8Hq$62H!=b$V?Dtv4kFH>fu zR){$SIjM~TmuDBKEB+a@^e6ouK8mBXSMVQAChfVqbqq*d3r=a1UzcXlwJO_!|F0&? zZNOkcAm055AtO(+%Lx0~$a9{3Ve%wC>zruRn@dG>L_lUHf0*;bRclm-NALX9Jyfl3 z3qL}#sg?gXPm5Hkrx$a?NPSLgW7f`^wv^h6%DtL6>~+~xG)N9dX4uBJ<*#F{1*k^u zg$`EU(0kbq`|rq!UvIw!c7~6vJ~?CBfs=-Nj7f?;)hqe*o60_}V%*#!H=(G)LoXm{ zW^Pj3lIc#+$t&hy6K;<~b1Oz$1{hFvQJClHVF@Ty2xY3=tCn$+ zj*bhfhSqs$!Bd5sYj7dCH-#<&r?4O9I)BIP@qH?M@c zFp~7(tvF*MzIM-2X5JPCF>+^?tI`BjSGfEgmo@vV)<_{jW>%NG| zGxT|fr5U0z8}GMNWeQVU{=3z9h)|e4nA@iu|m35zH%9}M%Heh`-fB;>9Ase3}(||)4oNGmnMUmbSdUpWj#iKOkRw ze0Yh4a~RU7oFFVRe+Z<>_IOFGtB(Na|MJDu{y!4n3xE#+6EL_BK@1f$aCi?w7$IG- z_SxZ)>8^FR6oCT;sn}wATx98n^1oq zyIsAIq`Usr>eN2|^^U5rH0o|4-~whb?~(~~Ot(OLg?tJ9CoVG?G73A$eLdqWP$vAR z-{$hlqrPGFDJ^zz<&7+tuH!B`KWl+REfxnBag)0IZJ};}MhyIMd6SuK}V9QxY=4C9BfvWvoIn{ZqMuXW_M=^FR;mW^Co+uiaVhe+7b z1tz_NP^VJQGt9f#j^E{-DzAy&@M5f}4jWU>N(!Nwt$0n|h9w`{{ zJ17%UX9l+%NXmE;E3-X(t>%j#A>MCu0oOCDVXT`dnWN4e*lWhF8D)iRbcEPjp#)5b zRo3)%t*aX%VuTz_3bvu8sYfdh-+?WW1~~%3dVTJ4w;o_-VlQ#WU5_leT2479L2?W%R3_K_GWrIKQy^t|`tbQ2o|@yT1y!vHc#$i({7@D~x!4=P2Fa-4I@nF3Hl>o5(%Ue6r9I?UnZxlo1XsiW z|1Ekxt~FunIXUjmS>o_A5;&PbAG1?s##rjo&~leKWw_>KQH+7NghC=j=J`ZsQl)$M9H`r zlBz(bUd(Q(iZ6_)nq2+al|;oiZY-`OXFj3N?{j5=*62GHB2ZJZrLV-QH3?N35b(;` zT$zrRRNA?I9B)BK%rZ9w^MIT&mq%QQi@2&87#4W4fi#|;#RR5!#!c6>&7w2Gl^_!B zxObIO9ORW>0UIUYs-tCbbLj|fAIEMb%YINQ2ah7vwx^2UK`ot7Ax_zQa$QWsM@#OS z%fK{8tJy|~*_wh{F!3Hym~V}0QF-qxUNyFJ)xZS%-*tly@@zR$Q4?$ASBNENL35I* z%Tb-3r>~|CB+k7rar>HeQT~5?KaaS6HqjTk0z@DEy>q%|EM-}l4wZ4TMR9FTI;|p6 z2!;Qq>i0K)A506x+t~^mJ%AJELi*6Fjr|I20~74fZ0pK^IW51qBw!B~mfQ|DOON1Ks>V3pgNi z&;ik%)k)MRqvkmUAzhC_PkHcPa$Ay<(tPyDr)fVmw?gHHQ&dJNUSifEYQ2J=Ei~_P z{r*kpazu~glGv~ceYcx%QrBTKB83~5p*h*|^IHTRel+r4V>wV-H-946`MHk|{7e*y zW&R&Fi8?iH5H#%xXgl+w|IU1re=lH_Nis52sR934i3)!4&o8BzODxL5gOUj{GD&(wKliEo1WgZ)#N~~;=zLW+9|&VNFLE#=!UWlf8_uT`yUA*6@H%_F=IkKCbnV@2LiH$3Gv zeU?b@C*`sR+3;=b0$0l#{V5F$HvC=wu!^p=+ND=8sjih|I+4wVcQxJxlz)LwtJwo_ z%Krdlo9jNpVY-zLc90Z@_z-vHXVr)9=d?gSjfGrM65&^0Ns1l$`g2E7a z0v!3YHhJ_zOFhmQV|H~fvLxi8p+2^Ex3S@UI15NZD&5VN#sQCmd9g*y{W@d+P8&)o zbzfpdOU!mqTZ1IlT5GLK2cr^bV~i>D!EnQt%ppj&n>B0=Tf^3{B`kob51fD^zT;PT(K1W*Aq|I5q)7XL+(0N4NE_}^CyfCj)CU<>g6-A-tb*cvzGMyncn&&qf^!jK%~9q%y}@ z49xg-*hq(nf=>8KGDLjZ2^6qS*PG`N;>BXx#U#ODx)rRt?VLT5&suki%C|dv7Mc6< z&dlc`N4{m(j@54VZNj9{I5$&l@hVwnP6H3G5mW_Q+6nYwpV{zu#n^(B;Um(cQ~cff zr|1P#t8B5EFEWmjw?cmdQyV^NZICLGuP36xjLuBqYbQW2l+YY)j}!YdVpU`-Sdd{7 zC+i>2)e;P4@_v+e_5I<)?y45anU6hsY`bHwL*`tZAq8c%-o|a3e_EtLix3Fjy zlO7y6p)4;OULRM*ssb1mk|aF2K$=4vV6Og}8bTM?0T}K_V*nHNgA6oEpggqhKrK-m z_8St72^1z@Or)YQ`nlxgB?_2_gDxst%+gPIiq;*<{U+AwPR${~({n&`hVJ##r*Vl&dqlY!{YoI%Ro)8grWD`UgI}F>Ahy zoTj?TeZ0zW7y((I9I=|>BLkn7xGbX=gQrxOQI~;WGq^7?z7hsS4mwFI1v8JvFr(g9 z=~SP`8&)8d6H4MrDDV~gy9HLvVGSMweolPS=XjaEr8m-7EGt=-%^en?imSR@?(5;- zUv})da5A(g*8koE&enlajo*51ms$ciM{kJ=w@34H>k;ZjXi8odSe{)*N9zGs(>Uaj zvoLfH=Vg+4ZzE!03geHm*#JCrG*w-b?GQQ5m*pkFWA~*bL7=^XmOH*QBUvj$-dLU^ zc_@ALklzp$-fKDMcEw*Ipp4&KxSTfQuTjEm>y2`bj8D-Dg(w6p3{#V9Uh4X0Z>e-a zQ3{fnFT}$rU+%n%`q*tpxpsH3`k-hxDjkfu z^j?u(hSc|QJU1$nxeDMaR=~Ym20HzV5``E2Kuin65x68|^$`=E@Lcpf(_DteY;37g zI*VX>fuv`elyljvWX^mx78%q)98`~ug*W#+?DIpM``7K+HG7S>J{Jg zDIYxa9JpGze3ZE1TSn_R#yhtfafoS&lQDG{?3rMwlEBHr5ra z@l5~Dc6z9key0WB{36HqbynU#Pv!t)rwE`6;zsQZ=~zzy)|I{jMLyle2IOO(zzQ&? zxqX<%&_#r!9q|f%=9G3u9%H9+<0kw2T1zzZYxw7B{E7A~6=PvIXb(l#-}qE8R#k%= zrd7s9-s4tAvI)aoo9826Nf$~w|DODa`tgK~)&G?a=M(gw<7j!E!xD{f-75byw&345 zR;z>;-%R@Ev3|+vHqO~Gih3S1LRlONA=`3lUhZzDEY}8(c8ao+Sif{eI9pVv54POp zUMQjgEN3UN@vPW93pzMqqxGz=^Dw{5o5!w5{n44j#?efGjf0wmVjMTQF`OeA6_Cu4 zdtSh@+=)Suq)?3@iYF*UQYeO?XX(QX;CvdB&sO2rYq3!_%z|ko*m%;c!ekU6g$9jp ztzhv4S!0AoQK>n@StAAndca2fU>{JMU`DtpGp|o;Jr{;=x>q-sslpTt6QrS9IW;E->MfvJ@`N`3hM3ODf z5gw&g-)u+OI~;EJ`RQq;^05HZX+-d5jde2aHF}Av3J6p#w`G;;iQwc4Mii)xTa?m2 z*|X<2!YMDvh#+FV7KDhb(3`|^A*juL%EaX~!_b-rdaeR6^hOmp)3f9?4ht{|LSi^n z1r&Pq_Fh$FAiWZ0bW0VjIRKQpj4_1{KsNIVWd}`aG#9rHoEjGP;tHIBigo1iSV1id z9sJbHI5GS!JXmP_JJL7p9-~Ivgq(Mt_m+BQGB)Z*eqz|X_EQDt!fZ^rJeGYljU06k zG2e9DJKKCD;BQQ3)EcmtJaXJj$zmx4( z7*NR^yc^IMl#@&YjflckL}9yQ#|)bYnFwr~8SHX5hfiUo*cosFT26dOQPa=OIkbi` z>K%md3@;8$XV63W&+jfO47P+Vt=a&|WAY^-!&%qE3Bzc)? zbiAC}01xFoO3$nHEOXd4mv{;MT=dewEj;7FXP&dh@TfW;ot{IBib7=wq(-yPn-ZKb zRkkv&pE_tR*S!=kg$l>!woChih7N@T+bItWjqc(pNsS+hIF z8WQ}cgyaRpo9v{xIpR+LIOBd7(!9u`IR-1vJs$a)?dx=!-jbTdjD{bVHgY%wksH7Y zpj{BWMt8W~+ZOZ+=?%9BKFDx+w&suIicBQ5tc9x-DBw1anwXhy&5$C2!H=60jZRSQIfknqle!h^QB%XIM3Hy&tTk))VK*7^KXX{i167g5~e`GGBK6 zE&r>Hk<`)r{-!R+BWv0Hojf`O#|H@NkQs8P7s0&9*kq6#Y1cdh0XI}H><~R_Usp?T zR}zOIVJbQyggmvEXC@0S6CX*M2z{CC<&Vw_&qwz13CrDQtpDsfH5Cdid6i30Jn2Ms2bs4LCBx(7~%1 zBamaOd{46#9UND`yMG5S8*CB(zRve7k$=L5OI?F(@c9nr1Vt4#wVtb62&G`=fybq= z;2py2I*fHbAsy&e$aDqiO~e`R&o&pxG8`ixYROf0_E+>}Hh*#G#g=tAGch7S1*7^df$% z1u+sy>RrkjcHop^w&IKwP3%$%Cx?%XPNjYOS_JQzt;e!FZ6EI-?J{M%JV$MeEM1bW zz`FDk-{?sgl8i9np*_{nS6b(`u!?T)wo0E+4BC7EKEODR?Jv0qq|SWr#I}@+EE7?T z5u&h(JM9^F%4PS^h(4lr_XUs#sIPeuuyC{cI=YzYcJ}2BOZfslo8!LU9 zPCj+i1$|yo8&U=<76!grVO7J+Md8=w1A{+0F1H|6Y9R87d&snUZsJ^6l2>CvT&<|!H{3zF)iv%05{?`uoYLe=M?EbB}8Mb!-Sd28Dy(C1ZOl3D0aMdYp z<^(>F^ul>im&{*I!Fq`-7iwjz^yVZdWdL1X{1)T7jRM?>2}oN%8O@lZZcH3?!OMzN zU^~PJ842MFt9x45QABf3nIP^mfQlzh_4J#HlGjO8)3ZLqK1tDW%iNH9Od%N?#E$v3 zL)6BiWeqGD!>{qlWDek~{(*8DfZ1N?i8JOT47)w;s?=m~rSdkZr=%_58Xc5%>V-VJ zKgGfxKMaiv&i&K>`pPr749)&@FjYrrbcT%_;IJ_pvu_>ySA&FDUdg7`GP-~6>092e zX5%AAM|Bk~&;w*^3%g%)8}8D{HUi92Ke9=FkK!L*?lgfwqEd1;agxF?zK#>Lgl&tSS!Uei zYHT=SOJ*vSm}eN_D*bHkiQ)I-u)*B#kUmR0ISA3OmdZ%|LX$Nt7vsjJE`S)|QEtZX z8s(QLZ1?&BcoFONkN|2H!T(nJ7U{mX9@iN1P8ek#zNIHS3~G*ohQ*LMVg#VY3vuBX z+Fs;w;@!|v(ULq^4%vJvN@7#tNmUr>Uk|{XsKZuCpB!AFopTc`y@2ekvPo|2`KR8) z1H=-U$wbd?U+t#QJd(0q}mn^XM2LeLe5;U62 z$PlmVCB_fBHgkTK9m8Hk-6M|Lkq!BVls{{xDHj2uMywl$yVz@tUP?|oa6&=#jnkoj0i2ZAUGY$KQvy=N~8got9z zHe$qkQo6t;RnfFAj>db^8htwildabPx>y2nOm6D(#0I{f<4r-lFPESn zRB87dQ!<7T<4e&z(1eg|t;h2c22X)2_rxEDH+<+=T4YY#CXM6wg1K*k3`WRus;@e) zJEmG5QQ_VYf9vn#BZ61C9nvD!+wEt+QYti<5JthWpOYB$O+h^U)Kar!5nAz~T}Ma@ zYoL0)6;}AwP%+6x8jtWf7!x`xSk};yuFD#WY&!`oVq|hRIDEY#*-J{sZLmn(U+JRd z=I*8#gs?Ady!15Oag}U&$t6KS@ z{D?h!_;%SP2K)_HAh>Dvr-ECa^o4;#4kYJ$u9 zEOF5|uOgv1CAuI3uhIQcp>7zC%9uHg4t0#k);a#s34g}NI3eUjsr9i1FG}i%X%{NO zj;(b@G^9VE%?d!7j6u%BFb#@T>gx>NMwbf0PvoD9{hK2b(Mv~7Y{b9+@|5cX^betM z@!{C}3X2LJd%cX$xvWFv2!5WqmbVi2CVDsTk5Nu>;fdEO@V9v>kOe{mGv@u??$tkc z2%N)L1E zYwUEkopyw9#%Eqe^y+n(&>eW8QYja}74oN~1JqG$s#AGLT+m1M%;~J2{Dxz`Q+czkzY~z9V{Dq0H;*!0`l%AG>6?3 zNa&bVTI;boxqmP);I`phKK>9ylX?(GW=l))ohxQv*bV9U{h%})YNcAWBtzRPbXdqu zY+nad;_q5-aO!9H)@9p}q7zBUF)r126{fIRdSp{I@ywVw*b!KeP~-4PMVqLjcT=I0 zk~7nkNOsn1$Fvl6-Qkk~Bl)jJ5V>3FUw3@Vd@p@vYGr|E1L&cofc{H-2cIHbwt90s zd--WzXlkAB-upo>=w!%;yQPteC=5kN!85C3YrOZWL@#L0CvnsjAZHUcs0{3OFaD=*B1F^ zQYBx*uH(9do-KpzA~9y&4mMspzr93PE$lcjLEp(Ad)LJ_m>DO@<6r%vzCL@2UmLOy z2Tfu!sbekw;<-W`#ia2Zjx(uF5k}^K)Bt- zqnMK76|>^c00!~j2o^}DZQ4)ZX4TM|D1$(`L>+=-Y?lyPI7>~xIn-MG;nvy?%J@J2 z6M%2W4Ar=n0ilax*#0wv$#G-)DKIT@%T^v=NbU9a_C`p#K7%Hd5q6=cy=oLBUI;=NMYK`!$jfL19|^hvV6}T;K3>LF1{l zR1Jclde&kW{Z~;I@!)R`1CuVTZD8vWcV;bZn^aD`&^ zCsbQhGKAYLOv|;c_iW9)Jg4=w+ap#BU_$JELtqvnb4{E(eOk`M;ny~ z>2aQg#UtkLqk&Zk4Wf4Wi4q6u2q>$V60CM2BvBfKPCs0gUc&q^D!5Fw!jKZB#VcVo ztXd(?qH%xaje1J&NUvPff|Ybe*l>S5L4gfg*~0P21w&ze3q62ChA`y|C+$ppJjP*a zrnqDPreJt8=-ywNuu=x-Ow5wmEr#GQ5kE|Nf;nSIdy{ZvD9$)8lYa({A2{~EA(sV) z6blRyB}HC6mw*XHvPf76QREU#WzdA*M<|sV9w?PGAc$Mu2hAgmq+^){lR}Fk)0ab~ zr0mr+OD|ZYBkbsja?M6p-{jdPp zVw@kvYPFD!-EZZb@NaX&$};t~;i#{DSN=mgMLR9^@_0f~Y@r5ia%9jJgNX6#4c=by z6t{mmxalZSeT&^Weov)ZBSkrpx()Ax^g7jj>tl17i_<~`JYl^@%X*K=VNUM9Gm@@1 zQ!FJVEte_^gVXm{Z4?1(xy_*69BgU|=F-Y?$+tnJ5zcsVvUDYj;h~V6{fvI-GA;cB zyOcuVq!`XXl`I>LL-;~|;5; z-uP6BUaPsnz(fyMP`ntu(+XEz1fab`dVBRQvnn!gz(hatgbVD?@`d%uOl1%0#fIVB9GN zf1QE~2c~lTgB>ypYaBUFcQ5p+#zBNq`%Sf^TS5rE53@zn*RAI@l$T>#&#;N!X0}cb zK)xdnWUu}beG+1KWnJnnS^;xJUsBP?sfvbU8E%MMpM^TqWIIrAEn&Udn{F=}w#R1= zjQ|w#=6E+nM$suH3x4qym&4%F4oVHfnD^eeqq@F8+}=(Cbx0rm@F&5NpB6FVxlNB^ zRx71xK=V>|EqK!HM55;U#Ks-LGNUeZ9g;+#W0RMpW~M}?_-TBu?K z@g{f{p@UKKK5mK&qk8L{0hI~ZeOu((S3n{$KLnW;VZsRp~nSHb-kk7xa~O73bQB#P^1t;MuYtU znLNeaO)lLCCEzh+pDd;+48Q)(xB+yJb0zwIpgv4XrW`AmCFb0uBD~siEqJvA-8EAzdy zFt`Xje;nE9zX}`r`sEbmr;+l?%yO@A#|yAeAz)HyD!8UJJ0aE;W6h#LbUl30@u7+(5n zVtxnlNzHr&uz!#JsLWhlUna!eU@b1}UU~a+$<%1t!~$TK`F6i7s|Y-RPr~)(LoE#< z%hPB}nVHiMNBZNK!|0ZQH_IM<(t}Q@02ePzet{aA9z0vSlV#2B{RS^73FKDQ*SXQ2 zkTooJMk)Hq&$vJ~LHkl7NabRDf)Irhrk(+jJ6;R44LZ1tpuTbP+@hs#Z~Zg%9U;`Y z!M5#bXca&2lf=jOEYT#?Oa39Rt5Dd{A$DYyIr5>A)8VCpfJs76kewXIZ zXx{4j?Rw(mIsqxM!LHEkTcy|;5gM^!s>P2zOa;GM{tyEwUS2hm%p5!}e_lu$@xCvF zO6~CHcr^a(BBgyQ`=^{{_|9ARl*Zm{6v8Qu*D+LbxRbXiunfU%<1f~HNor9{#wKb) zKE?ceWT7OcIA7BAuIN>`n83Nk;j57VoZBjNZbetOAU zrBzNiEHyh@4eLxH|63ufI{~2Nnl6Sir=t;>&fWD#n*=@FD0?1O_^ttV&TmyCkPg>R zp-66*R-6#MI*K0eGFbS+9>U8I62kS~Iu(vqACiziLyDZ|c%Zk%CuLP$;4<*h=G*yA zDkCcS4<_);cZqTII+}aqh(9UJHDXzgdjiDon9!234H`+}eF4D;Qcd15dJu9-FLzqx z8V+@-gcmB-U@PK2U?8$9Y;5*lN19cIBF?DPcE>G|@KY^a9XD`+hY&;1V$d#GZUHSa z%56X&`*RZWE#nMX1%c^$wSLTlzA<65WL=&R34xtDpKsjwx7=wz&l2|Y9&hnKyreDp z>!{)vQBzGc)U@=7VZh_}sLHnSZNuojuDqDilRQ%8oGR>8>;&qQ=!w7}$d56fRgw#d z-4w)xh*RkSQ z-az#wkVTyUwO6iS%1u~w#1MN`ms1ktxSlZGV1^K7C%vA)ULP>AmUZ+`W>g*lt7Xb9{ z&I_la7m>n3<-gGE=@yzIL_OR(D%V&U)_Cm#`*#?`pXrT3(D%0uc3Fil4M=t}rQ&$} zw~;wp;yBqAQ~cT~0DAYR5^{*cZ{1Man;vYBHa@gKU&A#qkKl$hy2TDt6$wFoWCXN& z-%Mz9CF+G6e)=7vH04izE*m;N)&@x)%#*aNpiOV3g)1wh+ynWZn!|IDJsy>I)o>SF zM5Y*KIsz&x13^@1^Vv?O@zGK)7k6XJv9<*9r)Pg~rLbFY?+z~-8d})gH%>iE6&tIp zc4Kh+%-hR1VR3Hrl#N-EV5;^LSm^S{udgqkiX?NI(;z8hXY1#A86-GrAG&;hUzn*e zo=}hf+l)ipXClMnu2WZM!ciXNhAcCm10Sl+eGacawY= zR0s5^3Xa*}#aH#ih7p_rh--epj#;UPa`^*dw*MjzmF%-(!H{^3rDKkebGo~2+8*=nq4)~}yCxD82vA{Nk0Q9KrpESB}UbJtJT;c>Rp`jVRZPkfS zRF@bN6IZX&@y~g*S~;Pt9FXySZgHpFOtvrt&I1FN(sQu{$IF+dv1As+A0SodRE|LT zTlTC$O?EvD2N|P;Som$K7Lf(v9cCGMY*Ni52n`WS;~REhCoT&X+PPh*C>NFf=y#+E zIEp%ML?=L13!bK_JTmj%EV`Svc|T9tNC*6=fE!A?6qf?xw-jD@$$!;=hr}$KlUGE> z!x#-W6;H{1!i>`6usBtxr30f|%${)ObrYtqy#|W{km+eWnCJ?4@LmE|lDc%**ml}h z1a@w0t1@A1DoVfaE-aS!1JMSqVP0k5=j!kF_Z#+jSW1&cHj(Z@OaVB|OoHYJc6uLt z(zO~oZ(C}>^9&>lCTv!%Z7uv#LKT>Z7tS16Y<+2Y;+m@Jnxmj|U?~7!ud8DhaAjoV z@~^kl%wm!YMu5v+&9un)`5@*s>`aRlsW>fFX*h7Q8#(wb<0Z71$qEF)bx2Q)9%F}# zIW2&GEn*9cJ=rg3XASy6Y7>Vij*o!nfPgdY;c?#71eBTX6O zBs=#l>W>pH!phf?3AhpZDg=y50U~UcHKC?xYg zCuNgGVx3g55Yl-Op>h?dtoDqZCPHM6df_e25^B#S?x|Mo{opIMviAMTSoA{4mhR<) zkpZGs)UaJa`wV;>y7!oLxb)x%e661uO;koxgcQe?E0uB~QFoJEGYG)c_m@mmu8GFQk&COC56tt7krQACNIl zPRTFDg^sj9JAh<9DjCmqinxlx`77^G0xu&j?c&$P7^FWxSMcB6D#*!2pw8$q4gYlL zv*KeD6?5_j9hSBrw^kSDhH{EHsW6KHL+gai=oQgIUkKpnx1#g53x)fq9WzCp3*dS) zmcK={Km<$uu7Lc!FENFVQk@~gz+wLw=7@@=17$O>b8~bsh|3`(az>sHI}VjkT^pnk zWSo6>Ec&QN!2If{n?Rkj{#%`-^1UXkmrl#}xE>FwTOhK~f844dGx2$F-?j-P-YsxV z)c&U`GVAhm%GmWTV_Jdri<01vJ?_T@V)jrr`=K&pO@;gwEC*ZP(7grZ4y>d7so2g? zTQi2~xWjAS9j{Bd6$iUgkDqlA7Q+V@Z#AEZwd#o9%a_eD|ANUZx2tJIzp6JrqRS$} zt0??%_U0>zx2)CuM5!4NzD`y}!Jh%ctfHS^!@Z8ZbUV{1o;Q$QaFua43+aEKH%_;& zgQWaqs6*50@L^4dP$t$8^{E@X_>02#EBAGTGD4DeGLF^Urc|8x)SaT>w)U`8mX5O8 zUiSFpobyZGrK9(n4E|Deuv$M+K4W#>P8^}DK|WzoJx=AdDT7-8?qeTk5&iPPok);_SV11uxrXGK}Z+!;s+XUHwAEG z>YJ}9tMH+a^uhpjHmFYgP{P*@+|2NawA40pRiMO)h@~!{yXwSTf-GX9(U^=LkO59G zf9P}CO}_X1i|9Z|9)!cTMWqsjeNLi;|KIap2_+6W0qLad%cKhBuIFr48?5$3fcj`rfO~5Dnv*YtA4)ldszxiRL3~B!&v+Ok;Jf}?EB5C|$ zq~+ZXgNG;LOThA*uvWILr;ZQxvo^43d2x`y0ae1#@%G-KFOZbkZb3J}5or>)p)?eq zg%-dL&ml17FmE*)_zkIq{n|M7)E5+LHr9{xmf{RsL=)srFN_ z$W*dizL3rYt@Hj_09OiCpUuWpd+LkYV1QlvKicLP6=x=2PDD<>C*$>LF$b!7-@r@h zt#ie+zYk#ww7XcKng{o=yp+62z31S_2kI8=y9KA|ONZF~6_+ig*7Rzg={x%nxGU*y zB-i=YJAW)Q7aF)P!-yNk1!VnI@MKBU91*IrllLMlt^Zmn{fU6ia|+eHGJ$OsHV1g+G^9x{H_axL05k8>F6qB+{h(t%I%42Ad+Eh*qq4_-czy?FG zwG*vl@GYb7I$^dpK9~oxE-ET2AN5qR;7u*qj69tpF$NhmJhF)(UUT(SXC%KXDB{bv z4N6f>xJgFGe}6F3>lX2Z(aL5Q7W`*N+Lb-g3Gryv?=p4(gDq4v8IDCl5DG@{V{&_v z)V6ReD3mo!`_QzQhDzFJ!Xat^0{D>dUm+tr#Pqrmqgl6KXB${LzR%;Y>FF#PW*bh> zr)U~%n`C?zp&)_1fM0m34g1_h^b-#`Pg#88)eua#u(xiDTt+`nrg|UABp!oiQ#94r zMl+?I63*mnj|X0{UnxsX^c=czwu*U$~!J+G;fe-Pj zf!w8CdkeTkinPG6xdR*wST!Gu4xPN=HMP-UJaV-qXc&^zI_ea$ZfUC7G|8Y<;~-*)msSK4HLgV@{dA%)RBvd zE>-!G_X_^Ya$~Q0EdNmyLTpoZfb>;>{}9 zz~lpv65`Z!C))45973?e9^e06y_YFJV?(kC;0K1W;oRKuM&&Xhp@UzLOjsDQ^UUMD z-Oa+XBB!O^dlAh^jtkk+m%w+$Q`B2Q1jQcq7=F||XVHNJgh$iGtrmz2=7>K5@4E~!TjF)Z-Y3+hpCsDP%P|z$n@={0lc&trkKw2ty(c#JpYU z0*I0-def&cyUO3$oxMstPofKEg4bJx+@YVPUw#3TXc=Q85^<1A#6vOzD?1o9t8uhx z9y)rpxidun>KW-%l{yT~c(D@B=$C|XppkR<^kl#_6i9g7v~9sGoR*pXDa>#yW(>eA zbR4>q0{fv!kFs*^*Fu|5%voweVl#&QGv;aO<$s)pFI zjQPc3>wd%N;#HP~&P$_JPq;j$PUtzw*QSrx6CIee>E4w8O;1(p*RiTvWF^J)z{v;^ zI&pNu!yEdZJCUX8>o^pmiNm@Iws9YrBF8VCA+Sh~%Q8P^pPz1Dn%g`==Pz58;J#(% z!Wf*jcQ#C&_k)8mCfY^;sfWOE-=WQ-ChiX9hknBKu&RAv;A?oH0-QcO2m65$scN>y zGNfoivUKADkuk>bJ|~RN_w@1()R$f$NI4dHT=Znrx}l|oJ*&=wVT*FWoms7}NXcf1LuF2xX@`;@ zxB5q0l+w|Hq(a#SSmmchiFh4C`97$&Ar1h9d@MVG*uwmfgftw6#oCkl>2#3`6kH73 zithulaB%en&P>=?x~mcrczJSP$mZ9=@;p{3$8+C?6(pt-v6|zOTZvfR&SGas`Yfb4d{m9x%^f z5+9M^$uGeb4h@Kv6s3eH&g7q~R8i*Nbn(~$^U9wKHOiiahT%N^B5tcOkq`T~1`Zy{ zc-o+`hgg8CFzuYeOk5R%zv+vLg^a=S#xh^XZNM?nQK}yXB7eCh#-PP)1}%nMIoNcO zoGpXywQSlLM%6>QDA4Y-kZ%xR%@8142W0FbnwHL#_w>@ zj>12MYMgUx`0)M4s|*gt0aTe}WP$}Jn80rZAKF_V*fK2zB0#3=GV+naBtcD$nn) zcZ?(QaR#feiJ5Ib2rM{srD%5IeGa`#QC`qx%F*bOqk-i(;aao(Ok2sYl*YnCCYX6QwTg3$6H(@s7^c%=@=*41{trEX#m4thq0gn<6NT1ZlurZ!h2&k32dfEw_iFfm`)9B@j(#SzZ;$eS zpQ4;m#j!J`$7RbYp47v2Y*7v$*`}sA!+z?%E&61L;v?s{(EW8E($J^Ft}}F=n73}B z*raYNE=)`o&uj%3rhZ33FznZuEFUd699M^;$4qscH`y)5Mq|iIbzv%B+yn#S?N;ECKMUJVZ+y1mYLy3Z(rChoyqUk>5 z3zSvd#?>b}!0-^Pb%vu%xbW#TSK<>E^Up-FUK6+TQylj2jGVXB=E)ep-9MHc$t>p? zi}oN`5=5?aVn5_bZNFHJ`|FCG8>oAfK*ad%WMb@ZBDi8%&ucu6Kt@(7zHng1~>Q_ZUWIV=Z`JrGHJV7GmyZhO3byr_)=$c@L@xh zQOB(!0#ua>9*uhZxxwLa)8bNYqG%wbmwz1mR>*EYqZ7RoLwIe&%*A(VA6ZM~%Jb|w zPdrO5Fa#E-Q{Jyd>u_NmT8n z!9>S}IV=kvhxE9K`3~bbT(Dup0md=GtwBFrj95_#fX0u=EQW^~!+HTk#6HO0IbQHa z1YXo$IAjk1x}n@fW42O}ZBqH_>J~YQPJW6Onc79(($=DMa>B!<4CsUMs!B$*TN2vW z6_Y%NjZorqVISUYY%|>*)FH2-I)pGCeAt=&Fe(_zJyh3*zxZ0}hBU`_B^%bEG9yIJ zMAq!_9;3vHzr^*tpEr2xc@UA4>KV%GVjZY%y_k83#%M4SYBgS>hcB5japtGWF(>JK zvKm#BlP8f=N@S<$ttqMM`<=6xy9tMp#5TO*8^|89&T(YG*h-HhLnXGTjVM&<64w{oFK z{uZxHZ7zDRtM+`qFUMb;@rC<@*FJKJjU>&ggKhqWE%5b`4^@4MEPMjS?A0uaQaOS} z@S8>b6psyIxe4t!{#^q}zr@fDel%}F3*lnY_jUvN^B_r;iZ}+}>94M=U&s(<=@2Hc zb@qbyvdKrYG&cWK)6rC}Q*usbIC|$`VbvU5;`Tz(Xhes~0`F_$+FFe#5$XW!l7UtrIATq-lqGX!?w)yQ~r+sQqZ?+LjoZ@%H zlLEg<110Di<(oG;k>Dbxa0%i&R6KsZiGA_G&rI<0{;m**6P0?|G92-CCz!!WSs=wC+hXhZFhbcE9wONr z`@1j1*&vOWy-@}*v2Zcv%nYq4Y?xSO`^@1V@N#Wf`aHanK(ZSAm{iFY<$GF_oql|@ z_lfl|`Zu#wQuUR&e$`Jb#Ica|1C_FiY+zQyx!{Q(*4S<1-?ca~+gPFg{pNB68<}>a zcXGyl$*qS~MmABlgAIRNoR;?KF8PY@9m3v5?*o(EJ~~7QYM}+FrhCUd;7ha08ne*5 zpd5d~&PrU58kIe(?0Iei(Uo|7WNzOj^P%X6)YIKOy#Bf;6@q=~{r?rzG%L$^lsK1h z;r^Y$-2Wn)5dSa*h9!%mfEgJ1G9fw`VAoRO~O7(%i{UXqW17#d=% zz1LCV%~=+pa3Q5Kf|MoUeM&)uMVMIA%GZX8v$ab*-Y$*HWQTxB$>z~Ew^B0e&jyxC z%FK-Q9hcYuu4`+am)BB~G>XXJl7EwhlRp>(Y>44fV$F2k@sBbZWJmBT&H*wqfFmN- z96}hDKmpBBBNhQ}6k>+vLs2gjQ|TcAGE6|11w4Vg;w(lPPxXz9k)ehN4kre6ABEy% zPkLUWbi$#IAZZ`F=ai5I2;&Tp_#C(^vJ*M}>5=1s!A0s7IbLh+&I4GWu_!{YuB&7P zih|#>>Ie{&7Nqm;wt(Zb1O$N`;XB#-3ZQNt)#@^1r`Br>)7j8qGdmPn4y8a?8l(_X zB$^Gj8Ab2}=m3TwlH3s#gukNt_lu+)B$W&FOOyB5IuhKG9+2=nnlLY~Tp!s7L$M8i z-iVZv`vgu*SFx7@%HeD_yl4_sN=a{E;3iuVGWK|w0aOHKG18hR#{55R6PzK?IA*p` z!go&T8p4F%4s6??WBV$kisB>`4z^%C4dS}!04*4ppOTb9X&7cVYT+J$gnpwD-b&{P zZEd+Mshr^$utGa1<`RXuES8-&O#MT!ta4myEZS)Vv7|(pl6RS?nrTZD)?pB^*W@@N zBmu|9xkFQj6(~A}s=kI}qNN+GSAQn9ycJ>=0F7U*zaZ!=mI{J70BoRwO?XIr6ibvP z)zD=ZvEZ~gI`z@kqmb|uW9LrkC3=%DP|A_+ORtt zxe6=)`O$;A*GQ3~s={2^3MfrM5Sb&OC*mOhAauO{`@{Lf4}3ptON9o3iZHqo3Jj%y z`fzSqWb0_qB`EAFEPw#j_kEVds1P{2FoXlw$!2AOH=i6piW5>rfHz+#tVN?ZP-HXu zwHu+6PcyVFWR*Dl2A|)F=+z|ovC{&qgkHWcaECP5E z4u=f@xfqR_nfl_?@lT@Ed_rIw!-qa9wU0|cVt}oYjP+tJM|vkAOmU-C9 zm48rgW~_QL5I3QmpuxxL#-x@ZEYu=_bZdLmLCwaiS36fc^R@O8pJ2vCCS;_s~TyQpnSQDY0uxg<<%KeC@Hw&@^*)?}`0F%-T$Eeu$zRm)k3PD20>0}uI z=JDNZiGpDF!vsOZZs0hxpGb{?%F%|?djA4ubVn))(ehzPaF-oWP!|QL1WtDY-O!C7 zbcihWlxhT$*ICLtyyTF*JSo%$BM#}G;^V_aXdIe0JP!AdV}lF7WLJiK_8}zaBf9Jh zxSw1Hq?{>qq!|(A@g*~9gDS-f2*LMTa3g5X^bB?psd$%c0H8r>HKW26@$XRCeWs(? zHt07ahla;#7xmQk*W;gCRBDm-cqbE0(fF-vWL=gxP%ACHI+Wk@@ouY^2a~Us1Y^%m z5g=p&Ccr%9RCEDf0YwE->^n~u|HnrVE|hdx=r&!6 z2=yOxB41Oq86~NK9Z^Oi^KAbC^XB&)%%jwvkXDtv-#n!G7ShJUvD@(euzy6s~w)Y-d2=D0K$0Pn7zAh>Kvwu$SG-0F?uCIe@bNYkmExY+6wmyc6JM6&niRR6_L{)d;if`=po-l6-B0`b4#!vBjKbu@sC+4#aB_sq=NTMNV zUTdgPz%lR_gi?db(q4EroQS^biV_Rd^PVV4v=$D5D+EiZ7ZCu2KBd;f7?^Uo{+#&* zQ;s;j0PH=c_uFUiN)Sp&$Y*+uxTbt?3K#KhlR2ZasN1_6t4 z?mE81^O}ouEr5388*bw;4s>qpum>p5kW@z77OxYN#zuBCPOsT%9CGp}OQ7`o2S~HF zU_gi2#4Tgk@9(E_%@dGstEO4B?hW*#!#w!$OlZL{8+mzX-}fqfo20f0=bL|97Ch@TOBLXXbX?Il&j)5ZI+zM(Sk z<6SQWNO@CwXsQ5wpDX^#`O0eonkK~NIy-AEKnQaQGph7tmE_2_Jbq0nk{LKKnW{{u9CM4RC=wE(HhLtP4Bh2o zRKmOnqazmpLo_<*w&PU`nD2uj-j-J*sR-hbWSlm4W9RBbK!^&N%CSiM>CoatE4J05}O;4f55@I%#H9SC4mXWCKSzY=(6%)DfA}V!L6Otu=zdjz2{ia%%Ie$C#;rl=maN#?V62`fW=j$yL0R1t3p&#@V{ zD;^{lX@WLfW{?PAOlWgiMuTRY*w{oIC~_T%E@uGF*{$H#!D0_TV3eOs1b`sJ;NW1C zLel%-l!k|GXXb)&G6sNuYAFf{#Wi#@8%QAJt<*KhOFKc zIy#WbJ&^`7Vdq1Dkd#LzIcg3_Si@Ycl$OX77~>L;V&t`C2~3^j$`ELP3|v$Ol35o# zMog4)eIi80TOVvM0Fh!3zIhCzy-E85o9@a#?Kr!F);v~JKz{Kdwj!98F$Bbib_@=* z?p5j_`&@#^fgymohg+HA%1k#{g<1Tq_$=Fl7g8aH{Q$aNlRi!1!**`9+TxY2&iPuS zVMtX(0cV|drKQ023=kBk;UeLEG<$jRRg#8U6j)bOxu$}qc@(`Uu5z+TB7Hm#LB;L@ zi9Hj|?t#;}nHD?5D$fzmKrk`b3;@ATp2L~o*p5wK+cBaO8%}fvKXc`=Hd__tHuR
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:l.htmlSerialize?[0,"",""]:[1,"X
","
"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("

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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/fonts/klinicslabbook-webfont.ttf b/static/fonts/klinicslabbook-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..acd4f27e4f343492addd252bb2ee274ccf1ec805 GIT binary patch literal 78120 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 CljSD> literal 0 HcmV?d00001 diff --git a/static/fonts/klinicslabbook-webfont.woff b/static/fonts/klinicslabbook-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..822179bd19e345d03a001fda783f4e94c33f3d08 GIT binary patch literal 33376 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≫O@^gNr5i1$ckFm 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 US5YayW%g8_00042qNEf608Epy!vFvP literal 0 HcmV?d00001 diff --git a/static/fonts/klinicslabbook-webfont.woff2 b/static/fonts/klinicslabbook-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c18bf5e6ef89d612f5525cec47142749483ed6b0 GIT binary patch literal 26420 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 TGwkkdt-#H0&!PBWI7|Ql2=gGK literal 0 HcmV?d00001 diff --git a/static/fonts/klinicslabmedium-webfont.eot b/static/fonts/klinicslabmedium-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..d2bc3bfd8a05be0b0a1d838e5d969f5d8fa8cd88 GIT binary patch literal 30383 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 literal 0 HcmV?d00001 diff --git a/static/fonts/klinicslabmedium-webfont.svg b/static/fonts/klinicslabmedium-webfont.svg new file mode 100644 index 000000000..b1e553fb7 --- /dev/null +++ b/static/fonts/klinicslabmedium-webfont.svg @@ -0,0 +1,1884 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/fonts/klinicslabmedium-webfont.ttf b/static/fonts/klinicslabmedium-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..994071b3cbf640b2fd5ff3dbd0b8fc53b13dceb3 GIT binary patch literal 78180 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 literal 0 HcmV?d00001 diff --git a/static/fonts/klinicslabmedium-webfont.woff b/static/fonts/klinicslabmedium-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..643977673af7a9fd22de07dfaace4b6bb6a3905d GIT binary patch literal 33780 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.c6Om=Ne?@T&A%94{&nUHzuATk9%OLvy; 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 nGVp2+`} literal 0 HcmV?d00001 diff --git a/static/img/404.png b/static/img/404.png new file mode 100644 index 0000000000000000000000000000000000000000..ca2492b2b3a2543dfb0922dcfac2000a32f6f943 GIT binary patch literal 5170 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 Sbi9)GxiT>{GblRka_wL3a`OWK literal 0 HcmV?d00001 diff --git a/static/img/aws-ec2.png b/static/img/aws-ec2.png new file mode 100644 index 0000000000000000000000000000000000000000..1d27b839625c942a46ada0bef3bd60afaeae15d5 GIT binary patch literal 14401 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 C-N)7d literal 0 HcmV?d00001 diff --git a/static/img/blog-social.png b/static/img/blog-social.png new file mode 100644 index 0000000000000000000000000000000000000000..a379db88a924d79c262b43c6927c0d599fe1bd0b GIT binary patch literal 3106 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 YFzR-51S+1WTm5UtIl5zS*dIRjAGL63TmS$7 literal 0 HcmV?d00001 diff --git a/static/img/cover-image.png b/static/img/cover-image.png new file mode 100644 index 0000000000000000000000000000000000000000..83b7a0a64e04c424eecd23cf7066e91c458dca2f GIT binary patch literal 23015 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 KAy+A58uUNOVmfXB literal 0 HcmV?d00001 diff --git a/static/img/drycc_builder.png b/static/img/drycc_builder.png new file mode 100644 index 0000000000000000000000000000000000000000..d25c059af9df2baf1c85698b9bc840b4584af5cd GIT binary patch literal 28223 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 literal 0 HcmV?d00001 diff --git a/static/img/favicon.ico b/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..04f26d64e9dcd98520b6b58471a574e6ecb54f6f GIT binary patch literal 32038 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 O0000tLcSEPx;R645ActWuF&P| zrDqe(f)Re_+b}X024%poY#5#m!?IvdI*gyrpD(buN<%rS*dG*QSHkZ zS)XN&``1J7FIa+)jatrjwh7OI_2TY=zpS|;(VrFvz1Lnj{ntm0InI|=z>q8;TKUig z3WO!6hKk|aV0tRP%I1oy7r31Kw6SSq8ihkNuQ!gGmI=5K-T?i zXckgb61wKN4Q_hX@`?x6b0n8sh%8w`0UN!X?Xu`EQsq%B<9$Ziul?S$R za0L1GC?AfF`pPQ&WM zUs;Zar|ZqidV!^JfDZ;D3glS8$J_JnF^bReG~ z@Y7ZnG|~btY8u79I?)`odK@7pnxeu}MUP5!D17*|@+HGdaz}lYKk}=5IohB(VQ5Lt znjY-h_Ox%M&_a6=Pxgd zBP157zF#sdSVymd8nc{A%c_>0$$|6)d0yecD(5shb7J|;jM_+3XDQ(KzfT2U^H9tl zK{|YxI0H`#O-?0bpqdZ#sp9{HSx%MX#IiVpJgM3F*;>w&T2lRoQy1a-#xp1>>HP6e zT{)qI^f_lK9RWwLCOM5cu2=>#q<$WdS}K;99}FF*vLi~%&L?R8@o069N8Q2|R|{K6 zAT0|WIcax#v()$H-_5eZrg);HyABY{%t%G<3D@Z6EQfkM)9cPf5nmH~AsaiOc0 zU~3s~#g&#Sifd3v>FvowDdQ~VjFUZ5%Y=Z`PfijvmPfM3N$^t^l6yk&)LIicB`xmD z$3D@s2ZTs-ge*h=juK$Y$!bFGWb3M>x`n9GpPqmdT}v7K-uEy+q;h%g5o_m!8Dh&m zFChuZv7;j=C3}ywBxZ7ypnX|1bpo=~Dv_vZf(viL8ZNU(jbu!*UcOjpX;(S5BMZIZ z?9OT_r^{{7*^@wOr49_F4)jZ?IRV=vW51bBXO9+SoG-tf6djgLm3$OkHPP_noImlY z;4#AZt3`hwdHBRaNGy<`xq5=v(MLBr-_@lO9SqlFlWA~q*07Qs69xq`ulV71_c?Bx zQ9NT{((Q2ETsCngoW2AWJR{0BSY2ZI0X}po8@>!|FgY@Po>Iu}TOZ5P(xN`vyeoJJ zjgJXCgNIsJyJd$$QWS|>zf2Oli`A6WhiS{U(vY1gz|>EfOX<(s#SdG=-rBhS z(k$d78#z|5Pxo+BW4E$#W0Gy>F#UBTXd|`&vVOiF1dmY^=j(UFlIPJi(|sCo^eo7I zkOzKtiE6y}=xwwz{mX<@Ft$$?uho(xYaf`=qk( zupF63t<&K-WS}^`XT0~wiELVYK_&nz@Q1s(C(Bi}>+o`|_fnJrkPrJ6O}=2=4LVD{ zZZjJ>iW6+kv=-L`up5+YAnCQzHOrF=X#)@U$LZ!GRVA-WHY!E za;qoI$7X8WeJT5qBqZ5B8l{}B*K93`Wh#NzSB(;>xZ>xpyCKRuEW6fWuCP)0Y!n$0 z7eG!(&Ue;|_#GJ8k5q zA!)QhyYp;EPL1VCXT^2#NLM-9=!+~XamDTILHJ5#=P|ESKV|&nio>06d3IpvE6;wU zuk@}&va!odjotoVGPyeql?V~P650RY z`j-tIXL*~udnA}EPSWNl`j$Z>Otu^AfH867>gygMtYuo;FDz81R zblwT2^L3o4&5!-Z*&wLEdzX8s<4zlj2yGM0nH*SOe9?nH;hiEf` zJ_R0=<`IZuudowsEF|X&acmnQ7!mDZ^+bl*ZTuUf=Rd;Sff2FM^;Ppj6)pi>(e(xQ dcbR|6-v9tR!+Ks%maG5(002ovPDHLkV1gQr{6qi% literal 0 HcmV?d00001 diff --git a/static/img/fork.png b/static/img/fork.png new file mode 100644 index 0000000000000000000000000000000000000000..427caa6ff9d4ac219c92bda1dff5b67a854cc8b6 GIT binary patch literal 1731 zcmajgdpr{g8wcN8b}QQ0BE35 z@Zg;tzcVSS$~zV*TJ-EJy%a=f3I-pSLXIKe0G_dUEbajM*O+)*FfJyRn%spu3IHhM z&~VQX%Gf;99c6L?+{y9;S`{B!R?B-DYNo*TV;j=Wv>yTfIm&F$ym|aYIjXqs+1Ywj z^34bcjqmf_i<4L)!Eo#}DDPgmjlt>rI{AcqFQ51MU1+N7nC3xQ zv!7&tXrF!Sl(976GBR6!c`(f`ON7cccE0{i)dG{9{MBsZ-QN_UB$!{r7C&}*_f85I zCQ1@#d8fJsUq<%N-pU{^(oXdL5xP$!(6MqmOXWbRU+yuhftvV22+Or;iSw|$bQmBP zw^5=knw^DmSP)vfAPb#v`st!ngMsEs{r(l(dd%0LCs(G4I3B;Y87B_|jVC82^zs>j zB^#gL3M-Q)_(6iuKc|nX5tUYg<&*Jr%`vCirdnnW&qCl?oCyBV$SU+{dRIp(PtDX?nW@( z7Ja9`*7oR`k??i=V%|ILS2f>znHpLWA|LXg8wbJc>HicZYeub~bKh<_vN8Ie{<;ur z_FC9m)^?>UuplcdrZQ(LT^kt*1hBO4wy~}2D#;%=%p-H7GK9~lfS<$qS26nZ=$5@2 z;D{=$J~Cx*Ly$AGyP1AzwIq+oSGMV|ty0?)3IGLJLVIyI#@u00D$^u5*{SRzACp!UM+3+jCj5VBvo#Yp z;Y-rqQ61N}ulc>vUoTz9Hq^_F(!WeeJUf5gFJ?c?3I*RN8EKf2Z^&K9}>wKYm(NF*}5uhJK;FMIxajk5HG-1z(NqEs^3 zdc|*Ya6&RU5*erO&<5>-p`sJDM z%f>IRtBRn@UhnDz0%%e(y%}z_DH4hPZf$)sK0aQ{V`KJ%!99AWW=v-y`vF2fE3NR{ zLKF-J<5g4~oHI~RL=9k}EzIuFNEWi3Gv?E|E5|BgpT)GzL*cE*p!kMDs)Ax@+|20c zDATHz&1Odr$pxOuKH+9hhEEy>$tV(EQb|dPtR-|yoPHLb=~)jtIeDQGD+(ER0fe~k9Sb)>h-^_XKqA5{Xn@X!4069H=Y{}9Zm_3 znWKZUpQuk@XP5NMuDWn`Kb&ERa}M;$_vU?Ul5CzHL$w{!Xmkl!-bOPOY#QmU%q@rT z{v;&H~4{*^aIw&259TJ3tB<7GJ70I)3KCW5V}0INICW z;|Fzhzu#%w%dW0Feh}G(pO#|=7c;9+zLi{JSx2LPA9f{knNy?o0_ZXzG4{@Y9c$GB ww=$HxlT5y;2}bYauPS+K{UfuQlcA&wfX;kK><`$Nu=AAwXhZ;<=M|m(UxEBYx&QzG literal 0 HcmV?d00001 diff --git a/static/img/glyphs.png b/static/img/glyphs.png new file mode 100644 index 0000000000000000000000000000000000000000..5f046512eec12e338a5411ba6ff36a2a0a6d54b5 GIT binary patch literal 3854 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 Qdw-~wrZ&j?#+M@h4Jr)YDgXcg literal 0 HcmV?d00001 diff --git a/static/img/large-social.png b/static/img/large-social.png new file mode 100644 index 0000000000000000000000000000000000000000..e95428419227858d98dd22f822a14e17fda528af GIT binary patch literal 18518 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 D3#1Vk literal 0 HcmV?d00001 diff --git a/static/img/mag_glass.png b/static/img/mag_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..511274ef002e3520653c0786afdba2eafeee8847 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8tDY{7Ar-fh5+vR<2+n`<|Nnp1hAE5!+6*6=1=3PdY8*D{ zDl|9jkngz9{IOEu9{Y@6Gj#Hv%o8_>+#VJh%s(_fY=A`BmEGbTI;UGYJl zNu*m;Xq%j-G11P^a7ycv_+ literal 0 HcmV?d00001 diff --git a/static/img/menu-logo.png b/static/img/menu-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3b7786bd027dde195a1837e3ccb1d44ed4b8c5 GIT binary patch literal 4609 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 literal 0 HcmV?d00001 diff --git a/static/img/svg/circle.svg b/static/img/svg/circle.svg new file mode 100644 index 000000000..5cb1439e8 --- /dev/null +++ b/static/img/svg/circle.svg @@ -0,0 +1,10 @@ + + + + Fill 31 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/img/svg/footer-engine-yard.svg b/static/img/svg/footer-engine-yard.svg new file mode 100644 index 000000000..559fbe51f --- /dev/null +++ b/static/img/svg/footer-engine-yard.svg @@ -0,0 +1,27 @@ + + + + EY logo + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/static/img/svg/footer-logo.svg b/static/img/svg/footer-logo.svg new file mode 100644 index 000000000..120e8a4f5 --- /dev/null +++ b/static/img/svg/footer-logo.svg @@ -0,0 +1,20 @@ + + + + Group + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/svg/helm-logo.svg b/static/img/svg/helm-logo.svg new file mode 100644 index 000000000..af15bda3a --- /dev/null +++ b/static/img/svg/helm-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/svg/logo.svg b/static/img/svg/logo.svg new file mode 100644 index 000000000..db269bf62 --- /dev/null +++ b/static/img/svg/logo.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/svg/square.svg b/static/img/svg/square.svg new file mode 100644 index 000000000..d6b63ed99 --- /dev/null +++ b/static/img/svg/square.svg @@ -0,0 +1,10 @@ + + + + Fill 26 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/img/svg/svc-cat-logo.svg b/static/img/svg/svc-cat-logo.svg new file mode 100644 index 000000000..b62d989d3 --- /dev/null +++ b/static/img/svg/svc-cat-logo.svg @@ -0,0 +1,11 @@ + + + + helm + Created with Sketch. + + + + + + diff --git a/static/img/svg/triangle.svg b/static/img/svg/triangle.svg new file mode 100644 index 000000000..e2917d456 --- /dev/null +++ b/static/img/svg/triangle.svg @@ -0,0 +1,10 @@ + + + + Fill 21 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/img/svg/workflow-logo.svg b/static/img/svg/workflow-logo.svg new file mode 100644 index 000000000..bdbf92676 --- /dev/null +++ b/static/img/svg/workflow-logo.svg @@ -0,0 +1 @@ +Logo Box \ No newline at end of file diff --git a/static/js/adjustments.js b/static/js/adjustments.js new file mode 100644 index 000000000..eae8d6731 --- /dev/null +++ b/static/js/adjustments.js @@ -0,0 +1,54 @@ +$(document).ready(function() { + + // init foundation for offcanvas menu + $(document).foundation(); + + + // custom theme js for sidebar links + var allClosed; + + // close all accordions, besides the menu containing the page that you've clicked on. + $('.toctree-l1').each(function(){ + if($(this).children('a').attr('state') == 'open') { + $(this).children('ul').show(); + allClosed = false; + return false; + } else { + allClosed = true; + } + }); + + if (allClosed == true) { } + + // if menu is closed when clicked, expand it + $('.toctree-l1 > a').click(function() { + + //Make the titles of open accordions dead links + if ($(this).attr('state') == 'open') {return false;} + + //Clicking on a title of a closed accordion + if($(this).attr('state') != 'open' && $(this).siblings().size() > 0) { + $('.toctree-l1 > ul').hide(); + $('.toctree-l1 > a').attr('state', ''); + $(this).attr('state', 'open'); + $(this).next().slideDown(function(){}); + return false; + } + }); +}); + + +// use headroom.js for sticky topbar +(function() { + var searchBar = document.querySelector(".top-bar"); + new Headroom(searchBar, { + offset: 50, + classes: { + "initial": "headroom", + "pinned": "headroom--pinned", + "unpinned": "headroom--unpinned", + "top" : "headroom--top", + "notTop" : "headroom--not-top" + } + }).init(); +}()); diff --git a/static/js/foundation.dropdown.js b/static/js/foundation.dropdown.js new file mode 100644 index 000000000..5db3dea6d --- /dev/null +++ b/static/js/foundation.dropdown.js @@ -0,0 +1,468 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.dropdown = { + name : 'dropdown', + + version : '5.5.3', + + settings : { + active_class : 'open', + disabled_class : 'disabled', + mega_class : 'mega', + align : 'bottom', + is_hover : false, + hover_timeout : 150, + opened : function () {}, + closed : function () {} + }, + + init : function (scope, method, options) { + Foundation.inherit(this, 'throttle'); + + $.extend(true, this.settings, method, options); + this.bindings(method, options); + }, + + events : function (scope) { + var self = this, + S = self.S; + + S(this.scope) + .off('.dropdown') + .on('click.fndtn.dropdown', '[' + this.attr_name() + ']', function (e) { + var settings = S(this).data(self.attr_name(true) + '-init') || self.settings; + if (!settings.is_hover || Modernizr.touch) { + e.preventDefault(); + if (S(this).parent('[data-reveal-id]').length) { + e.stopPropagation(); + } + self.toggle($(this)); + } + }) + .on('mouseenter.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) { + var $this = S(this), + dropdown, + target; + + clearTimeout(self.timeout); + + if ($this.data(self.data_attr())) { + dropdown = S('#' + $this.data(self.data_attr())); + target = $this; + } else { + dropdown = $this; + target = S('[' + self.attr_name() + '="' + dropdown.attr('id') + '"]'); + } + + var settings = target.data(self.attr_name(true) + '-init') || self.settings; + + if (S(e.currentTarget).data(self.data_attr()) && settings.is_hover) { + self.closeall.call(self); + } + + if (settings.is_hover) { + self.open.apply(self, [dropdown, target]); + } + }) + .on('mouseleave.fndtn.dropdown', '[' + this.attr_name() + '], [' + this.attr_name() + '-content]', function (e) { + var $this = S(this); + var settings; + + if ($this.data(self.data_attr())) { + settings = $this.data(self.data_attr(true) + '-init') || self.settings; + } else { + var target = S('[' + self.attr_name() + '="' + S(this).attr('id') + '"]'), + settings = target.data(self.attr_name(true) + '-init') || self.settings; + } + + self.timeout = setTimeout(function () { + if ($this.data(self.data_attr())) { + if (settings.is_hover) { + self.close.call(self, S('#' + $this.data(self.data_attr()))); + } + } else { + if (settings.is_hover) { + self.close.call(self, $this); + } + } + }.bind(this), settings.hover_timeout); + }) + .on('click.fndtn.dropdown', function (e) { + var parent = S(e.target).closest('[' + self.attr_name() + '-content]'); + var links = parent.find('a'); + + if (links.length > 0 && parent.attr('aria-autoclose') !== 'false') { + self.close.call(self, S('[' + self.attr_name() + '-content]')); + } + + if (e.target !== document && !$.contains(document.documentElement, e.target)) { + return; + } + + if (S(e.target).closest('[' + self.attr_name() + ']').length > 0) { + return; + } + + if (!(S(e.target).data('revealId')) && + (parent.length > 0 && (S(e.target).is('[' + self.attr_name() + '-content]') || + $.contains(parent.first()[0], e.target)))) { + e.stopPropagation(); + return; + } + + self.close.call(self, S('[' + self.attr_name() + '-content]')); + }) + .on('opened.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () { + self.settings.opened.call(this); + }) + .on('closed.fndtn.dropdown', '[' + self.attr_name() + '-content]', function () { + self.settings.closed.call(this); + }); + + S(window) + .off('.dropdown') + .on('resize.fndtn.dropdown', self.throttle(function () { + self.resize.call(self); + }, 50)); + + this.resize(); + }, + + close : function (dropdown) { + var self = this; + dropdown.each(function (idx) { + var original_target = $('[' + self.attr_name() + '=' + dropdown[idx].id + ']') || $('aria-controls=' + dropdown[idx].id + ']'); + original_target.attr('aria-expanded', 'false'); + if (self.S(this).hasClass(self.settings.active_class)) { + self.S(this) + .css(Foundation.rtl ? 'right' : 'left', '-99999px') + .attr('aria-hidden', 'true') + .removeClass(self.settings.active_class) + .prev('[' + self.attr_name() + ']') + .removeClass(self.settings.active_class) + .removeData('target'); + + self.S(this).trigger('closed.fndtn.dropdown', [dropdown]); + } + }); + dropdown.removeClass('f-open-' + this.attr_name(true)); + }, + + closeall : function () { + var self = this; + $.each(self.S('.f-open-' + this.attr_name(true)), function () { + self.close.call(self, self.S(this)); + }); + }, + + open : function (dropdown, target) { + this + .css(dropdown + .addClass(this.settings.active_class), target); + dropdown.prev('[' + this.attr_name() + ']').addClass(this.settings.active_class); + dropdown.data('target', target.get(0)).trigger('opened.fndtn.dropdown', [dropdown, target]); + dropdown.attr('aria-hidden', 'false'); + target.attr('aria-expanded', 'true'); + dropdown.focus(); + dropdown.addClass('f-open-' + this.attr_name(true)); + }, + + data_attr : function () { + if (this.namespace.length > 0) { + return this.namespace + '-' + this.name; + } + + return this.name; + }, + + toggle : function (target) { + if (target.hasClass(this.settings.disabled_class)) { + return; + } + var dropdown = this.S('#' + target.data(this.data_attr())); + if (dropdown.length === 0) { + // No dropdown found, not continuing + return; + } + + this.close.call(this, this.S('[' + this.attr_name() + '-content]').not(dropdown)); + + if (dropdown.hasClass(this.settings.active_class)) { + this.close.call(this, dropdown); + if (dropdown.data('target') !== target.get(0)) { + this.open.call(this, dropdown, target); + } + } else { + this.open.call(this, dropdown, target); + } + }, + + resize : function () { + var dropdown = this.S('[' + this.attr_name() + '-content].open'); + var target = $(dropdown.data("target")); + + if (dropdown.length && target.length) { + this.css(dropdown, target); + } + }, + + css : function (dropdown, target) { + var left_offset = Math.max((target.width() - dropdown.width()) / 2, 8), + settings = target.data(this.attr_name(true) + '-init') || this.settings, + parentOverflow = dropdown.parent().css('overflow-y') || dropdown.parent().css('overflow'); + + this.clear_idx(); + + + + if (this.small()) { + var p = this.dirs.bottom.call(dropdown, target, settings); + + dropdown.attr('style', '').removeClass('drop-left drop-right drop-top').css({ + position : 'absolute', + width : '95%', + 'max-width' : 'none', + top : p.top + }); + + dropdown.css(Foundation.rtl ? 'right' : 'left', left_offset); + } + // detect if dropdown is in an overflow container + else if (parentOverflow !== 'visible') { + var offset = target[0].offsetTop + target[0].offsetHeight; + + dropdown.attr('style', '').css({ + position : 'absolute', + top : offset + }); + + dropdown.css(Foundation.rtl ? 'right' : 'left', left_offset); + } + else { + + this.style(dropdown, target, settings); + } + + return dropdown; + }, + + style : function (dropdown, target, settings) { + var css = $.extend({position : 'absolute'}, + this.dirs[settings.align].call(dropdown, target, settings)); + + dropdown.attr('style', '').css(css); + }, + + // return CSS property object + // `this` is the dropdown + dirs : { + // Calculate target offset + _base : function (t, s) { + var o_p = this.offsetParent(), + o = o_p.offset(), + p = t.offset(); + + p.top -= o.top; + p.left -= o.left; + + //set some flags on the p object to pass along + p.missRight = false; + p.missTop = false; + p.missLeft = false; + p.leftRightFlag = false; + + //lets see if the panel will be off the screen + //get the actual width of the page and store it + var actualBodyWidth; + var windowWidth = window.innerWidth; + + if (document.getElementsByClassName('row')[0]) { + actualBodyWidth = document.getElementsByClassName('row')[0].clientWidth; + } else { + actualBodyWidth = windowWidth; + } + + var actualMarginWidth = (windowWidth - actualBodyWidth) / 2; + var actualBoundary = actualBodyWidth; + + if (!this.hasClass('mega') && !s.ignore_repositioning) { + var outerWidth = this.outerWidth(); + var o_left = t.offset().left; + + //miss top + if (t.offset().top <= this.outerHeight()) { + p.missTop = true; + actualBoundary = windowWidth - actualMarginWidth; + p.leftRightFlag = true; + } + + //miss right + if (o_left + outerWidth > o_left + actualMarginWidth && o_left - actualMarginWidth > outerWidth) { + p.missRight = true; + p.missLeft = false; + } + + //miss left + if (o_left - outerWidth <= 0) { + p.missLeft = true; + p.missRight = false; + } + } + + return p; + }, + + top : function (t, s) { + var self = Foundation.libs.dropdown, + p = self.dirs._base.call(this, t, s); + + this.addClass('drop-top'); + + if (p.missTop == true) { + p.top = p.top + t.outerHeight() + this.outerHeight(); + this.removeClass('drop-top'); + } + + if (p.missRight == true) { + p.left = p.left - this.outerWidth() + t.outerWidth(); + } + + if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) { + self.adjust_pip(this, t, s, p); + } + + if (Foundation.rtl) { + return {left : p.left - this.outerWidth() + t.outerWidth(), + top : p.top - this.outerHeight()}; + } + + return {left : p.left, top : p.top - this.outerHeight()}; + }, + + bottom : function (t, s) { + var self = Foundation.libs.dropdown, + p = self.dirs._base.call(this, t, s); + + if (p.missRight == true) { + p.left = p.left - this.outerWidth() + t.outerWidth(); + } + + if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) { + self.adjust_pip(this, t, s, p); + } + + if (self.rtl) { + return {left : p.left - this.outerWidth() + t.outerWidth(), top : p.top + t.outerHeight()}; + } + + return {left : p.left, top : p.top + t.outerHeight()}; + }, + + left : function (t, s) { + var p = Foundation.libs.dropdown.dirs._base.call(this, t, s); + + this.addClass('drop-left'); + + if (p.missLeft == true) { + p.left = p.left + this.outerWidth(); + p.top = p.top + t.outerHeight(); + this.removeClass('drop-left'); + } + + return {left : p.left - this.outerWidth(), top : p.top}; + }, + + right : function (t, s) { + var p = Foundation.libs.dropdown.dirs._base.call(this, t, s); + + this.addClass('drop-right'); + + if (p.missRight == true) { + p.left = p.left - this.outerWidth(); + p.top = p.top + t.outerHeight(); + this.removeClass('drop-right'); + } else { + p.triggeredRight = true; + } + + var self = Foundation.libs.dropdown; + + if (t.outerWidth() < this.outerWidth() || self.small() || this.hasClass(s.mega_menu)) { + self.adjust_pip(this, t, s, p); + } + + return {left : p.left + t.outerWidth(), top : p.top}; + } + }, + + // Insert rule to style psuedo elements + adjust_pip : function (dropdown, target, settings, position) { + var sheet = Foundation.stylesheet, + pip_offset_base = 8; + + if (dropdown.hasClass(settings.mega_class)) { + pip_offset_base = position.left + (target.outerWidth() / 2) - 8; + } else if (this.small()) { + pip_offset_base += position.left - 8; + } + + this.rule_idx = sheet.cssRules.length; + + //default + var sel_before = '.f-dropdown.open:before', + sel_after = '.f-dropdown.open:after', + css_before = 'left: ' + pip_offset_base + 'px;', + css_after = 'left: ' + (pip_offset_base - 1) + 'px;'; + + if (position.missRight == true) { + pip_offset_base = dropdown.outerWidth() - 23; + sel_before = '.f-dropdown.open:before', + sel_after = '.f-dropdown.open:after', + css_before = 'left: ' + pip_offset_base + 'px;', + css_after = 'left: ' + (pip_offset_base - 1) + 'px;'; + } + + //just a case where right is fired, but its not missing right + if (position.triggeredRight == true) { + sel_before = '.f-dropdown.open:before', + sel_after = '.f-dropdown.open:after', + css_before = 'left:-12px;', + css_after = 'left:-14px;'; + } + + if (sheet.insertRule) { + sheet.insertRule([sel_before, '{', css_before, '}'].join(' '), this.rule_idx); + sheet.insertRule([sel_after, '{', css_after, '}'].join(' '), this.rule_idx + 1); + } else { + sheet.addRule(sel_before, css_before, this.rule_idx); + sheet.addRule(sel_after, css_after, this.rule_idx + 1); + } + }, + + // Remove old dropdown rule index + clear_idx : function () { + var sheet = Foundation.stylesheet; + + if (typeof this.rule_idx !== 'undefined') { + sheet.deleteRule(this.rule_idx); + sheet.deleteRule(this.rule_idx); + delete this.rule_idx; + } + }, + + small : function () { + return matchMedia(Foundation.media_queries.small).matches && + !matchMedia(Foundation.media_queries.medium).matches; + }, + + off : function () { + this.S(this.scope).off('.fndtn.dropdown'); + this.S('html, body').off('.fndtn.dropdown'); + this.S(window).off('.fndtn.dropdown'); + this.S('[data-dropdown-content]').off('.fndtn.dropdown'); + }, + + reflow : function () {} + }; +}(jQuery, window, window.document)); diff --git a/static/js/foundation.js b/static/js/foundation.js new file mode 100644 index 000000000..c5a359d3b --- /dev/null +++ b/static/js/foundation.js @@ -0,0 +1,732 @@ +/* + * Foundation Responsive Library + * http://foundation.zurb.com + * Copyright 2015, ZURB + * Free to use under the MIT license. + * http://www.opensource.org/licenses/mit-license.php +*/ + +(function ($, window, document, undefined) { + 'use strict'; + + var header_helpers = function (class_array) { + var head = $('head'); + head.prepend($.map(class_array, function (class_name) { + if (head.has('.' + class_name).length === 0) { + return ''; + } + })); + }; + + header_helpers([ + 'foundation-mq-small', + 'foundation-mq-small-only', + 'foundation-mq-medium', + 'foundation-mq-medium-only', + 'foundation-mq-large', + 'foundation-mq-large-only', + 'foundation-mq-xlarge', + 'foundation-mq-xlarge-only', + 'foundation-mq-xxlarge', + 'foundation-data-attribute-namespace']); + + // Enable FastClick if present + + $(function () { + if (typeof FastClick !== 'undefined') { + // Don't attach to body if undefined + if (typeof document.body !== 'undefined') { + FastClick.attach(document.body); + } + } + }); + + // private Fast Selector wrapper, + // returns jQuery object. Only use where + // getElementById is not available. + var S = function (selector, context) { + if (typeof selector === 'string') { + if (context) { + var cont; + if (context.jquery) { + cont = context[0]; + if (!cont) { + return context; + } + } else { + cont = context; + } + return $(cont.querySelectorAll(selector)); + } + + return $(document.querySelectorAll(selector)); + } + + return $(selector, context); + }; + + // Namespace functions. + + var attr_name = function (init) { + var arr = []; + if (!init) { + arr.push('data'); + } + if (this.namespace.length > 0) { + arr.push(this.namespace); + } + arr.push(this.name); + + return arr.join('-'); + }; + + var add_namespace = function (str) { + var parts = str.split('-'), + i = parts.length, + arr = []; + + while (i--) { + if (i !== 0) { + arr.push(parts[i]); + } else { + if (this.namespace.length > 0) { + arr.push(this.namespace, parts[i]); + } else { + arr.push(parts[i]); + } + } + } + + return arr.reverse().join('-'); + }; + + // Event binding and data-options updating. + + var bindings = function (method, options) { + var self = this, + bind = function(){ + var $this = S(this), + should_bind_events = !$this.data(self.attr_name(true) + '-init'); + $this.data(self.attr_name(true) + '-init', $.extend({}, self.settings, (options || method), self.data_options($this))); + + if (should_bind_events) { + self.events(this); + } + }; + + if (S(this.scope).is('[' + this.attr_name() +']')) { + bind.call(this.scope); + } else { + S('[' + this.attr_name() +']', this.scope).each(bind); + } + // # Patch to fix #5043 to move this *after* the if/else clause in order for Backbone and similar frameworks to have improved control over event binding and data-options updating. + if (typeof method === 'string') { + return this[method].call(this, options); + } + + }; + + var single_image_loaded = function (image, callback) { + function loaded () { + callback(image[0]); + } + + function bindLoad () { + this.one('load', loaded); + + if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { + var src = this.attr( 'src' ), + param = src.match( /\?/ ) ? '&' : '?'; + + param += 'random=' + (new Date()).getTime(); + this.attr('src', src + param); + } + } + + if (!image.attr('src')) { + loaded(); + return; + } + + if (image[0].complete || image[0].readyState === 4) { + loaded(); + } else { + bindLoad.call(image); + } + }; + + /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */ + + window.matchMedia || (window.matchMedia = function() { + "use strict"; + + // For browsers that support matchMedium api such as IE 9 and webkit + var styleMedia = (window.styleMedia || window.media); + + // For those that don't support matchMedium + if (!styleMedia) { + var style = document.createElement('style'), + script = document.getElementsByTagName('script')[0], + info = null; + + style.type = 'text/css'; + style.id = 'matchmediajs-test'; + + script.parentNode.insertBefore(style, script); + + // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers + info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle; + + styleMedia = { + matchMedium: function(media) { + var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; + + // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers + if (style.styleSheet) { + style.styleSheet.cssText = text; + } else { + style.textContent = text; + } + + // Test if media query is true or false + return info.width === '1px'; + } + }; + } + + return function(media) { + return { + matches: styleMedia.matchMedium(media || 'all'), + media: media || 'all' + }; + }; + }()); + + /* + * jquery.requestAnimationFrame + * https://github.com/gnarf37/jquery-requestAnimationFrame + * Requires jQuery 1.8+ + * + * Copyright (c) 2012 Corey Frang + * Licensed under the MIT license. + */ + + (function(jQuery) { + + + // requestAnimationFrame polyfill adapted from Erik Möller + // fixes from Paul Irish and Tino Zijdel + // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating + + var animating, + lastTime = 0, + vendors = ['webkit', 'moz'], + requestAnimationFrame = window.requestAnimationFrame, + cancelAnimationFrame = window.cancelAnimationFrame, + jqueryFxAvailable = 'undefined' !== typeof jQuery.fx; + + for (; lastTime < vendors.length && !requestAnimationFrame; lastTime++) { + requestAnimationFrame = window[ vendors[lastTime] + 'RequestAnimationFrame' ]; + cancelAnimationFrame = cancelAnimationFrame || + window[ vendors[lastTime] + 'CancelAnimationFrame' ] || + window[ vendors[lastTime] + 'CancelRequestAnimationFrame' ]; + } + + function raf() { + if (animating) { + requestAnimationFrame(raf); + + if (jqueryFxAvailable) { + jQuery.fx.tick(); + } + } + } + + if (requestAnimationFrame) { + // use rAF + window.requestAnimationFrame = requestAnimationFrame; + window.cancelAnimationFrame = cancelAnimationFrame; + + if (jqueryFxAvailable) { + jQuery.fx.timer = function (timer) { + if (timer() && jQuery.timers.push(timer) && !animating) { + animating = true; + raf(); + } + }; + + jQuery.fx.stop = function () { + animating = false; + }; + } + } else { + // polyfill + window.requestAnimationFrame = function (callback) { + var currTime = new Date().getTime(), + timeToCall = Math.max(0, 16 - (currTime - lastTime)), + id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + + window.cancelAnimationFrame = function (id) { + clearTimeout(id); + }; + + } + + }( $ )); + + function removeQuotes (string) { + if (typeof string === 'string' || string instanceof String) { + string = string.replace(/^['\\/"]+|(;\s?})+|['\\/"]+$/g, ''); + } + + return string; + } + + function MediaQuery(selector) { + this.selector = selector; + this.query = ''; + } + + MediaQuery.prototype.toString = function () { + return this.query || (this.query = S(this.selector).css('font-family').replace(/^[\/\\'"]+|(;\s?})+|[\/\\'"]+$/g, '')); + }; + + window.Foundation = { + name : 'Foundation', + + version : '5.5.3', + + media_queries : { + 'small' : new MediaQuery('.foundation-mq-small'), + 'small-only' : new MediaQuery('.foundation-mq-small-only'), + 'medium' : new MediaQuery('.foundation-mq-medium'), + 'medium-only' : new MediaQuery('.foundation-mq-medium-only'), + 'large' : new MediaQuery('.foundation-mq-large'), + 'large-only' : new MediaQuery('.foundation-mq-large-only'), + 'xlarge' : new MediaQuery('.foundation-mq-xlarge'), + 'xlarge-only' : new MediaQuery('.foundation-mq-xlarge-only'), + 'xxlarge' : new MediaQuery('.foundation-mq-xxlarge') + }, + + stylesheet : $('').appendTo('head')[0].sheet, + + global : { + namespace : undefined + }, + + init : function (scope, libraries, method, options, response) { + var args = [scope, method, options, response], + responses = []; + + // check RTL + this.rtl = /rtl/i.test(S('html').attr('dir')); + + // set foundation global scope + this.scope = scope || this.scope; + + this.set_namespace(); + + if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) { + if (this.libs.hasOwnProperty(libraries)) { + responses.push(this.init_lib(libraries, args)); + } + } else { + for (var lib in this.libs) { + responses.push(this.init_lib(lib, libraries)); + } + } + + S(window).load(function () { + S(window) + .trigger('resize.fndtn.clearing') + .trigger('resize.fndtn.dropdown') + .trigger('resize.fndtn.equalizer') + .trigger('resize.fndtn.interchange') + .trigger('resize.fndtn.joyride') + .trigger('resize.fndtn.magellan') + .trigger('resize.fndtn.topbar') + .trigger('resize.fndtn.slider'); + }); + + return scope; + }, + + init_lib : function (lib, args) { + if (this.libs.hasOwnProperty(lib)) { + this.patch(this.libs[lib]); + + if (args && args.hasOwnProperty(lib)) { + if (typeof this.libs[lib].settings !== 'undefined') { + $.extend(true, this.libs[lib].settings, args[lib]); + } else if (typeof this.libs[lib].defaults !== 'undefined') { + $.extend(true, this.libs[lib].defaults, args[lib]); + } + return this.libs[lib].init.apply(this.libs[lib], [this.scope, args[lib]]); + } + + args = args instanceof Array ? args : new Array(args); + return this.libs[lib].init.apply(this.libs[lib], args); + } + + return function () {}; + }, + + patch : function (lib) { + lib.scope = this.scope; + lib.namespace = this.global.namespace; + lib.rtl = this.rtl; + lib['data_options'] = this.utils.data_options; + lib['attr_name'] = attr_name; + lib['add_namespace'] = add_namespace; + lib['bindings'] = bindings; + lib['S'] = this.utils.S; + }, + + inherit : function (scope, methods) { + var methods_arr = methods.split(' '), + i = methods_arr.length; + + while (i--) { + if (this.utils.hasOwnProperty(methods_arr[i])) { + scope[methods_arr[i]] = this.utils[methods_arr[i]]; + } + } + }, + + set_namespace : function () { + + // Description: + // Don't bother reading the namespace out of the meta tag + // if the namespace has been set globally in javascript + // + // Example: + // Foundation.global.namespace = 'my-namespace'; + // or make it an empty string: + // Foundation.global.namespace = ''; + // + // + + // If the namespace has not been set (is undefined), try to read it out of the meta element. + // Otherwise use the globally defined namespace, even if it's empty ('') + var namespace = ( this.global.namespace === undefined ) ? $('.foundation-data-attribute-namespace').css('font-family') : this.global.namespace; + + // Finally, if the namsepace is either undefined or false, set it to an empty string. + // Otherwise use the namespace value. + this.global.namespace = ( namespace === undefined || /false/i.test(namespace) ) ? '' : namespace; + }, + + libs : {}, + + // methods that can be inherited in libraries + utils : { + + // Description: + // Fast Selector wrapper returns jQuery object. Only use where getElementById + // is not available. + // + // Arguments: + // Selector (String): CSS selector describing the element(s) to be + // returned as a jQuery object. + // + // Scope (String): CSS selector describing the area to be searched. Default + // is document. + // + // Returns: + // Element (jQuery Object): jQuery object containing elements matching the + // selector within the scope. + S : S, + + // Description: + // Executes a function a max of once every n milliseconds + // + // Arguments: + // Func (Function): Function to be throttled. + // + // Delay (Integer): Function execution threshold in milliseconds. + // + // Returns: + // Lazy_function (Function): Function with throttling applied. + throttle : function (func, delay) { + var timer = null; + + return function () { + var context = this, args = arguments; + + if (timer == null) { + timer = setTimeout(function () { + func.apply(context, args); + timer = null; + }, delay); + } + }; + }, + + // Description: + // Executes a function when it stops being invoked for n seconds + // Modified version of _.debounce() http://underscorejs.org + // + // Arguments: + // Func (Function): Function to be debounced. + // + // Delay (Integer): Function execution threshold in milliseconds. + // + // Immediate (Bool): Whether the function should be called at the beginning + // of the delay instead of the end. Default is false. + // + // Returns: + // Lazy_function (Function): Function with debouncing applied. + debounce : function (func, delay, immediate) { + var timeout, result; + return function () { + var context = this, args = arguments; + var later = function () { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + var callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, delay); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + + // Description: + // Parses data-options attribute + // + // Arguments: + // El (jQuery Object): Element to be parsed. + // + // Returns: + // Options (Javascript Object): Contents of the element's data-options + // attribute. + data_options : function (el, data_attr_name) { + data_attr_name = data_attr_name || 'options'; + var opts = {}, ii, p, opts_arr, + data_options = function (el) { + var namespace = Foundation.global.namespace; + + if (namespace.length > 0) { + return el.data(namespace + '-' + data_attr_name); + } + + return el.data(data_attr_name); + }; + + var cached_options = data_options(el); + + if (typeof cached_options === 'object') { + return cached_options; + } + + opts_arr = (cached_options || ':').split(';'); + ii = opts_arr.length; + + function isNumber (o) { + return !isNaN (o - 0) && o !== null && o !== '' && o !== false && o !== true; + } + + function trim (str) { + if (typeof str === 'string') { + return $.trim(str); + } + return str; + } + + while (ii--) { + p = opts_arr[ii].split(':'); + p = [p[0], p.slice(1).join(':')]; + + if (/true/i.test(p[1])) { + p[1] = true; + } + if (/false/i.test(p[1])) { + p[1] = false; + } + if (isNumber(p[1])) { + if (p[1].indexOf('.') === -1) { + p[1] = parseInt(p[1], 10); + } else { + p[1] = parseFloat(p[1]); + } + } + + if (p.length === 2 && p[0].length > 0) { + opts[trim(p[0])] = trim(p[1]); + } + } + + return opts; + }, + + // Description: + // Adds JS-recognizable media queries + // + // Arguments: + // Media (String): Key string for the media query to be stored as in + // Foundation.media_queries + // + // Class (String): Class name for the generated tag + register_media : function (media, media_class) { + if (Foundation.media_queries[media] === undefined) { + $('head').append(''); + Foundation.media_queries[media] = removeQuotes($('.' + media_class).css('font-family')); + } + }, + + // Description: + // Add custom CSS within a JS-defined media query + // + // Arguments: + // Rule (String): CSS rule to be appended to the document. + // + // Media (String): Optional media query string for the CSS rule to be + // nested under. + add_custom_rule : function (rule, media) { + if (media === undefined && Foundation.stylesheet) { + Foundation.stylesheet.insertRule(rule, Foundation.stylesheet.cssRules.length); + } else { + var query = Foundation.media_queries[media]; + + if (query !== undefined) { + Foundation.stylesheet.insertRule('@media ' + + Foundation.media_queries[media] + '{ ' + rule + ' }', Foundation.stylesheet.cssRules.length); + } + } + }, + + // Description: + // Performs a callback function when an image is fully loaded + // + // Arguments: + // Image (jQuery Object): Image(s) to check if loaded. + // + // Callback (Function): Function to execute when image is fully loaded. + image_loaded : function (images, callback) { + var self = this, + unloaded = images.length; + + function pictures_has_height(images) { + var pictures_number = images.length; + + for (var i = pictures_number - 1; i >= 0; i--) { + if(images.attr('height') === undefined) { + return false; + }; + }; + + return true; + } + + if (unloaded === 0 || pictures_has_height(images)) { + callback(images); + } + + images.each(function () { + single_image_loaded(self.S(this), function () { + unloaded -= 1; + if (unloaded === 0) { + callback(images); + } + }); + }); + }, + + // Description: + // Returns a random, alphanumeric string + // + // Arguments: + // Length (Integer): Length of string to be generated. Defaults to random + // integer. + // + // Returns: + // Rand (String): Pseudo-random, alphanumeric string. + random_str : function () { + if (!this.fidx) { + this.fidx = 0; + } + this.prefix = this.prefix || [(this.name || 'F'), (+new Date).toString(36)].join('-'); + + return this.prefix + (this.fidx++).toString(36); + }, + + // Description: + // Helper for window.matchMedia + // + // Arguments: + // mq (String): Media query + // + // Returns: + // (Boolean): Whether the media query passes or not + match : function (mq) { + return window.matchMedia(mq).matches; + }, + + // Description: + // Helpers for checking Foundation default media queries with JS + // + // Returns: + // (Boolean): Whether the media query passes or not + + is_small_up : function () { + return this.match(Foundation.media_queries.small); + }, + + is_medium_up : function () { + return this.match(Foundation.media_queries.medium); + }, + + is_large_up : function () { + return this.match(Foundation.media_queries.large); + }, + + is_xlarge_up : function () { + return this.match(Foundation.media_queries.xlarge); + }, + + is_xxlarge_up : function () { + return this.match(Foundation.media_queries.xxlarge); + }, + + is_small_only : function () { + return !this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); + }, + + is_medium_only : function () { + return this.is_medium_up() && !this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); + }, + + is_large_only : function () { + return this.is_medium_up() && this.is_large_up() && !this.is_xlarge_up() && !this.is_xxlarge_up(); + }, + + is_xlarge_only : function () { + return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && !this.is_xxlarge_up(); + }, + + is_xxlarge_only : function () { + return this.is_medium_up() && this.is_large_up() && this.is_xlarge_up() && this.is_xxlarge_up(); + } + } + }; + + $.fn.foundation = function () { + var args = Array.prototype.slice.call(arguments, 0); + + return this.each(function () { + Foundation.init.apply(Foundation, [this].concat(args)); + return this; + }); + }; + +}(jQuery, window, window.document)); diff --git a/static/js/foundation.offcanvas.js b/static/js/foundation.offcanvas.js new file mode 100644 index 000000000..685e9a03a --- /dev/null +++ b/static/js/foundation.offcanvas.js @@ -0,0 +1,225 @@ +;(function ($, window, document, undefined) { + 'use strict'; + + Foundation.libs.offcanvas = { + name : 'offcanvas', + + version : '5.5.3', + + settings : { + open_method : 'move', + close_on_click : false + }, + + init : function (scope, method, options) { + this.bindings(method, options); + }, + + events : function () { + var self = this, + S = self.S, + move_class = '', + right_postfix = '', + left_postfix = '', + top_postfix = '', + bottom_postfix = ''; + + if (this.settings.open_method === 'move') { + move_class = 'move-'; + right_postfix = 'right'; + left_postfix = 'left'; + top_postfix = 'top'; + bottom_postfix = 'bottom'; + } else if (this.settings.open_method === 'overlap_single') { + move_class = 'offcanvas-overlap-'; + right_postfix = 'right'; + left_postfix = 'left'; + top_postfix = 'top'; + bottom_postfix = 'bottom'; + } else if (this.settings.open_method === 'overlap') { + move_class = 'offcanvas-overlap'; + } + + S(this.scope).off('.offcanvas') + .on('click.fndtn.offcanvas', '.left-off-canvas-toggle', function (e) { + self.click_toggle_class(e, move_class + right_postfix); + if (self.settings.open_method !== 'overlap') { + S('.left-submenu').removeClass(move_class + right_postfix); + } + $('.left-off-canvas-toggle').attr('aria-expanded', 'true'); + }) + .on('click.fndtn.offcanvas', '.left-off-canvas-menu a', function (e) { + var settings = self.get_settings(e); + var parent = S(this).parent(); + + if (settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')) { + self.hide.call(self, move_class + right_postfix, self.get_wrapper(e)); + parent.parent().removeClass(move_class + right_postfix); + } else if (S(this).parent().hasClass('has-submenu')) { + e.preventDefault(); + S(this).siblings('.left-submenu').toggleClass(move_class + right_postfix); + } else if (parent.hasClass('back')) { + e.preventDefault(); + parent.parent().removeClass(move_class + right_postfix); + } + $('.left-off-canvas-toggle').attr('aria-expanded', 'true'); + }) + //end of left canvas + .on('click.fndtn.offcanvas', '.right-off-canvas-toggle', function (e) { + self.click_toggle_class(e, move_class + left_postfix); + if (self.settings.open_method !== 'overlap') { + S('.right-submenu').removeClass(move_class + left_postfix); + } + $('.right-off-canvas-toggle').attr('aria-expanded', 'true'); + }) + .on('click.fndtn.offcanvas', '.right-off-canvas-menu a', function (e) { + var settings = self.get_settings(e); + var parent = S(this).parent(); + + if (settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')) { + self.hide.call(self, move_class + left_postfix, self.get_wrapper(e)); + parent.parent().removeClass(move_class + left_postfix); + } else if (S(this).parent().hasClass('has-submenu')) { + e.preventDefault(); + S(this).siblings('.right-submenu').toggleClass(move_class + left_postfix); + } else if (parent.hasClass('back')) { + e.preventDefault(); + parent.parent().removeClass(move_class + left_postfix); + } + $('.right-off-canvas-toggle').attr('aria-expanded', 'true'); + }) + //end of right canvas + .on('click.fndtn.offcanvas', '.top-off-canvas-toggle', function (e) { + self.click_toggle_class(e, move_class + bottom_postfix); + if (self.settings.open_method !== 'overlap') { + S('.top-submenu').removeClass(move_class + bottom_postfix); + } + $('.top-off-canvas-toggle').attr('aria-expanded', 'true'); + }) + .on('click.fndtn.offcanvas', '.top-off-canvas-menu a', function (e) { + var settings = self.get_settings(e); + var parent = S(this).parent(); + + if (settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')) { + self.hide.call(self, move_class + bottom_postfix, self.get_wrapper(e)); + parent.parent().removeClass(move_class + bottom_postfix); + } else if (S(this).parent().hasClass('has-submenu')) { + e.preventDefault(); + S(this).siblings('.top-submenu').toggleClass(move_class + bottom_postfix); + } else if (parent.hasClass('back')) { + e.preventDefault(); + parent.parent().removeClass(move_class + bottom_postfix); + } + $('.top-off-canvas-toggle').attr('aria-expanded', 'true'); + }) + //end of top canvas + .on('click.fndtn.offcanvas', '.bottom-off-canvas-toggle', function (e) { + self.click_toggle_class(e, move_class + top_postfix); + if (self.settings.open_method !== 'overlap') { + S('.bottom-submenu').removeClass(move_class + top_postfix); + } + $('.bottom-off-canvas-toggle').attr('aria-expanded', 'true'); + }) + .on('click.fndtn.offcanvas', '.bottom-off-canvas-menu a', function (e) { + var settings = self.get_settings(e); + var parent = S(this).parent(); + + if (settings.close_on_click && !parent.hasClass('has-submenu') && !parent.hasClass('back')) { + self.hide.call(self, move_class + top_postfix, self.get_wrapper(e)); + parent.parent().removeClass(move_class + top_postfix); + } else if (S(this).parent().hasClass('has-submenu')) { + e.preventDefault(); + S(this).siblings('.bottom-submenu').toggleClass(move_class + top_postfix); + } else if (parent.hasClass('back')) { + e.preventDefault(); + parent.parent().removeClass(move_class + top_postfix); + } + $('.bottom-off-canvas-toggle').attr('aria-expanded', 'true'); + }) + //end of bottom + .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { + self.click_remove_class(e, move_class + left_postfix); + S('.right-submenu').removeClass(move_class + left_postfix); + if (right_postfix) { + self.click_remove_class(e, move_class + right_postfix); + S('.left-submenu').removeClass(move_class + left_postfix); + } + $('.right-off-canvas-toggle').attr('aria-expanded', 'true'); + }) + .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { + self.click_remove_class(e, move_class + left_postfix); + $('.left-off-canvas-toggle').attr('aria-expanded', 'false'); + if (right_postfix) { + self.click_remove_class(e, move_class + right_postfix); + $('.right-off-canvas-toggle').attr('aria-expanded', 'false'); + } + }) + .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { + self.click_remove_class(e, move_class + top_postfix); + S('.bottom-submenu').removeClass(move_class + top_postfix); + if (bottom_postfix) { + self.click_remove_class(e, move_class + bottom_postfix); + S('.top-submenu').removeClass(move_class + top_postfix); + } + $('.bottom-off-canvas-toggle').attr('aria-expanded', 'true'); + }) + .on('click.fndtn.offcanvas', '.exit-off-canvas', function (e) { + self.click_remove_class(e, move_class + top_postfix); + $('.top-off-canvas-toggle').attr('aria-expanded', 'false'); + if (bottom_postfix) { + self.click_remove_class(e, move_class + bottom_postfix); + $('.bottom-off-canvas-toggle').attr('aria-expanded', 'false'); + } + }); + }, + + toggle : function (class_name, $off_canvas) { + $off_canvas = $off_canvas || this.get_wrapper(); + if ($off_canvas.is('.' + class_name)) { + this.hide(class_name, $off_canvas); + } else { + this.show(class_name, $off_canvas); + } + }, + + show : function (class_name, $off_canvas) { + $off_canvas = $off_canvas || this.get_wrapper(); + $off_canvas.trigger('open.fndtn.offcanvas'); + $off_canvas.addClass(class_name); + }, + + hide : function (class_name, $off_canvas) { + $off_canvas = $off_canvas || this.get_wrapper(); + $off_canvas.trigger('close.fndtn.offcanvas'); + $off_canvas.removeClass(class_name); + }, + + click_toggle_class : function (e, class_name) { + e.preventDefault(); + var $off_canvas = this.get_wrapper(e); + this.toggle(class_name, $off_canvas); + }, + + click_remove_class : function (e, class_name) { + e.preventDefault(); + var $off_canvas = this.get_wrapper(e); + this.hide(class_name, $off_canvas); + }, + + get_settings : function (e) { + var offcanvas = this.S(e.target).closest('[' + this.attr_name() + ']'); + return offcanvas.data(this.attr_name(true) + '-init') || this.settings; + }, + + get_wrapper : function (e) { + var $off_canvas = this.S(e ? e.target : this.scope).closest('.off-canvas-wrap'); + + if ($off_canvas.length === 0) { + $off_canvas = this.S('.off-canvas-wrap'); + } + return $off_canvas; + }, + + reflow : function () {} + }; +}(jQuery, window, window.document)); diff --git a/static/js/headroom.min.js b/static/js/headroom.min.js new file mode 100644 index 000000000..fcf9c18b2 --- /dev/null +++ b/static/js/headroom.min.js @@ -0,0 +1,7 @@ +/*! + * headroom.js v0.7.0 - Give your page some headroom. Hide your header until you need it + * Copyright (c) 2014 Nick Williams - http://wicky.nillia.ms/headroom.js + * License: MIT + */ + +!function(a,b){"use strict";function c(a){this.callback=a,this.ticking=!1}function d(b){return b&&"undefined"!=typeof a&&(b===a||b.nodeType)}function e(a){if(arguments.length<=0)throw new Error("Missing arguments in extend function");var b,c,f=a||{};for(c=1;ca,c=a+this.getViewportHeight()>this.getScrollerHeight();return b||c},toleranceExceeded:function(a,b){return Math.abs(a-this.lastKnownScrollY)>=this.tolerance[b]},shouldUnpin:function(a,b){var c=a>this.lastKnownScrollY,d=a>=this.offset;return c&&d&&b},shouldPin:function(a,b){var c=athis.lastKnownScrollY?"down":"up",c=this.toleranceExceeded(a,b);this.isOutOfBounds(a)||(a<=this.offset?this.top():this.notTop(),this.shouldUnpin(a,c)?this.unpin():this.shouldPin(a,c)&&this.pin(),this.lastKnownScrollY=a)}},g.options={tolerance:{up:0,down:0},offset:0,scroller:a,classes:{pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",initial:"headroom"}},g.cutsTheMustard="undefined"!=typeof h&&h.rAF&&h.bind&&h.classList,a.Headroom=g}(window,document); \ No newline at end of file diff --git a/static/js/jquery-1.12.4.min.js b/static/js/jquery-1.12.4.min.js new file mode 100644 index 000000000..e83647587 --- /dev/null +++ b/static/js/jquery-1.12.4.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; +}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"

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 QE_i6DYG2H|a5L!t0n>cgxBvhE literal 0 HcmV?d00001 diff --git a/diagrams/Workflow_Overview.png b/diagrams/Workflow_Overview.png new file mode 100644 index 0000000000000000000000000000000000000000..eee9c1b4eb5a9255d29a5a84e037b8bd94b7eea9 GIT binary patch literal 36630 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 + + + + + + + + + + + + + + + + + Architecture Diagrams - Drycc Workflow Documentation + + + + + + + +