k-tools 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/kt +6 -0
- data/lib/ktools.rb +34 -0
- data/lib/ktools/application.rb +32 -0
- data/lib/ktools/configuration.rb +13 -0
- data/lib/ktools/kdb.rb +36 -0
- data/lib/ktools/setup.rb +52 -0
- data/lib/ktools/sh.rb +84 -0
- data/lib/ktools/tools/deliver.rb +84 -0
- data/lib/ktools/tools/help.rb +38 -0
- data/lib/ktools/tools/spy.rb +109 -0
- data/lib/ktools/tools/swap.rb +58 -0
- data/lib/ktools/version.rb +3 -0
- metadata +142 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0226a35539e64679a9aea7413be04b860ddba08fde82448467fb0bcb3222b97d
|
4
|
+
data.tar.gz: dc63a32c9eba1d110eca92bd1face84cee59243d049e4d17c7e3f9d7c0754c8b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 994b074e26c3d39ee9134438dea60b6e6085b1567d07169d7e9874c87f964b6ec92f04c1140689eacecef25c8fc3810096d184aaf58e0eeb6b619494b229dbce
|
7
|
+
data.tar.gz: 5a9a1746418a318674f6ecb1980ab670144972e39459223a7724ff654f5461acc2fe1b8a541577ea99336efe55ccf1b2f03c6bc30ed19311bebd2609a54a63b9
|
data/bin/kt
ADDED
data/lib/ktools.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
require 'pry'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'oj'
|
5
|
+
|
6
|
+
require 'ktools/application'
|
7
|
+
require 'ktools/configuration'
|
8
|
+
require 'ktools/kdb'
|
9
|
+
require 'ktools/setup'
|
10
|
+
require 'ktools/sh'
|
11
|
+
require 'ktools/version'
|
12
|
+
|
13
|
+
require 'ktools/tools/deliver'
|
14
|
+
require 'ktools/tools/help'
|
15
|
+
require 'ktools/tools/spy'
|
16
|
+
require 'ktools/tools/swap'
|
17
|
+
|
18
|
+
module KTools
|
19
|
+
class << self
|
20
|
+
attr_writer :configuration
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.configuration
|
24
|
+
@configuration ||= Configuration.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.reset
|
28
|
+
@configuration = Configuration.new
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.configure
|
32
|
+
yield configuration
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module KTools
|
2
|
+
class Application
|
3
|
+
def initialize(args)
|
4
|
+
Setup.perform unless Setup.done?
|
5
|
+
|
6
|
+
@config = Setup.load
|
7
|
+
@command = args[0]
|
8
|
+
@tail = drop_first_arg(args)
|
9
|
+
end
|
10
|
+
|
11
|
+
def start
|
12
|
+
case @command
|
13
|
+
when 'spy'
|
14
|
+
Tools::Spy.start(@tail)
|
15
|
+
when 'deliver'
|
16
|
+
Tools::Deliver.start(@tail)
|
17
|
+
when 'swap'
|
18
|
+
Tools::Swap.start(@tail)
|
19
|
+
when 'setup'
|
20
|
+
Setup.perform
|
21
|
+
else
|
22
|
+
Tools::Help.display
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def drop_first_arg(args)
|
29
|
+
args.drop(1)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module KTools
|
2
|
+
LIB_PATH = File.expand_path('../../', __FILE__)
|
3
|
+
|
4
|
+
class Configuration
|
5
|
+
attr_accessor :kpath, :config_file, :kube_path
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@kpath = "#{Dir.home}/.ktools"
|
9
|
+
@kube_path = "#{Dir.home}/.kube"
|
10
|
+
@config_file = "#{@kpath}/config.json"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/ktools/kdb.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module KTools
|
2
|
+
class KDB
|
3
|
+
attr_accessor :config_file, :kpath
|
4
|
+
|
5
|
+
def self.read
|
6
|
+
config_file = self.new.config_file
|
7
|
+
return false unless File.exist?(config_file)
|
8
|
+
|
9
|
+
data = File.read(config_file)
|
10
|
+
Oj.load(data)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.write(data)
|
14
|
+
kdb = self.new
|
15
|
+
kdb.create_path
|
16
|
+
|
17
|
+
File.open(kdb.config_file, 'w') do |f|
|
18
|
+
f.write(Oj.dump(data))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.update(current, entry)
|
23
|
+
self.write(current.merge(entry))
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize
|
27
|
+
@config_file = KTools.configuration.config_file
|
28
|
+
@kpath = KTools.configuration.kpath
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_path
|
32
|
+
return true if File.exist?(@config_file)
|
33
|
+
FileUtils.mkdir_p(@kpath)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/ktools/setup.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module KTools
|
2
|
+
class Setup
|
3
|
+
def self.done?
|
4
|
+
KDB.read ? true : false
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.load
|
8
|
+
KDB.read
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.perform
|
12
|
+
secrets_path = self.new.get_secrets_path
|
13
|
+
KDB.write({"secrets" => secrets_path})
|
14
|
+
|
15
|
+
puts "Your 'secrets' path was saved as:"
|
16
|
+
puts secrets_path
|
17
|
+
|
18
|
+
puts ""
|
19
|
+
puts "For redefining it you can run:"
|
20
|
+
puts "$ kt setup"
|
21
|
+
puts ""
|
22
|
+
|
23
|
+
exit
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize; end
|
27
|
+
|
28
|
+
def get_secrets_path
|
29
|
+
path = String.new
|
30
|
+
|
31
|
+
loop do
|
32
|
+
puts "Insert the path for your 'secrets' repository:"
|
33
|
+
puts ""
|
34
|
+
print "#{Dir.home}/"
|
35
|
+
|
36
|
+
input = STDIN.gets.chomp.chomp('/')
|
37
|
+
path = "#{Dir.home}/#{input}"
|
38
|
+
ima_secret_path = "#{path}/.ima_secret"
|
39
|
+
|
40
|
+
puts ""
|
41
|
+
|
42
|
+
if File.file?(ima_secret_path)
|
43
|
+
break
|
44
|
+
else
|
45
|
+
puts "That's a invalid path, try again."
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
path
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/ktools/sh.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
module KTools
|
2
|
+
class Sh
|
3
|
+
# Secure mode, asks for confirmation.
|
4
|
+
# Shows command.
|
5
|
+
# Shows output.
|
6
|
+
def self.ell(cmd)
|
7
|
+
puts "Confirmation required."
|
8
|
+
puts ""
|
9
|
+
puts "Command:"
|
10
|
+
puts cmd
|
11
|
+
puts ""
|
12
|
+
|
13
|
+
print "Y/n: "
|
14
|
+
if "Y" == STDIN.gets.chomp
|
15
|
+
puts ""
|
16
|
+
puts "Running..."
|
17
|
+
puts `#{cmd}`
|
18
|
+
else
|
19
|
+
puts ""
|
20
|
+
puts "Aborted."
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Forced mode, won't ask confirmation.
|
25
|
+
# Shows command.
|
26
|
+
# Shows output.
|
27
|
+
def self.ell!(cmd)
|
28
|
+
puts cmd
|
29
|
+
puts `#{cmd}`
|
30
|
+
end
|
31
|
+
|
32
|
+
# Forced mode, won't ask confirmation.
|
33
|
+
# Won't show command.
|
34
|
+
# Won't show output.
|
35
|
+
# Returns output.
|
36
|
+
def self.elld!(cmd)
|
37
|
+
`#{cmd}`
|
38
|
+
end
|
39
|
+
|
40
|
+
# Forced mode, won't ask confirmation.
|
41
|
+
# Won't show command.
|
42
|
+
# Shows the output.
|
43
|
+
def self.ellb!(cmd)
|
44
|
+
puts `#{cmd}`
|
45
|
+
end
|
46
|
+
|
47
|
+
# Forced mode, won't ask confirmation.
|
48
|
+
# Shows command.
|
49
|
+
# Shows output.
|
50
|
+
# Loops into the output.
|
51
|
+
def self.ell_in!(cmd)
|
52
|
+
puts cmd
|
53
|
+
IO.popen(cmd) do |io|
|
54
|
+
while (line = io.gets) do
|
55
|
+
puts line
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Forced mode, won't ask confirmation.
|
61
|
+
# It's the meta-shell, or kt-shell mode.
|
62
|
+
# It emulates a shell over Ruby's $stdin/$stdout.
|
63
|
+
def self.ell_meta(cmd)
|
64
|
+
$stdout.print 'Press enter...'
|
65
|
+
started = false
|
66
|
+
|
67
|
+
$stdin.each_line do |line|
|
68
|
+
if started
|
69
|
+
pid = fork {
|
70
|
+
exec line
|
71
|
+
}
|
72
|
+
else
|
73
|
+
started = true
|
74
|
+
pid = fork {
|
75
|
+
exec cmd
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
Process.wait pid
|
80
|
+
$stdout.print 'kt:shell$ '
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module KTools
|
2
|
+
module Tools
|
3
|
+
class Deliver
|
4
|
+
def self.start(args)
|
5
|
+
self.new(args).start
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize(args)
|
9
|
+
@action = "#{args[0]} #{args[1]}"
|
10
|
+
@subject = args[2]
|
11
|
+
@argument = args[3]
|
12
|
+
end
|
13
|
+
|
14
|
+
def start
|
15
|
+
case @action
|
16
|
+
when 'force deploy'
|
17
|
+
dockerfile = "./Dockerfile"
|
18
|
+
do_fail("Dockerfile?") unless File.exist?(dockerfile)
|
19
|
+
|
20
|
+
registry = "registry.gitlab.com/"
|
21
|
+
origin = Sh.elld!("git config --get remote.origin.url")
|
22
|
+
do_fail("It is a Git repo?") unless origin
|
23
|
+
|
24
|
+
project = origin[/(?<=:)([^.]*)/]
|
25
|
+
do_fail("Can't find your project name.") if project.empty?
|
26
|
+
|
27
|
+
image_tag = "forcedAt#{Time.now.to_i}"
|
28
|
+
image = "#{registry}#{project}:#{image_tag}"
|
29
|
+
|
30
|
+
puts "Forcing deployment..."
|
31
|
+
puts "Project: #{project}"
|
32
|
+
puts "Deployment Name: #{@subject}"
|
33
|
+
puts "Docker Image: #{image}"
|
34
|
+
|
35
|
+
puts ""
|
36
|
+
puts "Ctrl-C to cancel in 5 seconds..."
|
37
|
+
sleep 5
|
38
|
+
puts "Starting..."
|
39
|
+
|
40
|
+
Sh.ell_in!("docker build -t #{image} .")
|
41
|
+
Sh.ell_in!("docker push #{image}")
|
42
|
+
|
43
|
+
Sh.ell_in!("./kdeliver force deploy #{@subject} #{image}")
|
44
|
+
when 'get bash'
|
45
|
+
puts "Opening live Bash..."
|
46
|
+
puts ""
|
47
|
+
|
48
|
+
pod = get_pod
|
49
|
+
container = "#{@subject}-container"
|
50
|
+
|
51
|
+
pod_cmd = "kubectl exec -ti -n default #{pod}"
|
52
|
+
bash_cmd = "-c #{container} /bin/bash"
|
53
|
+
|
54
|
+
Sh.ell_meta("#{pod_cmd} #{bash_cmd}")
|
55
|
+
when 'get logs'
|
56
|
+
puts "Opening live logs..."
|
57
|
+
puts ""
|
58
|
+
|
59
|
+
pod = get_pod
|
60
|
+
|
61
|
+
if @argument == "--tail"
|
62
|
+
Sh.ell_in!("kubectl logs -f #{pod}")
|
63
|
+
else
|
64
|
+
Sh.ell_in!("kubectl logs #{pod}")
|
65
|
+
end
|
66
|
+
else
|
67
|
+
Help.display
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def do_fail(cause)
|
74
|
+
puts cause
|
75
|
+
exit 1
|
76
|
+
end
|
77
|
+
|
78
|
+
def get_pod
|
79
|
+
pods = Sh.elld!("kubectl get pods | grep #{@subject}")
|
80
|
+
pods[/(^\S*)/]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module KTools
|
2
|
+
module Tools
|
3
|
+
class Help
|
4
|
+
def self.display
|
5
|
+
puts logo
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.logo
|
9
|
+
ascii = <<~HEREDOC
|
10
|
+
.----.....``..----...:/``````
|
11
|
+
.----.....``..-----:/+++:....
|
12
|
+
-----.....``..::/++++++o+----
|
13
|
+
`````:+---...-:.`-/++++++++oo/`````
|
14
|
+
````:++///-:++-./+++++++++oo:......
|
15
|
+
::::+++++++++-```/o+++++oo+.```````
|
16
|
+
.../+/:/++++o+-.`:+++ooo+:-````````
|
17
|
+
..:++/+//++oooo+++++++++++.........
|
18
|
+
`:++////++oooooooo+++++++o:........
|
19
|
+
///:////++oooooooo++++++++o........
|
20
|
+
-:/-./++++++++oo++++++++++o/-------
|
21
|
+
:::..-+++++++++++++++++++++o-......
|
22
|
+
-:..../++++++++++++++++++++o+......
|
23
|
+
`......+++++++++++++++++++++o/:::::
|
24
|
+
.......:++++++++++++++++++++o/.....
|
25
|
+
......../++++++++++++++++++++s:....
|
26
|
+
........-++++++++++++//::++++-o:```
|
27
|
+
........./++++//+/--.-----.:/+/+-..
|
28
|
+
`````````.:++o-.o---.-----.``-+/``-
|
29
|
+
----------:/+/-:o:-------.````.:+/:
|
30
|
+
:::::::::::/o/-:/.``````.-------+//
|
31
|
+
:::::::::::+/..--........``````./::
|
32
|
+
----------:+::::-........``````./::
|
33
|
+
..........++:------------.`````./::
|
34
|
+
HEREDOC
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module KTools
|
2
|
+
module Tools
|
3
|
+
class Spy
|
4
|
+
def self.start(args)
|
5
|
+
self.new(args).start
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize(args)
|
9
|
+
@args = args
|
10
|
+
@action = "#{args[0]} #{args[1]}"
|
11
|
+
@subject = args[2]
|
12
|
+
@env = args[3]
|
13
|
+
@cfg = KTools::KDB.read
|
14
|
+
end
|
15
|
+
|
16
|
+
def start
|
17
|
+
case @action
|
18
|
+
when 'drop registry'
|
19
|
+
puts "Deleting Docker Registry for #{@subject}..."
|
20
|
+
puts ""
|
21
|
+
|
22
|
+
registry_name = "#{@subject}-registry"
|
23
|
+
|
24
|
+
Sh.ell("kubectl delete secret #{registry_name}")
|
25
|
+
when 'create registry'
|
26
|
+
puts "Creating Docker Registry for #{@subject}..."
|
27
|
+
puts ""
|
28
|
+
|
29
|
+
registry_name = "#{@subject}-registry"
|
30
|
+
env_path = "#{@cfg["secrets"]}/#{@env}/#{@subject}"
|
31
|
+
env_file = "#{env_path}/registry.json"
|
32
|
+
envd = Oj.load(File.read(env_file))
|
33
|
+
|
34
|
+
kube_cmd = <<~HEREDOC
|
35
|
+
kubectl create secret docker-registry #{registry_name} \
|
36
|
+
--docker-server=#{envd["KSPY_DOCKER_SERVER"]} \
|
37
|
+
--docker-username=#{envd["KSPY_DOCKER_USER"]} \
|
38
|
+
--docker-password=#{envd["KSPY_DOCKER_PASSWORD"]}
|
39
|
+
HEREDOC
|
40
|
+
|
41
|
+
puts Sh.ellb!(kube_cmd)
|
42
|
+
when 'drop config'
|
43
|
+
puts "Deleting configMap for #{@subject}..."
|
44
|
+
puts ""
|
45
|
+
|
46
|
+
config_name = "#{@subject}-config-map"
|
47
|
+
|
48
|
+
Sh.ell("kubectl delete configMap #{config_name}")
|
49
|
+
when 'apply config'
|
50
|
+
puts "Updating/Creating configMap for #{@subject}..."
|
51
|
+
|
52
|
+
unless @env
|
53
|
+
puts ""
|
54
|
+
puts "Please, express the environment."
|
55
|
+
puts "It can be 'production' or 'staging', like:"
|
56
|
+
puts "$ kt spy apply config appslug staging"
|
57
|
+
exit 1
|
58
|
+
end
|
59
|
+
|
60
|
+
env_path = "#{@cfg["secrets"]}/#{@env}/#{@subject}"
|
61
|
+
config_map_file = "#{env_path}/config_map.yml"
|
62
|
+
|
63
|
+
Sh.ell("kubectl apply -f #{config_map_file}")
|
64
|
+
when 'drop ingress'
|
65
|
+
puts "Deleting ingress for #{@subject}..."
|
66
|
+
puts ""
|
67
|
+
|
68
|
+
ingress_name = "#{@subject}-ingress"
|
69
|
+
|
70
|
+
Sh.ell("kubectl delete ingress #{ingress_name}")
|
71
|
+
when 'apply ingress'
|
72
|
+
puts "Updating/Creating ingress for #{@subject}..."
|
73
|
+
|
74
|
+
unless @env
|
75
|
+
puts ""
|
76
|
+
puts "Please, express the environment."
|
77
|
+
puts "It can be 'production' or 'staging', like:"
|
78
|
+
puts "$ kt spy apply ingress appslug staging"
|
79
|
+
exit 1
|
80
|
+
end
|
81
|
+
|
82
|
+
env_path = "#{@cfg["secrets"]}/#{@env}/#{@subject}"
|
83
|
+
ingress_file = "#{env_path}/ingress.yml"
|
84
|
+
|
85
|
+
Sh.ell("kubectl apply -f #{ingress_file}")
|
86
|
+
when 'drop all'
|
87
|
+
puts "Deleting ALL Kubernetes resources of #{@subject}..."
|
88
|
+
|
89
|
+
puts ""
|
90
|
+
puts "Ctrl-C to cancel in 5 seconds..."
|
91
|
+
sleep 5
|
92
|
+
puts "Starting..."
|
93
|
+
|
94
|
+
drop_cmd = <<~HEREDOC
|
95
|
+
kubectl delete deployment #{@subject}-deployment &&
|
96
|
+
kubectl delete configMap #{@subject}-config-map &&
|
97
|
+
kubectl delete ingress #{@subject}-ingress &&
|
98
|
+
kubectl delete service #{@subject}-service &&
|
99
|
+
kubectl delete secret #{@subject}-registry
|
100
|
+
HEREDOC
|
101
|
+
|
102
|
+
Sh.ellb!(drop_cmd)
|
103
|
+
else
|
104
|
+
Help.display
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module KTools
|
2
|
+
module Tools
|
3
|
+
class Swap
|
4
|
+
def self.start(args)
|
5
|
+
self.new(args).start
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize(args)
|
9
|
+
@subject = args[0]
|
10
|
+
@kube_path = KTools.configuration.kube_path
|
11
|
+
@cfg = KTools::KDB.read
|
12
|
+
end
|
13
|
+
|
14
|
+
def start
|
15
|
+
unless @subject
|
16
|
+
files = Dir["#{@kube_path}/*.yml", "#{@kube_path}/*.yaml"]
|
17
|
+
|
18
|
+
files.each do |file|
|
19
|
+
name = File.basename(file).chomp(".yml").chomp(".yaml")
|
20
|
+
if name == @cfg["cluster"]
|
21
|
+
puts "-> #{name}".colorize(:yellow)
|
22
|
+
else
|
23
|
+
puts "- #{name}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
else
|
27
|
+
c_file = "#{@kube_path}/config"
|
28
|
+
File.delete(c_file) if File.exist?(c_file)
|
29
|
+
|
30
|
+
subject_file = check_subject_file
|
31
|
+
do_fail unless subject_file
|
32
|
+
|
33
|
+
FileUtils.cp(subject_file, c_file)
|
34
|
+
KTools::KDB.update(@cfg, {"cluster" => @subject})
|
35
|
+
|
36
|
+
puts "Swapped to #{@subject}."
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def do_fail
|
43
|
+
puts "Can't find this config file."
|
44
|
+
exit 1
|
45
|
+
end
|
46
|
+
|
47
|
+
def check_subject_file
|
48
|
+
yml_file = "#{@kube_path}/#{@subject}.yml"
|
49
|
+
yaml_file = "#{@kube_path}/#{@subject}.yaml"
|
50
|
+
|
51
|
+
return yml_file if File.exist?(yml_file)
|
52
|
+
return yaml_file if File.exist?(yaml_file)
|
53
|
+
|
54
|
+
false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
metadata
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: k-tools
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fernando Schuindt
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-02-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.12.2
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.12.2
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: colorize
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.8.1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.8.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: oj
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.7'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.7'
|
97
|
+
description: KTools is used to help manage, deploy and debug applications on Kubernetes
|
98
|
+
environments.
|
99
|
+
email:
|
100
|
+
- fernando@foxbox.co
|
101
|
+
executables:
|
102
|
+
- kt
|
103
|
+
extensions: []
|
104
|
+
extra_rdoc_files: []
|
105
|
+
files:
|
106
|
+
- bin/kt
|
107
|
+
- lib/ktools.rb
|
108
|
+
- lib/ktools/application.rb
|
109
|
+
- lib/ktools/configuration.rb
|
110
|
+
- lib/ktools/kdb.rb
|
111
|
+
- lib/ktools/setup.rb
|
112
|
+
- lib/ktools/sh.rb
|
113
|
+
- lib/ktools/tools/deliver.rb
|
114
|
+
- lib/ktools/tools/help.rb
|
115
|
+
- lib/ktools/tools/spy.rb
|
116
|
+
- lib/ktools/tools/swap.rb
|
117
|
+
- lib/ktools/version.rb
|
118
|
+
homepage: https://github.com/foxbox-studios/ktools
|
119
|
+
licenses:
|
120
|
+
- MIT
|
121
|
+
metadata: {}
|
122
|
+
post_install_message:
|
123
|
+
rdoc_options: []
|
124
|
+
require_paths:
|
125
|
+
- lib
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
requirements: []
|
137
|
+
rubyforge_project:
|
138
|
+
rubygems_version: 2.7.6
|
139
|
+
signing_key:
|
140
|
+
specification_version: 4
|
141
|
+
summary: A set of Bash-like tools to manage DO K8s clusters.
|
142
|
+
test_files: []
|