fog-proxmox 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/Gemfile.lock +1 -1
- data/lib/fog/compute/proxmox/models/container.rb +1 -12
- data/lib/fog/compute/proxmox/models/container_config.rb +29 -5
- data/lib/fog/compute/proxmox/models/containers.rb +8 -5
- data/lib/fog/compute/proxmox/models/disk.rb +4 -2
- data/lib/fog/compute/proxmox/models/disks.rb +4 -0
- data/lib/fog/compute/proxmox/models/interface.rb +3 -2
- data/lib/fog/compute/proxmox/models/server.rb +5 -5
- data/lib/fog/compute/proxmox/models/server_config.rb +4 -4
- data/lib/fog/compute/proxmox/models/servers.rb +8 -6
- data/lib/fog/network/proxmox/requests/update_network.rb +0 -1
- data/lib/fog/proxmox/hash.rb +3 -2
- data/lib/fog/proxmox/helpers/controller_helper.rb +12 -2
- data/lib/fog/proxmox/helpers/disk_helper.rb +5 -2
- data/lib/fog/proxmox/helpers/nic_helper.rb +16 -0
- data/lib/fog/proxmox/version.rb +1 -1
- data/spec/compute_spec.rb +5 -2
- data/spec/helpers/controller_helper_spec.rb +42 -0
- data/spec/helpers/nic_helper_spec.rb +22 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbbdd3aadac2823e21f3a920021fe70067b1f711
|
4
|
+
data.tar.gz: 83d7e18c74cd2eecc897a0732437020a16bfd7d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a0708b3f3b2c6afe53e852e00b15f59b1b7410ba06a10b2339c4aa162168de7fa25b2984d32d24c90a883f4954cbc99bb34d5ad3630ee30517098cda22d6aa6
|
7
|
+
data.tar.gz: e56a28ea1faff24e7023034c3ed8fc082f5b83e15841e23eef4e78cdc4f29f304d40171555019ee361a52edc5144cb3ef317c037e85def22fd130fc788708883
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -31,17 +31,6 @@ module Fog
|
|
31
31
|
attribute :swap
|
32
32
|
attribute :config
|
33
33
|
|
34
|
-
def initialize(attributes = {})
|
35
|
-
prepare_service_value(attributes)
|
36
|
-
set_config(attributes)
|
37
|
-
super
|
38
|
-
end
|
39
|
-
|
40
|
-
def type(attributes = {})
|
41
|
-
@type ||= 'lxc' unless attributes[:type] || attributes['type']
|
42
|
-
@type
|
43
|
-
end
|
44
|
-
|
45
34
|
def restore(backup, options = {})
|
46
35
|
requires :node, :vmid
|
47
36
|
path_params = { node: node, type: type }
|
@@ -66,7 +55,7 @@ module Fog
|
|
66
55
|
end
|
67
56
|
|
68
57
|
def set_config(attributes = {})
|
69
|
-
@config = Fog::Compute::Proxmox::ContainerConfig.new({ service: service }.merge(attributes))
|
58
|
+
@config = Fog::Compute::Proxmox::ContainerConfig.new({ service: service, vmid: vmid }.merge(attributes))
|
70
59
|
end
|
71
60
|
|
72
61
|
def config
|
@@ -19,20 +19,40 @@
|
|
19
19
|
|
20
20
|
require 'fog/proxmox/variables'
|
21
21
|
require 'fog/proxmox/helpers/nic_helper'
|
22
|
+
require 'fog/proxmox/helpers/controller_helper'
|
22
23
|
|
23
24
|
module Fog
|
24
25
|
module Compute
|
25
26
|
class Proxmox
|
26
27
|
# ContainerConfig model
|
27
28
|
class ContainerConfig < Fog::Proxmox::Model
|
28
|
-
identity :
|
29
|
+
identity :vmid
|
30
|
+
attribute :digest
|
29
31
|
attribute :ostype
|
32
|
+
attribute :storage
|
33
|
+
attribute :template
|
30
34
|
attribute :arch
|
31
35
|
attribute :memory
|
32
36
|
attribute :swap
|
33
37
|
attribute :hostname
|
38
|
+
attribute :nameserver
|
39
|
+
attribute :searchdomain
|
40
|
+
attribute :password
|
34
41
|
attribute :onboot
|
42
|
+
attribute :startup
|
35
43
|
attribute :rootfs
|
44
|
+
attribute :cores
|
45
|
+
attribute :cpuunits
|
46
|
+
attribute :cpulimit
|
47
|
+
attribute :description
|
48
|
+
attribute :console
|
49
|
+
attribute :cmode
|
50
|
+
attribute :tty
|
51
|
+
attribute :force
|
52
|
+
attribute :lock
|
53
|
+
attribute :pool
|
54
|
+
attribute :bwlimit
|
55
|
+
attribute :unprivileged
|
36
56
|
attribute :interfaces
|
37
57
|
attribute :mount_points
|
38
58
|
|
@@ -51,10 +71,14 @@ module Fog
|
|
51
71
|
Fog::Proxmox::NicHelper.to_mac_adresses_array(interfaces)
|
52
72
|
end
|
53
73
|
|
74
|
+
def type_console
|
75
|
+
'vnc' # by default. term is available too
|
76
|
+
end
|
77
|
+
|
54
78
|
private
|
55
79
|
|
56
80
|
def compute_nets(attributes)
|
57
|
-
nets = Fog::Proxmox::
|
81
|
+
nets = Fog::Proxmox::NicHelper.collect_nics(attributes)
|
58
82
|
@interfaces ||= Fog::Compute::Proxmox::Interfaces.new
|
59
83
|
nets.each do |key, value|
|
60
84
|
nic_hash = {
|
@@ -69,9 +93,9 @@ module Fog
|
|
69
93
|
end
|
70
94
|
|
71
95
|
def compute_mps(attributes)
|
72
|
-
|
96
|
+
controllers = Fog::Proxmox::ControllerHelper.collect_controllers(attributes)
|
73
97
|
@mount_points ||= Fog::Compute::Proxmox::Disks.new
|
74
|
-
|
98
|
+
controllers.each do |key, value|
|
75
99
|
storage, volid, size = Fog::Proxmox::DiskHelper.extract_storage_volid_size(value)
|
76
100
|
disk_hash = {
|
77
101
|
id: key.to_s,
|
@@ -79,7 +103,7 @@ module Fog
|
|
79
103
|
volid: volid,
|
80
104
|
size: size
|
81
105
|
}
|
82
|
-
names = Fog::Compute::Proxmox::Disk.attributes.reject { |key, _value| %i[id size storage].include? key }
|
106
|
+
names = Fog::Compute::Proxmox::Disk.attributes.reject { |key, _value| %i[id size storage volid].include? key }
|
83
107
|
names.each { |name| disk_hash.store(name.to_sym, Fog::Proxmox::ControllerHelper.extract(name, value)) }
|
84
108
|
@mount_points << Fog::Compute::Proxmox::Disk.new(disk_hash)
|
85
109
|
end
|
@@ -26,13 +26,16 @@ module Fog
|
|
26
26
|
class Containers < Fog::Compute::Proxmox::Servers
|
27
27
|
model Fog::Compute::Proxmox::Container
|
28
28
|
|
29
|
-
def
|
30
|
-
super(
|
29
|
+
def initialize(attributes = {})
|
30
|
+
super(attributes)
|
31
|
+
end
|
32
|
+
|
33
|
+
def type
|
34
|
+
'lxc'
|
31
35
|
end
|
32
36
|
|
33
|
-
def
|
34
|
-
|
35
|
-
@type
|
37
|
+
def new(attributes = {})
|
38
|
+
super({ node: node, type: type }.merge(attributes))
|
36
39
|
end
|
37
40
|
end
|
38
41
|
end
|
@@ -48,8 +48,6 @@ module Fog
|
|
48
48
|
attribute :backup
|
49
49
|
attribute :aio
|
50
50
|
|
51
|
-
CONTROLLERS = %w[ide sata scsi virtio].freeze
|
52
|
-
|
53
51
|
def controller
|
54
52
|
Fog::Proxmox::DiskHelper.extract_controller(id)
|
55
53
|
end
|
@@ -61,6 +59,10 @@ module Fog
|
|
61
59
|
def cdrom?
|
62
60
|
id == 'ide2' && media == 'cdrom'
|
63
61
|
end
|
62
|
+
|
63
|
+
def rootfs?
|
64
|
+
id == 'rootfs'
|
65
|
+
end
|
64
66
|
end
|
65
67
|
end
|
66
68
|
end
|
@@ -36,14 +36,15 @@ module Fog
|
|
36
36
|
identity :id
|
37
37
|
attribute :mac
|
38
38
|
attribute :model
|
39
|
+
attribute :name
|
40
|
+
attribute :ip
|
41
|
+
attribute :ip6
|
39
42
|
attribute :bridge
|
40
43
|
attribute :firewall
|
41
44
|
attribute :link_down
|
42
45
|
attribute :rate
|
43
46
|
attribute :queues
|
44
47
|
attribute :tag
|
45
|
-
|
46
|
-
NAME = 'net'
|
47
48
|
end
|
48
49
|
end
|
49
50
|
end
|
@@ -27,6 +27,7 @@ module Fog
|
|
27
27
|
# Server model
|
28
28
|
class Server < Fog::Compute::Server
|
29
29
|
identity :vmid
|
30
|
+
attribute :id
|
30
31
|
attribute :node
|
31
32
|
attribute :config
|
32
33
|
attribute :name
|
@@ -59,10 +60,9 @@ module Fog
|
|
59
60
|
super
|
60
61
|
end
|
61
62
|
|
62
|
-
def type
|
63
|
-
|
64
|
-
|
65
|
-
end
|
63
|
+
def type
|
64
|
+
attributes[:type]
|
65
|
+
end
|
66
66
|
|
67
67
|
def request(name, body_params = {}, path_params = {})
|
68
68
|
requires :node, :type
|
@@ -149,7 +149,7 @@ module Fog
|
|
149
149
|
end
|
150
150
|
|
151
151
|
def set_config(attributes = {})
|
152
|
-
@config = Fog::Compute::Proxmox::ServerConfig.new({ service: service }.merge(attributes))
|
152
|
+
@config = Fog::Compute::Proxmox::ServerConfig.new({ service: service, vmid: vmid }.merge(attributes))
|
153
153
|
end
|
154
154
|
|
155
155
|
def config
|
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
require 'fog/proxmox/variables'
|
21
21
|
require 'fog/proxmox/helpers/nic_helper'
|
22
|
+
require 'fog/proxmox/helpers/controller_helper'
|
22
23
|
require 'fog/proxmox/models/model'
|
23
24
|
|
24
25
|
module Fog
|
@@ -26,7 +27,7 @@ module Fog
|
|
26
27
|
class Proxmox
|
27
28
|
# ServerConfig model
|
28
29
|
class ServerConfig < Fog::Proxmox::Model
|
29
|
-
identity :
|
30
|
+
identity :vmid
|
30
31
|
attribute :digest
|
31
32
|
attribute :description
|
32
33
|
attribute :ostype
|
@@ -79,7 +80,7 @@ module Fog
|
|
79
80
|
private
|
80
81
|
|
81
82
|
def compute_nets(attributes)
|
82
|
-
nets = Fog::Proxmox::
|
83
|
+
nets = Fog::Proxmox::NicHelper.collect_nics(attributes)
|
83
84
|
@interfaces ||= Fog::Compute::Proxmox::Interfaces.new
|
84
85
|
nets.each do |key, value|
|
85
86
|
nic_hash = {
|
@@ -94,8 +95,7 @@ module Fog
|
|
94
95
|
end
|
95
96
|
|
96
97
|
def compute_disks(attributes)
|
97
|
-
controllers =
|
98
|
-
Fog::Compute::Proxmox::Disk::CONTROLLERS.each { |controller| controllers.merge!(Fog::Proxmox::ControllerHelper.to_hash(attributes, controller)) }
|
98
|
+
controllers = Fog::Proxmox::ControllerHelper.collect_controllers(attributes)
|
99
99
|
@disks ||= Fog::Compute::Proxmox::Disks.new
|
100
100
|
controllers.each do |key, value|
|
101
101
|
storage, volid, size = Fog::Proxmox::DiskHelper.extract_storage_volid_size(value)
|
@@ -26,15 +26,17 @@ module Fog
|
|
26
26
|
class Servers < Fog::Proxmox::Collection
|
27
27
|
model Fog::Compute::Proxmox::Server
|
28
28
|
attribute :node
|
29
|
-
attribute :type
|
30
29
|
|
31
|
-
def
|
32
|
-
super(
|
30
|
+
def initialize(attributes = {})
|
31
|
+
super(attributes)
|
32
|
+
end
|
33
|
+
|
34
|
+
def type
|
35
|
+
'qemu'
|
33
36
|
end
|
34
37
|
|
35
|
-
def
|
36
|
-
|
37
|
-
@type
|
38
|
+
def new(attributes = {})
|
39
|
+
super({ node: node, type: type }.merge(attributes))
|
38
40
|
end
|
39
41
|
|
40
42
|
def next_id
|
data/lib/fog/proxmox/hash.rb
CHANGED
@@ -22,11 +22,12 @@ module Fog
|
|
22
22
|
# module Hash mixins
|
23
23
|
module Hash
|
24
24
|
def self.stringify(hash)
|
25
|
+
return '' unless hash
|
25
26
|
string = ''
|
26
27
|
hash.each do |key, value|
|
27
|
-
string += "#{key}=#{value},"
|
28
|
+
string += "#{key}=#{value}," if value
|
28
29
|
end
|
29
|
-
string.slice(0, string.length - 1)
|
30
|
+
string.slice(0, string.length - 1) if string.length > 0
|
30
31
|
end
|
31
32
|
end
|
32
33
|
end
|
@@ -21,6 +21,9 @@ module Fog
|
|
21
21
|
module Proxmox
|
22
22
|
# module ControllerHelper mixins
|
23
23
|
module ControllerHelper
|
24
|
+
|
25
|
+
CONTROLLERS = %w[ide sata scsi virtio mp rootfs].freeze
|
26
|
+
|
24
27
|
def self.extract(name, controller_value)
|
25
28
|
values = controller_value.scan(/#{name}=(\w+)/)
|
26
29
|
name_value = values.first if values
|
@@ -33,7 +36,7 @@ module Fog
|
|
33
36
|
end
|
34
37
|
|
35
38
|
def self.valid?(name, key)
|
36
|
-
key.to_s.match(
|
39
|
+
key.to_s.match(/^#{name}(\d*)$/)
|
37
40
|
end
|
38
41
|
|
39
42
|
def self.last_index(name, values)
|
@@ -47,9 +50,16 @@ module Fog
|
|
47
50
|
indexes.empty? ? -1 : indexes.last
|
48
51
|
end
|
49
52
|
|
50
|
-
def self.
|
53
|
+
def self.select(hash,name)
|
51
54
|
hash.select { |key| valid?(name, key.to_s) }
|
52
55
|
end
|
56
|
+
|
57
|
+
def self.collect_controllers(attributes)
|
58
|
+
controllers = {}
|
59
|
+
CONTROLLERS.each { |controller| controllers.merge!(select(attributes, controller)) }
|
60
|
+
controllers
|
61
|
+
end
|
62
|
+
|
53
63
|
end
|
54
64
|
end
|
55
65
|
end
|
@@ -30,8 +30,11 @@ module Fog
|
|
30
30
|
else
|
31
31
|
"#{disk[:storage]}:#{disk[:size]}"
|
32
32
|
end
|
33
|
-
|
34
|
-
|
33
|
+
opts = disk[:options] if disk.has_key? :options
|
34
|
+
main_a = [:id,:volid,:storage,:size]
|
35
|
+
opts = disk.reject { |key,_value| main_a.include? key } unless opts
|
36
|
+
options = Fog::Proxmox::Hash.stringify(opts) if opts
|
37
|
+
value += ",#{options}" if options
|
35
38
|
{ "#{disk[:id]}": value }
|
36
39
|
end
|
37
40
|
|
@@ -23,6 +23,7 @@ module Fog
|
|
23
23
|
module Proxmox
|
24
24
|
# module NicHelper mixins
|
25
25
|
module NicHelper
|
26
|
+
|
26
27
|
def self.extract_mac_address(nic_value)
|
27
28
|
nic_value[/([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})/]
|
28
29
|
end
|
@@ -57,6 +58,21 @@ module Fog
|
|
57
58
|
model += ',' + Fog::Proxmox::Hash.stringify(options) unless options.empty?
|
58
59
|
{ "#{nic[:id]}": model }
|
59
60
|
end
|
61
|
+
|
62
|
+
def self.container_flatten(nic)
|
63
|
+
name = "name=#{nic[:name]}"
|
64
|
+
options = nic.reject { |key, _value| %i[name id].include? key }
|
65
|
+
name += ',' + Fog::Proxmox::Hash.stringify(options) unless options.empty?
|
66
|
+
{ "#{nic[:id]}": name }
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.valid?(key)
|
70
|
+
key.to_s.match(/^net(\d+)$/)
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.collect_nics(attributes)
|
74
|
+
attributes.select { |key| valid?(key.to_s) }
|
75
|
+
end
|
60
76
|
end
|
61
77
|
end
|
62
78
|
end
|
data/lib/fog/proxmox/version.rb
CHANGED
data/spec/compute_spec.rb
CHANGED
@@ -167,6 +167,8 @@ describe Fog::Compute::Proxmox do
|
|
167
167
|
config_hash = { onboot: 1, keyboard: 'fr', ostype: 'l26', kvm: 0 }
|
168
168
|
server.update(config_hash)
|
169
169
|
# server config
|
170
|
+
#config = server.config
|
171
|
+
#config.identity.must_equal vmid
|
170
172
|
disks = server.config.disks
|
171
173
|
nics = server.config.interfaces
|
172
174
|
nics.wont_be_nil
|
@@ -188,7 +190,7 @@ describe Fog::Compute::Proxmox do
|
|
188
190
|
servers_all.must_include server
|
189
191
|
# server not running exception
|
190
192
|
proc do
|
191
|
-
|
193
|
+
server.start_console(websocket: 1)
|
192
194
|
end.must_raise Fog::Proxmox::Errors::ServiceError
|
193
195
|
# Start server
|
194
196
|
server.action('start')
|
@@ -197,7 +199,7 @@ describe Fog::Compute::Proxmox do
|
|
197
199
|
status.must_equal true
|
198
200
|
# server vga not set exception
|
199
201
|
proc do
|
200
|
-
|
202
|
+
server.start_console(websocket: 1)
|
201
203
|
end.must_raise Fog::Proxmox::Errors::ServiceError
|
202
204
|
# Stop server
|
203
205
|
server.action('stop')
|
@@ -379,6 +381,7 @@ describe Fog::Compute::Proxmox do
|
|
379
381
|
# get container config
|
380
382
|
config = container.config
|
381
383
|
config.wont_be_nil
|
384
|
+
config.identity.must_equal vmid
|
382
385
|
# Get a mac address
|
383
386
|
mac_address = container.config.mac_addresses.first
|
384
387
|
mac_address.wont_be_nil
|
@@ -31,6 +31,15 @@ require 'fog/proxmox/helpers/controller_helper'
|
|
31
31
|
let(:scsi) do
|
32
32
|
{ scsi10: 'local-lvm:1,cache=none' }
|
33
33
|
end
|
34
|
+
let(:cdrom) do
|
35
|
+
{ ide2: 'none,media=cdrom' }
|
36
|
+
end
|
37
|
+
let(:mp) do
|
38
|
+
{ mp0: 'local-lvm:1' }
|
39
|
+
end
|
40
|
+
let(:rootfs) do
|
41
|
+
{ rootfs: 'local-lvm:1' }
|
42
|
+
end
|
34
43
|
|
35
44
|
describe '#extract' do
|
36
45
|
it "returns bridge" do
|
@@ -74,4 +83,37 @@ require 'fog/proxmox/helpers/controller_helper'
|
|
74
83
|
assert !Fog::Proxmox::ControllerHelper.valid?('net','sdfdsf')
|
75
84
|
end
|
76
85
|
end
|
86
|
+
|
87
|
+
describe '#select' do
|
88
|
+
it "returns scsi10" do
|
89
|
+
controllers = Fog::Proxmox::ControllerHelper.select(scsi,'scsi')
|
90
|
+
assert controllers.has_key?(:scsi10)
|
91
|
+
assert controllers.has_value?(scsi[:scsi10])
|
92
|
+
end
|
93
|
+
it "returns empty" do
|
94
|
+
controllers = Fog::Proxmox::ControllerHelper.select(net,'scsi')
|
95
|
+
assert controllers.empty?
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#collect_controllers' do
|
100
|
+
it "returns scsi0 and ide2" do
|
101
|
+
controllers = Fog::Proxmox::ControllerHelper.collect_controllers(scsi.merge(cdrom))
|
102
|
+
assert controllers.has_key?(:scsi10)
|
103
|
+
assert controllers.has_value?(scsi[:scsi10])
|
104
|
+
assert controllers.has_key?(:ide2)
|
105
|
+
assert controllers.has_value?(cdrom[:ide2])
|
106
|
+
end
|
107
|
+
it "returns rootfs and mp0" do
|
108
|
+
controllers = Fog::Proxmox::ControllerHelper.collect_controllers(rootfs.merge(mp))
|
109
|
+
assert controllers.has_key?(:mp0)
|
110
|
+
assert controllers.has_value?(mp[:mp0])
|
111
|
+
assert controllers.has_key?(:rootfs)
|
112
|
+
assert controllers.has_value?(rootfs[:rootfs])
|
113
|
+
end
|
114
|
+
it "returns empty" do
|
115
|
+
controllers = Fog::Proxmox::ControllerHelper.collect_controllers(net)
|
116
|
+
assert controllers.empty?
|
117
|
+
end
|
118
|
+
end
|
77
119
|
end
|
@@ -70,4 +70,26 @@ require 'fog/proxmox/helpers/nic_helper'
|
|
70
70
|
assert_equal '66:89:C5:59:AA:96', mac_address
|
71
71
|
end
|
72
72
|
end
|
73
|
+
|
74
|
+
describe '#valid?' do
|
75
|
+
it "returns true" do
|
76
|
+
assert Fog::Proxmox::NicHelper.valid?('net0')
|
77
|
+
end
|
78
|
+
it "returns false" do
|
79
|
+
assert !Fog::Proxmox::NicHelper.valid?('net')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '#collect_nics' do
|
84
|
+
it "returns net0" do
|
85
|
+
nets = Fog::Proxmox::NicHelper.collect_nics(net_vm.merge({'netout': 'sdfdsgfdsf'}))
|
86
|
+
assert nets.has_key?(:net0)
|
87
|
+
assert nets.has_value?(net_vm[:net0])
|
88
|
+
assert !nets.has_key?('netout')
|
89
|
+
end
|
90
|
+
it "returns empty" do
|
91
|
+
nets = Fog::Proxmox::NicHelper.collect_nics({'netout': 'sdfdsgfdsf'})
|
92
|
+
assert nets.empty?
|
93
|
+
end
|
94
|
+
end
|
73
95
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fog-proxmox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tristan Robert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|