unit-hosting 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.travis.yml +1 -0
- data/Gemfile +14 -9
- data/README.md +18 -19
- data/Rakefile +3 -11
- data/VERSION +1 -1
- data/lib/unit-hosting.rb +2 -2
- data/lib/unit-hosting/agent.rb +4 -3
- data/lib/unit-hosting/api/base.rb +5 -2
- data/lib/unit-hosting/api/vm.rb +25 -23
- data/lib/unit-hosting/api/vm_group.rb +2 -0
- data/lib/unit-hosting/cache.rb +20 -1
- data/lib/unit-hosting/cli.rb +1 -0
- data/lib/unit-hosting/commands.rb +43 -53
- data/lib/unit-hosting/group.rb +3 -1
- data/spec/spec_helper.rb +50 -0
- data/spec/unit-hosting/agent_spec.rb +119 -0
- data/spec/unit-hosting/api/base_spec.rb +37 -0
- data/spec/unit-hosting/api/vm_group_spec.rb +56 -0
- data/spec/unit-hosting/api/vm_recipe_spec.rb +27 -0
- data/spec/unit-hosting/api/vm_spec.rb +148 -0
- data/spec/unit-hosting/cache_spec.rb +33 -0
- data/spec/unit-hosting/cli_spec.rb +23 -0
- data/spec/unit-hosting/commands_spec.rb +214 -0
- data/spec/unit-hosting/group_spec.rb +64 -0
- data/unit-hosting.gemspec +44 -11
- metadata +140 -19
- data/test/helper.rb +0 -18
- data/test/test_unit-hosting.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98119bd883670b1b0926c70ecedca0a05f895b38
|
4
|
+
data.tar.gz: 3561a6bf65164b4815a141adaa78ccc20bc7faa4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa306e08ec7432af886974060d2d8682bffdb36f9a5ccf59b1dc898c393074991bada5881e7038a9833b6b9f880a122844c0ac30e12f04b89bd3907da5402b4a
|
7
|
+
data.tar.gz: f3c0cb3920efb4298028bc41b50a094f92e5e3a150a15ee2c7f88265142ee82a870c21a937a0d80887a6f0027361cf1271a484274c2b9e42989aea44935e41d6
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: travis-ci
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,20 +1,25 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
|
-
|
3
|
-
# Example:
|
4
|
-
# gem "activesupport", ">= 2.3.5"
|
2
|
+
|
5
3
|
gem 'mutter'
|
6
4
|
gem "keystorage", "~> 0.4.13"
|
7
|
-
gem 'mechanize'
|
8
5
|
gem 'highline', '> 1.6'
|
9
6
|
gem 'progressbar', '>= 0.9.0'
|
10
7
|
gem 'httpclient', '>= 2.1.6.1'
|
11
8
|
gem 'command-line-utils' , '>= 0.0.1'
|
12
|
-
|
9
|
+
gem 'active_support'
|
10
|
+
gem 'i18n'
|
11
|
+
gem 'nokogiri','~> 1.5.9'
|
12
|
+
gem 'mechanize', '2.6.0'
|
13
13
|
|
14
|
-
# Add dependencies to develop your gem here.
|
15
|
-
# Include everything needed to run rake, tests, features, etc.
|
16
14
|
group :development do
|
17
|
-
# gem "shoulda", ">= 0"
|
18
|
-
gem "bundler"
|
19
15
|
gem "jeweler"
|
20
16
|
end
|
17
|
+
|
18
|
+
group :development,:test do
|
19
|
+
gem 'simplecov'
|
20
|
+
gem 'coveralls', :require =>false
|
21
|
+
gem "bundler"
|
22
|
+
gem 'rake'
|
23
|
+
gem 'rspec'
|
24
|
+
gem 'webmock'
|
25
|
+
end
|
data/README.md
CHANGED
@@ -1,14 +1,25 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
This is a command to manage virtual servers on UnitHosting(http://www.unit-hosting.com).
|
1
|
+
Unit Hosting support libs for Ruby
|
2
|
+
==================================
|
5
3
|
|
6
4
|
[![Build Status](https://travis-ci.org/tumf/unit-hosting.png?branch=master)](https://travis-ci.org/tumf/unit-hosting)
|
5
|
+
[![Coverage Status](https://coveralls.io/repos/tumf/unit-hosting/badge.png?branch=master)](https://coveralls.io/r/tumf/unit-hosting?branch=master)
|
6
|
+
[![Gem Version](https://badge.fury.io/rb/unit-hosting.png)](http://badge.fury.io/rb/unit-hosting)
|
7
|
+
[![Code Climate](https://codeclimate.com/github/tumf/unit-hosting.png)](https://codeclimate.com/github/tumf/unit-hosting)
|
8
|
+
[![Dependency Status](https://gemnasium.com/tumf/unit-hosting.png)](https://gemnasium.com/tumf/unit-hosting)
|
9
|
+
|
10
|
+
|
11
|
+
This is a library and CLI tools to manage virtual servers on [UnitHosting](http://www.unit-hosting.com).
|
12
|
+
|
13
|
+
Ruby versions 1.8.7, 1.9.2, 1.9.3, 2.0.0
|
14
|
+
|
15
|
+
> **GitHub**
|
16
|
+
> https://github.com/tumf/unit-hosting
|
17
|
+
|
7
18
|
|
8
19
|
Install
|
9
20
|
-------
|
10
21
|
|
11
|
-
sudo gem install unit-hosting
|
22
|
+
[sudo] gem install unit-hosting
|
12
23
|
|
13
24
|
> **RubyGems.org**
|
14
25
|
> https://rubygems.org/gems/unit-hosting
|
@@ -16,22 +27,12 @@ Install
|
|
16
27
|
Usage
|
17
28
|
-----
|
18
29
|
|
19
|
-
|
30
|
+
unit-hosting [global options] command [command options] args..
|
20
31
|
|
21
32
|
Global Options
|
22
33
|
---------------
|
23
34
|
|
24
35
|
|
25
|
-
Development
|
26
|
-
-----------
|
27
|
-
|
28
|
-
MySQLサーバの起動
|
29
|
-
|
30
|
-
```
|
31
|
-
sudo mysql.server start
|
32
|
-
```
|
33
|
-
|
34
|
-
|
35
36
|
Commands
|
36
37
|
--------
|
37
38
|
|
@@ -48,6 +49,4 @@ See Also
|
|
48
49
|
Copyright
|
49
50
|
---------
|
50
51
|
|
51
|
-
Copyright (c) 2011 Yoshihiro TAKAHARA. See LICENSE.txt for
|
52
|
-
further details.
|
53
|
-
|
52
|
+
Copyright (c) 2011-2014 Yoshihiro TAKAHARA. See LICENSE.txt for further details.
|
data/Rakefile
CHANGED
@@ -26,14 +26,6 @@ Jeweler::Tasks.new do |gem|
|
|
26
26
|
end
|
27
27
|
Jeweler::RubygemsDotOrgTasks.new
|
28
28
|
|
29
|
-
require
|
30
|
-
|
31
|
-
|
32
|
-
test.pattern = 'test/**/test_*.rb'
|
33
|
-
test.verbose = true
|
34
|
-
end
|
35
|
-
|
36
|
-
task :default => :test
|
37
|
-
|
38
|
-
|
39
|
-
|
29
|
+
require "rspec/core/rake_task"
|
30
|
+
RSpec::Core::RakeTask.new("spec")
|
31
|
+
task :default => :spec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/unit-hosting.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'bundler/setup'
|
3
|
+
require 'active_support/core_ext'
|
4
|
+
require 'i18n'
|
3
5
|
|
4
6
|
require "highline/import"
|
5
7
|
require "keystorage"
|
@@ -8,5 +10,3 @@ require 'xmlrpc/client'
|
|
8
10
|
require 'rexml/document'
|
9
11
|
require 'openssl'
|
10
12
|
|
11
|
-
require 'unit-hosting/agent'
|
12
|
-
require 'unit-hosting/commands'
|
data/lib/unit-hosting/agent.rb
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
require "mechanize"
|
4
|
-
|
4
|
+
require "unit-hosting/group"
|
5
5
|
module UnitHosting
|
6
|
-
UHURL = "https://cloud.unit-hosting.com"
|
7
6
|
class Agent < Mechanize
|
7
|
+
attr_accessor :endpoint
|
8
8
|
def initialize
|
9
9
|
super
|
10
|
+
@endpoint = "https://cloud.unit-hosting.com"
|
10
11
|
max_history = 0
|
11
12
|
end
|
12
13
|
|
13
14
|
def getr path
|
14
|
-
get(
|
15
|
+
get(@endpoint + path)
|
15
16
|
end
|
16
17
|
|
17
18
|
def login id,password
|
@@ -8,7 +8,8 @@ module UnitHosting
|
|
8
8
|
end
|
9
9
|
module_function :keypath
|
10
10
|
class Base
|
11
|
-
attr_reader :instance_id,:api_key
|
11
|
+
attr_reader :instance_id,:api_key
|
12
|
+
attr_accessor :server
|
12
13
|
def initialize(instance_id=nil,api_key=nil)
|
13
14
|
@instance_id = instance_id
|
14
15
|
@api_key = api_key
|
@@ -40,7 +41,9 @@ module UnitHosting
|
|
40
41
|
def server_call(method,param = {})
|
41
42
|
param["instance_id"] = @instance_id
|
42
43
|
param["api_key"] = @api_key
|
43
|
-
|
44
|
+
result = @server.call(method,param)
|
45
|
+
# puts @server.http_last_response.body
|
46
|
+
return result
|
44
47
|
end
|
45
48
|
end
|
46
49
|
end
|
data/lib/unit-hosting/api/vm.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# -*- coding: utf-8 -*-
|
3
|
+
require 'active_support/inflector'
|
3
4
|
require 'unit-hosting/api/base'
|
4
5
|
|
5
6
|
module UnitHosting
|
@@ -10,36 +11,31 @@ module UnitHosting
|
|
10
11
|
@api_key_elm = '/server/key'
|
11
12
|
super
|
12
13
|
end
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
14
|
+
|
15
|
+
def to_api(name)
|
16
|
+
"vm.#{name}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_missing(name, *args)
|
20
|
+
name = name.to_s
|
21
|
+
name = if /(.*)\?$/ =~ name
|
22
|
+
"get#{$1.camelize}"
|
23
|
+
else
|
24
|
+
name.camelize(:lower)
|
25
|
+
end
|
26
|
+
if args.blank?
|
27
|
+
server_call(to_api(name))
|
28
|
+
else
|
29
|
+
server_call(to_api(name),*args)
|
30
|
+
end
|
30
31
|
end
|
32
|
+
|
31
33
|
def memory_unit_size size
|
32
34
|
server_call("vm.setMemoryUnitSize",{"size" => size})
|
33
35
|
end
|
34
36
|
def cpu_unit_num num
|
35
37
|
server_call("vm.setCpuUnitNum",{"num" => num})
|
36
38
|
end
|
37
|
-
def memory_unit_size?
|
38
|
-
server_call("vm.getMemoryUnitSize")
|
39
|
-
end
|
40
|
-
def cpu_unit_num?
|
41
|
-
server_call("vm.getCpuUnitNum")
|
42
|
-
end
|
43
39
|
def ips
|
44
40
|
server_call("vm.getIpInfo")
|
45
41
|
end
|
@@ -67,6 +63,12 @@ module UnitHosting
|
|
67
63
|
def get_vm_data(key)
|
68
64
|
server_call("vm.getVmData",{"key" =>key})
|
69
65
|
end
|
66
|
+
def set_pv_args(val)
|
67
|
+
server_call("vm.setPvArgs",{"pv_args" =>val})
|
68
|
+
end
|
69
|
+
def get_pv_args
|
70
|
+
server_call("vm.getPvArgs")
|
71
|
+
end
|
70
72
|
end
|
71
73
|
end
|
72
74
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
require 'unit-hosting/api/base'
|
4
4
|
require 'unit-hosting/api/vm'
|
5
|
+
require 'unit-hosting/api/vm_recipe'
|
5
6
|
|
6
7
|
module UnitHosting
|
7
8
|
module Api
|
@@ -19,6 +20,7 @@ module UnitHosting
|
|
19
20
|
vms.each do |vm|
|
20
21
|
return vm["api_key"] if vm["instance_id"] == instance_id
|
21
22
|
end
|
23
|
+
nil #missing
|
22
24
|
end
|
23
25
|
# instance_idに紐づくvmを返す
|
24
26
|
def vm(instance_id)
|
data/lib/unit-hosting/cache.rb
CHANGED
@@ -6,7 +6,26 @@ require 'unit-hosting/group'
|
|
6
6
|
module UnitHosting
|
7
7
|
class Cache < PStore
|
8
8
|
def groups
|
9
|
-
transaction { |ps|
|
9
|
+
transaction { |ps|
|
10
|
+
ps["groups"] ||= [].extend(UnitHosting::Groups)
|
11
|
+
}
|
10
12
|
end
|
13
|
+
|
14
|
+
def update_all_groups! gs
|
15
|
+
transaction { |ps|
|
16
|
+
ps["groups"] = gs.update
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def update_group! group
|
21
|
+
transaction { |ps|
|
22
|
+
groups = ps["groups"].reject { |g|
|
23
|
+
g.instance_id == group.instance_id
|
24
|
+
}
|
25
|
+
groups << group.update
|
26
|
+
ps["groups"] = groups
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
11
30
|
end
|
12
31
|
end
|
data/lib/unit-hosting/cli.rb
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
#require "rubygems"
|
4
4
|
|
5
|
-
require "unit-hosting"
|
6
5
|
require "unit-hosting/api"
|
7
6
|
require "unit-hosting/agent"
|
8
7
|
require "unit-hosting/cache"
|
@@ -10,41 +9,49 @@ require "unit-hosting/cache"
|
|
10
9
|
|
11
10
|
module UnitHosting
|
12
11
|
class Commands < CommandLineUtils::Commands
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
class ArgumentError < StandardError;end
|
13
|
+
class LoginError < ArgumentError; end
|
14
|
+
class GroupNotFound < ArgumentError; end
|
15
|
+
# CommandLineUtils::COMMANDS +=
|
16
|
+
attr_accessor :agent, :cache, :keyname
|
17
|
+
def initialize endpoint =nil
|
18
|
+
@keyname = "unit-hosting"
|
19
|
+
@endpoint = endpoint
|
20
|
+
@command_options = []
|
21
|
+
super()
|
16
22
|
@commands += ["login","logout","update","groups","group"]
|
17
23
|
@agent = Agent.new
|
18
|
-
@
|
19
|
-
@cache =
|
24
|
+
@agent.endpoint = @endpoint
|
25
|
+
@cache = nil
|
26
|
+
end
|
20
27
|
|
28
|
+
def cache
|
29
|
+
@cache ||= Cache.new(cache_file)
|
21
30
|
end
|
22
31
|
|
23
32
|
def login
|
24
33
|
opt = OptionParser.new
|
25
34
|
opt.parse!(@command_options)
|
26
|
-
@summery = "Login to
|
35
|
+
@summery = "Login to #{@endpoint} ."
|
27
36
|
@banner = ""
|
28
37
|
return opt if @help
|
29
38
|
|
30
|
-
user = ask('Enter user: ') do |q|
|
31
|
-
q.validate = /\w+/
|
32
|
-
end
|
33
|
-
|
34
39
|
ok = false
|
35
40
|
while(!ok)
|
41
|
+
user = ask('Enter user: ') do |q|
|
42
|
+
q.validate = /\w+/
|
43
|
+
end
|
36
44
|
password = ask("Enter your password: ") do |q|
|
37
45
|
q.validate = /\w+/
|
38
46
|
q.echo = false
|
39
47
|
end
|
40
|
-
|
41
48
|
@agent.login(user,password)
|
42
|
-
if @agent.login?
|
49
|
+
if @agent.login?
|
43
50
|
ok = true
|
44
|
-
Keystorage.set(
|
45
|
-
puts "login OK"
|
51
|
+
Keystorage.set(@keyname,user,password)
|
52
|
+
$stderr.puts "login OK"
|
46
53
|
else
|
47
|
-
puts "password mismatch"
|
54
|
+
$stderr.puts "password mismatch"
|
48
55
|
end
|
49
56
|
end
|
50
57
|
end
|
@@ -52,15 +59,14 @@ module UnitHosting
|
|
52
59
|
def logout
|
53
60
|
opt = OptionParser.new
|
54
61
|
opt.parse!(@command_options)
|
55
|
-
@summery = "Logout from
|
62
|
+
@summery = "Logout from #{@endpoint} ."
|
56
63
|
@banner = ""
|
57
64
|
return opt if @help
|
58
|
-
Keystorage.delete(
|
65
|
+
Keystorage.delete(@keyname)
|
59
66
|
end
|
60
67
|
|
61
68
|
include UnitHosting::Api
|
62
|
-
def update
|
63
|
-
all = false
|
69
|
+
def update all = false
|
64
70
|
opt = OptionParser.new
|
65
71
|
opt.on('-a','--all', 'update all cache') { all = true }
|
66
72
|
opt.parse!(@command_options)
|
@@ -69,31 +75,13 @@ module UnitHosting
|
|
69
75
|
return opt if @help
|
70
76
|
gid = @command_options.shift
|
71
77
|
|
72
|
-
|
73
78
|
start
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
}.compact
|
82
|
-
@cache.transaction { |ps|
|
83
|
-
if all
|
84
|
-
ps["groups"] = gs.find_all { |g|
|
85
|
-
!g.key.empty?
|
86
|
-
}.extend(Groups).update
|
87
|
-
else
|
88
|
-
group = ask_group(gid,gs)
|
89
|
-
ps["groups"] = gs.collect{ |g|
|
90
|
-
unless g.key.empty?
|
91
|
-
g.update if g.instance_id == group.instance_id
|
92
|
-
g
|
93
|
-
end
|
94
|
-
}.compact.extend(Groups)
|
95
|
-
end
|
96
|
-
}
|
79
|
+
if all
|
80
|
+
cache.update_all_groups!(@agent.groups)
|
81
|
+
else
|
82
|
+
group = ask_group(gid,cache.groups)
|
83
|
+
cache.update_group!(group)
|
84
|
+
end
|
97
85
|
end
|
98
86
|
|
99
87
|
def groups
|
@@ -102,8 +90,7 @@ module UnitHosting
|
|
102
90
|
@summery = "List sever groups."
|
103
91
|
@banner = ""
|
104
92
|
return opt if @help
|
105
|
-
|
106
|
-
puts @cache.groups.tablize
|
93
|
+
STDOUT.puts cache.groups.try(:tablize)
|
107
94
|
end
|
108
95
|
|
109
96
|
def group
|
@@ -114,7 +101,7 @@ module UnitHosting
|
|
114
101
|
return opt if @help
|
115
102
|
|
116
103
|
id = @command_options.shift
|
117
|
-
group = ask_group(id
|
104
|
+
group = ask_group(id,cache.groups)
|
118
105
|
puts group.tablize if group
|
119
106
|
end
|
120
107
|
|
@@ -129,27 +116,30 @@ module UnitHosting
|
|
129
116
|
private
|
130
117
|
def start
|
131
118
|
return true if @agent.login?
|
132
|
-
|
119
|
+
|
120
|
+
user = Keystorage.list(@keyname).shift
|
133
121
|
login unless user
|
134
122
|
if user
|
135
|
-
@agent.login(user,Keystorage.get(
|
123
|
+
@agent.login(user,Keystorage.get(@keyname,user))
|
136
124
|
login unless @agent.login?
|
137
125
|
end
|
126
|
+
raise LoginError,"Can't start session" unless @agent.login?
|
138
127
|
end
|
139
|
-
|
140
128
|
def ask_group(id,gs)
|
141
129
|
unless id
|
142
130
|
puts gs.extend(Groups).tablize
|
143
|
-
id = ask('Enter group id
|
131
|
+
id = ask('Enter group id: ',gs.ids) { |q|
|
144
132
|
q.validate = /\w+/
|
145
133
|
q.readline = true
|
146
134
|
}
|
147
135
|
end
|
148
|
-
raise SystemExit if id == "q"
|
149
136
|
group = gs.find { |g| id == g.instance_id }
|
150
|
-
raise "Group #{id} is not exists." unless group
|
137
|
+
raise GroupNotFound,"Group #{id} is not exists." unless group
|
151
138
|
group
|
152
139
|
end
|
153
140
|
|
141
|
+
def cache_file file = ".unit-hosting.cache"
|
142
|
+
File.join ENV['HOME'],file
|
143
|
+
end
|
154
144
|
end
|
155
145
|
end
|