]> git.immae.eu Git - github/fretlink/ansible-clever.git/commitdiff
Add support for scalability configuration
authorClement Delafargue <clement.delafargue@fretlink.com>
Fri, 19 Jun 2020 13:39:22 +0000 (15:39 +0200)
committerClement Delafargue <clement.delafargue@fretlink.com>
Mon, 22 Jun 2020 12:41:16 +0000 (14:41 +0200)
Closes #52

README.md
dhall/Config.dhall
files/clever-set-scalability.sh [new file with mode: 0755]
tasks/deploy.yml
tasks/setup.yml

index c0f7959816b6d7ef5a1e7baa546a76806190a9cb..348f36d54a4be556e211b8b7519e53fe67c7aa45 100644 (file)
--- a/README.md
+++ b/README.md
@@ -36,6 +36,7 @@ Variables for the application
 - `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`.
@@ -44,6 +45,20 @@ Variables specific to deployment, default should be fine:
 - `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
 ------------
index e092e2c43a40027332ace1ce096225a15fc29fba..12371f5faf97440256293b3023ddf4cffca1e67d 100644 (file)
@@ -2,6 +2,20 @@ let Addon = (./Addon.dhall).Type
 
 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
@@ -16,6 +30,7 @@ let Config =
         , clever_addons : List Addon
         , clever_env : Environment
         , clever_build_flavor : Optional Text
+        , clever_scaling : Optional ScalingParameters
         }
 
 let mkConfig =
@@ -34,7 +49,15 @@ 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
+    }
diff --git a/files/clever-set-scalability.sh b/files/clever-set-scalability.sh
new file mode 100755 (executable)
index 0000000..34a5a24
--- /dev/null
@@ -0,0 +1,19 @@
+#!/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[@]}"
index ca1e54ae2adaf67605d8e560b03abdc7f2bc5b0e..c56798146de8e8d68f297e5c62a05532cf55f60c 100644 (file)
   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:
index a2d5b900b875d5ae231eb5f030aa4f92375ad1e7..8a11772639258333bfac385f1feda783e9371ae0 100644 (file)
@@ -29,3 +29,4 @@
   with_items:
     - clever-set-domain.sh
     - clever-set-drain.sh
+    - clever-set-scalability.sh