- `clever_env_output_file`: as a post deploy task you might need to retrieve the full Clever environment configuration (i.e. with addon env variables). If this variable is set to a filename then the env will be retrieved after a successful deploy and written to this file. Beware, the resulting file will contain sensitive information (addon passwords, …). Optional.
- `clever_build_flavor`: an optional text value used to configure the size of the dedicated build instance (for instance `S` or `XL`). If not defined, it delegates to clever cloud default behaviour. Setting `disabled` disables the dedicated build instance altogether.
- `clever_scaling`: an optional object used to configure the runtime instances flavours and numbers. If not defined, it delegates to clever cloud default behaviour.
+- `clever_service_dependencies`: a list of the service dependencies needed by the application (each service being a dict containing either an `app_id` field, or an `addon_id` field), optional.<br/>
+ Example: `[{ addon_id: addon_00000000-0000-0000-0000-000000000000 }, { app_id: app_00000000-0000-0000-0000-000000000000 }]`
Variables specific to deployment, defaults should be fine:
# example
# clever_addons:
# - name: pg
-# - env_prefix: POSTGRESQL_ADDON
+# env_prefix: POSTGRESQL_ADDON
+
+clever_service_dependencies: []
+# example
+# clever_service_dependencies:
+# - addon_id: addon_00000000-0000-0000-0000-000000000000
+# - app_id: app_00000000-0000-0000-0000-000000000000
let Addon = (./Addon.dhall).Type
+let ServiceDependency = (./ServiceDependency.dhall).Type
+
let Vault = ./Vault.dhall
let FixedOrRange =
, clever_haskell_entry_point : Optional Text
, clever_disable_metrics : Bool
, clever_addons : List Addon
+ , clever_service_dependencies : List ServiceDependency
, clever_env : Environment
, clever_build_flavor : Optional Text
, clever_scaling : Optional ScalingParameters
, clever_haskell_entry_point = None Text
, clever_disable_metrics = False
, clever_addons = [] : List Addon
+ , clever_service_dependencies = [] : List ServiceDependency
, clever_env = {=}
, clever_build_flavor = None Text
, clever_scaling = None ScalingParameters
--- /dev/null
+let ServiceDependency =
+ < Addon : { addon_id : Text } | Application : { app_id : Text } >
+
+let addon = λ(addon_id : Text) → ServiceDependency.Addon { addon_id = addon_id }
+
+let application =
+ λ(app_id : Text) → ServiceDependency.Application { app_id = app_id }
+
+in { Type = ServiceDependency, addon = addon, application = application }
-{ Addon = ./Addon.dhall, Config = ./Config.dhall, Vault = ./Vault.dhall }
+{ Addon = ./Addon.dhall
+, ServiceDependency = ./ServiceDependency.dhall
+, Config = ./Config.dhall
+, Vault = ./Vault.dhall
+}
-- name: Gather addon information for {{ addon.name }} (clever --version < 1.5.0)
- shell: >
- set -o pipefail &&
- clever env | grep {{ addon.env_prefix }}
- | sed -e 's/{{ addon.env_prefix }}_//' -e 's/=/: \"/' -e 's/$/\"/'
- > {{ clever_app_confdir }}/{{ addon.name }}_env.yml
- args:
- chdir: "{{ clever_app_root }}"
- executable: "bash"
- environment:
- CONFIGURATION_FILE: "{{ clever_login_file }}"
- changed_when: False
- when: clever_returned_version.stdout is version('1.5.0', '<')
-
-- name: Gather addon information for {{ addon.name }} (clever --version >= 1.5.0)
+- name: Gather addon information for {{ addon.name }}
shell: >
set -o pipefail &&
clever env | grep {{ addon.env_prefix }}
environment:
CONFIGURATION_FILE: "{{ clever_login_file }}"
changed_when: False
- when: clever_returned_version.stdout is version('1.5.0', '>=')
- name: Include addon var for {{ addon.name }}
include_vars:
MIN_FLAVOR: "{{ clever_scaling.flavor.min | default('') }}"
MAX_FLAVOR: "{{ clever_scaling.flavor.max | default('') }}"
+- name: Configure service dependencies
+ include_tasks: service-dep.yml
+ vars:
+ service_dep: "{{ item }}"
+ with_items: "{{ clever_service_dependencies }}"
+
- name: Push Environment
shell: "clever env import --json < {{ clever_app_confdir }}/env"
args:
--- /dev/null
+- name: Make sure addon {{ service_dep.addon_id }} is linked
+ shell: >
+ clever service link-addon {{ service_dep.addon_id }}
+ args:
+ chdir: "{{ clever_app_root }}"
+ environment:
+ CONFIGURATION_FILE: "{{ clever_login_file }}"
+ when: service_dep.addon_id is defined
+
+- name: Make sure app {{ service_dep.app_id }} is linked
+ shell: >
+ clever service link-app {{ service_dep.app_id }}
+ args:
+ chdir: "{{ clever_app_root }}"
+ environment:
+ CONFIGURATION_FILE: "{{ clever_login_file }}"
+ when: service_dep.app_id is defined
- import_playbook: ./test-haskell-app.yml
- import_playbook: ./test-noop-deploy.yml
- import_playbook: ./test-scalability.yml
+- import_playbook: ./test-service-deps.yml
- import_playbook: ./test-restart-app.yml
--- /dev/null
+---
+- name: Deploy an app & configure service dependencies on clever
+ hosts: localhost
+ remote_user: root
+ pre_tasks:
+ - file:
+ state: absent
+ path: ../clever-commands
+ roles:
+ - role: clever
+ vars:
+ clever_token: 123abc
+ clever_secret: cba321
+ clever_app: app_00000000-0000-0000-0000-000000000000
+ clever_service_dependencies:
+ - app_id: app_00000000-2222-2222-2222-000000000000
+ - addon_id: addon_00000000-0000-0000-0000-000000000000
+ post_tasks:
+ - name: Check stubbed commands
+ shell: "{{ item.cmd }}"
+ ignore_errors: true
+ vars:
+ display: "{{ item.display }}"
+ with_list:
+ - cmd: "grep service ../clever-commands"
+ display: "Expected 'clever service' command to be called"
+ register: tests_results
+ - name: show results
+ debug:
+ msg:
+ - "failed_results: {{ failed_results }}"
+ - "success_results: {{ success_results }}"
+ failed_when: tests_results is failed
+ vars:
+ failed_results: "{{ tests_results.results | selectattr('failed') | map(attribute='item.display') | list }}"
+ success_results: "{{ tests_results.results | rejectattr('failed') | map(attribute='item.display') | list }}"