cpl 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d93c337f8796f7d559d3587333f8fee8e95785ccbe0879f5d47bbb41fcd3b54
4
- data.tar.gz: 237d1440185416bca6d1552c25e04d0d225f91bde8fbb71cd6e5e15319d3eb97
3
+ metadata.gz: c162aaec9e6b476bb2ac9171d4cfbaf564a11f18821c1ee139c83120343ec127
4
+ data.tar.gz: 98a5f78b9fb4f17f4380e290d1ca01d2729570986b22b1fbf8171cedb5e9aca1
5
5
  SHA512:
6
- metadata.gz: e0af450819139fa8ed5af99165bed18e2e5eb48516d916cedf10466da2e31334d8b0228b41a6c6eb5babdf2b064be91d52e59e950f08987d1d9c480c55e3dc3d
7
- data.tar.gz: 1876895ad75a6c8329dda66e0aa151d6a5b83c29816ce3713249c977992d071ce9b898f44bd302ef3a4c120731ca359f02c23e08c5e4eb194a00a0f441c901f2
6
+ metadata.gz: 2f0cf811bd1e52e97039d66c24a282363798d1ae2e892d950360c6f99e1cfe84c0dd9da643c83b1a0de353d94fde1a6ded645ae167a804f2dc695f32439a84c4
7
+ data.tar.gz: 33d012cd711b38968d7eb8cff48cb313f3c7c0e71049a0c5c4af832ea9cd62c06a112b2975f40a9bbc78f36acb9eb2816a1f36be46b38112b4b1b45bf52ea180
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cpl (0.3.3)
4
+ cpl (0.4.0)
5
5
  debug (~> 1.7.1)
6
6
  dotenv (~> 2.8.1)
7
7
  psych (~> 5.1.0)
data/cpl.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.email = ["justin@shakacode.com", "sergey@shakacode.com"]
10
10
 
11
11
  spec.summary = "Heroku to Control Plane"
12
- spec.description = "Helper CLI for migrating from Heroku to Control Plane"
12
+ spec.description = "CLI for providing Heroku-like platform-as-a-service on Control Plane"
13
13
  spec.homepage = "https://github.com/shakacode/heroku-to-control-plane"
14
14
  spec.license = "MIT"
15
15
 
data/lib/command/base.rb CHANGED
@@ -137,7 +137,7 @@ module Command
137
137
  end
138
138
 
139
139
  def wait_for_workload(workload)
140
- wait_for("workload to start") { cp.workload_get(workload) }
140
+ wait_for("workload to start") { cp.fetch_workload(workload) }
141
141
  end
142
142
 
143
143
  def wait_for_replica(workload, location)
@@ -148,7 +148,7 @@ module Command
148
148
 
149
149
  def ensure_workload_deleted(workload)
150
150
  progress.puts "- Ensure workload is deleted"
151
- cp.workload_delete(workload, no_raise: true)
151
+ cp.workload_delete(workload)
152
152
  end
153
153
 
154
154
  def latest_image_from(items, app_name: config.app, name_only: true)
@@ -15,11 +15,22 @@ module Command
15
15
  HEREDOC
16
16
 
17
17
  def call
18
+ ensure_docker_running!
19
+
18
20
  dockerfile = config.current[:dockerfile] || "Dockerfile"
19
21
  dockerfile = "#{config.app_cpln_dir}/#{dockerfile}"
20
22
  progress.puts "- Building dockerfile: #{dockerfile}"
21
23
 
22
24
  cp.image_build(latest_image_next, dockerfile: dockerfile)
23
25
  end
26
+
27
+ private
28
+
29
+ def ensure_docker_running!
30
+ `docker version > /dev/null 2>&1`
31
+ return if $?.success? # rubocop:disable Style/SpecialGlobalVars
32
+
33
+ Shell.abort("Can't run Docker. Please make sure that it's installed and started, then try again.")
34
+ end
24
35
  end
25
36
  end
@@ -35,7 +35,7 @@ module Command
35
35
  def delete_gvc
36
36
  progress.puts "- Deleting gvc:"
37
37
 
38
- return progress.puts "none" unless cp.gvc_get
38
+ return progress.puts "none" unless cp.fetch_gvc
39
39
 
