- `clever_disable_metrics`: a boolean to disable metrics support. Optional, default to `false`.
- `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 inside this file. 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.
Variables specific to deployment, default should be fine:
- `clever_cli_version`: Version of clever cli tools, default to `2.6.1`.
- `clever_app_confdir`: Path where to store clever cloud data specific to this application, default to `"{{ clever_app_root }}/.clever_cloud"`
- `clever_login_file`: Path to store login information. Default to `"{{ clever_app_confdir }}/login"`.
+Scaling configuration
+---------------------
+
+```yaml
+clever_scaling:
+ # instances and flavors are optional and can be configured as
+ # either a fixed value (with `fixed`) or a range # (with `min` and `max`)
+ flavors:
+ fixed: XS
+ instances:
+ min: 2
+ max: 5
+```
+
Dependencies
------------
let Vault = ./Vault.dhall
+let FixedOrRange =
+ λ(t : Type) → < Fixed : { fixed : t } | Range : { min : t, max : t } >
+
+let fixed = λ(t : Type) → λ(f : t) → (FixedOrRange t).Fixed { fixed = f }
+
+let range = λ(t : Type) → λ(r : { min : t, max : t }) → (FixedOrRange t).Range r
+
+let InstancesConfig = FixedOrRange Natural
+
+let FlavorsConfig = FixedOrRange Text
+
+let ScalingParameters =
+ { flavor : Optional FlavorsConfig, instances : Optional InstancesConfig }
+
let Config =
λ(Environment : Type)
→ { clever_app : Text
, clever_addons : List Addon
, clever_env : Environment
, clever_build_flavor : Optional Text
+ , clever_scaling : Optional ScalingParameters
}
let mkConfig =
, clever_addons = [] : List Addon
, clever_env = {=}
, clever_build_flavor = None Text
+ , clever_scaling = None ScalingParameters
}
: Config {}
-in { Type = Config, mkConfig = mkConfig }
+in { Type = Config
+ , mkConfig = mkConfig
+ , ScalingParameters = ScalingParameters
+ , InstancesConfig = InstancesConfig
+ , FlavorsConfig = FlavorsConfig
+ , fixed = fixed
+ , range = range
+ }
--- /dev/null
+#!/usr/bin/env bash
+
+set -eo pipefail
+params=()
+if [ -n "$INSTANCES" ]; then
+ params+=("--instances" "${INSTANCES}")
+elif [ -n "$MIN_INSTANCES" ] && [ -n "$MAX_INSTANCES" ]; then
+ params+=("--min-instances" "${MIN_INSTANCES}")
+ params+=("--max-instances" "${MAX_INSTANCES}")
+
+fi
+if [ -n "$FLAVOR" ]; then
+ params+=("--flavor" "${FLAVOR}")
+elif [ -n "$MIN_FLAVOR" ] && [ -n "$MAX_FLAVOR" ]; then
+ params+=("--min-flavor" "${MIN_FLAVOR}")
+ params+=("--max-flavor" "${MAX_FLAVOR}")
+fi
+
+clever scale "${params[@]}"
environment:
CONFIGURATION_FILE: "{{ clever_login_file }}"
+- name: Configure Scalability
+ when: clever_scaling is defined
+ command: "{{ ansible_env.HOME }}/{{ clever_user_path }}/clever-set-scalability.sh"
+ args:
+ chdir: "{{ clever_app_root }}"
+ environment:
+ CONFIGURATION_FILE: "{{ clever_login_file }}"
+ INSTANCES: "{{ clever_scaling.instances.fixed | default ('') }}"
+ MIN_INSTANCES: "{{ clever_scaling.instances.min | default('') }}"
+ MAX_INSTANCES: "{{ clever_scaling.instances.max | default('') }}"
+ FLAVOR: "{{ clever_scaling.flavor.fixed | default('') }}"
+ MIN_FLAVOR: "{{ clever_scaling.flavor.min | default('') }}"
+ MAX_FLAVOR: "{{ clever_scaling.flavor.max | default('') }}"
+
- name: Push Environment
shell: "clever env import --json < {{ clever_app_confdir }}/env"
args:
with_items:
- clever-set-domain.sh
- clever-set-drain.sh
+ - clever-set-scalability.sh