minke 1.6.1 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OWIxZmFjODdiYTgyYzBmOTg2Yjg3Nzg4Y2RlZjRkZmM0MGZkNjk5NQ==
4
+ YmRhZmY1MDljOWIyNjkxOWU0Y2NhYTg5MTdmZjI5ZGFjNDdjYWM5Yg==
5
5
  data.tar.gz: !binary |-
6
- MzQ4YzhmMjFmZDg1N2Y4MmFiZDk2ZTA1ZjRkMzkxOGFiNTg4OTMxMQ==
6
+ ODVkMWRmODEzYWZhZmYwY2FlODFiMTY2MTIzYzNmMjI4OTI5M2M1ZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- Y2IwYTI2YjI0MDhmZDcwYTUzOTBmYmY1OTQ2MzBmZWEyNTFiNTBkMGM3Yzhm
10
- NjE5OTFkNzY5MmUzZTM3Njc3Mjc2NzU0NjM5OTY2NmVkNzUxYjM5MThkNTZh
11
- MjA3MTE3MzViZGRjNjE2ZGE1MzMyOGI1YzU1MDkzYmM2ZTIyNzE=
9
+ YzBiNmE2YjA3ZDRhMjY1NjYzM2M4MzJkYmI4NjZlZTNjZDBlODZlMTNiMTEw
10
+ ZTQyNmMxYmJjNzhiODFkNzhmZTBmNTBlMjQwNjQyNGMwYzNlNDJhNDM5ODE2
11
+ ZmYzMDZhYTM0NzBhMGQ4NmU0NGE0NDIxZjg2OWJlMDg1OTE5ZGY=
12
12
  data.tar.gz: !binary |-
13
- ZjgyNjA0N2I3YWI0M2E0YTVmNTBlZjU2MTU3YmZjYzRiNjk1MWFkOWQxZmYw
14
- NWRkOGE0NmMyNDU0NTEyZTgxNjcyYjVhNzAyNjBkZWUyZmUzZTE0MGRhZDg3
15
- N2MyYTU2ZTE2NzY0MDVjYmRhMjIxMTAwOTRlODE3MGZiMWQ1Yjg=
13
+ M2UyMWYwMzNiYzI2NzFhMjQ5ZjVjYTgxNzFjNWI1Y2E4ZTE0MDMwMTFkNzQw
14
+ ZjZlYmM1ZjU0MTU2NzcwYThkZmFlYjA4MjI0YzJjOTM4NjJkYWE0NzFiZTc1
15
+ MGVjYmM2OGE3MTY1MjVkMWY5MmY1ZjhkNmViMTQyZmFkNzVlZTI=
data/docker/Dockerfile ADDED
@@ -0,0 +1,4 @@
1
+ FROM ruby:latest
2
+
3
+ COPY ./Gemfile Gemfile
4
+ RUN bundle install
data/docker/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "rake"
4
+ gem "cucumber", "~> 1.3.10"
5
+ gem "cucumber-rest-api", "= 0.3"
6
+ gem 'minke'
7
+ gem 'minke-generator-swift'
8
+ gem 'minke-generator-netmvc'
9
+ gem 'minke-generator-go'
data/lib/minke.rb CHANGED
@@ -12,6 +12,7 @@ require 'colorize'
12
12
  require 'multi_json'
13
13
  require 'openssl'
14
14
  require 'base64'
15
+ require 'securerandom'
15
16
  require 'sshkey'
16
17
 
17
18
  require 'minke/version'
@@ -1,19 +1,21 @@
1
1
  module Minke
2
2
  module Docker
3
3
  class DockerComposeFactory
4
- def initialize system_runner
4
+ def initialize system_runner, project_name
5
+ @project_name = project_name
5
6
  @system_runner = system_runner
6
7
  end
7
8
 
8
9
  def create compose_file
9
- Minke::Docker::DockerCompose.new compose_file, @system_runner
10
+ Minke::Docker::DockerCompose.new compose_file, @system_runner, @project_name
10
11
  end
11
12
  end
12
13
 
13
14
  class DockerCompose
14
15
  @compose_file = nil
15
16
 
16
- def initialize compose_file, system_runner
17
+ def initialize compose_file, system_runner, project_name
18
+ @project_name = project_name
17
19
  @compose_file = compose_file
18
20
  @system_runner = system_runner
19
21
  end
@@ -21,41 +23,26 @@ module Minke
21
23
  ##
22
24
  # start the containers in a stack defined by the docker compose file
23
25
  def up
24
- unless ENV['DOCKER_NETWORK'].to_s.empty?
25
- directory = create_compose_network_file
26
-
27
- @system_runner.execute "docker-compose -f #{@compose_file} -f #{directory + '/docker-compose.yml'} up -d"
28
- @system_runner.remove_entry_secure directory
29
- else
30
- @system_runner.execute "docker-compose -f #{@compose_file} up -d"
31
- end
32
-
26
+ execute_command "up -d"
33
27
  sleep 2
34
28
  end
35
29
 
36
30
  ##
