sct 0.1.18 → 0.1.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/bin/sct +3 -4
  3. data/{.DS_Store → cluster/lib/.DS_Store} +0 -0
  4. data/cluster/lib/cluster.rb +6 -0
  5. data/cluster/lib/cluster/commands_generator.rb +95 -0
  6. data/cluster/lib/cluster/module.rb +7 -0
  7. data/{lib/sct/commands/cluster.rb → cluster/lib/cluster/runner.rb} +96 -118
  8. data/{lib → sct/lib}/.DS_Store +0 -0
  9. data/sct/lib/sct.rb +17 -0
  10. data/sct/lib/sct/.DS_Store +0 -0
  11. data/sct/lib/sct/cli_tools_distributor.rb +46 -0
  12. data/{lib → sct/lib}/sct/command.rb +0 -0
  13. data/{lib → sct/lib}/sct/commands/hostfile.rb +7 -23
  14. data/sct/lib/sct/commands/init.rb +37 -0
  15. data/sct/lib/sct/commands/mysqlproxy.rb +20 -0
  16. data/sct/lib/sct/commands_generator.rb +56 -0
  17. data/sct/lib/sct/tools.rb +12 -0
  18. data/sct/lib/sct/version.rb +3 -0
  19. data/sct_core/lib/.DS_Store +0 -0
  20. data/sct_core/lib/sct_core.rb +13 -0
  21. data/{lib/sct → sct_core/lib/sct_core}/.DS_Store +0 -0
  22. data/sct_core/lib/sct_core/command_executor.rb +104 -0
  23. data/{lib/sct → sct_core/lib/sct_core}/config.rb +3 -3
  24. data/sct_core/lib/sct_core/core_ext/string.rb +9 -0
  25. data/{lib/sct/setup/helpers.rb → sct_core/lib/sct_core/helper.rb} +2 -2
  26. data/sct_core/lib/sct_core/module.rb +0 -0
  27. data/sct_core/lib/sct_core/sct_pty.rb +53 -0
  28. data/sct_core/lib/sct_core/ui/implementations/shell.rb +129 -0
  29. data/sct_core/lib/sct_core/ui/interface.rb +120 -0
  30. data/sct_core/lib/sct_core/ui/ui.rb +26 -0
  31. data/shell/README.md +0 -0
  32. data/shell/lib/shell.rb +3 -0
  33. data/{lib/sct → shell/lib/shell}/ClassLevelInheritableAttributes.rb +0 -0
  34. data/shell/lib/shell/commands_generator.rb +14 -0
  35. data/{lib/sct → shell/lib/shell}/docker/composer.rb +4 -3
  36. data/{lib/sct → shell/lib/shell}/docker/docker.rb +7 -10
  37. data/{lib/sct → shell/lib/shell}/docker/php.rb +3 -2
  38. data/{lib/sct → shell/lib/shell}/docker/yarn.rb +4 -3
  39. data/shell/lib/shell/module.rb +9 -0
  40. data/shell/lib/shell/runner.rb +34 -0
  41. data/shell/lib/shell/tools.rb +7 -0
  42. metadata +89 -53
  43. data/.gitignore +0 -12
  44. data/.gitlab/merge_request_templates/DefinitionOfDone.md +0 -14
  45. data/.rspec +0 -3
  46. data/.travis.yml +0 -7
  47. data/CODE_OF_CONDUCT.md +0 -74
  48. data/Gemfile +0 -4
  49. data/Gemfile.lock +0 -48
  50. data/LICENSE.txt +0 -21
  51. data/README.md +0 -134
  52. data/Rakefile +0 -6
  53. data/lib/sct.rb +0 -61
  54. data/lib/sct/command_interface.rb +0 -18
  55. data/lib/sct/command_option.rb +0 -14
  56. data/lib/sct/commands/composer.rb +0 -29
  57. data/lib/sct/commands/init.rb +0 -51
  58. data/lib/sct/commands/mysqlproxy.rb +0 -38
  59. data/lib/sct/commands/php.rb +0 -37
  60. data/lib/sct/commands/yarn.rb +0 -26
  61. data/lib/sct/version.rb +0 -3
  62. data/resources/corefile.yml +0 -45
  63. data/sct.gemspec +0 -40
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c9a10c8fd025fd2f32f82840295ef14bd7da4604ab7f90e4d0f0f107b902ab0c
4
- data.tar.gz: a719ae52d73c95fdff15652350046e75e6fe1bf99f3f893d85a577ed2f78efa5
3
+ metadata.gz: e738ce105b1b145395e1126e272a2100112b7bc2282963b5ea08f76e0057f26e
4
+ data.tar.gz: 46076d0d575a48bca094be8a6eaf298ca3cb9943788ed8e52cbe131b1708764f
5
5
  SHA512:
