diff --git a/proposals/001-controlled-rollout.md b/proposals/001-controlled-rollout.md new file mode 100644 index 000000000..a970297a8 --- /dev/null +++ b/proposals/001-controlled-rollout.md @@ -0,0 +1,115 @@ +# Controlled Rollout proposal + +## Why + +New features are great, everybody loves them. However, new features come by the hand of new code. New code can have bugs +or it can have performance regressions. + +Features aren't perfect for all users. Sometimes they are perfect for some users and not others. Sometimes they are +perfect for some hosts and not others. + +Rolling out a feature shouldn't always be a binary choice: enabled/disabled. In an ideal world, all features would be +enabled by default, everybody would love them all, and they would work flawlessly for all possible use cases. + +We are in the real world, though, which is not ideal. So we should give people running Fleet tools to rollout features +slowly, so that they can update infrastructure if needed, or only use a feature within the scope that is useful for +them. + +This is a proposal on how this tool could look like and work. + +## How + +We would create a new type of boolean value in our `AppConfig` called `RolloutBoolean`. + +`RolloutBoolean` will have a function `Get(h *fleet.Host) bool`. So instead of doing this: + +```go +if ac.HostSettings.EnableHostUsers { + ... +} +``` + +We would do: + +```go +if ac.HostSettings.EnableHostUsers.Get(host) { + ... +} +``` + +In yaml terms, this is what `RolloutBoolean` would be able to parse: + +1. Regular true/false, 0/1, yes/no values + +```yaml +--- +apiVersion: v1 +kind: config +spec: + host_settings: + enable_software_inventory: false +``` + +2. Only enable a feature for certain teams: + +```yaml +--- +apiVersion: v1 +kind: config +spec: + host_settings: + enable_software_inventory: + default: false + overrides: + teams: + - team1: true + - team2: true +``` + +2. Enabled for all except a specified team: + +```yaml +--- +apiVersion: v1 +kind: config +spec: + host_settings: + enable_software_inventory: + default: true + overrides: + teams: + - team1: false +``` + +3. Enabled only for specific hosts: + +```yaml +--- +apiVersion: v1 +kind: config +spec: + host_settings: + enable_software_inventory: + default: false + overrides: + host_ids: + - 3214: true +``` + +4. Enabled for hosts on a specific platform (as reported by osquery, not in terms of label membership): + +```yaml +--- +apiVersion: v1 +kind: config +spec: + host_settings: + enable_software_inventory: + default: false + overrides: + platforms: + - linux: true +``` + +The `Get(h *Host) bool` function will use the provided host to define whether the feature is enabled or not based on +how it's defined in the configuration. \ No newline at end of file