40
40
  cp.gvc_delete
41
41
  progress.puts config.app
@@ -15,7 +15,7 @@ module Command
15
15
  image = latest_image
16
16
 
17
17
  config[:app_workloads].each do |workload|
18
- cp.workload_get_and_ensure(workload).dig("spec", "containers").each do |container|
18
+ cp.fetch_workload!(workload).dig("spec", "containers").each do |container|
19
19
  next unless container["image"].match?(%r{^/org/#{config[:cpln_org]}/image/#{config.app}:})
20
20
 
21
21
  cp.workload_set_image_ref(workload, container: container["name"], image: image)
data/lib/command/env.rb CHANGED
@@ -12,7 +12,7 @@ module Command
12
12
  HEREDOC
13
13
 
14
14
  def call
15
- cp.gvc_get_and_ensure.dig("spec", "env").map do |prop|
15
+ cp.fetch_gvc!.dig("spec", "env").map do |prop|
16
16
  # NOTE: atm no special chars handling, consider adding if needed
17
17
  puts "#{prop['name']}=#{prop['value']}"
18
18
  end
@@ -17,7 +17,7 @@ module Command
17
17
  HEREDOC
18
18
 
19
19
  def call
20
- exit(!cp.gvc_get.nil?)
20
+ exit(!cp.fetch_gvc.nil?)
21
21
  end
22
22
  end
23
23
  end
data/lib/command/open.rb CHANGED
@@ -23,7 +23,7 @@ module Command
23
23
 
24
24
  def call
25
25
  workload = config.options[:workload] || config[:one_off_workload]
26
- data = cp.workload_get_and_ensure(workload)
26
+ data = cp.fetch_workload!(workload)
27
27
  url = data["status"]["endpoint"]
28
28
  opener = `which xdg-open open`.split("\n").grep_v("not found").first
29
29
 
data/lib/command/run.rb CHANGED
@@ -59,7 +59,7 @@ module Command
59
59
  progress.puts "- Cloning workload '#{workload}' on '#{config.options[:app]}' to '#{one_off}'"
60
60
 
61
61
  # Create a base copy of workload props
62
- spec = cp.workload_get_and_ensure(workload).fetch("spec")
62
+ spec = cp.fetch_workload!(workload).fetch("spec")
63
63
  container = spec["containers"].detect { _1["name"] == workload } || spec["containers"].first
64
64
 
65
65
  # remove other containers if any
@@ -57,7 +57,7 @@ module Command
57
57
  progress.puts "- Cloning workload '#{workload}' on '#{config.options[:app]}' to '#{one_off}'"
58
58
 
59
59
  # Get base specs of workload
60
- spec = cp.workload_get_and_ensure(workload).fetch("spec")
60
+ spec = cp.fetch_workload!(workload).fetch("spec")
61
61
  container = spec["containers"].detect { _1["name"] == workload } || spec["containers"].first
62
62
 
63
63
  # remove other containers if any
@@ -113,7 +113,7 @@ module Command
113
113
  def show_logs_waiting # rubocop:disable Metrics/MethodLength
114
114
  progress.puts "- Scheduled, fetching logs (it is cron job, so it may take up to a minute to start)"
115
115
  begin
116
- while cp.workload_get(one_off)
116
+ while cp.fetch_workload(one_off)
117
117
  sleep(WORKLOAD_SLEEP_CHECK)
118
118
  print_uniq_logs
119
119
  end
data/lib/command/setup.rb CHANGED
@@ -37,7 +37,7 @@ module Command
37
37
  def call
38
38
  config.args.each do |template|
39
39
  filename = "#{config.app_cpln_dir}/templates/#{template}.yml"
40
- ensure_template(template, filename)
40
+ ensure_template!(template, filename)
41
41
  apply_template(filename)
42
42
  progress.puts(template)
43
43
  end
@@ -45,7 +45,7 @@ module Command
45
45
 
46
46
  private
47
47
 
48
- def ensure_template(template, filename)
48
+ def ensure_template!(template, filename)
49
49
  Shell.abort("Can't find template '#{template}' at '#{filename}', please create it.") unless File.exist?(filename)
50
50
  end
51
51
 
data/lib/command/test.rb CHANGED
@@ -18,7 +18,9 @@ module Command
18
18
  # You can use `debugger` to debug.
19
19
  # debugger
20
20
  # Or print values
21
+ # rubocop:disable Lint/Debugger
21
22
  pp latest_image_next
23
+ # rubocop:enable Lint/Debugger
22
24
  end
23
25
  end
24
26
  end
data/lib/core/config.rb CHANGED
@@ -19,7 +19,7 @@ class Config
19
19
  end
20
20
 
21
21
  def [](key)
22
- ensure_current_config
22
+ ensure_current_config!
23
23
 
24
24
  old_key = old_option_keys[key]
25
25
  if current.key?(key)
@@ -41,37 +41,37 @@ class Config
41
41
 
42
42
  private
43
43
 
44
- def ensure_current_config
44
+ def ensure_current_config!
45
45
  Shell.abort("Can't find current config, please specify an app.") unless current
46
46
  end
47
47
 
48
- def ensure_current_config_app(app)
48
+ def ensure_current_config_app!(app)
49
49
  Shell.abort("Can't find app '#{app}' in 'controlplane.yml'.") unless current
50
50
  end
51
51
 
52
- def ensure_config
52
+ def ensure_config!
53
53
  Shell.abort("'controlplane.yml' is empty.") unless config
54
54
  end
55
55
 
56
- def ensure_config_apps
56
+ def ensure_config_apps!
57
57
  Shell.abort("Can't find key 'apps' in 'controlplane.yml'.") unless config[:apps]
58
58
  end
59
59
 
60
- def ensure_config_app(app, options)
60
+ def ensure_config_app!(app, options)
61
61
  Shell.abort("App '#{app}' is empty in 'controlplane.yml'.") unless options
62
62
  end
63
63
 
64
64
  def pick_current_config
65
- ensure_config
66
- ensure_config_apps
65
+ ensure_config!
66
+ ensure_config_apps!
67
67
  config[:apps].each do |c_app, c_data|
68
- ensure_config_app(c_app, c_data)
68
+ ensure_config_app!(c_app, c_data)
69
69
  if c_app.to_s == app || (c_data[:match_if_app_name_starts_with] && app.start_with?(c_app.to_s))
70
70
  @current = c_data
71
71
  break
72
72
  end
73
73
  end
74
- ensure_current_config_app(app)
74
+ ensure_current_config_app!(app)
75
75
  end
76
76
 
77
77
  def load_app_config
@@ -15,7 +15,7 @@ class Controlplane # rubocop:disable Metrics/ClassLength
15
15
  def image_build(image, dockerfile:, push: true)
16
16
  cmd = "cpln image build --org #{org} --name #{image} --dir #{config.app_dir} --dockerfile #{dockerfile}"
17
17
  cmd += " --push" if push
18
- perform(cmd)
18
+ perform!(cmd)
19
19
  end
20
20
 
21
21
  def image_query(app_name = config.app)
@@ -38,12 +38,12 @@ class Controlplane # rubocop:disable Metrics/ClassLength
38
38
  perform_yaml(cmd)
39
39
  end
40
40
 
41
- def gvc_get(a_gvc = gvc)
41
+ def fetch_gvc(a_gvc = gvc)
42
42
  api.gvc_get(gvc: a_gvc, org: org)
43
43
  end
44
44
 
45
- def gvc_get_and_ensure(a_gvc = gvc)
46
- gvc_data = gvc_get(a_gvc)
45
+ def fetch_gvc!(a_gvc = gvc)
46
+ gvc_data = fetch_gvc(a_gvc)
47
47
  return gvc_data if gvc_data
48
48
 
49
49
  Shell.abort("Can't find GVC '#{gvc}', please create it with 'cpl setup gvc -a #{config.app}'.")
@@ -55,12 +55,12 @@ class Controlplane # rubocop:disable Metrics/ClassLength
55
55
 
56
56
  # workload
57
57
 
58
- def workload_get(workload)
58
+ def fetch_workload(workload)
59
59
  api.workload_get(workload: workload, gvc: gvc, org: org)
60
60
  end
61
61
 
62
- def workload_get_and_ensure(workload)
63
- workload_data = workload_get(workload)
62
+ def fetch_workload!(workload)
63
+ workload_data = fetch_workload(workload)
64
64
  return workload_data if workload_data
65
65
 
66
66
  Shell.abort("Can't find workload '#{workload}', please create it with 'cpl setup #{workload} -a #{config.app}'.")
@@ -74,45 +74,50 @@ class Controlplane # rubocop:disable Metrics/ClassLength
74
74
  def workload_set_image_ref(workload, container:, image:)
75
75
  cmd = "cpln workload update #{workload} #{gvc_org}"
76
76
  cmd += " --set spec.containers.#{container}.image=/org/#{config[:cpln_org]}/image/#{image}"
77
- perform(cmd)
77
+ perform!(cmd)
78
78
  end
79
79
 
80
80
  def workload_set_suspend(workload, value)
81
- data = workload_get_and_ensure(workload)
81
+ data = fetch_workload!(workload)
82
82
  data["spec"]["defaultOptions"]["suspend"] = value
83
83
  apply(data)
84
84
  end
85
85
 
86
86
  def workload_force_redeployment(workload)
87
87
  cmd = "cpln workload force-redeployment #{workload} #{gvc_org}"
88
+ perform!(cmd)
89
+ end
90
+
91
+ def workload_delete(workload)
92
+ cmd = "cpln workload delete #{workload} #{gvc_org}"
93
+ cmd += " 2> /dev/null"
88
94
  perform(cmd)
89
95
  end
90
96
 
91
- def workload_delete(workload, no_raise: false)
97
+ def workload_delete!(workload)
92
98
  cmd = "cpln workload delete #{workload} #{gvc_org}"
93
- cmd += " 2> /dev/null" if no_raise
94
- no_raise ? perform_no_raise(cmd) : perform(cmd)
99
+ perform!(cmd)
95
100
  end
96
101
 
97
102
  def workload_connect(workload, location:, container: nil, shell: nil)
98
103
  cmd = "cpln workload connect #{workload} #{gvc_org} --location #{location}"
99
104
  cmd += " --container #{container}" if container
100
105
  cmd += " --shell #{shell}" if shell
101
- perform(cmd)
106
+ perform!(cmd)
102
107
  end
103
108
 
104
109
  def workload_exec(workload, location:, container: nil, command: nil)
105
110
  cmd = "cpln workload exec #{workload} #{gvc_org} --location #{location}"
106
111
  cmd += " --container #{container}" if container
107
112
  cmd += " -- #{command}"
108
- perform(cmd)
113
+ perform!(cmd)
109
114
  end
110
115
 
111
116
  # logs
112
117
 
113
118
  def logs(workload:)
114
119
  cmd = "cpln logs '{workload=\"#{workload}\"}' --org #{org} -t -o raw --limit 200"
115
- perform(cmd)
120
+ perform!(cmd)
116
121
  end
117
122
 
118
123
  def log_get(workload:, from:, to:)
@@ -126,18 +131,18 @@ class Controlplane # rubocop:disable Metrics/ClassLength
126
131
  f.write(data.to_yaml)
127
132
  f.rewind
128
133
  cmd = "cpln apply #{gvc_org} --file #{f.path} > /dev/null"
129
- perform(cmd)
134
+ perform!(cmd)
130
135
  end
131
136
  end
132
137
 
133
138
  private
134
139
 
135
140
  def perform(cmd)
136
- system(cmd) || exit(false)
141
+ system(cmd)
137
142
  end
138
143
 
139
- def perform_no_raise(cmd)
140
- system(cmd)
144
+ def perform!(cmd)
145
+ system(cmd) || exit(false)
141
146
  end
142
147
 
143
148
  def perform_yaml(cmd)
data/lib/cpl/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cpl
4
- VERSION = "0.3.3"
4
+ VERSION = "0.4.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cpl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Gordon
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-03-15 00:00:00.000000000 Z
12
+ date: 2023-03-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: debug
@@ -137,7 +137,7 @@ dependencies:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
139
  version: 0.22.0
140
- description: Helper CLI for migrating from Heroku to Control Plane
140
+ description: CLI for providing Heroku-like platform-as-a-service on Control Plane
141
141
  email:
142
142
  - justin@shakacode.com
143
143
  - sergey@shakacode.com