forj 0.0.21 → 0.0.22
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.
- data/.rspec +3 -0
- data/.rubocop.yml +22 -0
- data/Gemfile +17 -0
- data/README.md +20 -0
- data/Rakefile +31 -0
- data/bin/forj +1 -5
- data/lib/boot.rb +21 -18
- data/lib/connection.rb +31 -25
- data/lib/down.rb +0 -3
- data/lib/helpers.rb +28 -0
- data/lib/log.rb +63 -0
- data/lib/network.rb +100 -55
- data/lib/repositories.rb +23 -14
- data/lib/security.rb +41 -10
- data/lib/yaml_parse.rb +8 -1
- data/spec/boot_spec.rb +27 -0
- data/spec/connection_spec.rb +55 -0
- data/spec/down_spec.rb +16 -0
- data/spec/network_spec.rb +16 -0
- data/spec/repositories_spec.rb +36 -0
- data/spec/setup_spec.rb +16 -0
- data/spec/spec_helper.rb +78 -0
- data/spec/ssh_spec.rb +16 -0
- data/spec/yaml_parse_spec.rb +16 -0
- metadata +27 -11
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
# limit lines to 80 characters.
|
16
|
+
LineLength:
|
17
|
+
Max: 200
|
18
|
+
Enabled: true
|
19
|
+
# disabled while we still support ruby 1.8
|
20
|
+
HashSyntax:
|
21
|
+
Description: 'Prefer Ruby 1.9 hash syntax over 1.8 syntax'
|
22
|
+
Enabled: false
|
data/Gemfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
data/README.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Forj cli
|
2
|
+
=====================
|
3
|
+
|
4
|
+
|
5
|
+
How to use it
|
6
|
+
=====================
|
7
|
+
|
8
|
+
|
9
|
+
FORJ Team
|
10
|
+
|
11
|
+
|
12
|
+
Contributing to Forj
|
13
|
+
=====================
|
14
|
+
We welcome all types of contributions. Checkout our website (http://docs.forj.io/en/latest/dev/contribute.html)
|
15
|
+
to start hacking on Forj. Also join us in our community (https://www.forj.io/community/) to help grow and foster Forj for
|
16
|
+
your development today!
|
17
|
+
|
18
|
+
License
|
19
|
+
=====================
|
20
|
+
forj cli is licensed under the Apache License, Version 2.0. See LICENSE for full license text.
|
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
|
19
|
+
require 'rspec/core/rake_task'
|
20
|
+
|
21
|
+
task :default => [:spec]
|
22
|
+
|
23
|
+
desc 'Run the specs.'
|
24
|
+
RSpec::Core::RakeTask.new do |t|
|
25
|
+
t.pattern = 'spec/boot_spec.rb'
|
26
|
+
end
|
27
|
+
|
28
|
+
desc 'Run the specs whenever a relevant file changes.'
|
29
|
+
task :watch do
|
30
|
+
puts 'test'
|
31
|
+
end
|
data/bin/forj
CHANGED
@@ -42,6 +42,7 @@ class Forj < Thor
|
|
42
42
|
puts ' -as: just because :)'
|
43
43
|
puts ' -name: name for the maestro box'
|
44
44
|
puts ' -test: this will delete everything after it finish to install the forge'
|
45
|
+
puts ' example: forj boot redstone on hpcloud as redstone01'
|
45
46
|
puts ' down: delete the Maestro box and all systems installed by the blueprint'
|
46
47
|
puts ' -name: name for the maestro box'
|
47
48
|
puts ' setup: set the credentials for forj cli'
|
@@ -54,11 +55,6 @@ class Forj < Thor
|
|
54
55
|
puts ' tenant_id: id for the tenant you want to use'
|
55
56
|
puts ' availability_zone: which availability zone will be deployed'
|
56
57
|
puts ''
|
57
|
-
puts ' openstack:'
|
58
|
-
puts ' openstack_username: your openstack username'
|
59
|
-
puts ' openstack_api_key: your openstack password'
|
60
|
-
puts ' openstack_auth_url: your openstack identity endpoint'
|
61
|
-
puts ''
|
62
58
|
end
|
63
59
|
|
64
60
|
desc 'boot', 'boot a Maestro box and instruct it to provision the blueprint'
|
data/lib/boot.rb
CHANGED
@@ -25,6 +25,10 @@ require_relative 'security.rb'
|
|
25
25
|
include SecurityGroup
|
26
26
|
require_relative 'repositories.rb'
|
27
27
|
include Repositories
|
28
|
+
require_relative 'log.rb'
|
29
|
+
include Logging
|
30
|
+
require_relative 'helpers.rb'
|
31
|
+
include Helpers
|
28
32
|
|
29
33
|
#
|
30
34
|
# Boot module
|
@@ -32,26 +36,23 @@ include Repositories
|
|
32
36
|
module Boot
|
33
37
|
def boot(blueprint, cloud_provider, name, build_config_dir, branch, test = false)
|
34
38
|
begin
|
39
|
+
initial_msg = format('booting %{blueprint} on %{cloud_provider}',
|
40
|
+
blueprint: blueprint , cloud_provider: cloud_provider)
|
41
|
+
Logging.info(initial_msg)
|
42
|
+
puts (initial_msg)
|
35
43
|
|
36
|
-
puts format('booting %{blueprint} on %{cloud_provider}',
|
37
|
-
blueprint: blueprint , cloud_provider: cloud_provider)
|
38
|
-
|
39
|
-
# get definitions from yaml
|
40
44
|
forj_dir = File.expand_path(File.dirname(__FILE__))
|
41
45
|
Dir.chdir(forj_dir)
|
42
46
|
definitions = YamlParse.get_values('../lib/catalog.yaml')
|
43
47
|
|
44
|
-
# clone the maestro repo
|
45
48
|
Repositories.clone_repo
|
46
49
|
|
47
|
-
# create the network where maestro will land
|
48
50
|
network = Network.create_network(name)
|
49
51
|
subnet = Network.create_subnet(network.id, name)
|
50
52
|
router = Network.get_router(definitions[blueprint]['router'])
|
51
|
-
Network
|
53
|
+
Network.create_router_interface(subnet.id, router)
|
52
54
|
|
53
|
-
|
54
|
-
security_group = SecurityGroup::create_security_group(blueprint)
|
55
|
+
security_group = SecurityGroup.create_security_group(blueprint)
|
55
56
|
|
56
57
|
ports = definitions['redstone']['ports']
|
57
58
|
|
@@ -61,21 +62,21 @@ module Boot
|
|
61
62
|
|
62
63
|
ENV['FORJ_HPC_NETID'] = network.id
|
63
64
|
ENV['FORJ_SECURITY_GROUP'] = security_group.name
|
64
|
-
ENV['FORJ_KEYPAIR'] = definitions[blueprint]['keypair']
|
65
|
-
ENV['FORJ_HPC_NOVA_KEYPUB'] = definitions[blueprint]['keypair']
|
65
|
+
#ENV['FORJ_KEYPAIR'] = definitions[blueprint]['keypair']
|
66
|
+
#ENV['FORJ_HPC_NOVA_KEYPUB'] = definitions[blueprint]['keypair']
|
66
67
|
|
67
68
|
# run build.sh to boot maestro
|
68
69
|
current_dir = Dir.pwd
|
69
|
-
home =
|
70
|
-
build_path = home + '/.
|
70
|
+
home = Helpers.get_home_path
|
71
|
+
build_path = home + '/.forj/maestro/build'
|
71
72
|
Dir.chdir(build_path)
|
72
73
|
|
73
74
|
if build_config_dir
|
74
75
|
command = format('bin/build.sh --build_ID maestro.%{name} --box-name maestro --build-conf-dir %{build_config_dir} --build-config box-13.5 --gitBranch %{branch}', name: name, build_config_dir: build_config_dir, branch: branch)
|
75
|
-
|
76
|
-
|
76
|
+
elsif blueprint != 'redstone'
|
77
|
+
command = format('bin/build.sh --build_ID %{name} --box-name maestro --build-conf-dir ~/.forj/maestro/build/conf --build-config box --blueprint %{blueprint_name}', name: name, blueprint_name: blueprint)
|
77
78
|
else
|
78
|
-
command = format('bin/build.sh --build_ID %{name} --box-name maestro --build-conf-dir ~/.
|
79
|
+
command = format('bin/build.sh --build_ID %{name} --box-name maestro --build-conf-dir ~/.forj/maestro/build/conf --build-config box', name: name)
|
79
80
|
end
|
80
81
|
|
81
82
|
Kernel.system(command)
|
@@ -89,9 +90,11 @@ module Boot
|
|
89
90
|
end
|
90
91
|
|
91
92
|
rescue SystemExit, Interrupt
|
92
|
-
|
93
|
+
msg = format('%{name} interrupted by user')
|
94
|
+
puts msg
|
95
|
+
Logging.info(msg)
|
93
96
|
rescue StandardError => e
|
94
|
-
|
97
|
+
Logging.error(e.message)
|
95
98
|
end
|
96
99
|
end
|
97
100
|
end
|
data/lib/connection.rb
CHANGED
@@ -25,36 +25,42 @@ include YamlParse
|
|
25
25
|
# Connection module
|
26
26
|
#
|
27
27
|
module Connection
|
28
|
-
|
29
28
|
def compute
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
29
|
+
begin
|
30
|
+
credentials = get_credentials
|
31
|
+
Fog::Compute.new({
|
32
|
+
:provider => 'HP',
|
33
|
+
:hp_access_key => credentials['access_key'],
|
34
|
+
:hp_secret_key => credentials['secret_key'],
|
35
|
+
:hp_auth_uri => credentials['auth_uri'],
|
36
|
+
:hp_tenant_id => credentials['tenant_id'],
|
37
|
+
:hp_avl_zone => credentials['availability_zone'],
|
38
|
+
:version => 'v2'
|
39
|
+
})
|
40
|
+
rescue => e
|
41
|
+
Logging.error(e.message)
|
42
|
+
end
|
40
43
|
end
|
41
44
|
|
42
45
|
def network
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
46
|
+
begin
|
47
|
+
credentials = get_credentials
|
48
|
+
Fog::HP::Network.new({
|
49
|
+
:hp_access_key => credentials['access_key'],
|
50
|
+
:hp_secret_key => credentials['secret_key'],
|
51
|
+
:hp_auth_uri => credentials['auth_uri'],
|
52
|
+
:hp_tenant_id => credentials['tenant_id'],
|
53
|
+
:hp_avl_zone => credentials['availability_zone']
|
54
|
+
})
|
55
|
+
rescue => e
|
56
|
+
Logging.error(e.message)
|
57
|
+
end
|
51
58
|
end
|
52
|
-
|
53
59
|
end
|
54
60
|
|
55
61
|
def get_credentials
|
56
62
|
home = File.expand_path('~')
|
57
|
-
creds = '%
|
63
|
+
creds = format('%{home}/.hpcloud/accounts/hp', home: home)
|
58
64
|
template = YAML.load_file(creds)
|
59
65
|
credentials = Hash.new
|
60
66
|
|
@@ -63,10 +69,10 @@ def get_credentials
|
|
63
69
|
credentials['secret_key'] = template[:credentials][:secret_key]
|
64
70
|
credentials['auth_uri'] = template[:credentials][:auth_uri]
|
65
71
|
credentials['tenant_id'] = template[:credentials][:tenant_id]
|
66
|
-
credentials['availability_zone'] = template[:regions][:
|
67
|
-
rescue
|
68
|
-
puts 'your credentials are not configured, delete the file %
|
72
|
+
credentials['availability_zone'] = template[:regions][:compute]
|
73
|
+
rescue => e
|
74
|
+
puts format('your credentials are not configured, delete the file %{creds} and run forj setup again', creds: creds)
|
75
|
+
Logging.error(e.message)
|
69
76
|
end
|
70
|
-
|
71
77
|
credentials
|
72
78
|
end
|
data/lib/down.rb
CHANGED
data/lib/helpers.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
module Helpers
|
19
|
+
def get_home_path
|
20
|
+
File.expand_path('~')
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_directory(path)
|
24
|
+
unless File.directory?(path)
|
25
|
+
Dir.mkdir path
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/log.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
|
19
|
+
# create a forj.log file in ~/.hpcloud/forj.log
|
20
|
+
|
21
|
+
require 'logger'
|
22
|
+
|
23
|
+
require 'require_relative'
|
24
|
+
|
25
|
+
require_relative 'helpers.rb'
|
26
|
+
include Helpers
|
27
|
+
|
28
|
+
#
|
29
|
+
# Logging module
|
30
|
+
#
|
31
|
+
module Logging
|
32
|
+
def info(message)
|
33
|
+
home = Helpers.get_home_path
|
34
|
+
Helpers.create_directory(format('%{home}/.forj/', home: home))
|
35
|
+
|
36
|
+
log = format('%{home}/.forj/forj.log', home: home)
|
37
|
+
log = Logger.new(log)
|
38
|
+
log.level = Logger::DEBUG
|
39
|
+
|
40
|
+
log.formatter = proc do |severity, datetime, progname, msg|
|
41
|
+
"#{progname} : #{datetime}: #{severity}: #{msg} \n"
|
42
|
+
end
|
43
|
+
|
44
|
+
log.info(message)
|
45
|
+
end
|
46
|
+
|
47
|
+
def error(message)
|
48
|
+
home = Helpers.get_home_path
|
49
|
+
Helpers.create_directory(format('%{home}/.forj/', home: home))
|
50
|
+
|
51
|
+
log = format('%{home}/.forj/forj.log', home: home)
|
52
|
+
log = Logger.new(log)
|
53
|
+
log.level = Logger::ERROR
|
54
|
+
|
55
|
+
log.formatter = proc do |severity, datetime, progname, msg|
|
56
|
+
"#{progname} : #{datetime}: #{severity}: #{msg} \n"
|
57
|
+
end
|
58
|
+
|
59
|
+
log.error(message)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
data/lib/network.rb
CHANGED
@@ -19,107 +19,152 @@ require 'require_relative'
|
|
19
19
|
|
20
20
|
require_relative 'connection.rb'
|
21
21
|
include Connection
|
22
|
+
require_relative 'log.rb'
|
23
|
+
include Logging
|
22
24
|
|
23
25
|
#
|
24
26
|
# Network module
|
25
27
|
#
|
26
28
|
module Network
|
27
|
-
|
28
29
|
def create_network(name)
|
29
|
-
|
30
|
+
begin
|
31
|
+
Logging.info(format('creating network %{name}', name: name))
|
32
|
+
Connection.network.networks.create(:name => name)
|
33
|
+
rescue => e
|
34
|
+
Logging.error(e.message)
|
35
|
+
end
|
30
36
|
end
|
31
37
|
|
32
38
|
def delete_network(network_name)
|
33
|
-
|
34
|
-
|
39
|
+
begin
|
40
|
+
network = Connection.network.networks.all(:name => network_name)[0]
|
41
|
+
Connection.network.networks.get(network.id).destroy
|
42
|
+
rescue => e
|
43
|
+
Logging.error(e.message)
|
44
|
+
end
|
35
45
|
end
|
36
46
|
|
37
47
|
def create_subnet(network_id, name)
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
48
|
+
begin
|
49
|
+
Connection.network.subnets.create(
|
50
|
+
:network_id => network_id,
|
51
|
+
:name => name,
|
52
|
+
:cidr => get_next_subnet,
|
53
|
+
:ip_version => '4'
|
54
|
+
)
|
55
|
+
rescue => e
|
56
|
+
Logging.error(e.message)
|
57
|
+
end
|
44
58
|
end
|
45
59
|
|
46
60
|
def delete_subnet(subnet_id)
|
47
|
-
|
61
|
+
begin
|
62
|
+
Connection.network.subnets.get(subnet_id).destroy
|
63
|
+
rescue => e
|
64
|
+
Logging.error(e.message)
|
65
|
+
end
|
48
66
|
end
|
49
67
|
|
50
68
|
def get_subnet(name)
|
51
|
-
|
69
|
+
begin
|
70
|
+
Connection.network.subnets.all(:name => name)[0]
|
71
|
+
rescue => e
|
72
|
+
Logging.error(e.message)
|
73
|
+
end
|
52
74
|
end
|
53
75
|
|
54
76
|
def get_router(name)
|
55
|
-
|
56
|
-
|
77
|
+
begin
|
78
|
+
routers = Connection.network.routers.all({:name => name})
|
79
|
+
router = nil
|
57
80
|
|
58
|
-
|
59
|
-
|
60
|
-
|
81
|
+
routers.each do|r|
|
82
|
+
router = r
|
83
|
+
end
|
61
84
|
|
62
|
-
|
85
|
+
router
|
86
|
+
rescue => e
|
87
|
+
Logging.error(e.message)
|
88
|
+
end
|
63
89
|
end
|
64
90
|
|
65
91
|
def create_router_interface(subnet_id, router)
|
66
|
-
|
92
|
+
begin
|
93
|
+
router.add_interface(subnet_id, nil)
|
94
|
+
rescue => e
|
95
|
+
Logging.error(e.message)
|
96
|
+
end
|
67
97
|
end
|
68
98
|
|
69
99
|
def delete_router_interface(subnet_id, router)
|
70
|
-
|
100
|
+
begin
|
101
|
+
router.remove_interface(subnet_id)
|
102
|
+
rescue => e
|
103
|
+
Logging.error(e.message)
|
104
|
+
end
|
71
105
|
end
|
72
106
|
|
73
107
|
def create_router(name)
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
108
|
+
begin
|
109
|
+
Connection.network.routers.create(
|
110
|
+
:name => name,
|
111
|
+
:admin_state_up => true
|
112
|
+
)
|
113
|
+
rescue => e
|
114
|
+
Logging.error(e.message)
|
115
|
+
end
|
78
116
|
end
|
79
117
|
|
80
118
|
def delete_router(router_id)
|
81
|
-
|
119
|
+
begin
|
120
|
+
Connection.network.routers.get(router_id).destroy
|
121
|
+
rescue => e
|
122
|
+
Logging.error(e.message)
|
123
|
+
end
|
82
124
|
end
|
83
|
-
|
84
125
|
end
|
85
126
|
|
86
127
|
|
87
128
|
def get_next_subnet
|
88
|
-
|
89
|
-
|
129
|
+
begin
|
130
|
+
subnet_values = Array.new
|
131
|
+
subnets = Connection.network.subnets.all
|
90
132
|
|
91
|
-
|
92
|
-
|
93
|
-
|
133
|
+
subnets.each do|s|
|
134
|
+
subnet_values.push(s.cidr)
|
135
|
+
end
|
94
136
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
137
|
+
gap = false
|
138
|
+
count = 0
|
139
|
+
range_used = Array.new
|
140
|
+
new_subnet = 0
|
141
|
+
new_cidr = ''
|
100
142
|
|
101
|
-
|
143
|
+
subnet_values = subnet_values.sort!
|
102
144
|
|
103
|
-
|
104
|
-
|
105
|
-
|
145
|
+
subnet_values.each do|value|
|
146
|
+
range_used.push(value[5])
|
147
|
+
end
|
106
148
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
149
|
+
range_used.each do |n|
|
150
|
+
if count.to_i == n.to_i
|
151
|
+
else
|
152
|
+
new_subnet = count
|
153
|
+
gap = true
|
154
|
+
break
|
155
|
+
end
|
156
|
+
count += 1
|
113
157
|
end
|
114
|
-
count += 1
|
115
|
-
end
|
116
158
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
159
|
+
if gap
|
160
|
+
new_cidr = '10.0.%s.0/24' % [count]
|
161
|
+
else
|
162
|
+
max_value = range_used.max
|
163
|
+
new_subnet = max_value.to_i + 1
|
164
|
+
new_cidr = '10.0.%s.0/24' % [new_subnet]
|
165
|
+
end
|
166
|
+
new_cidr
|
167
|
+
rescue => e
|
168
|
+
Logging.error(e.message)
|
123
169
|
end
|
124
|
-
new_cidr
|
125
170
|
end
|
data/lib/repositories.rb
CHANGED
@@ -21,6 +21,8 @@ require 'require_relative'
|
|
21
21
|
|
22
22
|
require_relative 'yaml_parse.rb'
|
23
23
|
include YamlParse
|
24
|
+
require_relative 'log.rb'
|
25
|
+
include Logging
|
24
26
|
|
25
27
|
#
|
26
28
|
# Repositories module
|
@@ -28,22 +30,29 @@ include YamlParse
|
|
28
30
|
module Repositories
|
29
31
|
def clone_repo
|
30
32
|
|
31
|
-
|
32
|
-
|
33
|
+
current_dir = Dir.pwd
|
34
|
+
forj_dir = File.expand_path(File.dirname(__FILE__))
|
35
|
+
Dir.chdir(forj_dir)
|
33
36
|
|
34
|
-
|
35
|
-
|
37
|
+
definitions = YamlParse::get_values('../lib/catalog.yaml')
|
38
|
+
maestro_url = definitions['default']['maestro']
|
36
39
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
40
|
+
home = File.expand_path('~')
|
41
|
+
path = home + '/.forj/'
|
42
|
+
|
43
|
+
begin
|
44
|
+
if File.directory?(path)
|
45
|
+
if File.directory?(path + 'maestro')
|
46
|
+
FileUtils.rm_r path + 'maestro'
|
47
|
+
end
|
48
|
+
Logging.info('cloning the maestro repo')
|
49
|
+
Git.clone(maestro_url, 'maestro', :path => path)
|
41
50
|
end
|
42
|
-
|
51
|
+
rescue => e
|
52
|
+
puts format('Error while cloning the repo from %{maestro_url}', maestro_url: maestro_url)
|
53
|
+
puts 'If this error persist you could clone the repo manually in ~/.forj/'
|
54
|
+
Logging.error(e.message)
|
43
55
|
end
|
44
|
-
|
45
|
-
puts format('Error while cloning the repo from %{maestro_url}', maestro_url: maestro_url)
|
46
|
-
puts 'If this error persist you could clone the repo manually in ~/.hpcloud/'
|
56
|
+
Dir.chdir(current_dir)
|
47
57
|
end
|
48
|
-
|
49
|
-
end
|
58
|
+
end
|
data/lib/security.rb
CHANGED
@@ -19,6 +19,8 @@ require 'require_relative'
|
|
19
19
|
|
20
20
|
require_relative 'connection.rb'
|
21
21
|
include Connection
|
22
|
+
require_relative 'log.rb'
|
23
|
+
include Logging
|
22
24
|
|
23
25
|
#
|
24
26
|
# SecurityGroup module
|
@@ -26,15 +28,30 @@ include Connection
|
|
26
28
|
module SecurityGroup
|
27
29
|
|
28
30
|
def create_security_group(name)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
begin
|
32
|
+
sec_groups = get_security_group(name)
|
33
|
+
if sec_groups.length >= 1
|
34
|
+
sec_groups[0]
|
35
|
+
else
|
36
|
+
description = format('Security group for blueprint %{name}', name: name)
|
37
|
+
Logging.info(description)
|
38
|
+
Connection.network.security_groups.create(
|
39
|
+
:name => name,
|
40
|
+
:description => description
|
41
|
+
)
|
42
|
+
end
|
43
|
+
rescue => e
|
44
|
+
Logging.error(e.message)
|
45
|
+
end
|
34
46
|
end
|
35
47
|
|
36
|
-
def delete_security_group(
|
37
|
-
|
48
|
+
def delete_security_group(security_group)
|
49
|
+
begin
|
50
|
+
sec_group = get_security_group(security_group)
|
51
|
+
Connection.network.security_groups.get(sec_group.id).destroy
|
52
|
+
rescue => e
|
53
|
+
Logging.error(e.message)
|
54
|
+
end
|
38
55
|
end
|
39
56
|
|
40
57
|
def create_security_group_rule(security_group_id, protocol, port_min, port_max)
|
@@ -47,12 +64,26 @@ module SecurityGroup
|
|
47
64
|
:port_range_max => port_max,
|
48
65
|
:remote_ip_prefix => '0.0.0.0/0'
|
49
66
|
)
|
50
|
-
rescue StandardError
|
51
|
-
|
67
|
+
rescue StandardError => e
|
68
|
+
msg = format('error creating the rule for port %{port_min}', port_min: port_min)
|
69
|
+
puts msg
|
70
|
+
Logging.error(e.message)
|
52
71
|
end
|
53
72
|
end
|
54
73
|
|
55
74
|
def delete_security_group_rule(rule_id)
|
56
|
-
|
75
|
+
begin
|
76
|
+
Connection.network.security_group_rules.get(rule_id).destroy
|
77
|
+
rescue => e
|
78
|
+
Logging.error(e.message)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_security_group(name)
|
83
|
+
begin
|
84
|
+
Connection.network.security_groups.all({:name => name})
|
85
|
+
rescue => e
|
86
|
+
Logging.error(e.message)
|
87
|
+
end
|
57
88
|
end
|
58
89
|
end
|
data/lib/yaml_parse.rb
CHANGED
@@ -16,12 +16,19 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
18
|
require 'yaml'
|
19
|
+
require_relative 'log.rb'
|
20
|
+
include Logging
|
19
21
|
|
20
22
|
#
|
21
23
|
# YamlParse module
|
22
24
|
#
|
23
25
|
module YamlParse
|
24
26
|
def get_values(path_to_yaml)
|
25
|
-
|
27
|
+
begin
|
28
|
+
Logging.info('getting values from catalog.yaml, this will be a service catalog.forj.io')
|
29
|
+
YAML.load_file(path_to_yaml)
|
30
|
+
rescue => e
|
31
|
+
Logging.error(e.message)
|
32
|
+
end
|
26
33
|
end
|
27
34
|
end
|
data/spec/boot_spec.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require 'require_relative'
|
19
|
+
|
20
|
+
require_relative '../lib/boot.rb'
|
21
|
+
include Boot
|
22
|
+
|
23
|
+
require 'spec_helper'
|
24
|
+
|
25
|
+
describe 'boot' do
|
26
|
+
it 'is booting maestro'
|
27
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require 'spec_helper'
|
19
|
+
|
20
|
+
require 'fog'
|
21
|
+
|
22
|
+
require_relative '../lib/connection.rb'
|
23
|
+
include Connection
|
24
|
+
|
25
|
+
class TestClass
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'network' do
|
29
|
+
it 'is connecting to hpcloud' do
|
30
|
+
@test_class = TestClass.new
|
31
|
+
@test_class.extend(Connection)
|
32
|
+
|
33
|
+
Fog.mock!
|
34
|
+
|
35
|
+
conn = @test_class.network
|
36
|
+
expect(conn).to be
|
37
|
+
|
38
|
+
Fog::Mock.reset
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
describe 'compute' do
|
44
|
+
it 'is connecting to hpcloud' do
|
45
|
+
@test_class = TestClass.new
|
46
|
+
@test_class.extend(Connection)
|
47
|
+
|
48
|
+
Fog.mock!
|
49
|
+
|
50
|
+
conn = @test_class.compute
|
51
|
+
expect(conn).to be
|
52
|
+
|
53
|
+
Fog::Mock.reset
|
54
|
+
end
|
55
|
+
end
|
data/spec/down_spec.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require 'spec_helper'
|
19
|
+
|
20
|
+
require 'fog'
|
21
|
+
|
22
|
+
require_relative '../lib/repositories.rb'
|
23
|
+
include Repositories
|
24
|
+
|
25
|
+
class TestClass
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'repositories' do
|
29
|
+
it 'its clonning the repo' do
|
30
|
+
@test_class = TestClass.new
|
31
|
+
@test_class.extend(Repositories)
|
32
|
+
|
33
|
+
repo = @test_class.clone_repo
|
34
|
+
expect(repo).to be
|
35
|
+
end
|
36
|
+
end
|
data/spec/setup_spec.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# The generated `.rspec` file contains `--require spec_helper` which will cause this
|
4
|
+
# file to always be loaded, without a need to explicitly require it in any files.
|
5
|
+
#
|
6
|
+
# Given that it is always loaded, you are encouraged to keep this file as
|
7
|
+
# light-weight as possible. Requiring heavyweight dependencies from this file
|
8
|
+
# will add to the boot time of your test suite on EVERY test run, even for an
|
9
|
+
# individual file that may not need all of that loaded. Instead, make a
|
10
|
+
# separate helper file that requires this one and then use it only in the specs
|
11
|
+
# that actually need it.
|
12
|
+
#
|
13
|
+
# The `.rspec` file also contains a few flags that are not defaults but that
|
14
|
+
# users commonly want.
|
15
|
+
#
|
16
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
17
|
+
RSpec.configure do |config|
|
18
|
+
# The settings below are suggested to provide a good initial experience
|
19
|
+
# with RSpec, but feel free to customize to your heart's content.
|
20
|
+
=begin
|
21
|
+
# These two settings work together to allow you to limit a spec run
|
22
|
+
# to individual examples or groups you care about by tagging them with
|
23
|
+
# `:focus` metadata. When nothing is tagged with `:focus`, all examples
|
24
|
+
# get run.
|
25
|
+
config.filter_run :focus
|
26
|
+
config.run_all_when_everything_filtered = true
|
27
|
+
|
28
|
+
# Many RSpec users commonly either run the entire suite or an individual
|
29
|
+
# file, and it's useful to allow more verbose output when running an
|
30
|
+
# individual spec file.
|
31
|
+
if config.files_to_run.one?
|
32
|
+
# Use the documentation formatter for detailed output,
|
33
|
+
# unless a formatter has already been configured
|
34
|
+
# (e.g. via a command-line flag).
|
35
|
+
config.default_formatter = 'doc'
|
36
|
+
end
|
37
|
+
|
38
|
+
# Print the 10 slowest examples and example groups at the
|
39
|
+
# end of the spec run, to help surface which specs are running
|
40
|
+
# particularly slow.
|
41
|
+
config.profile_examples = 10
|
42
|
+
|
43
|
+
# Run specs in random order to surface order dependencies. If you find an
|
44
|
+
# order dependency and want to debug it, you can fix the order by providing
|
45
|
+
# the seed, which is printed after each run.
|
46
|
+
# --seed 1234
|
47
|
+
config.order = :random
|
48
|
+
|
49
|
+
# Seed global randomization in this process using the `--seed` CLI option.
|
50
|
+
# Setting this allows you to use `--seed` to deterministically reproduce
|
51
|
+
# test failures related to randomization by passing the same `--seed` value
|
52
|
+
# as the one that triggered the failure.
|
53
|
+
Kernel.srand config.seed
|
54
|
+
|
55
|
+
# rspec-expectations config goes here. You can use an alternate
|
56
|
+
# assertion/expectation library such as wrong or the stdlib/minitest
|
57
|
+
# assertions if you prefer.
|
58
|
+
config.expect_with :rspec do |expectations|
|
59
|
+
# Enable only the newer, non-monkey-patching expect syntax.
|
60
|
+
# For more details, see:
|
61
|
+
# - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
|
62
|
+
expectations.syntax = :expect
|
63
|
+
end
|
64
|
+
|
65
|
+
# rspec-mocks config goes here. You can use an alternate test double
|
66
|
+
# library (such as bogus or mocha) by changing the `mock_with` option here.
|
67
|
+
config.mock_with :rspec do |mocks|
|
68
|
+
# Enable only the newer, non-monkey-patching expect syntax.
|
69
|
+
# For more details, see:
|
70
|
+
# - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
|
71
|
+
mocks.syntax = :expect
|
72
|
+
|
73
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
74
|
+
# a real object. This is generally recommended.
|
75
|
+
mocks.verify_partial_doubles = true
|
76
|
+
end
|
77
|
+
=end
|
78
|
+
end
|
data/spec/ssh_spec.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.22
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2014-06-12 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
|
-
requirement: &
|
16
|
+
requirement: &16918740 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.16.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *16918740
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: fog
|
27
|
-
requirement: &
|
27
|
+
requirement: &16918200 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.22.1
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *16918200
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: hpcloud
|
38
|
-
requirement: &
|
38
|
+
requirement: &16917580 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.0.6
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *16917580
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: git
|
49
|
-
requirement: &
|
49
|
+
requirement: &16916860 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.2.7
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *16916860
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rbx-require-relative
|
60
|
-
requirement: &
|
60
|
+
requirement: &16915980 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: 0.0.9
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *16915980
|
69
69
|
description: forj command line
|
70
70
|
email:
|
71
71
|
- forj@forj.io
|
@@ -85,6 +85,22 @@ files:
|
|
85
85
|
- lib/setup.rb
|
86
86
|
- lib/repositories.rb
|
87
87
|
- lib/ssh.rb
|
88
|
+
- lib/log.rb
|
89
|
+
- lib/helpers.rb
|
90
|
+
- spec/boot_spec.rb
|
91
|
+
- spec/connection_spec.rb
|
92
|
+
- spec/down_spec.rb
|
93
|
+
- spec/network_spec.rb
|
94
|
+
- spec/repositories_spec.rb
|
95
|
+
- spec/setup_spec.rb
|
96
|
+
- spec/spec_helper.rb
|
97
|
+
- spec/ssh_spec.rb
|
98
|
+
- spec/yaml_parse_spec.rb
|
99
|
+
- Rakefile
|
100
|
+
- Gemfile
|
101
|
+
- README.md
|
102
|
+
- .rspec
|
103
|
+
- .rubocop.yml
|
88
104
|
homepage: https://forj.io
|
89
105
|
licenses:
|
90
106
|
- Apache License, Version 2.0.
|