longshoreman 0.0.3
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 +7 -0
- data/lib/longshoreman.rb +44 -0
- data/lib/longshoreman/container.rb +88 -0
- data/lib/longshoreman/image.rb +43 -0
- metadata +66 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7b1314644d0e203677e27d0596b13e43fc72cb8f
|
4
|
+
data.tar.gz: d01724ed6a95bbc0c7e98da936a69c5465e2b2e4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 61643f53551a9245566324a1643bb7b24ac608cf261b99deb66d788d46cb58bf45d64d57ff75ddfcaaf8a2a30a8c9019310ae1c13ad2e3c4752bbb61bf01c906
|
7
|
+
data.tar.gz: 0f3550aebfe7261919c4d89300d7b177187f56013fbee3107f1f93efd0ab5a39d9dca551a03dec8e432c2728b6f7315bd30b553df91eed1cde1725cc8f85875e
|
data/lib/longshoreman.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'docker'
|
2
|
+
|
3
|
+
class Longshoreman
|
4
|
+
|
5
|
+
def initialize(image = nil, name = nil, extra_args = {})
|
6
|
+
Docker.options = { :write_timeout => 300, :read_timeout => 300 }
|
7
|
+
Docker.validate_version!
|
8
|
+
|
9
|
+
@ip = get_host_ip
|
10
|
+
@container = Longshoreman::Container.new(image, name, extra_args)
|
11
|
+
@image = Longshoreman::Image.new
|
12
|
+
end
|
13
|
+
|
14
|
+
# Figure out which IP address the Docker host is at
|
15
|
+
def get_host_ip
|
16
|
+
# Let the crazy one-liner definition begin:
|
17
|
+
# Docker.url.split(':')[1][2..-1]
|
18
|
+
# Docker.url = tcp://192.168.123.205:2375
|
19
|
+
# split(':') = ["tcp", "//192.168.123.205", "2375"]
|
20
|
+
# [1] = "//192.168.123.205"
|
21
|
+
# [2..-1] = "192.168.123.205"
|
22
|
+
# This last bit prunes the leading //
|
23
|
+
url = Docker.url
|
24
|
+
case url.split(':')[0]
|
25
|
+
when 'unix'
|
26
|
+
"127.0.0.1"
|
27
|
+
when 'tcp'
|
28
|
+
url.split(':')[1][2..-1]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def cleanup
|
33
|
+
@container.cleanup
|
34
|
+
@image.cleanup
|
35
|
+
end
|
36
|
+
|
37
|
+
attr_reader :ip
|
38
|
+
attr_accessor :container
|
39
|
+
attr_accessor :image
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
require 'longshoreman/image'
|
44
|
+
require 'longshoreman/container'
|
@@ -0,0 +1,88 @@
|
|
1
|
+
class Longshoreman::Container
|
2
|
+
|
3
|
+
def initialize(image = nil, name = nil, extra_args = {})
|
4
|
+
if image && name
|
5
|
+
create(image, name, extra_args)
|
6
|
+
start
|
7
|
+
else
|
8
|
+
@raw = nil
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def all(opts = {})
|
13
|
+
@raw.all(opts)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Wrapper to clean up container in a single call
|
17
|
+
# name can be a name or id
|
18
|
+
def cleanup
|
19
|
+
if @raw
|
20
|
+
@raw.stop
|
21
|
+
@raw.delete(:force => true)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Create a docker container from an image (or repository:tag string), name,
|
26
|
+
# and optional extra args.
|
27
|
+
def create(image, name, extra_args={})
|
28
|
+
# If this ends up getting integrated, we'll use @logger.error here
|
29
|
+
case image.class.to_s
|
30
|
+
when "Docker::Image"
|
31
|
+
i = image.id
|
32
|
+
when "String"
|
33
|
+
if image.include? ':' # repository:tag format
|
34
|
+
i = image
|
35
|
+
else
|
36
|
+
puts "Image string must be in 'repository:tag' format."
|
37
|
+
return
|
38
|
+
end
|
39
|
+
else
|
40
|
+
puts "image must be Docker::Image or in 'repository:tag' format"
|
41
|
+
return
|
42
|
+
end
|
43
|
+
|
44
|
+
# Don't change the non-capitalized 'name' here. The Docker API gem extracts
|
45
|
+
# this key and uses it to name the container on create.
|
46
|
+
main_args = {
|
47
|
+
'name' => name,
|
48
|
+
'Hostname' => name,
|
49
|
+
'Image' => i,
|
50
|
+
'PublishAllPorts' => true,
|
51
|
+
'CapAdd' => 'NET_ADMIN',
|
52
|
+
}
|
53
|
+
@raw = Docker::Container.create(main_args.merge(extra_args))
|
54
|
+
end
|
55
|
+
|
56
|
+
# This get method is not a "pass thru"
|
57
|
+
def get(id, opts = {})
|
58
|
+
@raw = Docker::Container.get(id, opts)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Return the randomized port number associated with the exposed port.
|
62
|
+
def rport(exposed_port, protocol="tcp")
|
63
|
+
# Get all mapped ports
|
64
|
+
ports = @raw.json["NetworkSettings"]["Ports"]
|
65
|
+
# We're going to expect 1:1 mapping here
|
66
|
+
ports["#{exposed_port.to_s}/#{protocol}"][0]["HostPort"].to_i
|
67
|
+
end
|
68
|
+
|
69
|
+
def id
|
70
|
+
@raw.id
|
71
|
+
end
|
72
|
+
|
73
|
+
def remove
|
74
|
+
@raw.remove(:force => true)
|
75
|
+
end
|
76
|
+
alias_method :delete, :remove
|
77
|
+
|
78
|
+
def start
|
79
|
+
@raw.start
|
80
|
+
end
|
81
|
+
|
82
|
+
def stop
|
83
|
+
@raw.stop
|
84
|
+
end
|
85
|
+
|
86
|
+
attr_accessor :raw
|
87
|
+
|
88
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
class Longshoreman::Image
|
2
|
+
|
3
|
+
def initialize
|
4
|
+
@raw = nil
|
5
|
+
end
|
6
|
+
|
7
|
+
# Build an image from a Dockerfile
|
8
|
+
def build(dockerfile_path)
|
9
|
+
dockerfile = IO.read(dockerfile_path)
|
10
|
+
@raw = Docker::Image.build(dockerfile)
|
11
|
+
@raw # Return the image without having to add .raw
|
12
|
+
end
|
13
|
+
|
14
|
+
# This is useful if you're building from Dockerfiles each run
|
15
|
+
def remove
|
16
|
+
if @raw
|
17
|
+
@raw.remove(:force => true) if @raw.exist?(@raw.id)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
alias_method :cleanup, :remove
|
21
|
+
|
22
|
+
def exist?(id, opts = {})
|
23
|
+
@raw.exist?(id, opts)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Return the image object identified by repository:tag
|
27
|
+
def get(repository, tag)
|
28
|
+
images = Docker::Image.all.select { |i|
|
29
|
+
i.info["RepoTags"].include? "#{repository}:#{tag}"
|
30
|
+
}
|
31
|
+
# I don't think it's possible to have multiple images from the same
|
32
|
+
# repository with the same tag, so this shouldn't be an issue.
|
33
|
+
@raw = images[0]
|
34
|
+
end
|
35
|
+
|
36
|
+
# Return the id
|
37
|
+
def id
|
38
|
+
@raw.id
|
39
|
+
end
|
40
|
+
|
41
|
+
attr_accessor :raw
|
42
|
+
|
43
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: longshoreman
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Aaron Mildenstein
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-06-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ~>
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '1.0'
|
19
|
+
- - '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.21.4
|
22
|
+
name: docker-api
|
23
|
+
prerelease: false
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
30
|
+
- - '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.21.4
|
33
|
+
description: This gem is intended to aid in using Docker images and containers, specifically with regards to integration testing in RSpec.
|
34
|
+
email: aaron@mildensteins.com
|
35
|
+
executables: []
|
36
|
+
extensions: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
files:
|
39
|
+
- lib/longshoreman.rb
|
40
|
+
- lib/longshoreman/container.rb
|
41
|
+
- lib/longshoreman/image.rb
|
42
|
+
homepage: http://github.com/untergeek/longshoreman
|
43
|
+
licenses:
|
44
|
+
- Apache License (2.0)
|
45
|
+
metadata: {}
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 2.4.5
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: A helper Gem for using the Docker API
|
66
|
+
test_files: []
|