37
31
  # stop the containers in a stack and removes them as defined by the docker compose file
38
32
  def down
39
- unless ENV['DOCKER_NETWORK'].to_s.empty?
40
- directory = create_compose_network_file
41
-
42
- @system_runner.execute "docker-compose -f #{@compose_file} -f #{directory + '/docker-compose.yml'} down"
43
- @system_runner.remove_entry_secure directory
44
- else
45
- @system_runner.execute "docker-compose -f #{@compose_file} down -v"
46
- end
33
+ execute_command "down -v"
47
34
  end
48
35
 
49
36
  ##
50
37
  # remove the containers started in a stack defined by the docker compose file
51
38
  def rm
52
- @system_runner.execute "echo y | docker-compose -f #{@compose_file} rm -v" unless ::Docker.info["Driver"] == "btrfs"
39
+ execute_command 'rm -v' unless ::Docker.info["Driver"] == "btrfs"
53
40
  end
54
41
 
55
42
  ##
56
43
  # stream the logs for the current running stack
57
44
  def logs
58
- @system_runner.execute "docker-compose -f #{@compose_file} logs -f"
45
+ execute_command 'logs -f'
59
46
  end
60
47
 
61
48
  ##
@@ -64,6 +51,17 @@ module Minke
64
51
  @system_runner.execute_and_return "docker-compose -f #{@compose_file} port #{container} #{private_port}"
65
52
  end
66
53
 
54
+ def execute_command command
55
+ unless ENV['DOCKER_NETWORK'].to_s.empty?
56
+ directory = create_compose_network_file
57
+
58
+ @system_runner.execute "docker-compose -f #{@compose_file} -f #{directory + '/docker-compose.yml'} -p #{@project_name} #{command}"
59
+ @system_runner.remove_entry_secure directory
60
+ else
61
+ @system_runner.execute "docker-compose -f #{@compose_file} -p #{@project_name} #{command}"
62
+ end
63
+ end
64
+
67
65
  def create_compose_network_file
68
66
  content = { 'version' => '2'.to_s, 'networks' => {'default' => { 'external' => { 'name' => ENV['DOCKER_NETWORK'] } } } }
69
67
 
@@ -42,6 +42,16 @@ module Minke
42
42
  ::Docker::Image.create('fromImage' => image_name)
43
43
  end
44
44
 
45
+ ##
46
+ # running_images returns a list of running containers
47
+ # Returns
48
+ #
49
+ # Array of Docker::Image
50
+ def running_containers
51
+ containers = ::Docker::Container.all(all: true, filters: { status: ["running"] }.to_json)
52
+ return containers
53
+ end
54
+
45
55
  ##
46
56
  # create_and_run_container starts a conatainer of the given image name and executes a command
47
57
  #
@@ -3,30 +3,54 @@ module Minke
3
3
  ##
4
4
  # ServiceDiscovery allows you to look up the publicly accessible address and port for a server
5
5
  class ServiceDiscovery
6
- def initialize config
7
- reader = Minke::Config::Reader.new
8
- @config = reader.read config
6
+ def initialize project_name, docker_runner
7
+ @project_name = project_name
8
+ @docker_runner = docker_runner
9
9
  end
10
10
 
11
11
  ##
12
12
  # Will attempt to locate the public details for a running container given
13
13
  # its name and private port
14
14
  # Parameters:
15
- # - container_name: the name of the running container
15
+ # - service_name: the name of the running service
16
16
  # - private_port: the private port which you wish to retrieve an address for
17
- # - task: :run, :cucumber search either the run or cucumber section of the config
18
- def public_address_for container_name, private_port, task
19
- compose = Minke::Docker::DockerCompose.new @config.compose_file_for(task), Minke::Docker::SystemRunner.new
20
- docker_runner = Minke::Docker::DockerRunner.new
17
+ # Returns:
18
+ # public address for the container e.g. 0.0.0.0:8080
19
+ def public_address_for service_name, private_port
20
+ begin
21
+ ip = @docker_runner.get_docker_ip_address
22
+ container_details = find_container_by_name "/#{@project_name}_#{service_name}_1"
23
+ ports = container_details.first.info['Ports'].select { |p| p['PrivatePort'] == private_port }.first
24
+ rescue
25
+ raise "Unable to find public address for '#{service_name}' on port #{private_port}"
26
+ end
21
27
 
22
- public_address = compose.public_address container_name, private_port
28
+ return "#{ip}:#{ports['PublicPort']}"
29
+ end
23
30
 
24
- ip = docker_runner.get_docker_ip_address
25
- if ip != "127.0.0.1" && ip != "0.0.0.0" && ip != nil
26
- public_address.gsub!('0.0.0.0', ip)
31
+ ##
32
+ # Will attempt to locate the private details for a running container given
33
+ # its name and private port
34
+ # Parameters:
35
+ # - service_name: the name of the running service
36
+ # - private_port: the private port which you wish to retrieve an address for
37
+ # Returns:
38
+ # private address for the container e.g. 172.17.0.2:8080
39
+ def bridge_address_for service_name, private_port
40
+ begin
41
+ puts "/#{@project_name}_#{service_name}_1"
42
+ container_details = find_container_by_name "/#{@project_name}_#{service_name}_1"
43
+ ip = container_details.first.info['NetworkSettings']['Networks']['bridge']['IPAddress']
44
+ rescue
45
+ raise "Unable to find bridge address for '#{service_name}' on port #{private_port}"
27
46
  end
