kapten 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a12301a0450644f79a5e7cccff56fb4bf25d7903
4
+ data.tar.gz: 80eb062eabdf84778f079912b10c245ef0ea497a
5
+ SHA512:
6
+ metadata.gz: 00b93967c2d698f1dd6b17db04c6764399ccb9279aa536d5007738deb939edfba37e47c29a460448ad2f198e5651d3e20e7578cb31dee095394717bb8c5b8d8a
7
+ data.tar.gz: e4e720f309b7c75d385a1f9d30ee1bda8cfec240b0d4d9cf5f6c23e447eca12be05b537284ff2bbb670abdf480e0488b3fc0153fe8ddab5d21affe2c5e086f16
data/bin/kapten ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "kapten"
4
+
5
+ Kapten::CLI.start
@@ -0,0 +1,39 @@
1
+ require 'json'
2
+
3
+ module Kapten::Config
4
+
5
+ CONFIG_FILE = ".kapten.json"
6
+
7
+
8
+ # Get config from current directory (.kapten.json file)
9
+ def self.get
10
+
11
+ return false unless File.file?( Kapten::Config::CONFIG_FILE )
12
+
13
+ config_contents = File.read( Kapten::Config::CONFIG_FILE )
14
+
15
+ config = JSON.parse(config_contents)
16
+
17
+ end
18
+
19
+
20
+ # Generate a basic config file
21
+ def self.generate(type, name)
22
+
23
+ config = {
24
+ type: type,
25
+ name: name,
26
+ }
27
+
28
+ return config
29
+
30
+ end
31
+
32
+
33
+ # Update config file with new data
34
+ def self.save(config)
35
+ File.write( Kapten::Config::CONFIG_FILE, config.to_json )
36
+ return true
37
+ end
38
+
39
+ end
@@ -0,0 +1,145 @@
1
+ require 'docker'
2
+ require 'colorize'
3
+
4
+ module Kapten::DockerApi
5
+
6
+ # Check if Docker is installed
7
+ def self.has_docker?
8
+
9
+ begin
10
+
11
+ version = Docker.version
12
+ return true if version
13
+
14
+ rescue
15
+
16
+ return false
17
+
18
+ end
19
+
20
+ return false
21
+
22
+ end
23
+
24
+
25
+ # Get Docker container by Kapten name
26
+ def self.get_container(name)
27
+
28
+ begin
29
+
30
+ container = Docker::Container.get('kapten_' + name)
31
+ return container
32
+
33
+ rescue
34
+
35
+ return false
36
+
37
+ end
38
+
39
+ end
40
+
41
+
42
+ # Get Docker image by name
43
+ def self.get_image(image)
44
+
45
+ begin
46
+
47
+ image = Docker::Image.get( image )
48
+ return image
49
+
50
+ rescue
51
+
52
+ return false
53
+
54
+ end
55
+
56
+ end
57
+
58
+
59
+ # Start Docker container, attaches STDIN and STDOUT
60
+ def self.start(name, image)
61
+
62
+ container = Kapten::DockerApi::get_container(name)
63
+
64
+ if not container
65
+
66
+ # Pull image if not installed
67
+ docker_image = Kapten::DockerApi::get_image( image )
68
+
69
+ unless docker_image
70
+
71
+ puts "First time running, installing environment (this might take a few minutes)...".green
72
+ docker_image = Docker::Image.create( 'fromImage' => image )
73
+
74
+ end
75
+
76
+
77
+ puts "Creating environment...".green
78
+
79
+ container = Docker::Container.create(
80
+ 'Image' => image,
81
+ 'name' => 'kapten_' + name,
82
+ 'Hostname' => name,
83
+ 'Cmd' => ['/bin/bash'],
84
+ "OpenStdin" => true,
85
+ "StdinOnce" => true,
86
+ "Tty" => true,
87
+ "WorkingDir" => "/usr/src/" + name,
88
+ "Hostconfig" => {
89
+ "Binds" => [Dir.pwd + ":/usr/src/" + name]
90
+ }
91
+ )
92
+
93
+ end
94
+
95
+ container.start
96
+ puts "---------------------------------".green
97
+ puts 'Kapten: You\'re now inside the development environment, go wild! (use "exit" to get out of here)'.green
98
+
99
+
100
+ # Connect to container shell with both STDIN and STDOUT
101
+ require "io/console"
102
+ STDIN.raw do |stdin|
103
+ container.exec(["bash"], stdin: stdin, tty: true) do |chunk|
104
+ print chunk
105
+ end
106
+ end
107
+
108
+ end
109
+
110
+
111
+ # Stop running container
112
+ def self.stop(name)
113
+
114
+ container = Kapten::DockerApi::get_container(name)
115
+
116
+ if container
117
+
118
+ container.stop
119
+ return true
120
+
121
+ end
122
+
123
+ return false
124
+
125
+ end
126
+
127
+
128
+ # Fully remove container
129
+ def self.destroy(name)
130
+
131
+ container = Kapten::DockerApi::get_container(name)
132
+
133
+ if container
134
+
135
+ container.stop
136
+ container.delete(:force => true)
137
+ return true
138
+
139
+ end
140
+
141
+ return false
142
+
143
+ end
144
+
145
+ end
@@ -0,0 +1,67 @@
1
+ require 'colorize'
2
+
3
+ module Kapten::Helpers
4
+
5
+ TYPES = {
6
+ 'ruby' => 'ruby:latest',
7
+ 'python' => 'python:latest',
8
+ 'node' => 'node:latest',
9
+ 'elixir' => 'elixir:latest',
10
+ 'php' => 'php:latest',
11
+ 'go' => 'golang:latest',
12
+ 'haskell' => 'haskell:latest',
13
+ 'java' => 'openjdk:latest',
14
+ 'perl' => 'perl:latest',
15
+ }
16
+
17
+
18
+ # Validate that Kapten is initalized and Docker is installed
19
+ def self.validate_install
20
+
21
+ config = Kapten::Config::get
22
+
23
+ # Make sure a config exists (Kapten has been initialized)
24
+ unless config
25
+ puts 'Kapten not initalized'.red
26
+ puts 'Run "kapten init" to get started'.red
27
+ return false
28
+ end
29
+
30
+ # Make sure Docker is instsalled
31
+ unless Kapten::DockerApi::has_docker?
32
+ puts 'Kapten requires Docker'.red
33
+ puts 'Install and then try running command again: https://www.docker.com'.red
34
+ return false
35
+ end
36
+
37
+ return config
38
+
39
+ end
40
+
41
+
42
+ # Get Docker image by environment type
43
+ def self.get_image(type)
44
+
45
+ return Kapten::Helpers::TYPES[ type ]
46
+
47
+ end
48
+
49
+
50
+ # Get all available environment types
51
+ def self.get_types
52
+
53
+ return Kapten::Helpers::TYPES.keys
54
+
55
+ end
56
+
57
+
58
+ # Remove all traces of Kapten (stop and destory container, delete config file)
59
+ def self.remove(name)
60
+
61
+ Kapten::DockerApi::destroy( name )
62
+
63
+ File.delete( Kapten::Config::CONFIG_FILE )
64
+
65
+ end
66
+
67
+ end
data/lib/kapten.rb ADDED
@@ -0,0 +1,135 @@
1
+ require 'thor'
2
+ require 'colorize'
3
+
4
+ module Kapten;end
5
+
6
+ require 'kapten/helpers'
7
+ require 'kapten/docker'
8
+ require 'kapten/config'
9
+
10
+ class Kapten::CLI < Thor
11
+
12
+ desc 'init [TYPE]', 'Initalize Kapten in the current directory'
13
+ method_option :name, :aliases => "-n", :desc => "Specify a name. Defaults to the current directory name."
14
+ long_desc <<-LONGDESC
15
+ Initalize Kapten in the current directory with a specified environment type
16
+
17
+ Available types are: #{Kapten::Helpers::get_types.join(', ')}
18
+ LONGDESC
19
+ def init(type)
20
+
21
+ if Kapten::Config.get
22
+ puts 'Environment already initialized'
23
+ puts 'Use "kapten start" to get developing'
24
+ return
25
+ end
26
+
27
+ types = Kapten::Helpers::get_types
28
+
29
+ if not types.include?(type)
30
+ puts 'No such environment type'.red
31
+ puts 'Available environment types are: ' + types.join(', ')
32
+ return
33
+ end
34
+
35
+ name = options[:name] || File.basename(Dir.getwd)
36
+
37
+ config = Kapten::Config::generate(type, name)
38
+
39
+ Kapten::Config::save(config)
40
+
41
+ puts 'Kapten initialized!'.green
42
+ puts 'Use "kapten start" to load your environment'
43
+
44
+ end
45
+
46
+
47
+ desc 'start', 'Run and attach environemnt'
48
+ def start
49
+
50
+ config = Kapten::Helpers::validate_install
51
+ return unless config
52
+
53
+ image = Kapten::Helpers::get_image( config['type'] )
54
+
55
+ Kapten::DockerApi::start( config['name'], image )
56
+
57
+ end
58
+
59
+
60
+ desc 'stop', 'Stop environment'
61
+ def stop
62
+
63
+ config = Kapten::Helpers::validate_install
64
+ return unless config
65
+
66
+ puts 'Stopping Kapten environment...'
67
+
68
+ results = Kapten::DockerApi::stop( config['name'] )
69
+
70
+ puts 'Environment no longer active!'.green
71
+
72
+ end
73
+
74
+
75
+ desc 'destroy', 'Destroy environment (use "kapten start" to recreate)'
76
+ def destroy
77
+
78
+ config = Kapten::Helpers::validate_install
79
+ return unless config
80
+
81
+ unless Kapten::DockerApi::get_container( config['name'] )
82
+
83
+ puts 'No environment to destroy!'
84
+ puts 'Run "kapten start" to set it up'
85
+ return
86
+
87
+ end
88
+
89
+
90
+ puts 'Destroying environment...'
91
+
92
+ results = Kapten::DockerApi::destroy( config['name'] )
93
+
94
+ puts 'Environment destroyed! Rebuild it by running "kapten start".'.green
95
+
96
+ end
97
+
98
+
99
+ desc 'info', 'Info about current environment'
100
+ def info
101
+
102
+ config = Kapten::Helpers::validate_install
103
+ return unless config
104
+
105
+ container = Kapten::DockerApi::get_container( config["name"] )
106
+
107
+ if not container
108
+ status = 'Not created'
109
+ else
110
+ status = "Not running".yellow
111
+ status = "Running".green if container.json["State"]["Running"]
112
+ end
113
+
114
+ puts ''
115
+ puts 'Name: ' + config['name']
116
+ puts 'Type: ' + config['type']
117
+ puts 'Status: ' + status
118
+ puts ''
119
+
120
+ end
121
+
122
+
123
+ desc 'remove', 'Fully remove Kapten from the current project'
124
+ def remove
125
+
126
+ config = Kapten::Helpers::validate_install
127
+ return unless config
128
+
129
+ Kapten::Helpers::remove( config['name'] )
130
+
131
+ puts 'All traces of Kapten have been removed'.green
132
+
133
+ end
134
+
135
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kapten
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Fabian Lindfors
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-04-15 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: ''
14
+ email: fabian@flapplabs.se
15
+ executables:
16
+ - kapten
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/kapten
21
+ - lib/kapten.rb
22
+ - lib/kapten/config.rb
23
+ - lib/kapten/docker.rb
24
+ - lib/kapten/helpers.rb
25
+ homepage: https://github.com/fabianlindfors/kapten
26
+ licenses:
27
+ - MIT
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 2.5.1
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: Simple containerized development environments directly from the command line
49
+ test_files: []