hyperb 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +3 -0
- data/Makefile +3 -2
- data/README.md +1 -0
- data/examples/README.md +27 -5
- data/lib/hyperb/containers/containers.rb +22 -4
- data/lib/hyperb/containers/host_config.rb +46 -0
- data/lib/hyperb/images/images.rb +5 -6
- data/lib/hyperb/utils.rb +6 -0
- data/lib/hyperb/version.rb +1 -1
- data/spec/containers_spec.rb +112 -0
- data/spec/host_config_spec.rb +18 -0
- data/spec/images_spec.rb +4 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cfd1df42e8e7a70e5da8139a47a333c132f55ec
|
4
|
+
data.tar.gz: 42211756c1e2fac4844f38b02f245f91f2a98ca5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 839af760aa8293c023623b92b475e975dbb436a195f90b1afd0ecc5efcdc717cffb25569e46be3d87fa08f842112a52d1fbf2bcb2037f46c609f5a53bbd7e233
|
7
|
+
data.tar.gz: 8645b548c23c76ffe182e32ae77746ebfb10de08fa93a2c1319244152702553112518b0c6f372aba388eb3a90231dfc539126ff1deab6b6a8995d416220b18e1
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/Makefile
CHANGED
data/README.md
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
<p align="center">
|
5
5
|
<a href="https://circleci.com/gh/drish/hyperb"><img src="https://circleci.com/gh/drish/hyperb.svg?style=svg"></a>
|
6
6
|
<a href="https://github.com/drish/hyperb/blob/master/LICENSE.txt"><img src="https://img.shields.io/badge/license-MIT-blue.svg"></a>
|
7
|
+
<a href="https://rubygems.org/gems/hyperb"><img src="https://img.shields.io/gem/dt/hyperb.svg?style=flat-square"></a>
|
7
8
|
<a href="https://coveralls.io/github/drish/hyperb?branch=master"><img src="https://coveralls.io/repos/github/drish/hyperb/badge.svg?branch=master"></a>
|
8
9
|
<a href="https://codeclimate.com/github/drish/hyperb"><img src="https://codeclimate.com/github/drish/hyperb/badges/gpa.svg" /></a>
|
9
10
|
<a href="https://badge.fury.io/rb/hyperb"><img src="https://badge.fury.io/rb/hyperb.svg"</></a>
|
data/examples/README.md
CHANGED
@@ -71,13 +71,13 @@ response = client.remove_image(name: 'busybox', force: true)
|
|
71
71
|
returns a Hash containing information about the inspected image
|
72
72
|
|
73
73
|
```ruby
|
74
|
-
info = client.inspect_image(
|
74
|
+
info = client.inspect_image(name: 'busybox')
|
75
75
|
puts info
|
76
76
|
```
|
77
77
|
|
78
|
-
## Containers API
|
78
|
+
## [Containers API](https://docs.hyper.sh/Reference/API/2016-04-04%20[Ver.%201.23]/Container)
|
79
79
|
|
80
|
-
#### create_container
|
80
|
+
#### [create_container](https://docs.hyper.sh/Reference/API/2016-04-04%20[Ver.%201.23]/Container/create.html)
|
81
81
|
|
82
82
|
Return a hash containing downcased symbolized container info.
|
83
83
|
|
@@ -106,7 +106,7 @@ res = client.create_container name: 'nginx-c', image: 'nginx', hostname: 'hostny
|
|
106
106
|
With custom mounts
|
107
107
|
|
108
108
|
```ruby
|
109
|
-
res = client.create_container name: 'nginx-c', image: 'nginx', mounts: ['./path/to/mount']
|
109
|
+
res = client.create_container name: 'nginx-c', image: 'nginx', mounts: ['./path/to/mount']
|
110
110
|
```
|
111
111
|
|
112
112
|
With custom network mode
|
@@ -121,6 +121,28 @@ Exposing ports
|
|
121
121
|
res = client.create_container name: 'nginx-c', image: 'nginx', exposedports: { '22/tcp': {} }
|
122
122
|
```
|
123
123
|
|
124
|
+
Configurations such as:
|
125
|
+
|
126
|
+
Binds, Links, PublishAllPorts, PortBindings, ReadonlyRootfs, VolumesFrom, RestartPolicy, NetworkMode, LogConfig, VolumeDriver
|
127
|
+
|
128
|
+
Are setup through Hyperb::HostConfig.
|
129
|
+
|
130
|
+
see examples below:
|
131
|
+
|
132
|
+
```ruby
|
133
|
+
# you can either create host configurations through Hyperb::HostConfig
|
134
|
+
# or with a Hash
|
135
|
+
|
136
|
+
client.create_container name: 'mysql-1', image: 'mysql', host_config: Hyperb::HostConfig.new(binds: ['/path'] )}
|
137
|
+
|
138
|
+
client.create_container name: 'mysql-1', image: 'mysql', host_config: { binds: ['/path/'] }
|
139
|
+
client.create_container name: 'mysql-1', image: 'mysql', host_config: { links: ['container1:link_alias'] }
|
140
|
+
client.create_container name: 'mysql-1', image: 'mysql', host_config: { publish_all_ports: true }
|
141
|
+
client.create_container name: 'mysql-1', image: 'mysql', host_config: { readonly_rootfs: true }
|
142
|
+
client.create_container name: 'mysql-1', image: 'mysql', host_config: { restart_policy: { name: 'unless-stopped' }}
|
143
|
+
client.create_container name: 'mysql-1', image: 'mysql', host_config: { network_mode: 'host' }
|
144
|
+
```
|
145
|
+
|
124
146
|
#### start_container
|
125
147
|
|
126
148
|
```ruby
|
@@ -408,4 +430,4 @@ client.version
|
|
408
430
|
"Arch"=>"amd64",
|
409
431
|
"KernelVersion"=>"4.0.0"
|
410
432
|
}
|
411
|
-
```
|
433
|
+
```
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'hyperb/request'
|
2
2
|
require 'hyperb/containers/container'
|
3
|
+
require 'hyperb/containers/host_config'
|
3
4
|
require 'hyperb/utils'
|
4
5
|
require 'json'
|
5
6
|
require 'uri'
|
@@ -103,21 +104,28 @@ module Hyperb
|
|
103
104
|
# @option params [String] :networkmode network mode, ie 'bridge'.
|
104
105
|
# @option params [Hash] :exposedports ports to expose.
|
105
106
|
#
|
107
|
+
# @option params [Hash] :exposedports ports to expose.
|
108
|
+
#
|
106
109
|
# @option params [Hash] :labels hash containing key: value
|
107
110
|
# @option params labels [String] :sh_hyper_instancetype container size: s1, s2, s3 ...
|
108
111
|
def create_container(params = {})
|
109
112
|
raise ArgumentError, 'Invalid arguments.' unless check_arguments(params, 'image')
|
110
113
|
path = '/containers/create'
|
111
114
|
query = {}
|
112
|
-
|
113
|
-
# set a default size, otherwise container can't be started
|
115
|
+
# set default size, otherwise container can't be started
|
114
116
|
body = { labels: { sh_hyper_instancetype: 's1' } }
|
117
|
+
|
118
|
+
# parse host_config options
|
119
|
+
if params.key?(:host_config)
|
120
|
+
body[camelize(:host_config)] = setup_host_config(params)
|
121
|
+
params.delete(:host_config)
|
122
|
+
end
|
123
|
+
|
115
124
|
query[:name] = params[:name] if params.key?(:name)
|
116
125
|
params.delete(:name)
|
117
126
|
body.merge!(params)
|
118
127
|
|
119
|
-
|
120
|
-
downcase_symbolize(response)
|
128
|
+
downcase_symbolize(JSON.parse(Hyperb::Request.new(self, path, query, 'post', body).perform))
|
121
129
|
end
|
122
130
|
|
123
131
|
# inspect a container
|
@@ -247,5 +255,15 @@ module Hyperb
|
|
247
255
|
query[:name] = params[:name] if params.key?(:name)
|
248
256
|
Hyperb::Request.new(self, path, query, 'post').perform
|
249
257
|
end
|
258
|
+
|
259
|
+
private
|
260
|
+
|
261
|
+
def setup_host_config(params)
|
262
|
+
if params[:host_config].is_a?(Hash)
|
263
|
+
HostConfig.new(params[:host_config]).fmt
|
264
|
+
elsif params[:host_config].is_a?(HostConfig)
|
265
|
+
params[:host_config].fmt
|
266
|
+
end
|
267
|
+
end
|
250
268
|
end
|
251
269
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'hyperb/utils'
|
2
|
+
|
3
|
+
module Hyperb
|
4
|
+
# helper for managing creating proper container host configs
|
5
|
+
# @see https://docs.hyper.sh/Reference/API/2016-04-04%20[Ver.%201.23]/Container/create.html
|
6
|
+
class HostConfig
|
7
|
+
include Hyperb::Utils
|
8
|
+
|
9
|
+
attr_accessor :binds, :links, :port_bindings, :publish_all_ports,
|
10
|
+
:network_mode, :restart_policy, :volume_driver, :log_config,
|
11
|
+
:readonly_rootfs, :volumes_from
|
12
|
+
|
13
|
+
def initialize(params = {})
|
14
|
+
params.each do |att, value|
|
15
|
+
value = downcase_symbolize(value) if value.is_a?(Hash)
|
16
|
+
instance_variable_set("@#{att.downcase.to_sym}", value)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# returns a hash containing formated host config data
|
21
|
+
#
|
22
|
+
# @returns [Hash]
|
23
|
+
def fmt
|
24
|
+
formated = {}
|
25
|
+
attrs.keys.each do |key|
|
26
|
+
formated[camelize(key)] = attrs[key]
|
27
|
+
end
|
28
|
+
formated
|
29
|
+
end
|
30
|
+
|
31
|
+
def attrs
|
32
|
+
{
|
33
|
+
binds: binds,
|
34
|
+
links: links,
|
35
|
+
port_bindings: port_bindings,
|
36
|
+
publish_all_ports: publish_all_ports,
|
37
|
+
network_mode: network_mode,
|
38
|
+
restart_policy: restart_policy,
|
39
|
+
volume_driver: volume_driver,
|
40
|
+
log_config: log_config,
|
41
|
+
readonly_rootfs: readonly_rootfs,
|
42
|
+
volumes_from: volumes_from
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/hyperb/images/images.rb
CHANGED
@@ -45,12 +45,10 @@ module Hyperb
|
|
45
45
|
# @required @option params [String] :from_image image name to be pulled
|
46
46
|
# @option params [String] :tag image tag name
|
47
47
|
#
|
48
|
-
# @option params [Hash] :
|
49
|
-
# @option params
|
50
|
-
# @option params
|
51
|
-
# @option params
|
52
|
-
#
|
53
|
-
# TODO: @option params [Boolean] :stdout print stream to stdout
|
48
|
+
# @option params [Hash] :x_registry_auth object containing either login information.
|
49
|
+
# @option params x_registry_auth [String] :username
|
50
|
+
# @option params x_registry_auth [String] :email
|
51
|
+
# @option params x_registry_auth [String] :password
|
54
52
|
def create_image(params = {})
|
55
53
|
raise ArgumentError, 'Invalid arguments.' unless check_arguments(params, 'from_image')
|
56
54
|
path = '/images/create'
|
@@ -101,6 +99,7 @@ module Hyperb
|
|
101
99
|
# @param params [Hash] A customizable set of params.
|
102
100
|
# @option params [String] :name image name to be removed
|
103
101
|
def inspect_image(params = {})
|
102
|
+
raise ArgumentError, 'Invalid arguments.' unless check_arguments(params, 'name')
|
104
103
|
path = '/images/' + params[:name] + '/json'
|
105
104
|
res = JSON.parse(Hyperb::Request.new(self, path, {}, 'get').perform)
|
106
105
|
downcase_symbolize(res)
|
data/lib/hyperb/utils.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
module Hyperb
|
2
2
|
# utils functions
|
3
3
|
module Utils
|
4
|
+
# converts from Symbol or String to CamelCase
|
5
|
+
# @return String
|
6
|
+
def camelize(value)
|
7
|
+
value.to_s.split('_').collect(&:capitalize).join
|
8
|
+
end
|
9
|
+
|
4
10
|
# checks if all args are keys into the hash
|
5
11
|
#
|
6
12
|
# @return [Boolean]
|
data/lib/hyperb/version.rb
CHANGED
data/spec/containers_spec.rb
CHANGED
@@ -263,6 +263,118 @@ RSpec.describe Hyperb::Containers do
|
|
263
263
|
expect(a_request(:post, path)
|
264
264
|
.with(body: { image: 'image', workingdir: '/path/', labels: { sh_hyper_instancetype: 's1' } })).to have_been_made
|
265
265
|
end
|
266
|
+
|
267
|
+
it 'correct request should be made with Hyperb::HostConfig class' do
|
268
|
+
path = @create_container_path
|
269
|
+
|
270
|
+
hc = Hyperb::HostConfig.new(binds: ['/path/to/mount'])
|
271
|
+
|
272
|
+
stub_request(:post, path)
|
273
|
+
.with(body: { image: 'image', labels: { sh_hyper_instancetype:'s1' }, 'HostConfig': hc.fmt })
|
274
|
+
.to_return(body: fixture('create_container.json'))
|
275
|
+
|
276
|
+
@client.create_container(image: 'image', host_config: hc)
|
277
|
+
expect(a_request(:post, path)
|
278
|
+
.with(body: { image: 'image',
|
279
|
+
labels: { sh_hyper_instancetype:'s1' },
|
280
|
+
'HostConfig': hc.fmt })).to have_been_made
|
281
|
+
end
|
282
|
+
|
283
|
+
it 'correct request should be made with host_configs:binds' do
|
284
|
+
path = @create_container_path
|
285
|
+
|
286
|
+
hc = Hyperb::HostConfig.new(binds: ['/path/to/mount'])
|
287
|
+
|
288
|
+
stub_request(:post, path)
|
289
|
+
.with(body: { image: 'image', labels: { sh_hyper_instancetype:'s1' }, 'HostConfig': hc.fmt })
|
290
|
+
.to_return(body: fixture('create_container.json'))
|
291
|
+
|
292
|
+
@client.create_container(image: 'image', host_config: { binds: ['/path/to/mount'] })
|
293
|
+
expect(a_request(:post, path)
|
294
|
+
.with(body: { image: 'image',
|
295
|
+
labels: { sh_hyper_instancetype:'s1' },
|
296
|
+
'HostConfig': hc.fmt })).to have_been_made
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'correct request should be made with host_configs:links' do
|
300
|
+
path = @create_container_path
|
301
|
+
|
302
|
+
hc = Hyperb::HostConfig.new(links: ['container2:alias'])
|
303
|
+
|
304
|
+
stub_request(:post, path)
|
305
|
+
.with(body: { image: 'image', labels: { sh_hyper_instancetype:'s1' }, 'HostConfig': hc.fmt })
|
306
|
+
.to_return(body: fixture('create_container.json'))
|
307
|
+
|
308
|
+
@client.create_container(image: 'image', host_config: { links: ['container2:alias'] })
|
309
|
+
expect(a_request(:post, path)
|
310
|
+
.with(body: { image: 'image',
|
311
|
+
labels: { sh_hyper_instancetype:'s1' },
|
312
|
+
'HostConfig': hc.fmt })).to have_been_made
|
313
|
+
end
|
314
|
+
|
315
|
+
it 'correct request should be made with host_configs:publish_all_ports' do
|
316
|
+
path = @create_container_path
|
317
|
+
|
318
|
+
hc = Hyperb::HostConfig.new(publish_all_ports: false)
|
319
|
+
|
320
|
+
stub_request(:post, path)
|
321
|
+
.with(body: { image: 'image', labels: { sh_hyper_instancetype:'s1' }, 'HostConfig': hc.fmt })
|
322
|
+
.to_return(body: fixture('create_container.json'))
|
323
|
+
|
324
|
+
@client.create_container(image: 'image', host_config: { publish_all_ports: false })
|
325
|
+
expect(a_request(:post, path)
|
326
|
+
.with(body: { image: 'image',
|
327
|
+
labels: { sh_hyper_instancetype:'s1' },
|
328
|
+
'HostConfig': hc.fmt })).to have_been_made
|
329
|
+
end
|
330
|
+
|
331
|
+
it 'correct request should be made with host_configs:readonly_rootfs' do
|
332
|
+
path = @create_container_path
|
333
|
+
|
334
|
+
hc = Hyperb::HostConfig.new(readonly_rootfs: false)
|
335
|
+
|
336
|
+
stub_request(:post, path)
|
337
|
+
.with(body: { image: 'image', labels: { sh_hyper_instancetype:'s1' }, 'HostConfig': hc.fmt })
|
338
|
+
.to_return(body: fixture('create_container.json'))
|
339
|
+
|
340
|
+
@client.create_container(image: 'image', host_config: { readonly_rootfs: false })
|
341
|
+
expect(a_request(:post, path)
|
342
|
+
.with(body: { image: 'image',
|
343
|
+
labels: { sh_hyper_instancetype:'s1' },
|
344
|
+
'HostConfig': hc.fmt })).to have_been_made
|
345
|
+
end
|
346
|
+
|
347
|
+
it 'correct request should be made with host_configs:restart_policy' do
|
348
|
+
path = @create_container_path
|
349
|
+
|
350
|
+
hc = Hyperb::HostConfig.new(restart_policy: { name: 'unless-stopped' })
|
351
|
+
|
352
|
+
stub_request(:post, path)
|
353
|
+
.with(body: { image: 'image', labels: { sh_hyper_instancetype:'s1' }, 'HostConfig': hc.fmt })
|
354
|
+
.to_return(body: fixture('create_container.json'))
|
355
|
+
|
356
|
+
@client.create_container(image: 'image', host_config: { restart_policy: { name: 'unless-stopped' }})
|
357
|
+
expect(a_request(:post, path)
|
358
|
+
.with(body: { image: 'image',
|
359
|
+
labels: { sh_hyper_instancetype:'s1' },
|
360
|
+
'HostConfig': hc.fmt })).to have_been_made
|
361
|
+
end
|
362
|
+
|
363
|
+
it 'correct request should be made with host_configs:network_mode' do
|
364
|
+
path = @create_container_path
|
365
|
+
|
366
|
+
hc = Hyperb::HostConfig.new(network_mode: 'host')
|
367
|
+
|
368
|
+
stub_request(:post, path)
|
369
|
+
.with(body: { image: 'image', labels: { sh_hyper_instancetype:'s1' }, 'HostConfig': hc.fmt })
|
370
|
+
.to_return(body: fixture('create_container.json'))
|
371
|
+
|
372
|
+
@client.create_container(image: 'image', host_config: { network_mode: 'host' })
|
373
|
+
expect(a_request(:post, path)
|
374
|
+
.with(body: { image: 'image',
|
375
|
+
labels: { sh_hyper_instancetype:'s1' },
|
376
|
+
'HostConfig': hc.fmt })).to have_been_made
|
377
|
+
end
|
266
378
|
end
|
267
379
|
|
268
380
|
describe '#start_container' do
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
RSpec.describe Hyperb::HostConfig do
|
4
|
+
|
5
|
+
it '#fmt' do
|
6
|
+
host_config = Hyperb::HostConfig.new(binds: ['path/to/binds'], publish_all_ports: false)
|
7
|
+
formated = host_config.fmt
|
8
|
+
expect(formated).to be_a Hash
|
9
|
+
expect(formated.key?('Binds')).to be true
|
10
|
+
expect(formated.key?('PublishAllPorts')).to be true
|
11
|
+
end
|
12
|
+
|
13
|
+
it '#attrs' do
|
14
|
+
host_config = Hyperb::HostConfig.new(binds: 'path/to/binds')
|
15
|
+
expect(host_config.attrs).to be_a Hash
|
16
|
+
expect(host_config.attrs[:binds]).to be_a String
|
17
|
+
end
|
18
|
+
end
|
data/spec/images_spec.rb
CHANGED
@@ -120,6 +120,10 @@ RSpec.describe Hyperb::Images do
|
|
120
120
|
.to_return(body: fixture('inspect_image.json'))
|
121
121
|
end
|
122
122
|
|
123
|
+
it 'should raise ArgumentError when name is not provided' do
|
124
|
+
expect { @client.inspect_image }.to raise_error(ArgumentError)
|
125
|
+
end
|
126
|
+
|
123
127
|
it 'request to the correct path should be made' do
|
124
128
|
@client.inspect_image name: 'busybox'
|
125
129
|
expect(a_request(:get, @inspect_image_path)).to have_been_made
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hyperb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- drish
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http
|
@@ -146,6 +146,7 @@ files:
|
|
146
146
|
- lib/hyperb/compose/compose.rb
|
147
147
|
- lib/hyperb/containers/container.rb
|
148
148
|
- lib/hyperb/containers/containers.rb
|
149
|
+
- lib/hyperb/containers/host_config.rb
|
149
150
|
- lib/hyperb/error.rb
|
150
151
|
- lib/hyperb/hyper_version.rb
|
151
152
|
- lib/hyperb/images/image.rb
|
@@ -187,6 +188,7 @@ files:
|
|
187
188
|
- spec/fixtures/services.json
|
188
189
|
- spec/fixtures/volumes.json
|
189
190
|
- spec/helper.rb
|
191
|
+
- spec/host_config_spec.rb
|
190
192
|
- spec/image_spec.rb
|
191
193
|
- spec/images_spec.rb
|
192
194
|
- spec/network_spec.rb
|
@@ -215,7 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
215
217
|
version: '0'
|
216
218
|
requirements: []
|
217
219
|
rubyforge_project:
|
218
|
-
rubygems_version: 2.6.
|
220
|
+
rubygems_version: 2.6.12
|
219
221
|
signing_key:
|
220
222
|
specification_version: 4
|
221
223
|
summary: The Hyper.sh Ruby Gem
|