47
+ return "#{ip}:#{private_port}"
48
+ end
28
49
 
29
- public_address
50
+ :private
51
+ def find_container_by_name name
52
+ containers = @docker_runner.running_containers
53
+ containers.select { |c| c.info['Names'].include?(name) }
30
54
  end
31
55
  end
32
56
  end
@@ -46,7 +46,7 @@ namespace :app do
46
46
  create_dependencies
47
47
 
48
48
  if @config.run != nil
49
- runner = Minke::Tasks::Run.new @config, :run, @generator_config, @docker_runner, @docker_compose_factory, @logger, @helper
49
+ runner = Minke::Tasks::Run.new @config, :run, @generator_config, @docker_runner, @docker_compose_factory, @service_discovery, @logger, @helper
50
50
  runner.run
51
51
  end
52
52
  end
@@ -59,7 +59,7 @@ namespace :app do
59
59
  create_dependencies
60
60
 
61
61
  if @config.cucumber != nil
62
- runner = Minke::Tasks::Cucumber.new @config, :cucumber, @generator_config, @docker_runner, @docker_compose_factory, @logger, @helper
62
+ runner = Minke::Tasks::Cucumber.new @config, :cucumber, @generator_config, @docker_runner, @docker_compose_factory, @service_discovery, @logger, @helper
63
63
  runner.run
64
64
  end
65
65
  end
@@ -72,9 +72,11 @@ namespace :app do
72
72
  end
73
73
 
74
74
  def create_dependencies
75
+ @project_name = "minke#{SecureRandom.urlsafe_base64(12)}".downcase
75
76
  @system_runner = Minke::Docker::SystemRunner.new
76
- @docker_compose_factory ||= Minke::Docker::DockerComposeFactory.new @system_runner
77
+ @docker_compose_factory ||= Minke::Docker::DockerComposeFactory.new @system_runner, @project_name
77
78
  @docker_runner ||= Minke::Docker::DockerRunner.new
79
+ @service_discovery ||= Minke::Docker::ServiceDiscovery.new @project_name, @docker_runner
78
80
 
79
81
  if @config == nil
80
82
  reader = Minke::Config::Reader.new
@@ -4,11 +4,12 @@ module Minke
4
4
  # Task is a base implementation of a rake task such as fetch, build, etc
5
5
  class Task
6
6
 
7
- def initialize config, task, generator_settings, docker_runner, docker_compose_factory, logger, helper
7
+ def initialize config, task, generator_settings, docker_runner, docker_compose_factory, service_discovery, logger, helper
8
8
  @config = config
9
9
  @task = task
10
10
  @generator_settings = generator_settings
11
11
  @docker_runner = docker_runner
12
+ @service_discovery = service_discovery
12
13
  @logger = logger
13
14
  @helper = helper
14
15
  @task_settings = config.send(task)
@@ -84,18 +85,21 @@ module Minke
84
85
  end
85
86
 
86
87
  def build_address url
87
- if url.type == 'public'
88
+ if url.type == 'external'
88
89
  "#{url.protocol}://#{url.address}:#{url.port}#{url.path}"
89
- else
90
- # if running on docker for mac we need to replace the ip address with the docker hosts
91
- public_address = @compose.public_address url.address, url.port
90
+ elsif url.type == 'bridge'
91
+ address = @service_discovery.bridge_address_for url.address, url.port
92
+ "#{url.protocol}://#{address}#{url.path}"
93
+ elsif url.type == 'public'
94
+ address = @service_discovery.public_address_for url.address, url.port
92
95
 
96
+ # if running on docker for mac we need to replace the ip address with the docker hosts
93
97
  ip = @docker_runner.get_docker_ip_address
94
98
  if ip != "127.0.0.1" && ip != "0.0.0.0" && ip != nil
95
- public_address.gsub!('0.0.0.0', ip)
99
+ address.gsub!('0.0.0.0', ip)
96
100
  end
97
101
 
98
- "#{url.protocol}://#{public_address}#{url.path}"
102
+ "#{url.protocol}://#{address}#{url.path}"
99
103
  end
100
104
  end
101
105
 
data/lib/minke/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Minke
2
- VERSION = "1.6.1"
2
+ VERSION = "1.8.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minke
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nic Jackson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-14 00:00:00.000000000 Z
11
+ date: 2016-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -201,6 +201,8 @@ files:
201
201
  - bin/console
202
202
  - bin/minke
203
203
  - bin/setup
204
+ - docker/Dockerfile
205
+ - docker/Gemfile
204
206
  - examples/config_go.yml
205
207
  - examples/config_swift.yml
206
208
  - lib/minke.rb