6
- metadata.gz: 3777d0a28ceab88ebc43d3442068d55c5e95c6a2eaef141be7e71a81851e22e5feaf676c282e58fa662f65875fe9333a62b64211bee00a0b87b5b2e4c35aceb3
7
- data.tar.gz: 04a36128ed9daf630791e025877800337a21efb0ddd9c374535878cc74c734c5fc502ff676ddeae57bc12888bccaeb7ae3777dcf4b2bf79db8c4e69af3109629
6
+ metadata.gz: c56a04592b7e8e81065dbad8c2f0913df26e90381bf2d0581741ad4e34db4b044da88688b8a1a5fdf8e08a7ac89676867934efc9f8ff6641eda2437c62df3ef0
7
+ data.tar.gz: a598f85d2e88af7230783a9918a1d0d90c5e6dd622fd3b98fbed1ea52081d3acde39e95bbf03cc8811e6a0eb6c66c7d7c37e5ff98dad51eb3003bc2f0bb7ea3d
data/bin/sct CHANGED
@@ -1,8 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'commander/import'
4
- require 'sct'
5
-
6
3
  if RUBY_VERSION < '2.0.0'
7
4
  abort("sct requires Ruby 2.0.0 or higher")
8
5
  end
@@ -11,6 +8,8 @@ def self.windows?
11
8
  (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
12
9
  end
13
10
 
11
+ require 'sct/cli_tools_distributor'
12
+
14
13
  if ARGV.include?('-v') || ARGV.include?('--version')
15
14
  # This will print out the sct binary path right above the
16
15
  # version number. Very often, users are not aware they have
@@ -20,4 +19,4 @@ if ARGV.include?('-v') || ARGV.include?('--version')
20
19
  puts("-----------------------------")
21
20
  end
22
21
 
23
- Sct::SctCore.take_off(Sct.constants.map(&Sct.method(:const_get)).grep(Class))
22
+ Sct::CLIToolsDistributor.take_off
@@ -0,0 +1,6 @@
1
+ require 'sct_core'
2
+
3
+ require 'terminal-table'
4
+
5
+ require_relative 'cluster/runner'
6
+ require_relative 'cluster/module'
@@ -0,0 +1,95 @@
1
+ require 'commander'
2
+ require_relative 'runner'
3
+
4
+ module Cluster
5
+ class CommandsGenerator
6
+ include Commander::Methods
7
+
8
+ def self.start
9
+ self.new.run
10
+ end
11
+
12
+ def run
13
+ program :name, 'cluster'
14
+ program :version, Sct::VERSION
15
+ program :description, 'CLI for \'cluster\' - Manage your local kubernetes cluster'
16
+
17
+ global_option('--verbose') { $verbose = true }
18
+
19
+ command :up do |c|
20
+
21
+ c.syntax = "sct cluster up"
22
+ c.description = "Start the cluster"
23
+ c.option '--clean', 'start a clean cluster. Old cluster will be purged if available.'
24
+
25
+ c.action do |args, options|
26
+ if options.clean
27
+ Cluster::Runner.new.reset
28
+ else
29
+ Cluster::Runner.new.launch
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+ command :down do |c|
36
+
37
+ c.syntax = 'sct cluster down'
38
+ c.description = 'stop the cluster'
39
+
40
+ c.action do |args, options|
41
+ Cluster::Runner.new.down
42
+ end
43
+ end
44
+
45
+ command :reset do |c|
46
+
47
+ c.syntax = 'sct cluster reset'
48
+ c.description = 'reset your cluster and start with a clean cluster'
49
+
50
+ c.action do |args, options|
51
+ Cluster::Runner.new.reset
52
+ end
53
+ end
54
+
55
+ alias_command :'setup', :'reset'
56
+
57
+ command :status do |c|
58
+
59
+ c.syntax = 'sct cluster status'
60
+ c.description = 'see the status of your cluster'
61
+
62
+ c.action do |args, options|
63
+ Cluster::Runner.new.status
64
+ end
65
+ end
66
+
67
+ command :'update config' do |c|
68
+
69
+ c.syntax = 'sct cluster update config'
70
+ c.description = 'update the cluster configuration'
71
+
72
+ c.action do |args, options|
73
+ Cluster::Runner.new.update_config
74
+ end
75
+ end
76
+
77
+ command :'delete pods' do |c|
78
+ c.syntax = 'sct cluster delete stalled pods'
79
+ c.description = 'delete stalled pods from the cluster'
80
+ c.option '--stalled', 'delete stalled pods'
81
+ c.option '--all', 'delete all pods'
82
+
83
+ c.action do |args, options|
84
+
85
+ Cluster::Runner.new.delete_stalled_pods if options.stalled
86
+ UI.important("Currently its not possible to delete all pods") if options.all
87
+ end
88
+ end
89
+
90
+ default_command :status
91
+
92
+ run!
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,7 @@
1
+ module Cluster
2
+
3
+ # import the helper functionality from SCT
4
+ Helpers = Sct::Helper
5
+ UI = Sct::UI
6
+
7
+ end
@@ -1,54 +1,37 @@
1
- require 'sct/command_interface'
2
- require 'terminal-table'
3
-
4
- module Sct
5
-
6
- class ClusterCommand
7
-
8
- IS_PUBLIC_COMMAND = true
9
- SYNTAX = 'sct cluster up | sct cluster down | sct cluster setup | sct cluster reset | sct cluster update-config | sct cluster delete-stalled-pods | sct cluster status'
10
- SUMMARY = 'Perform actions on the minikube cluster.'
11
- EXAMPLE = 'sct cluster up | sct cluster down | sct cluster setup | sct cluster reset | sct cluster update-config | sct cluster delete-stalled-pods | sct cluster status'
12
- EXAMPLE_DESCRIPTION = 'Perform actions on the minikube cluster.'
13
- DESCRIPTION = "sct cluster allows you to start, stop, setup/reset, update the config, delete the stalled pods, or status of the Spend Cloud minikube cluster."
14
-
15
- OPTIONS = []
16
-
17
- def execute(args, options)
18
- return puts "SCT has not been initialized. Run 'sct init' first.".red unless Sct::Config.exists
19
-
20
- case args[0]
21
- when "up"
22
- up
23
- when "down"
24
- down
25
- when "update-config"
26
- update_config
27
- when "setup", "reset"
28
- reset
29
- when "delete-stalled-pods"
30
- delete_stalled_pods(feedback: true)
31
- when "status"
32
- status
33
- else
34
- puts "Unknown or missing argument. Please run 'sct cluster --help'.".red
35
- end
36
- end
37
-
38
- def up
39
- start
1
+ module Cluster
2
+ class Runner
3
+
4
+ def launch
5
+ return UI.error("SCT has not been initialized. Run 'sct init' first.") unless SctCore::Config.exists
6
+ start_cluster
40
7
  run_command "kubectl delete pod -n kube-system #{pods("kube-system").map { |pod| pod[:name] if pod[:name].start_with? "registry-creds" } .compact.join(" ")}"
41
8
  run_command "kubectl rollout status -n kube-system deployment/registry-creds"
42
9
  post_start
43
10
  end
44
11
 
12
+ def start_cluster
13
+ if SctCore::Helper.operatingSystem == SctCore::Helper::MAC_OS
14
+ run_command "#{minikube} start --cpus=$(sysctl -n hw.ncpu) --memory=8G"
15
+ else
16
+ run_command "#{minikube} start --cpus=$(cat /proc/cpuinfo | grep processor | wc -l) --memory=10G"
17
+ end
18
+ run_command "#{minikube} ssh -- 'sudo su -c \"echo 10048576 > /proc/sys/fs/inotify/max_user_watches\"'"
19
+ update_config
20
+ end
21
+
22
+ def post_start
23
+ wait_for_pods
24
+ run_command "sudo sct hostfile"
25
+ UI.success("\n✔️ You can visit your environment at 👉 https://spend-cloud.spend.cloud.local 👌")
26
+ end
27
+
45
28
  def down
46
29
  run_command "#{minikube} stop"
47
30
  end
48
31
 
49
32
  def reset
50
33
  run_command "#{minikube} delete"
51
- start
34
+ start_cluster
52
35
  create_secrets
53
36
  run_command "#{minikube} addons enable registry-creds"
54
37
  run_command "#{minikube} addons enable ingress"
@@ -63,51 +46,84 @@ module Sct
63
46
  post_start
64
47
  end
65
48
 
49
+ def wait_for_pods
50
+ UI.important("Waiting for pods to become ready...")
51
+
52
+ while ! pods.all? { |pod| pod[:status] == "Running" }
53
+ delete_stalled_pods
54
+
55
+ sleep 5
56
+ end
57
+
58
+ UI.success("Pods are now ready.")
59
+ end
60
+
61
+ def delete_stalled_pods(feedback: false)
62
+
63
+ return UI.success("No stalled pods found") unless !pods.to_a.empty?
64
+
65
+ stalled_pods = pods.select { |pod| pod[:stalled] }
66
+
67
+ if stalled_pods.empty?
68
+ UI.success("There are no stalled pods.") if feedback
69
+ else
70
+ run_command "kubectl delete pods #{stalled_pods.map { |pod| pod[:name] } .join(" ")}"
71
+ end
72
+ end
73
+
66
74
  def update_config
67
- if Sct::Helpers.operatingSystem == Sct::Helpers::WINDOWS
68
- windows_home_path = Sct::Helpers.windowsHomePath
75
+ if SctCore::Helper.operatingSystem == SctCore::Helper::WINDOWS
76
+ windows_home_path = SctCore::Helper.windowsHomePath
69
77
  kube_file_path = windows_home_path+"/.kube/config"
70
78
 
71
79
  if !File.exists?(kube_file_path)
72
- return puts "#{kube_file_path} doesn't exist".red
80
+ return UI.error("#{kube_file_path} doesn't exist")
73
81
  end
74
82
 
75
83
  run_command "sed -e 's~\\\\~/~g' -e 's~C:~/mnt/c~g' < #{kube_file_path} > ~/.kube/minikube-config"
76
84
 
77
- puts "#{kube_file_path} copied to ~/.kube/minikube-config".green
85
+ UI.success("#{kube_file_path} copied to ~/.kube/minikube-config")
78
86
  end
79
87
 
80
88
  run_command "kubectl config use-context minikube"
81
89
 
82
- run_command "kubectl replace -n kube-system -f #{File.expand_path('../../../resources/corefile.yml', __dir__)}"
83
- run_command "kubectl delete pod -n kube-system #{pods("kube-system").map { |pod| pod[:name] if pod[:name].start_with? "coredns" } .compact.join(" ")}"
90
+ run_command "kubectl replace -n kube-system -f #{File.expand_path('../../resources/corefile.yml', __dir__)}"
91
+ old_list = pods("kube-system").map { |pod| pod[:name] if pod[:name].start_with? "coredns" }.compact
92
+ run_command "kubectl delete pod -n kube-system #{old_list.join(" ")}" unless old_list.to_a.empty?
84
93
  run_command "kubectl rollout status -n kube-system deployment/coredns"
85
94
  end
86
95
 
87
- def delete_stalled_pods(feedback: false)
88
- stalled_pods = pods.select { |pod| pod[:stalled] }
89
-
90
- if stalled_pods.empty?
91
- puts "There are no stalled pods.".green if feedback
96
+ def pods(namespace = nil)
97
+ if namespace
98
+ output = `kubectl get pods -n #{namespace}`
92
99
  else
93
- run_command "kubectl delete pods #{stalled_pods.map { |pod| pod[:name] } .join(" ")}"
100
+ output = `kubectl get pods`
94
101
  end
95
- end
96
102
 
97
- def start
98
- if Sct::Helpers.operatingSystem == Sct::Helpers::MAC_OS
99
- run_command "#{minikube} start --cpus=$(sysctl -n hw.ncpu) --memory=8G"
100
- else
101
- run_command "#{minikube} start --cpus=$(cat /proc/cpuinfo | grep processor | wc -l) --memory=10G"
103
+ # split output lines
104
+ lines = output.split "\n"
105
+
106
+ # exclude first line (table header)
107
+ lines = lines[1..-1]
108
+
109
+ if lines.to_a.empty?
110
+ return
102
111
  end
103
- run_command "#{minikube} ssh -- 'sudo su -c \"echo 10048576 > /proc/sys/fs/inotify/max_user_watches\"'"
104
- update_config
105
- end
106
112
 
107
- def post_start
108
- wait_for_pods
109
- run_command "sudo sct hostfile"
110
- puts "\n✔️ You can visit your environment at 👉 https://spend-cloud.spend.cloud.local 👌"
113
+ # get name and status of each pod
114
+ lines.map do |line|
115
+ columns = line.split(" ")
116
+
117
+ name = columns[0]
118
+ status = columns[2]
119
+ stalled = status == "ErrImagePull" || status == "ImagePullBackOff"
120
+
121
+ {
122
+ name: name,
123
+ status: status,
124
+ stalled: stalled
125
+ }
126
+ end
111
127
  end
112
128
 
113
129
  def create_secrets
@@ -123,35 +139,23 @@ module Sct
123
139
  end
124
140
 
125
141
  def wait_for_gcr_secret
126
- puts "Waiting for Google Cloud Registry secret to become available...".yellow
142
+ UI.important("Waiting for Google Cloud Registry secret to become available...")
127
143
 
128
144
  while ! `kubectl get secrets`.include? "gcr-secret"
129
145
  sleep 5
130
146
  end
131
147
 
132
- puts "Google Cloud Registry secret is now available.".green
148
+ UI.success("Google Cloud Registry secret is now available.")
133
149
  end
134
150
 
135
151
  def wait_for_ingress_ip
136
- puts "Waiting for ingress IP to become available...".yellow
152
+ UI.important("Waiting for ingress IP to become available...")
137
153
 
138
154
  while `kubectl describe ingress | grep "Address" | awk '{print $2}'`.empty?
139
155
  sleep 5
140
156
  end
141
157
 
142
- puts "Ingress IP is now available.".green
143
- end
144
-
145
- def wait_for_pods
146
- puts "Waiting for pods to become ready...".yellow
147
-
148
- while ! pods.all? { |pod| pod[:status] == "Running" }
149
- delete_stalled_pods
150
-
151
- sleep 5
152
- end
153
-
154
- puts "Pods are now ready.".green
158
+ UI.success("Ingress IP is now available.")
155
159
  end
156
160
 
157
161
  def status
@@ -162,7 +166,7 @@ module Sct
162
166
  print_pods_status("kube-system")
163
167
  print_pods_status
164
168
  else
165
- puts "Please check your minikube status. If all services are stopped you should start the minikube first.".yellow
169
+ UI.important("Please check your minikube status. If all services are stopped you should start the minikube first.")
166
170
  end
167
171
  end
168
172
 
@@ -201,7 +205,14 @@ module Sct
201
205
  end
202
206
 
203
207
  def print_pods_status(namespace = nil)
204
- rows = pods(namespace).map do |pod|
208
+
209
+ pods_list = pods(namespace)
210
+
211
+ if pods_list.to_a.empty?
212
+ return
213
+ end
214
+
215
+ rows = pods_list.map do |pod|
205
216
  [
206
217
  pod[:name],
207
218
  pod[:status] == "Running" ? pod[:status].green : pod[:status].red
@@ -211,35 +222,6 @@ module Sct
211
222
  puts Terminal::Table.new title: "Pods (namespace: #{namespace || "default"})".green, headings: ['Name', 'Status'], rows: rows
212
223
  end
213
224
 
214
- def pods(namespace = nil)
215
- if namespace
216
- output = `kubectl get pods -n #{namespace}`
217
- else
218
- output = `kubectl get pods`
219
- end
220
-
221
- # split output lines
222
- lines = output.split "\n"
223
-
224
- # exclude first line (table header)
225
- lines = lines[1..-1]
226
-
227
- # get name and status of each pod
228
- lines.map do |line|
229
- columns = line.split(" ")
230
-
231
- name = columns[0]
232
- status = columns[2]
233
- stalled = status == "ErrImagePull" || status == "ImagePullBackOff"
234
-
235
- {
236
- name: name,
237
- status: status,
238
- stalled: stalled
239
- }
240
- end
241
- end
242
-
243
225
  def run_command command
244
226
  if ! system command
245
227
  raise command.red
@@ -247,15 +229,11 @@ module Sct
247
229
  end
248
230
 
249
231
  def minikube
250
- if Sct::Helpers.operatingSystem == Sct::Helpers::WINDOWS
232
+ if SctCore::Helper.operatingSystem == SctCore::Helper::WINDOWS
251
233
  return "minikube.exe"
252
234
  else
253
235
  return "minikube"
254
236
  end
255
237
  end
256
-
257
- implements CommandInterface
258
-
259
238
  end
260
-
261
- end
239
+ end