cpl 1.1.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/rspec.yml +1 -1
- data/CHANGELOG.md +23 -1
- data/CONTRIBUTING.md +2 -6
- data/Gemfile.lock +7 -7
- data/README.md +34 -11
- data/docs/commands.md +13 -5
- data/docs/migrating.md +3 -3
- data/examples/controlplane.yml +63 -4
- data/lib/command/apply_template.rb +2 -1
- data/lib/command/base.rb +31 -0
- data/lib/command/config.rb +0 -5
- data/lib/command/delete.rb +40 -11
- data/lib/command/env.rb +1 -0
- data/lib/command/generate.rb +45 -0
- data/lib/command/info.rb +5 -8
- data/lib/command/latest_image.rb +1 -0
- data/lib/command/maintenance.rb +1 -0
- data/lib/command/no_command.rb +1 -0
- data/lib/command/ps.rb +5 -1
- data/lib/command/run.rb +2 -2
- data/lib/command/run_detached.rb +2 -1
- data/lib/command/setup_app.rb +3 -3
- data/lib/command/version.rb +1 -0
- data/lib/core/config.rb +180 -66
- data/lib/core/controlplane.rb +15 -3
- data/lib/core/controlplane_api.rb +9 -1
- data/lib/core/controlplane_api_direct.rb +18 -2
- data/lib/core/helpers.rb +10 -0
- data/lib/core/shell.rb +25 -3
- data/lib/cpl/version.rb +1 -1
- data/lib/cpl.rb +28 -2
- data/lib/generator_templates/Dockerfile +27 -0
- data/lib/generator_templates/controlplane.yml +57 -0
- data/lib/generator_templates/entrypoint.sh +8 -0
- data/lib/generator_templates/templates/gvc.yml +21 -0
- data/lib/generator_templates/templates/postgres.yml +176 -0
- data/lib/generator_templates/templates/rails.yml +36 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 711286ef49686f6c51df2a94c533b3df94f4d71d3fb6018b6ed61c210593dd47
|
4
|
+
data.tar.gz: '085357faac6b5b27e493049b34c27debab21fa19950af21548fe11889140b557'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac229234f4919d8e1b3485095476ef0fddac04573d8dd03aba6a3737fd5e90b319538e04c51d98e5f33f244fe304c519d949a624a377bbc9ee9067754a0c71dd
|
7
|
+
data.tar.gz: 0ba5203d4f8539dde89a2eb5a52dc92c2098d11bb1914002cd57628081465d08e9842f47546da563bc18edda17fbf12101bfefca8fdcee4088825c0e56ee0fa0
|
data/.github/workflows/rspec.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -14,6 +14,28 @@ Changes since the last non-beta release.
|
|
14
14
|
|
15
15
|
_Please add entries here for your pull requests that are not yet released._
|
16
16
|
|
17
|
+
### Fixed
|
18
|
+
|
19
|
+
- Fixed issue where `info` command does not respect `CPLN_ORG` env var. [PR 88](https://github.com/shakacode/heroku-to-control-plane/pull/88) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
20
|
+
- Fixed issues with running `cpl --version` and `cpl --help` where no configuration file exists. [PR 100](https://github.com/shakacode/heroku-to-control-plane/pull/100) by [Mostafa Ahangarha](https://github.com/ahangarha).
|
21
|
+
- Fixed issue where `delete` command fails to delete apps with volumesets. [PR 123](https://github.com/shakacode/heroku-to-control-plane/pull/123) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
22
|
+
|
23
|
+
### Added
|
24
|
+
|
25
|
+
- Added `--org` option to all commands. [PR 88](https://github.com/shakacode/heroku-to-control-plane/pull/88) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
26
|
+
- Added option to set the app with a `CPLN_APP` env var. [PR 88](https://github.com/shakacode/heroku-to-control-plane/pull/88) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
27
|
+
- Show `org` and `app` on every command excluding `info`, `version`, `maintenance`, `env`, `ps`, and `latest_image`. [PR 94](https://github.com/shakacode/heroku-to-control-plane/pull/94) by [Mostafa Ahangarha](https://github.com/ahangarha).
|
28
|
+
- Added option to only use `CPLN_ORG` and `CPLN_APP` env vars if `allow_org_override_by_env` and `allow_app_override_by_env` configs are set to `true` in `controlplane.yml`. [PR 109](https://github.com/shakacode/heroku-to-control-plane/pull/109) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
29
|
+
- Added `CPLN_LOCATION` env variable and `--location` option for `apply-template`, `ps`, `run`, `run:detached`. [PR 105](https://github.com/shakacode/heroku-to-control-plane/pull/105) by [Mostafa Ahangarha](https://github.com/ahangarha).
|
30
|
+
- Added `generate` command for creating basic Control Plane configuration directory. [PR 116](https://github.com/shakacode/heroku-to-control-plane/pull/116) by [Mostafa Ahangarhga](https://github.com/ahangarha).
|
31
|
+
- Added `--trace` option to all commands for more detailed logs. [PR 124](https://github.com/shakacode/heroku-to-control-plane/pull/124) by [justin808](https://github.com/justin808)
|
32
|
+
- Added better error message to check the org name in case of a 403 error. [PR 124](https://github.com/justin808) by [justin808](https://github.com/justin808)
|
33
|
+
|
34
|
+
### Changed
|
35
|
+
|
36
|
+
- `--org` option now takes precedence over `CPLN_ORG` env var, which takes precedence over `cpln_org` from `controlplane.yml`. [PR 88](https://github.com/shakacode/heroku-to-control-plane/pull/88) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
37
|
+
- Renamed `setup` config into `setup_app_templates`. [PR 112](https://github.com/shakacode/heroku-to-control-plane/pull/112) by [Mostafa Ahangarha](https://github.com/ahangarha).
|
38
|
+
|
17
39
|
## [1.1.2] - 2023-10-17
|
18
40
|
|
19
41
|
### Fixed
|
@@ -23,7 +45,7 @@ _Please add entries here for your pull requests that are not yet released._
|
|
23
45
|
### Added
|
24
46
|
|
25
47
|
- Added `open-console` command to open the app console on Control Plane. [PR 83](https://github.com/shakacode/heroku-to-control-plane/pull/83) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
26
|
-
- Added option to set the org with a `CPLN_ORG` env var. [PR 83](https://github.com/shakacode/heroku-to-control-plane/pull/83) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
48
|
+
- Added option to set the org with a `CPLN_ORG`/`CPLN_ORG_UPSTREAM` env var. [PR 83](https://github.com/shakacode/heroku-to-control-plane/pull/83) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
27
49
|
- Added `--verbose` option to all commands for more detailed logs. [PR 83](https://github.com/shakacode/heroku-to-control-plane/pull/83) by [Rafael Gomes](https://github.com/rafaelgomesxyz).
|
28
50
|
|
29
51
|
### Changed
|
data/CONTRIBUTING.md
CHANGED
@@ -12,12 +12,6 @@ git clone https://github.com/shakacode/heroku-to-control-plane
|
|
12
12
|
alias cpl="~/projects/heroku-to-control-plane/bin/cpl"
|
13
13
|
```
|
14
14
|
|
15
|
-
Or set the path of the Ruby gem in your Gemfile.
|
16
|
-
|
17
|
-
```ruby
|
18
|
-
gem 'cpl', path: '~/projects/heroku-to-control-plane'
|
19
|
-
```
|
20
|
-
|
21
15
|
## Linting/Testing
|
22
16
|
|
23
17
|
Before committing or pushing code, be sure to:
|
@@ -36,6 +30,8 @@ overcommit --install
|
|
36
30
|
|
37
31
|
## Debugging
|
38
32
|
|
33
|
+
1. Use the `--verbose` option to see more detailed logs.
|
34
|
+
2. Use the `--trace` option to see full logging of HTTP requests. Warning, this will display keys to your logs or console.
|
39
35
|
1. Add a breakpoint (`debugger`) to any line of code you want to debug.
|
40
36
|
2. Modify the `lib/command/test.rb` file to trigger the code you want to test. To simulate a command, you can use
|
41
37
|
`Cpl::Cli.start` (e.g., `Cpl::Cli.start(["deploy-image", "-a", "my-app-name"])` would be the same as running
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cpl (1.
|
4
|
+
cpl (1.2.0)
|
5
5
|
debug (~> 1.7.1)
|
6
6
|
dotenv (~> 2.8.1)
|
7
7
|
psych (~> 5.1.0)
|
@@ -24,8 +24,8 @@ GEM
|
|
24
24
|
dotenv (2.8.1)
|
25
25
|
hashdiff (1.0.1)
|
26
26
|
iniparse (1.5.0)
|
27
|
-
io-console (0.
|
28
|
-
irb (1.
|
27
|
+
io-console (0.7.1)
|
28
|
+
irb (1.11.0)
|
29
29
|
rdoc
|
30
30
|
reline (>= 0.3.8)
|
31
31
|
json (2.6.3)
|
@@ -36,15 +36,15 @@ GEM
|
|
36
36
|
parallel (1.22.1)
|
37
37
|
parser (3.2.0.0)
|
38
38
|
ast (~> 2.4.1)
|
39
|
-
psych (5.1.
|
39
|
+
psych (5.1.2)
|
40
40
|
stringio
|
41
41
|
public_suffix (5.0.1)
|
42
42
|
rainbow (3.1.1)
|
43
43
|
rake (13.0.6)
|
44
|
-
rdoc (6.
|
44
|
+
rdoc (6.6.2)
|
45
45
|
psych (>= 4.0.0)
|
46
46
|
regexp_parser (2.6.2)
|
47
|
-
reline (0.
|
47
|
+
reline (0.4.1)
|
48
48
|
io-console (~> 0.5)
|
49
49
|
rexml (3.2.5)
|
50
50
|
rspec (3.12.0)
|
@@ -86,7 +86,7 @@ GEM
|
|
86
86
|
simplecov_json_formatter (~> 0.1)
|
87
87
|
simplecov-html (0.12.3)
|
88
88
|
simplecov_json_formatter (0.1.4)
|
89
|
-
stringio (3.0
|
89
|
+
stringio (3.1.0)
|
90
90
|
thor (1.2.2)
|
91
91
|
timecop (0.9.6)
|
92
92
|
unicode-display_width (2.4.2)
|
data/README.md
CHANGED
@@ -6,13 +6,19 @@
|
|
6
6
|
<meta name="keywords" content="Control Plane, Heroku, Kubernetes, K8, Infrastructure">
|
7
7
|
<meta name="google-site-verification" content="dIV4nMplcYl6YOKOaZMqgvdKXhLJ4cdYY6pS6e_YrPU" />
|
8
8
|
|
9
|
-
_A gem that provides **Heroku Flow** functionality on Control Plane, including docs for migrating from [Heroku](https://heroku.com) to [Control Plane](https://controlplane.com)_
|
9
|
+
_A gem that provides **Heroku Flow** functionality on Control Plane, including docs for migrating from [Heroku](https://heroku.com) to [Control Plane](https://shakacode.controlplane.com/)._
|
10
10
|
|
11
11
|
[](https://github.com/shakacode/heroku-to-control-plane/actions/workflows/rspec.yml)
|
12
12
|
[](https://github.com/shakacode/heroku-to-control-plane/actions/workflows/rubocop.yml)
|
13
13
|
|
14
14
|
[](https://badge.fury.io/rb/cpl)
|
15
15
|
|
16
|
+
---
|
17
|
+
|
18
|
+
_If you need a free demo account for Control Plane (no CC required), you can contact [controlplane@shakacode.com](mailto:controlplane@shakacode.com)._
|
19
|
+
|
20
|
+
---
|
21
|
+
|
16
22
|
This playbook shows how to move "Heroku apps" to "Control Plane workloads" via an open-source `cpl` CLI on top of
|
17
23
|
Control Plane's `cpln` CLI.
|
18
24
|
|
@@ -90,7 +96,7 @@ For the typical Rails app, this means:
|
|
90
96
|
|
91
97
|
## Installation
|
92
98
|
|
93
|
-
1. Ensure your [Control Plane](https://controlplane.com) account is set up. Set up an `organization`
|
99
|
+
1. Ensure your [Control Plane](https://shakacode.controlplane.com/) account is set up. Set up an `organization` `<your-org>` for testing in that account and modify the value for `aliases.common.cpln_org` in `.controlplane/controlplane.yml`, or you can also set it with the `CPLN_ORG` environment variable. If you need an organization, please [contact Shakacode](mailto:controlplane@shakacode.com).
|
94
100
|
|
95
101
|
2. Install [Node.js](https://nodejs.org/en) (required for Control Plane CLI).
|
96
102
|
|
@@ -111,8 +117,7 @@ npm update -g @controlplane/cli
|
|
111
117
|
|
112
118
|
5. Run `cpln image docker-login --org <your-org>` to ensure that you have access to the Control Plane Docker registry.
|
113
119
|
|
114
|
-
6. Install Heroku to Control Plane `cpl` CLI
|
115
|
-
For information on the latter, see [CONTRIBUTING.md](CONTRIBUTING.md). You may also install `cpl` in your project's Gemfile.
|
120
|
+
6. Install Heroku to Control Plane `cpl` CLI as a [Ruby gem](https://rubygems.org/gems/cpl): `gem install cpl`. If you want to hack on the source code, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
116
121
|
|
117
122
|
7. You can use [this Dockerfile](https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/.controlplane/Dockerfile) as an example for your project. Ensure that you have Docker running.
|
118
123
|
|
@@ -138,7 +143,7 @@ The `cpl` gem is based on several configuration files within a `/.controlplane`
|
|
138
143
|
├─ entrypoint.sh
|
139
144
|
```
|
140
145
|
|
141
|
-
1. `controlplane.yml` describes the overall application. Be sure to have
|
146
|
+
1. `controlplane.yml` describes the overall application. Be sure to have `<your-org>` as the value for `aliases.common.cpln_org`, or set it with the `CPLN_ORG` environment variable.
|
142
147
|
2. `Dockerfile` builds the production application. `entrypoint.sh` is an _example_ entrypoint script for the production application, referenced in your Dockerfile.
|
143
148
|
3. `templates` directory contains the templates for the various workloads, such as `rails.yml` and `postgres.yml`.
|
144
149
|
4. `templates/gvc.yml` defines your project's GVC (like a Heroku app). More importantly, it contains ENV values for the app.
|
@@ -153,18 +158,31 @@ Here's a complete example of all supported config keys explained for the `contro
|
|
153
158
|
```yaml
|
154
159
|
# Keys beginning with "cpln_" correspond to your settings in Control Plane.
|
155
160
|
|
161
|
+
# Global settings that apply to `cpl` usage.
|
162
|
+
# You can opt out of allowing the use of CPLN_ORG and CPLN_APP env vars
|
163
|
+
# to avoid any accidents with the wrong org / app.
|
164
|
+
allow_org_override_by_env: true
|
165
|
+
allow_app_override_by_env: true
|
166
|
+
|
156
167
|
aliases:
|
157
168
|
common: &common
|
158
|
-
# Organization
|
159
|
-
# Production apps will use a different organization, specified
|
169
|
+
# Organization for staging and QA apps is typically set as an alias.
|
170
|
+
# Production apps will use a different organization, specified in `apps`, for security.
|
171
|
+
# Change this value to your organization name
|
172
|
+
# or set the CPLN_ORG env var and it will override this for all `cpl` commands
|
173
|
+
# (provided that `allow_org_override_by_env` is set to `true`).
|
160
174
|
cpln_org: my-org-staging
|
161
175
|
|
162
|
-
#
|
176
|
+
# Control Plane offers the ability to use multiple locations.
|
177
|
+
# default_location is used for commands that require a location
|
178
|
+
# including `ps`, `run`, `run:detached`, `apply-template`.
|
179
|
+
# This can be overridden with option --location=<location> and
|
180
|
+
# CPLN_LOCATION environment variable.
|
163
181
|
default_location: aws-us-east-2
|
164
182
|
|
165
183
|
# Allows running the command `cpl setup-app`
|
166
184
|
# instead of `cpl apply-template gvc redis postgres memcached rails sidekiq`.
|
167
|
-
|
185
|
+
setup_app_templates:
|
168
186
|
- gvc
|
169
187
|
- redis
|
170
188
|
- postgres
|
@@ -224,6 +242,11 @@ apps:
|
|
224
242
|
my-app-production:
|
225
243
|
<<: *common
|
226
244
|
|
245
|
+
# You can also opt out of allowing the use of CPLN_ORG and CPLN_APP env vars per app.
|
246
|
+
# It's recommended to leave this off for production, to avoid any accidents.
|
247
|
+
allow_org_override_by_env: false
|
248
|
+
allow_app_override_by_env: false
|
249
|
+
|
227
250
|
# Use a different organization for production.
|
228
251
|
cpln_org: my-org-production
|
229
252
|
|
@@ -255,7 +278,7 @@ Suppose your app is called `tutorial-app`. You can run the following commands.
|
|
255
278
|
```sh
|
256
279
|
# Provision all infrastructure on Control Plane.
|
257
280
|
# `tutorial-app` will be created per definition in .controlplane/controlplane.yml.
|
258
|
-
cpl apply-template gvc postgres redis rails -a tutorial-app
|
281
|
+
cpl apply-template gvc postgres redis rails daily-task -a tutorial-app
|
259
282
|
|
260
283
|
# Build and push the Docker image to the Control Plane repository.
|
261
284
|
# Note, it may take many minutes. Be patient.
|
@@ -405,7 +428,7 @@ spec:
|
|
405
428
|
type: cron
|
406
429
|
job:
|
407
430
|
# Run daily job at 2am.
|
408
|
-
schedule: 0
|
431
|
+
schedule: "0 2 * * *"
|
409
432
|
# "Never" or "OnFailure"
|
410
433
|
restartPolicy: Never
|
411
434
|
containers:
|
data/docs/commands.md
CHANGED
@@ -100,7 +100,7 @@ cpl copy-image-from-upstream -a $APP_NAME --upstream-token $UPSTREAM_TOKEN --ima
|
|
100
100
|
|
101
101
|
### `delete`
|
102
102
|
|
103
|
-
- Deletes the whole app (GVC with all workloads and all images)
|
103
|
+
- Deletes the whole app (GVC with all workloads, all volumesets and all images)
|
104
104
|
- Will ask for explicit user confirmation
|
105
105
|
|
106
106
|
```sh
|
@@ -131,6 +131,15 @@ cpl env -a $APP_NAME
|
|
131
131
|
if [ cpl exists -a $APP_NAME ]; ...
|
132
132
|
```
|
133
133
|
|
134
|
+
### `generate`
|
135
|
+
|
136
|
+
Creates base Control Plane config and template files
|
137
|
+
|
138
|
+
```sh
|
139
|
+
# Creates .controlplane directory with Control Plane config and other templates
|
140
|
+
cpl generate
|
141
|
+
```
|
142
|
+
|
134
143
|
### `info`
|
135
144
|
|
136
145
|
- Displays the diff between defined/available apps/workloads (apps equal GVCs)
|
@@ -140,7 +149,7 @@ if [ cpl exists -a $APP_NAME ]; ...
|
|
140
149
|
- The diff is based on what's defined in the `.controlplane/controlplane.yml` file
|
141
150
|
|
142
151
|
```sh
|
143
|
-
# Shows diff for all apps in all orgs.
|
152
|
+
# Shows diff for all apps in all orgs (based on `.controlplane/controlplane.yml`).
|
144
153
|
cpl info
|
145
154
|
|
146
155
|
# Shows diff for all apps in a specific org.
|
@@ -312,7 +321,6 @@ cpl ps:swait -a $APP_NAME -w $WORKLOAD_NAME
|
|
312
321
|
|
313
322
|
- Runs one-off **_interactive_** replicas (analog of `heroku run`)
|
314
323
|
- Uses `Standard` workload type and `cpln exec` as the execution method, with CLI streaming
|
315
|
-
- May not work correctly with tasks that last over 5 minutes (there's a Control Plane scaling bug at the moment)
|
316
324
|
- If `fix_terminal_size` is `true` in the `.controlplane/controlplane.yml` file, the remote terminal size will be fixed to match the local terminal size (may also be overriden through `--terminal-size`)
|
317
325
|
|
318
326
|
> **IMPORTANT:** Useful for development where it's needed for interaction, and where network connection drops and
|
@@ -391,8 +399,8 @@ cpl run:detached rails db:migrate:status -a $APP_NAME --use-local-token
|
|
391
399
|
### `setup-app`
|
392
400
|
|
393
401
|
- Creates an app and all its workloads
|
394
|
-
- Specify the templates for the app and workloads through `
|
395
|
-
- This should
|
402
|
+
- Specify the templates for the app and workloads through `setup_app_templates` in the `.controlplane/controlplane.yml` file
|
403
|
+
- This should only be used for temporary apps like review apps, never for persistent apps like production (to update workloads for those, use 'cpl apply-template' instead)
|
396
404
|
|
397
405
|
```sh
|
398
406
|
cpl setup-app -a $APP_NAME
|
data/docs/migrating.md
CHANGED
@@ -29,13 +29,13 @@ Edit the `.controlplane/controlplane.yml` file as needed. Note that the `my-app-
|
|
29
29
|
is defined in this file. See
|
30
30
|
[this example](https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/.controlplane/controlplane.yml).
|
31
31
|
|
32
|
-
Before the initial setup, add the templates for the app to the `.controlplane/controlplane.yml` file, using the `
|
32
|
+
Before the initial setup, add the templates for the app to the `.controlplane/controlplane.yml` file, using the `setup_app_templates`
|
33
33
|
key, e.g.:
|
34
34
|
|
35
35
|
```yaml
|
36
36
|
my-app-staging:
|
37
37
|
<<: *common
|
38
|
-
|
38
|
+
setup_app_templates:
|
39
39
|
- gvc
|
40
40
|
- redis
|
41
41
|
- memcached
|
@@ -191,7 +191,7 @@ configure an entry for, e.g., `my-app-review`, and then create review apps start
|
|
191
191
|
my-app-review:
|
192
192
|
<<: *common
|
193
193
|
match_if_app_name_starts_with: true
|
194
|
-
|
194
|
+
setup_app_templates:
|
195
195
|
- gvc
|
196
196
|
- redis
|
197
197
|
- memcached
|
data/examples/controlplane.yml
CHANGED
@@ -1,15 +1,38 @@
|
|
1
1
|
# Keys beginning with "cpln_" correspond to your settings in Control Plane.
|
2
2
|
|
3
|
+
# Global settings that apply to `cpl` usage.
|
4
|
+
# You can opt out of allowing the use of CPLN_ORG and CPLN_APP env vars
|
5
|
+
# to avoid any accidents with the wrong org / app.
|
6
|
+
allow_org_override_by_env: true
|
7
|
+
allow_app_override_by_env: true
|
8
|
+
|
3
9
|
aliases:
|
4
10
|
common: &common
|
5
|
-
# Organization
|
6
|
-
# Production apps will use a different organization, specified
|
11
|
+
# Organization for staging and QA apps is typically set as an alias.
|
12
|
+
# Production apps will use a different organization, specified in `apps`, for security.
|
13
|
+
# Change this value to your organization name
|
14
|
+
# or set the CPLN_ORG env var and it will override this for all `cpl` commands
|
15
|
+
# (provided that `allow_org_override_by_env` is set to `true`).
|
7
16
|
cpln_org: my-org-staging
|
8
17
|
|
9
|
-
#
|
18
|
+
# Control Plane offers the ability to use multiple locations.
|
19
|
+
# default_location is used for commands that require a location
|
20
|
+
# including `ps`, `run`, `run:detached`, `apply-template`.
|
21
|
+
# This can be overridden with option --location=<location> and
|
22
|
+
# CPLN_LOCATION environment variable.
|
10
23
|
# TODO: Allow specification of multiple locations.
|
11
24
|
default_location: aws-us-east-2
|
12
25
|
|
26
|
+
# Allows running the command `cpl setup-app`
|
27
|
+
# instead of `cpl apply-template gvc redis postgres memcached rails sidekiq`.
|
28
|
+
setup:
|
29
|
+
- gvc
|
30
|
+
- redis
|
31
|
+
- postgres
|
32
|
+
- memcached
|
33
|
+
- rails
|
34
|
+
- sidekiq
|
35
|
+
|
13
36
|
# Configure the workload name used as a template for one-off scripts, like a Heroku one-off dyno.
|
14
37
|
one_off_workload: rails
|
15
38
|
|
@@ -24,26 +47,62 @@ aliases:
|
|
24
47
|
- postgres
|
25
48
|
- memcached
|
26
49
|
|
27
|
-
# Configure the workload name used when maintenance mode is on (defaults to "maintenance")
|
50
|
+
# Configure the workload name used when maintenance mode is on (defaults to "maintenance").
|
28
51
|
maintenance_workload: maintenance
|
29
52
|
|
53
|
+
# Fixes the remote terminal size to match the local terminal size
|
54
|
+
# when running the commands `cpl run` or `cpl run:detached`.
|
55
|
+
fix_terminal_size: true
|
56
|
+
|
57
|
+
# Apps with a deployed image created before this amount of days will be listed for deletion
|
58
|
+
# when running the command `cpl cleanup-stale-apps`.
|
59
|
+
stale_app_image_deployed_days: 5
|
60
|
+
|
61
|
+
# Images that exceed this quantity will be listed for deletion
|
62
|
+
# when running the command `cpl cleanup-images`.
|
63
|
+
image_retention_max_qty: 20
|
64
|
+
|
65
|
+
# Images created before this amount of days will be listed for deletion
|
66
|
+
# when running the command `cpl cleanup-images` (`image_retention_max_qty` takes precedence).
|
67
|
+
image_retention_days: 5
|
68
|
+
|
69
|
+
# Run workloads created before this amount of days will be listed for deletion
|
70
|
+
# when running the command `cpl run:cleanup`.
|
71
|
+
stale_run_workload_created_days: 2
|
72
|
+
|
30
73
|
apps:
|
31
74
|
my-app-staging:
|
32
75
|
# Use the values from the common section above.
|
33
76
|
<<: *common
|
77
|
+
|
34
78
|
my-app-review:
|
35
79
|
<<: *common
|
80
|
+
|
36
81
|
# If `match_if_app_name_starts_with` is `true`, then use this config for app names starting with this name,
|
37
82
|
# e.g., "my-app-review-pr123", "my-app-review-anything-goes", etc.
|
38
83
|
match_if_app_name_starts_with: true
|
84
|
+
|
39
85
|
my-app-production:
|
40
86
|
<<: *common
|
87
|
+
|
88
|
+
# You can also opt out of allowing the use of CPLN_ORG and CPLN_APP env vars per app.
|
89
|
+
# It's recommended to leave this off for production, to avoid any accidents.
|
90
|
+
allow_org_override_by_env: false
|
91
|
+
allow_app_override_by_env: false
|
92
|
+
|
41
93
|
# Use a different organization for production.
|
42
94
|
cpln_org: my-org-production
|
95
|
+
|
43
96
|
# Allows running the command `cpl promote-app-from-upstream -a my-app-production`
|
44
97
|
# to promote the staging app to production.
|
45
98
|
upstream: my-app-staging
|
99
|
+
|
100
|
+
# Used by the command `cpl promote-app-from-upstream` to run a release script before deploying.
|
101
|
+
# This is relative to the `.controlplane/` directory.
|
102
|
+
release_script: release_script
|
103
|
+
|
46
104
|
my-app-other:
|
47
105
|
<<: *common
|
106
|
+
|
48
107
|
# You can specify a different `Dockerfile` relative to the `.controlplane/` directory (defaults to "Dockerfile").
|
49
108
|
dockerfile: ../some_other/Dockerfile
|
@@ -7,6 +7,7 @@ module Command
|
|
7
7
|
REQUIRES_ARGS = true
|
8
8
|
OPTIONS = [
|
9
9
|
app_option(required: true),
|
10
|
+
location_option,
|
10
11
|
skip_confirm_option
|
11
12
|
].freeze
|
12
13
|
DESCRIPTION = "Applies application-specific configs from templates"
|
@@ -126,7 +127,7 @@ module Command
|
|
126
127
|
def apply_template(filename)
|
127
128
|
data = File.read(filename)
|
128
129
|
.gsub("APP_GVC", config.app)
|
129
|
-
.gsub("APP_LOCATION", config
|
130
|
+
.gsub("APP_LOCATION", config.location)
|
130
131
|
.gsub("APP_ORG", config.org)
|
131
132
|
.gsub("APP_IMAGE", latest_image)
|
132
133
|
|
data/lib/command/base.rb
CHANGED
@@ -23,6 +23,8 @@ module Command
|
|
23
23
|
EXAMPLES = ""
|
24
24
|
# If `true`, hides the command from `cpl help`
|
25
25
|
HIDE = false
|
26
|
+
# Whether or not to show key information like ORG and APP name in commands
|
27
|
+
WITH_INFO_HEADER = true
|
26
28
|
|
27
29
|
NO_IMAGE_AVAILABLE = "NO_IMAGE_AVAILABLE"
|
28
30
|
|
@@ -38,6 +40,10 @@ module Command
|
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
43
|
+
def self.common_options
|
44
|
+
[org_option, verbose_option, trace_option]
|
45
|
+
end
|
46
|
+
|
41
47
|
def self.org_option(required: false)
|
42
48
|
{
|
43
49
|
name: :org,
|
@@ -103,6 +109,19 @@ module Command
|
|
103
109
|
}
|
104
110
|
end
|
105
111
|
|
112
|
+
def self.location_option(required: false)
|
113
|
+
{
|
114
|
+
name: :location,
|
115
|
+
params: {
|
116
|
+
aliases: ["-l"],
|
117
|
+
banner: "LOCATION_NAME",
|
118
|
+
desc: "Location name",
|
119
|
+
type: :string,
|
120
|
+
required: required
|
121
|
+
}
|
122
|
+
}
|
123
|
+
end
|
124
|
+
|
106
125
|
def self.upstream_token_option(required: false)
|
107
126
|
{
|
108
127
|
name: :upstream_token,
|
@@ -188,6 +207,17 @@ module Command
|
|
188
207
|
}
|
189
208
|
end
|
190
209
|
|
210
|
+
def self.trace_option(required: false)
|
211
|
+
{
|
212
|
+
name: :trace,
|
213
|
+
params: {
|
214
|
+
desc: "Shows trace of API calls. WARNING: may contain sensitive data",
|
215
|
+
type: :boolean,
|
216
|
+
required: required
|
217
|
+
}
|
218
|
+
}
|
219
|
+
end
|
220
|
+
|
191
221
|
def self.all_options
|
192
222
|
methods.grep(/_option$/).map { |method| send(method.to_s) }
|
193
223
|
end
|
@@ -239,6 +269,7 @@ module Command
|
|
239
269
|
end
|
240
270
|
|
241
271
|
def latest_image_next(app = config.app, org = config.org, commit: nil)
|
272
|
+
# debugger
|
242
273
|
commit ||= config.options[:commit]
|
243
274
|
|
244
275
|
@latest_image_next ||= {}
|
data/lib/command/config.rb
CHANGED
@@ -21,11 +21,6 @@ module Command
|
|
21
21
|
EX
|
22
22
|
|
23
23
|
def call # rubocop:disable Metrics/MethodLength
|
24
|
-
if config.org_comes_from_env
|
25
|
-
puts Shell.color("Org comes from CPLN_ORG env var", :yellow)
|
26
|
-
puts
|
27
|
-
end
|
28
|
-
|
29
24
|
if config.app
|
30
25
|
puts "#{Shell.color("Current config (app '#{config.app}')", :blue)}:"
|
31
26
|
puts pretty_print(config.current)
|
data/lib/command/delete.rb
CHANGED
@@ -7,21 +7,45 @@ module Command
|
|
7
7
|
app_option(required: true),
|
8
8
|
skip_confirm_option
|
9
9
|
].freeze
|
10
|
-
DESCRIPTION = "Deletes the whole app (GVC with all workloads and all images)"
|
10
|
+
DESCRIPTION = "Deletes the whole app (GVC with all workloads, all volumesets and all images)"
|
11
11
|
LONG_DESCRIPTION = <<~DESC
|
12
|
-
- Deletes the whole app (GVC with all workloads and all images)
|
12
|
+
- Deletes the whole app (GVC with all workloads, all volumesets and all images)
|
13
13
|
- Will ask for explicit user confirmation
|
14
14
|
DESC
|
15
15
|
|
16
16
|
def call
|
17
|
+
return progress.puts("App '#{config.app}' does not exist.") if cp.fetch_gvc.nil?
|
18
|
+
|
19
|
+
check_volumesets
|
20
|
+
check_images
|
17
21
|
return unless confirm_delete
|
18
22
|
|
23
|
+
delete_volumesets
|
19
24
|
delete_gvc
|
20
25
|
delete_images
|
21
26
|
end
|
22
27
|
|
23
28
|
private
|
24
29
|
|
30
|
+
def check_volumesets
|
31
|
+
@volumesets = cp.fetch_volumesets["items"]
|
32
|
+
return progress.puts("No volumesets to delete.") unless @volumesets.any?
|
33
|
+
|
34
|
+
message = "The following volumesets will be deleted along with the app:"
|
35
|
+
volumesets_list = @volumesets.map { |volumeset| "- #{volumeset['name']}" }.join("\n")
|
36
|
+
progress.puts("#{Shell.color(message, :red)}\n#{volumesets_list}\n\n")
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_images
|
40
|
+
@images = cp.query_images["items"]
|
41
|
+
.select { |image| image["name"].start_with?("#{config.app}:") }
|
42
|
+
return progress.puts("No images to delete.") unless @images.any?
|
43
|
+
|
44
|
+
message = "The following images will be deleted along with the app:"
|
45
|
+
images_list = @images.map { |image| "- #{image['name']}" }.join("\n")
|
46
|
+
progress.puts("#{Shell.color(message, :red)}\n#{images_list}\n\n")
|
47
|
+
end
|
48
|
+
|
25
49
|
def confirm_delete
|
26
50
|
return true if config.options[:yes]
|
27
51
|
|
@@ -33,22 +57,27 @@ module Command
|
|
33
57
|
end
|
34
58
|
|
35
59
|
def delete_gvc
|
36
|
-
return progress.puts("App '#{config.app}' does not exist.") if cp.fetch_gvc.nil?
|
37
|
-
|
38
60
|
step("Deleting app '#{config.app}'") do
|
39
61
|
cp.gvc_delete
|
40
62
|
end
|
41
63
|
end
|
42
64
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
65
|
+
def delete_volumesets
|
66
|
+
@volumesets.each do |volumeset|
|
67
|
+
step("Deleting volumeset '#{volumeset['name']}'") do
|
68
|
+
# If the volumeset is attached to a workload, we need to delete the workload first
|
69
|
+
workload = volumeset.dig("status", "usedByWorkload")&.split("/")&.last
|
70
|
+
cp.delete_workload(workload) if workload
|
46
71
|
|
47
|
-
|
72
|
+
cp.delete_volumeset(volumeset["name"])
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
48
76
|
|
49
|
-
|
50
|
-
|
51
|
-
|
77
|
+
def delete_images
|
78
|
+
@images.each do |image|
|
79
|
+
step("Deleting image '#{image['name']}'") do
|
80
|
+
cp.image_delete(image["name"])
|
52
81
|
end
|
53
82
|
end
|
54
83
|
end
|
data/lib/command/env.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Command
|
4
|
+
class Generator < Thor::Group
|
5
|
+
include Thor::Actions
|
6
|
+
|
7
|
+
def copy_files
|
8
|
+
directory("generator_templates", ".controlplane")
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.source_root
|
12
|
+
File.expand_path("../", __dir__)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Generate < Base
|
17
|
+
NAME = "generate"
|
18
|
+
DESCRIPTION = "Creates base Control Plane config and template files"
|
19
|
+
LONG_DESCRIPTION = <<~DESC
|
20
|
+
Creates base Control Plane config and template files
|
21
|
+
DESC
|
22
|
+
EXAMPLES = <<~EX
|
23
|
+
```sh
|
24
|
+
# Creates .controlplane directory with Control Plane config and other templates
|
25
|
+
cpl generate
|
26
|
+
```
|
27
|
+
EX
|
28
|
+
WITH_INFO_HEADER = false
|
29
|
+
|
30
|
+
def call
|
31
|
+
if controlplane_directory_exists?
|
32
|
+
Shell.warn("The directory '.controlplane' already exists!")
|
33
|
+
return
|
34
|
+
end
|
35
|
+
|
36
|
+
Generator.start
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def controlplane_directory_exists?
|
42
|
+
Dir.exist? ".controlplane"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|