nutkins 0.1.6 → 0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e39c7d9fb6cf2c1c75ea934110db18766e507ab8
4
- data.tar.gz: b8e2dbfa8a16cd68b564db04bd024114cf4c042a
3
+ metadata.gz: 7180a966807e27688ba070e225f11faad2f46dbc
4
+ data.tar.gz: 4a7427067089d88a6a82d576ae7089293fd18cfd
5
5
  SHA512:
6
- metadata.gz: ec3ae892c0dd327696cee6e7254a1cfb3e50bf2a4e3348b012184fc4a1ff61adba402abe451e9b21a15c0bf2f54d49e85cef11ff9706673ce56fcc115ce0fde8
7
- data.tar.gz: c1db55842f25e02cb6163218e6e74d881ab8364f0bbd13763f876cde5c533c9115f7f83fd578ec8a08e400e5e9cac483fa199fef47f11c95af7d616be99e87e1
6
+ metadata.gz: 4f32b2b6fd85b135b5c492450277a354375b1a64cb6128af26223fb1e3715cd61f066892837048a54aef03b4292f5004f2c6653e2acf5e27a575aa54a45c3c0c
7
+ data.tar.gz: 39f709c64bfe4f7ef19f6286c21562b1fbe4ef5aec90f65f2ba64557fb287c68ccaf12fc7cdea6db3a61ec4e6642b54e8cbeb53bf57046c04d92919d3000f660
data/README.md CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  [![build status](https://circleci.com/gh/ohjames/nutkins.png)](https://circleci.com/gh/ohjames/nutkins)
4
4
 
5
- Nutkins is a tool to manage and test a repository containing one or more docker images.
6
- * Easy to create and run test instances of any service in a single command.
7
- * Docker images and containers are managed to avoid the difficulties using the raw `docker` command provides around removing images.
8
- * A wrapper around `fleetctl` to make upgrading services easy.
9
- * Extra configuation in `nutkins.yaml` and `nutkin.yaml` to add extra functionality missing from docker.
5
+ Nutkins is a tool to help build and test multiple docker containers configured via etcd and confd. You can:
6
+ * Describe test volumes and etcd variables using yaml.
7
+ * Easily rebuild and test containers with a few simple commands.
data/bin/nutkins CHANGED
@@ -42,6 +42,9 @@ module Nutkins::Command
42
42
  op.subcommand 'build-secret,B path', 'build secret files/volumes'
43
43
  op.subcommand 'extract-secrets,X [*names]', 'extract secret files/volumes'
44
44
 
45
+ op.subcommand 'start-etcd', 'start container running etcd'
46
+ op.subcommand 'stop-etcd', 'stop container running etcd'
47
+
45
48
  parsed_cfg = op.parse(args).to_h
46
49
 
47
50
  global_config = OpenStruct.new parsed_cfg[:config]
@@ -75,6 +78,10 @@ module Nutkins::Command
75
78
  nutkins.build_secret config.path
76
79
  when 'extract-secrets'
77
80
  nutkins.extract_secrets config.names
81
+ when 'start-etcd'
82
+ nutkins.start_etcd_container
83
+ when 'stop-etcd'
84
+ nutkins.stop_etcd_container
78
85
  end
79
86
  rescue RuntimeError => e
80
87
  puts e.to_s
@@ -1,10 +1,8 @@
1
+ require 'open3'
2
+
1
3
  module Nutkins::Docker
2
4
  def self.image_id_for_tag tag
3
- regex = /^#{tag} +/
4
- `docker images`.each_line do |line|
5
- return line.split(' ')[2] if line =~ regex
6
- end
7
- nil
5
+ self.run_get_stdout 'inspect', '--format="{{.Id}}"', tag
8
6
  end
9
7
 
10
8
  def self.container_id_for_tag tag
@@ -14,4 +12,26 @@ module Nutkins::Docker
14
12
  end
15
13
  nil
16
14
  end
15
+
16
+ def self.container_id_for_name name
17
+ self.run_get_stdout 'inspect', '--format="{{.Id}}"', name
18
+ end
19
+
20
+ def self.run_get_stdout *args
21
+ stdout_str, stderr_str, status = Open3.capture3 'docker', *args
22
+ status.success? && stdout_str.chomp
23
+ end
24
+
25
+ def self.run *args, stdout: false, stderr: true
26
+ stdout_backup = ! stdout && $stdout.clone
27
+ stderr_backup = ! stderr && $stderr.clone
28
+ $stdout.reopen File.new('/dev/null', 'w') unless stdout
29
+ $stderr.reopen File.new('/dev/null', 'w') unless stderr
30
+ begin
31
+ system 'docker', *args
32
+ ensure
33
+ $stdout.reopen stdout_backup unless stdout
34
+ $stderr.reopen stderr_backup unless stderr
35
+ end
36
+ end
17
37
  end
@@ -1,3 +1,3 @@
1
1
  module Nutkins
2
- VERSION = "0.1.6"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/nutkins.rb CHANGED
@@ -32,7 +32,7 @@ module Nutkins
32
32
  cfg = get_image_config img_name
33
33
  img_dir = get_project_dir img_name
34
34
  raise "directory `#{img_dir}' does not exist" unless Dir.exists? img_dir
35
- tag = get_tag cfg
35
+ tag = cfg['tag']
36
36
 
37
37
  build_cfg = cfg["build"]
38
38
  if build_cfg
@@ -43,11 +43,11 @@ module Nutkins
43
43
 
44
44
  prev_image_id = Docker.image_id_for_tag tag
45
45
 
46
- if run_docker "build", "-t", tag, img_dir
46
+ if Docker.run 'build', '-t', cfg['latest_tag'], '-t', tag, img_dir, stdout: true
47
47
  image_id = Docker.image_id_for_tag tag
48
48
  if not prev_image_id.nil? and image_id != prev_image_id
49
49
  puts "deleting previous image #{prev_image_id}"
50
- run_docker "rmi", prev_image_id
50
+ Docker.run "rmi", prev_image_id
51
51
  end
52
52
  else
53
53
  raise "issue building docker image for #{img_name}"
@@ -75,10 +75,10 @@ module Nutkins
75
75
  end
76
76
  end
77
77
 
78
- tag = get_tag cfg
78
+ tag = cfg['tag']
79
79
  prev_container_id = Docker.container_id_for_tag tag unless preserve
80
80
  puts "creating new docker image"
81
- unless run_docker "create", "-it", *flags, tag, *docker_args
81
+ unless Docker.run "create", "-it", *flags, tag, *docker_args
82
82
  raise "failed to create `#{img_name}' container"
83
83
  end
84
84
 
@@ -86,7 +86,7 @@ module Nutkins
86
86
  container_id = Docker.container_id_for_tag tag
87
87
  if not prev_container_id.nil? and container_id != prev_container_id
88
88
  puts "deleting previous container #{prev_container_id}"
89
- run_docker "rm", prev_container_id
89
+ Docker.run "rm", prev_container_id
90
90
  end
91
91
  end
92
92
 
@@ -95,7 +95,7 @@ module Nutkins
95
95
 
96
96
  def run img_name, reuse: false, shell: false
97
97
  cfg = get_image_config img_name
98
- tag = get_tag cfg
98
+ tag = cfg['tag']
99
99
  create_args = []
100
100
  if shell
101
101
  raise '--shell and --reuse arguments are incompatible' if reuse
@@ -124,11 +124,12 @@ module Nutkins
124
124
 
125
125
  def delete img_name
126
126
  cfg = get_image_config img_name
127
- tag = get_tag cfg
127
+ tag = cfg['tag']
128
128
  container_id = Docker.container_id_for_tag tag
129
129
  raise "no container to delete" if container_id.nil?
130
130
  puts "deleting container #{container_id}"
131
- run_docker "rm", container_id
131
+ # TODO: also delete :latest
132
+ Docker.run "rm", container_id
132
133
  end
133
134
 
134
135
  def delete_all
@@ -176,11 +177,46 @@ module Nutkins
176
177
  puts "TODO: exec #{img_name}: #{cmd.join ' '}"
177
178
  end
178
179
 
180
+ def start_etcd_container
181
+ name = get_etcd_container_name
182
+ return unless name
183
+ existing = Docker.container_id_for_name name
184
+ unless existing
185
+ Docker.run 'create', '--name', name, '-p', '4001:4001', 'microbox/etcd:latest', '-name', name
186
+ end
187
+
188
+ if Docker.run 'start', name
189
+ puts 'started etcd container'
190
+ else
191
+ puts 'failed to start etcd container'
192
+ end
193
+ end
194
+
195
+ def stop_etcd_container
196
+ name = get_etcd_container_name
197
+ return unless name
198
+ if Docker.run 'stop', name
199
+ puts 'stopped etcd container'
200
+ else
201
+ puts 'failed to stop etcd container'
202
+ end
203
+ end
204
+
179
205
  private
206
+ def get_etcd_container_name
207
+ repository = @config.repository
208
+ repository && "nutkins-etcd-#{repository}"
209
+ end
210
+
180
211
  def get_image_config path
181
212
  img_cfg_path = File.join get_project_dir(path), IMG_CONFIG_FILE_NAME
182
213
  img_cfg = File.exists?(img_cfg_path) ? YAML.load_file(img_cfg_path) : {}
183
214
  img_cfg["image"] ||= path if path != '.'
215
+ img_cfg["version"] ||= @config.version if @config.version
216
+ img_cfg['version'] = img_cfg['version'].to_s
217
+ raise 'missing mandatory version field' unless img_cfg.has_key? 'version'
218
+ img_cfg['latest_tag'] = get_tag img_cfg
219
+ img_cfg['tag'] = img_cfg['latest_tag'] + ':' + img_cfg['version']
184
220
  img_cfg
185
221
  end
186
222
 
@@ -211,9 +247,5 @@ module Nutkins
211
247
  img_dir = get_project_dir img_name
212
248
  Dir.glob("#{img_dir}/{volumes,secrets}/*.gpg")
213
249
  end
214
-
215
- def run_docker *args
216
- system 'docker', *args
217
- end
218
250
  end
219
251
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nutkins
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Pike
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-02 00:00:00.000000000 Z
11
+ date: 2016-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler