yun 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Rakefile +4 -0
- data/lib/yun.rb +2 -2
- data/lib/yun/commands/command_base.rb +20 -0
- data/lib/yun/commands/node_command.rb +43 -4
- data/lib/yun/commands/yun_command.rb +26 -0
- data/lib/yun/config.rb +15 -10
- data/lib/yun/model.rb +4 -0
- data/lib/yun/model/connection.rb +29 -0
- data/lib/yun/model/fog_attributes.rb +40 -0
- data/lib/yun/model/node.rb +46 -0
- data/lib/yun/version.rb +1 -1
- data/spec/spec_helper.rb +10 -0
- data/spec/yun/model/connection_spec.rb +96 -0
- data/spec/yun/model/fog_attributes_spec.rb +21 -0
- data/spec/yun/model/node_spec.rb +80 -0
- data/spec/yun/version_spec.rb +8 -0
- data/yun.gemspec +3 -1
- metadata +33 -7
- data/lib/yun/cli.rb +0 -12
- data/lib/yun/yun.rb +0 -32
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/Rakefile
ADDED
data/lib/yun.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
require 'yun/
|
2
|
-
require 'yun/
|
1
|
+
require 'yun/model'
|
2
|
+
require 'yun/commands/yun_command'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'yun/model/connection'
|
3
|
+
|
4
|
+
module Yun
|
5
|
+
module CommandBase
|
6
|
+
|
7
|
+
def connection
|
8
|
+
@connection ||= Connection.new init_data
|
9
|
+
end
|
10
|
+
|
11
|
+
def init_data
|
12
|
+
{
|
13
|
+
:provider => "aws",
|
14
|
+
:aws_access_key_id => Config.aws_access_key_id,
|
15
|
+
:aws_secret_access_key => Config.aws_secret_access_key,
|
16
|
+
:region => Config.region
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,11 +1,50 @@
|
|
1
|
-
require '
|
1
|
+
require 'hirb'
|
2
|
+
require 'yun/commands/command_base'
|
3
|
+
require 'yun/config'
|
2
4
|
|
3
5
|
module Yun
|
4
|
-
class
|
6
|
+
class NodeCommand < Thor
|
5
7
|
|
6
|
-
|
8
|
+
include CommandBase
|
9
|
+
|
10
|
+
desc "node list", "list all nodes"
|
7
11
|
def list
|
8
|
-
|
12
|
+
node_attributes = connection.list.map do |node|
|
13
|
+
{
|
14
|
+
:id => node.id,
|
15
|
+
:name => node.name,
|
16
|
+
:type => node.instance_type,
|
17
|
+
:image => node.image,
|
18
|
+
:ip => node.ip,
|
19
|
+
:created_at => node.created_at,
|
20
|
+
:state => node.state
|
21
|
+
}
|
22
|
+
end
|
23
|
+
puts Hirb::Helpers::AutoTable.render node_attributes
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "node create NODE_NAME", "create a node"
|
27
|
+
method_option :image, :aliases => "-i", :default => "ami-11d68a54", :desc => "Amazon Machine Image"
|
28
|
+
method_option :instance_type, :aliases => "-t", :default => "t1.micro", :desc => "Instance Type"
|
29
|
+
def create(node_name)
|
30
|
+
attributes = create_attributes node_name, options
|
31
|
+
connection.create attributes
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "node destroy NODE_NAME", "destroy a node"
|
35
|
+
def destroy node_name
|
36
|
+
node = connection.find node_name
|
37
|
+
node.destroy
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def create_attributes node_name, options
|
42
|
+
{
|
43
|
+
"name" => node_name,
|
44
|
+
:image => options[:image],
|
45
|
+
:instance_type => options[:instance_type],
|
46
|
+
:key_name => Config.key_name
|
47
|
+
}
|
9
48
|
end
|
10
49
|
|
11
50
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'thor/group'
|
3
|
+
require 'yun/commands/command_base'
|
4
|
+
require 'yun/commands/node_command'
|
5
|
+
|
6
|
+
module Yun
|
7
|
+
class YunCommand < Thor
|
8
|
+
|
9
|
+
include CommandBase
|
10
|
+
|
11
|
+
desc "ssh NODE_NAME", "ssh to a node"
|
12
|
+
def ssh node_name
|
13
|
+
key = "~/.ssh/#{Config.key_name}.pem"
|
14
|
+
user_name = "ec2-user"
|
15
|
+
|
16
|
+
node = connection.find node_name
|
17
|
+
server_ip = node.ip
|
18
|
+
|
19
|
+
exec "ssh -i #{key} #{user_name}@#{server_ip}"
|
20
|
+
end
|
21
|
+
|
22
|
+
register NodeCommand, :node, "node SUBCOMMAND", "commands for node"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Yun::YunCommand.start
|
data/lib/yun/config.rb
CHANGED
@@ -3,24 +3,29 @@ require 'yaml'
|
|
3
3
|
module Yun
|
4
4
|
class Config
|
5
5
|
|
6
|
-
def
|
7
|
-
|
6
|
+
def self.aws_access_key_id
|
7
|
+
setting[:aws_access_key_id]
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
10
|
+
def self.aws_secret_access_key
|
11
|
+
setting[:aws_secret_access_key]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.region
|
15
|
+
setting[:region]
|
12
16
|
end
|
13
17
|
|
14
|
-
def
|
15
|
-
|
18
|
+
def self.key_name
|
19
|
+
setting[:key_name]
|
16
20
|
end
|
17
21
|
|
18
|
-
|
19
|
-
|
22
|
+
private
|
23
|
+
def self.setting
|
24
|
+
@setting ||= YAML.load_file(config_file)[:default]
|
20
25
|
end
|
21
26
|
|
22
|
-
def
|
23
|
-
@
|
27
|
+
def self.config_file
|
28
|
+
@config_file ||= File.expand_path('~/.yun')
|
24
29
|
end
|
25
30
|
|
26
31
|
end
|
data/lib/yun/model.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'yun/model'
|
2
|
+
|
3
|
+
module Yun
|
4
|
+
class Connection
|
5
|
+
def initialize options
|
6
|
+
@servers = Fog::Compute.new(options).servers
|
7
|
+
end
|
8
|
+
|
9
|
+
def create attributes={}
|
10
|
+
fog_attributes = FogAttributes.new attributes
|
11
|
+
server = @servers.create fog_attributes
|
12
|
+
server.wait_for { ready? }
|
13
|
+
Node.new server
|
14
|
+
end
|
15
|
+
|
16
|
+
def list
|
17
|
+
@servers.map do |server|
|
18
|
+
Node.new server
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def find node_name
|
23
|
+
list.find do |node|
|
24
|
+
node.name == node_name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Yun
|
2
|
+
class FogAttributes < Hash
|
3
|
+
|
4
|
+
def initialize attributes
|
5
|
+
convert_basic_attributes attributes
|
6
|
+
convert_tags_attributes attributes
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
def convert_basic_attributes attributes
|
11
|
+
attributes.each do |key, value|
|
12
|
+
convert key, value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def convert key, value
|
17
|
+
if fog_key_mapping.has_key? key
|
18
|
+
fog_key = fog_key_mapping[key]
|
19
|
+
self[fog_key] = value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def fog_key_mapping
|
24
|
+
{
|
25
|
+
:image => :image_id,
|
26
|
+
:instance_type => :flavor_id,
|
27
|
+
:key_name => :key_name
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def convert_tags_attributes attributes
|
32
|
+
tags_key = ["name"]
|
33
|
+
tags_hash = attributes.reject do |key, value|
|
34
|
+
not tags_key.include? key
|
35
|
+
end
|
36
|
+
self[:tags] = tags_hash
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Yun
|
2
|
+
class Node
|
3
|
+
|
4
|
+
def initialize server
|
5
|
+
@server = server
|
6
|
+
end
|
7
|
+
|
8
|
+
def id
|
9
|
+
@server.id
|
10
|
+
end
|
11
|
+
|
12
|
+
def image
|
13
|
+
@server.image_id
|
14
|
+
end
|
15
|
+
|
16
|
+
def instance_type
|
17
|
+
@server.flavor_id
|
18
|
+
end
|
19
|
+
|
20
|
+
def key_name
|
21
|
+
@server.key_name
|
22
|
+
end
|
23
|
+
|
24
|
+
def name
|
25
|
+
@server.tags["name"]
|
26
|
+
end
|
27
|
+
|
28
|
+
def state
|
29
|
+
@server.state
|
30
|
+
end
|
31
|
+
|
32
|
+
def ip
|
33
|
+
@server.public_ip_address
|
34
|
+
end
|
35
|
+
|
36
|
+
def created_at
|
37
|
+
@server.created_at
|
38
|
+
end
|
39
|
+
|
40
|
+
def destroy
|
41
|
+
@server.destroy
|
42
|
+
@server.wait_for { not reload or state == 'terminated' }
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
data/lib/yun/version.rb
CHANGED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Yun::Connection do
|
4
|
+
|
5
|
+
config = {
|
6
|
+
:provider => 'aws',
|
7
|
+
:aws_access_key_id => 'fake_aws_access_key_id',
|
8
|
+
:aws_secret_access_key => 'fake_secret_access_key',
|
9
|
+
:region => 'us-west-1'
|
10
|
+
}
|
11
|
+
|
12
|
+
before :all do
|
13
|
+
Fog::Compute.new(config).key_pairs.create(:name => 'some_key')
|
14
|
+
end
|
15
|
+
|
16
|
+
after :each do
|
17
|
+
Fog::Compute.new(config).servers.each do |server|
|
18
|
+
server.destroy
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'create' do
|
23
|
+
|
24
|
+
before :each do
|
25
|
+
@connection = Yun::Connection.new config
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should create server with default value when no attributes given' do
|
29
|
+
node = @connection.create
|
30
|
+
|
31
|
+
node.instance_type.should == 't1.micro'
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should make sure the server is running in creation' do
|
35
|
+
node = @connection.create
|
36
|
+
|
37
|
+
node.state.should == 'running'
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should create server using given attributes' do
|
41
|
+
attributes =
|
42
|
+
{
|
43
|
+
:image => 'test_image_id',
|
44
|
+
:instance_type => 'small_type',
|
45
|
+
:key_name => 'some_key'
|
46
|
+
}
|
47
|
+
node = @connection.create attributes
|
48
|
+
|
49
|
+
node.image.should == 'test_image_id'
|
50
|
+
node.instance_type.should == 'small_type'
|
51
|
+
node.key_name.should == 'some_key'
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should create server with name' do
|
55
|
+
attributes = { "name" => 'test server' }
|
56
|
+
|
57
|
+
node = @connection.create attributes
|
58
|
+
|
59
|
+
node.name.should == 'test server'
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'list' do
|
65
|
+
|
66
|
+
before :each do
|
67
|
+
@connection = Yun::Connection.new config
|
68
|
+
|
69
|
+
@one_node = @connection.create({ "name" => 'one node' })
|
70
|
+
@other_node = @connection.create({ "name" => 'other node' })
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should return all the node' do
|
74
|
+
nodes = @connection.list
|
75
|
+
|
76
|
+
nodes.length.should == 2
|
77
|
+
names = nodes.map { |node| node.name }
|
78
|
+
names.sort.should == ['one node', 'other node']
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'find' do
|
84
|
+
before do
|
85
|
+
@connection = Yun::Connection.new config
|
86
|
+
@one_node = @connection.create({ "name" => 'one node' })
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should find the node by node name' do
|
90
|
+
node = @connection.find 'one node'
|
91
|
+
|
92
|
+
node.name.should == 'one node'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Yun::FogAttributes do
|
4
|
+
|
5
|
+
it 'should convert attributes to fog attributes hash' do
|
6
|
+
attribute = { :image => 'test_image_id' }
|
7
|
+
|
8
|
+
fog_attr = Yun::FogAttributes.new attribute
|
9
|
+
|
10
|
+
fog_attr[:image_id].should == 'test_image_id'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should save name attribute into tags' do
|
14
|
+
attribute = { "name" => 'test name' }
|
15
|
+
|
16
|
+
fog_attr = Yun::FogAttributes.new attribute
|
17
|
+
|
18
|
+
fog_attr[:tags]["name"].should == 'test name'
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Yun::Node do
|
4
|
+
|
5
|
+
options = {
|
6
|
+
:provider => 'aws',
|
7
|
+
:aws_access_key_id => 'fake_aws_access_key_id',
|
8
|
+
:aws_secret_access_key => 'fake_secret_access_key',
|
9
|
+
:region => 'us-west-1'
|
10
|
+
}
|
11
|
+
|
12
|
+
after :each do
|
13
|
+
Fog::Compute.new(options).servers.each do |server|
|
14
|
+
server.destroy
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'basic attributes' do
|
19
|
+
|
20
|
+
before do
|
21
|
+
@time = Time.now
|
22
|
+
attributes =
|
23
|
+
{
|
24
|
+
:id => 'id',
|
25
|
+
:image_id => 'some_image',
|
26
|
+
:flavor_id => 'small_type',
|
27
|
+
:key_name => 'some_key',
|
28
|
+
:state => 'running',
|
29
|
+
:public_ip_address => '127.0.0.1',
|
30
|
+
:created_at => @time
|
31
|
+
}
|
32
|
+
@ec2_node = Fog::Compute::AWS::Server.new attributes
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should convert all the ec2 node attribute' do
|
36
|
+
node = Yun::Node.new @ec2_node
|
37
|
+
|
38
|
+
node.id.should == 'id'
|
39
|
+
node.image.should == 'some_image'
|
40
|
+
node.instance_type.should == 'small_type'
|
41
|
+
node.key_name.should == 'some_key'
|
42
|
+
node.state.should == 'running'
|
43
|
+
node.ip.should == '127.0.0.1'
|
44
|
+
node.created_at == @time
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'node name' do
|
50
|
+
|
51
|
+
before do
|
52
|
+
attributes = { :tags => { "name" => 'test node' } }
|
53
|
+
@ec2_node = Fog::Compute::AWS::Server.new attributes
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should parse the name in the tags value' do
|
57
|
+
node = Yun::Node.new @ec2_node
|
58
|
+
|
59
|
+
node.name.should == 'test node'
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'destroy' do
|
65
|
+
|
66
|
+
before do
|
67
|
+
@connection = Yun::Connection.new options
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should destroy ec2 node' do
|
71
|
+
node = @connection.create
|
72
|
+
|
73
|
+
node.destroy
|
74
|
+
|
75
|
+
@connection.list.length.should == 0
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
data/yun.gemspec
CHANGED
@@ -17,6 +17,8 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.executables = "yun"
|
18
18
|
|
19
19
|
gem.add_runtime_dependency "fog", ">= 1.0.0"
|
20
|
-
gem.add_runtime_dependency 'hirb', '
|
20
|
+
gem.add_runtime_dependency 'hirb', '>= 0.4.5'
|
21
21
|
gem.add_runtime_dependency 'thor', '>= 0.14.0'
|
22
|
+
|
23
|
+
gem.add_development_dependency 'rspec', '~> 2.7'
|
22
24
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yun
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Feng Zhichao
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-12-09 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: fog
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
|
-
- -
|
42
|
+
- - ">="
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
hash: 5
|
45
45
|
segments:
|
@@ -65,6 +65,21 @@ dependencies:
|
|
65
65
|
version: 0.14.0
|
66
66
|
type: :runtime
|
67
67
|
version_requirements: *id003
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: rspec
|
70
|
+
prerelease: false
|
71
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
hash: 13
|
77
|
+
segments:
|
78
|
+
- 2
|
79
|
+
- 7
|
80
|
+
version: "2.7"
|
81
|
+
type: :development
|
82
|
+
version_requirements: *id004
|
68
83
|
description:
|
69
84
|
email:
|
70
85
|
- flankerfc@gmail.com
|
@@ -75,16 +90,27 @@ extensions: []
|
|
75
90
|
extra_rdoc_files: []
|
76
91
|
|
77
92
|
files:
|
93
|
+
- .gitignore
|
78
94
|
- .rvmrc
|
79
95
|
- Gemfile
|
80
96
|
- Gemfile.lock
|
97
|
+
- Rakefile
|
81
98
|
- bin/yun
|
82
99
|
- lib/yun.rb
|
83
|
-
- lib/yun/
|
100
|
+
- lib/yun/commands/command_base.rb
|
84
101
|
- lib/yun/commands/node_command.rb
|
102
|
+
- lib/yun/commands/yun_command.rb
|
85
103
|
- lib/yun/config.rb
|
104
|
+
- lib/yun/model.rb
|
105
|
+
- lib/yun/model/connection.rb
|
106
|
+
- lib/yun/model/fog_attributes.rb
|
107
|
+
- lib/yun/model/node.rb
|
86
108
|
- lib/yun/version.rb
|
87
|
-
-
|
109
|
+
- spec/spec_helper.rb
|
110
|
+
- spec/yun/model/connection_spec.rb
|
111
|
+
- spec/yun/model/fog_attributes_spec.rb
|
112
|
+
- spec/yun/model/node_spec.rb
|
113
|
+
- spec/yun/version_spec.rb
|
88
114
|
- yun.gemspec
|
89
115
|
homepage: https://github.com/flanker/yun
|
90
116
|
licenses: []
|
data/lib/yun/cli.rb
DELETED
data/lib/yun/yun.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'fog'
|
2
|
-
require 'hirb'
|
3
|
-
require 'yun/config'
|
4
|
-
|
5
|
-
module Yun
|
6
|
-
class Yun
|
7
|
-
|
8
|
-
def self.list
|
9
|
-
config = Config.new
|
10
|
-
options = {:provider => "aws",
|
11
|
-
:aws_access_key_id => config.aws_access_key_id,
|
12
|
-
:aws_secret_access_key => config.aws_secret_access_key,
|
13
|
-
:region => config.region}
|
14
|
-
|
15
|
-
nodes = Fog::Compute.new(options).servers.map do |node|
|
16
|
-
{
|
17
|
-
:id => node.id,
|
18
|
-
:flavor_id => node.flavor_id,
|
19
|
-
:image_id => node.image_id,
|
20
|
-
:address => node.private_ip_address,
|
21
|
-
:created_at => node.created_at,
|
22
|
-
:status => node.state,
|
23
|
-
:instance_type => node.root_device_type
|
24
|
-
}
|
25
|
-
end.sort_by do |node|
|
26
|
-
node[:id] || ""
|
27
|
-
end
|
28
|
-
|
29
|
-
puts Hirb::Helpers::AutoTable.render nodes
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|