pec 0.1.5 → 0.1.6
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +8 -15
- data/lib/pec.rb +10 -1
- data/lib/pec/cli.rb +9 -67
- data/lib/pec/compute/flavor.rb +1 -1
- data/lib/pec/compute/image.rb +1 -1
- data/lib/pec/compute/security_group.rb +1 -6
- data/lib/pec/compute/server.rb +18 -24
- data/lib/pec/compute/tenant.rb +12 -0
- data/lib/pec/configure/host.rb +3 -2
- data/lib/pec/configure/sample.rb +1 -0
- data/lib/pec/configure/user_data.rb +0 -1
- data/lib/pec/director.rb +53 -0
- data/lib/pec/director/destroy_director.rb +23 -0
- data/lib/pec/director/helper.rb +47 -0
- data/lib/pec/director/make_director.rb +35 -0
- data/lib/pec/director/vm_status_director.rb +38 -0
- data/lib/pec/errors.rb +1 -0
- data/lib/pec/init.rb +42 -0
- data/lib/pec/network/port.rb +41 -41
- data/lib/pec/network/subnet.rb +7 -5
- data/lib/pec/query.rb +2 -15
- data/lib/pec/resource.rb +20 -0
- data/lib/pec/resource/openstack.rb +60 -0
- data/lib/pec/version.rb +1 -1
- metadata +11 -3
- data/lib/pec/vm_director.rb +0 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3777a334f52b99460286a3728200d1115a9912cb
|
4
|
+
data.tar.gz: a77aa53e221c37903bb3e20c91eefd6a5d139d54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 553934f57c16268267a986f769650a7429ba59aa49b4fe0b20573fad64250b82b28890988a03ffb6250c86e2c6d560c65ac59863f597c2013439c6fe083c02c3
|
7
|
+
data.tar.gz: b09690c07338509b24963ac254161adda7e548b0808f05293ff5849b49f9947b95536e542b29e131137a0bec4e49ecb431be3749c479d4bfba6f15727dcaf935
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -13,7 +13,7 @@ OpenStackにおいて複数サーバの起動一括起動停止や、 DHCPサー
|
|
13
13
|
|
14
14
|
## Usage
|
15
15
|
|
16
|
-
|
16
|
+
セットアップ・定義ファイル作成
|
17
17
|
|
18
18
|
$ pec init
|
19
19
|
|
@@ -21,7 +21,7 @@ OpenStackにおいて複数サーバの起動一括起動停止や、 DHCPサー
|
|
21
21
|
create - /Pec.yaml
|
22
22
|
create - /user_datas/web_server.yaml.sample
|
23
23
|
```
|
24
|
-
|
24
|
+
|
25
25
|
Pec.yamlに基づきホストを作成します。
|
26
26
|
ホスト名が指定された場合はそのホストのみ作成、削除します。
|
27
27
|
|
@@ -29,21 +29,13 @@ Pec.yamlに基づきホストを作成します。
|
|
29
29
|
|
30
30
|
$ pec destroy <hostname>
|
31
31
|
|
32
|
-
|
33
|
-
#### ~/.fog
|
34
|
-
```
|
35
|
-
% cat ~/.fog
|
36
|
-
default:
|
37
|
-
openstack_auth_url: "http://your-openstack-endpoint/v2.0/tokens"
|
38
|
-
openstack_username: "admin"
|
39
|
-
openstack_tenant: "admin"
|
40
|
-
openstack_api_key: "admin-no-password"
|
41
|
-
```
|
42
|
-
|
32
|
+
$ pec status <hostname>
|
43
33
|
|
34
|
+
### Configure
|
44
35
|
#### Pec.yaml
|
45
36
|
```
|
46
37
|
pyama-test001:
|
38
|
+
tenant: your_tenant
|
47
39
|
image: centos-7.1_chef-12.3_puppet-3.7
|
48
40
|
flavor: m1.small
|
49
41
|
networks:
|
@@ -75,10 +67,11 @@ pyama-test002:
|
|
75
67
|
|
76
68
|
| 項目名 | 説明 | 必須 | 例示 |
|
77
69
|
| -------------- | ---------------------------------------------- | ---- | ------------------------------- |
|
78
|
-
| instance_name| インスタンス名
|
70
|
+
| instance_name | インスタンス名 | ○ | pyama-test001 |
|
71
|
+
| tenant | テナント名 | ○ | your_tenant |
|
79
72
|
| image | イメージ名 | ○ | centos-7.1_chef-12.3_puppet-3.7 |
|
80
73
|
| flavor | フレーバー名 | ○ | m1.small |
|
81
|
-
| networks | ネットワーク定義 | - | []
|
74
|
+
| networks | ネットワーク定義 | - | [] |
|
82
75
|
| security_group | セキュリティグループ名 | - | [default,ssh] |
|
83
76
|
| templates | `user_data`のテンプレート.`./user_datas`に配置 | - | [base.yaml,webserver.yaml] |
|
84
77
|
| user_data | cloud-init記法に準拠 | - | - |
|
data/lib/pec.rb
CHANGED
@@ -1,9 +1,17 @@
|
|
1
1
|
require 'fog'
|
2
2
|
require 'ip'
|
3
|
+
require 'colorator'
|
3
4
|
require "pec/version"
|
4
5
|
require "pec/query"
|
5
6
|
require "pec/errors"
|
6
|
-
require "pec/
|
7
|
+
require "pec/init"
|
8
|
+
require "pec/resource"
|
9
|
+
require "pec/resource/openstack"
|
10
|
+
require "pec/director"
|
11
|
+
require "pec/director/helper"
|
12
|
+
require "pec/director/make_director"
|
13
|
+
require "pec/director/destroy_director"
|
14
|
+
require "pec/director/vm_status_director"
|
7
15
|
require "pec/configure"
|
8
16
|
require "pec/configure/sample"
|
9
17
|
require "pec/configure/host"
|
@@ -12,6 +20,7 @@ require "pec/configure/user_data"
|
|
12
20
|
require "pec/compute/server"
|
13
21
|
require "pec/compute/flavor"
|
14
22
|
require "pec/compute/image"
|
23
|
+
require "pec/compute/tenant"
|
15
24
|
require "pec/compute/security_group"
|
16
25
|
require "pec/network/port"
|
17
26
|
require "pec/network/subnet"
|
data/lib/pec/cli.rb
CHANGED
@@ -5,84 +5,26 @@ module Pec
|
|
5
5
|
|
6
6
|
desc 'init', 'create sample config'
|
7
7
|
def init
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
puts "create directry user_datas"
|
12
|
-
end
|
13
|
-
unless File.exist?("Pec.yaml")
|
14
|
-
open("Pec.yaml","w") do |e|
|
15
|
-
YAML.dump(Pec::Configure::Sample.pec_file, e)
|
16
|
-
end
|
17
|
-
puts "create configure file Pec.yaml"
|
18
|
-
end
|
19
|
-
open("#{dirname}/web_server.yaml.sample","w") do |e|
|
20
|
-
YAML.dump(Pec::Configure::Sample.user_data, e)
|
21
|
-
end if FileTest.exist?(dirname)
|
22
|
-
|
8
|
+
Pec::Init.create_fog_config
|
9
|
+
Pec::Init.create_template_dir
|
10
|
+
Pec::Init.create_sample_config
|
23
11
|
end
|
24
12
|
|
25
13
|
desc 'up', 'create vm by Pec.yaml'
|
26
14
|
def up(host_name = nil)
|
27
|
-
|
28
|
-
director = Pec::VmDirector.new
|
29
|
-
|
30
|
-
config.filter_by_host(host_name).each do |host|
|
31
|
-
begin
|
32
|
-
director.make(host)
|
33
|
-
rescue Pec::Errors::Error => e
|
34
|
-
pec_create_err_message(e, host)
|
35
|
-
rescue Excon::Errors::Error => e
|
36
|
-
excon_err_message(e)
|
37
|
-
end
|
38
|
-
end if config
|
39
|
-
rescue Errno::ENOENT => e
|
40
|
-
puts e
|
41
|
-
rescue Pec::Errors::Configure => e
|
42
|
-
pec_config_err_message
|
15
|
+
Pec::Director.execute("make", host_name)
|
43
16
|
end
|
44
17
|
|
45
18
|
option :force , type: :boolean, aliases: "-f"
|
46
19
|
desc "destroy", "delete vm"
|
47
20
|
def destroy(host_name = nil)
|
48
|
-
|
49
|
-
director = Pec::VmDirector.new
|
50
|
-
|
51
|
-
config.filter_by_host(host_name).each do |host|
|
52
|
-
begin
|
53
|
-
if options[:force] || yes?("#{host.name}: Are you sure you want to destroy the '#{host.name}' VM? [y/N]")
|
54
|
-
director.destroy!(host.name)
|
55
|
-
end
|
56
|
-
rescue Pec::Errors::Error => e
|
57
|
-
pec_delete_err_message(e, host)
|
58
|
-
rescue Excon::Errors::Error => e
|
59
|
-
excon_err_message(e)
|
60
|
-
end
|
61
|
-
end if config
|
62
|
-
rescue Errno::ENOENT => e
|
63
|
-
puts e
|
64
|
-
rescue Pec::Errors::Configure => e
|
65
|
-
pec_config_err_message
|
21
|
+
Pec::Director.execute("destroy", host_name, options)
|
66
22
|
end
|
67
23
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
def pec_delete_err_message(e, host)
|
75
|
-
puts e
|
76
|
-
puts "can't create server:#{host.name}"
|
77
|
-
end
|
78
|
-
|
79
|
-
def pec_config_err_message
|
80
|
-
puts "configure can't load"
|
81
|
-
end
|
82
|
-
|
83
|
-
def excon_err_message(e)
|
84
|
-
JSON.parse(e.response[:body]).each { |e,m| puts "#{e}:#{m["message"]}" }
|
85
|
-
end
|
24
|
+
desc "status", "vm status"
|
25
|
+
def status(host_name = nil)
|
26
|
+
say("Current machine stasus:", :yellow)
|
27
|
+
Pec::Director.execute("vm_status", host_name)
|
86
28
|
end
|
87
29
|
end
|
88
30
|
end
|
data/lib/pec/compute/flavor.rb
CHANGED
data/lib/pec/compute/image.rb
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
module Pec
|
2
2
|
class Compute
|
3
3
|
class Security_Group
|
4
|
-
|
5
|
-
def add_security_group(server_id, security_groups)
|
6
|
-
security_groups.each do |sg_name|
|
7
|
-
response = Fog::Compute[:openstack].add_security_group(server_id, sg_name)
|
8
|
-
end if security_groups
|
9
|
-
end
|
4
|
+
extend Query
|
10
5
|
end
|
11
6
|
end
|
12
7
|
end
|
data/lib/pec/compute/server.rb
CHANGED
@@ -1,37 +1,31 @@
|
|
1
|
-
require 'json'
|
2
1
|
module Pec
|
3
2
|
class Compute
|
4
3
|
class Server
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
raise(Pec::Errors::Port, "port-id:#{port.id} ip-addr:#{port.ip_address} in used") if port.used?
|
9
|
-
puts "#{name}: assingn ip #{port.ip_address}"
|
10
|
-
{ port_id: port.id }
|
11
|
-
end if ports
|
4
|
+
extend Query
|
5
|
+
class << self
|
6
|
+
def create(name, image_ref, flavor_ref, options)
|
12
7
|
|
13
|
-
|
8
|
+
response = Pec::Resource.get.create_server(name, image_ref, flavor_ref, options)
|
14
9
|
|
15
|
-
|
10
|
+
if response[:status] == 202
|
11
|
+
puts "success create for server_name:#{name}".blue
|
12
|
+
end
|
16
13
|
|
17
|
-
|
18
|
-
puts "success create for server_name:#{name}"
|
14
|
+
response.data[:body]["server"]["id"]
|
19
15
|
end
|
20
16
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
def exists?(server_name)
|
25
|
-
fetch(server_name)
|
26
|
-
end
|
17
|
+
def exists?(server_name)
|
18
|
+
fetch(server_name)
|
19
|
+
end
|
27
20
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
def destroy!(server_name)
|
22
|
+
server = fetch(server_name)
|
23
|
+
raise(Pec::Errors::Host, "server_name:#{server_name} is not fond!") unless server
|
24
|
+
response = Pec::Resource.get.delete_server(server["id"]) if server
|
32
25
|
|
33
|
-
|
34
|
-
|
26
|
+
if response && response[:status] == 204
|
27
|
+
puts "server_name:#{server_name} is deleted!".green
|
28
|
+
end
|
35
29
|
end
|
36
30
|
end
|
37
31
|
end
|
data/lib/pec/configure/host.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Pec
|
2
2
|
class Configure
|
3
3
|
class Host
|
4
|
-
attr_reader :name, :image, :flavor,:security_group, :user_data, :networks, :templates
|
4
|
+
attr_reader :name, :image, :flavor,:security_group, :user_data, :networks, :templates, :tenant
|
5
5
|
def initialize(config)
|
6
6
|
@name = config[0];
|
7
7
|
@image = config[1]["image"];
|
@@ -9,6 +9,7 @@ module Pec
|
|
9
9
|
@security_group = config[1]["security_group"];
|
10
10
|
@user_data = config[1]["user_data"];
|
11
11
|
@templates = config[1]["templates"]
|
12
|
+
@tenant = config[1]["tenant"]
|
12
13
|
end
|
13
14
|
|
14
15
|
def append_network(network)
|
@@ -27,7 +28,7 @@ module Pec
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def check_require_key(config)
|
30
|
-
err = %w(image flavor).find {|r| !config[1].key?(r) || config[1][r].nil? }
|
31
|
+
err = %w(image flavor tenant).find {|r| !config[1].key?(r) || config[1][r].nil? }
|
31
32
|
raise(Pec::Errors::Host,"skip! #{config[0]}: #{err} is required!") unless err.nil?
|
32
33
|
true
|
33
34
|
end
|
data/lib/pec/configure/sample.rb
CHANGED
@@ -21,7 +21,6 @@ module Pec
|
|
21
21
|
def make_port_content(config, ports)
|
22
22
|
config.networks.map do |ether|
|
23
23
|
ifcfg_content = {}
|
24
|
-
|
25
24
|
ifcfg_content["bootproto"] = ether.bootproto
|
26
25
|
ifcfg_content["name"] = ether.options["name"] || ether.name
|
27
26
|
ifcfg_content["device"] = ether.options["device"] || ether.name
|
data/lib/pec/director.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
module Pec
|
2
|
+
class Director
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def execute(action, host_name, options=nil)
|
6
|
+
config = Pec::Configure.new("Pec.yaml")
|
7
|
+
director = assign_director(action, options)
|
8
|
+
|
9
|
+
config.filter_by_host(host_name).each do |host|
|
10
|
+
begin
|
11
|
+
director.execute!(host) if director.do_it?(host)
|
12
|
+
rescue Pec::Errors::Error => e
|
13
|
+
director.err_message(e, host)
|
14
|
+
rescue Excon::Errors::Error => e
|
15
|
+
excon_err_message(e)
|
16
|
+
end
|
17
|
+
end if config
|
18
|
+
|
19
|
+
rescue Pec::Errors::Configure => e
|
20
|
+
config_load_err_message
|
21
|
+
rescue Pec::Errors::Error => e
|
22
|
+
err_message(e)
|
23
|
+
rescue Errno::ENOENT => e
|
24
|
+
err_messag(e)
|
25
|
+
end
|
26
|
+
|
27
|
+
def assign_director(action, options)
|
28
|
+
case
|
29
|
+
when action == "make"
|
30
|
+
Pec::Director::MakeDirector.new
|
31
|
+
when action == "destroy"
|
32
|
+
Pec::Director::DestroyDirector.new(options)
|
33
|
+
when action == "vm_status"
|
34
|
+
Pec::Director::VmStatusDirector.new
|
35
|
+
else
|
36
|
+
raise
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def err_message(e)
|
41
|
+
puts e.to_s.magenta
|
42
|
+
end
|
43
|
+
|
44
|
+
def config_load_err_message
|
45
|
+
puts "can't load configfile".magenta
|
46
|
+
end
|
47
|
+
|
48
|
+
def excon_err_message(e)
|
49
|
+
JSON.parse(e.response[:body]).each { |e,m| puts "#{e}:#{m["message"]}".magenta }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Pec
|
2
|
+
class Director
|
3
|
+
class DestroyDirector
|
4
|
+
def initialize(command_options)
|
5
|
+
@command_options = command_options
|
6
|
+
end
|
7
|
+
|
8
|
+
def execute!(host)
|
9
|
+
Pec::Resource.set_tenant(host.tenant)
|
10
|
+
Pec::Compute::Server.destroy!(host.name)
|
11
|
+
end
|
12
|
+
|
13
|
+
def do_it?(host)
|
14
|
+
@command_options[:force] || Thor.new.yes?("#{host.name}: Are you sure you want to destroy the '#{host.name}' VM? [y/N]")
|
15
|
+
end
|
16
|
+
|
17
|
+
def err_message(e, host)
|
18
|
+
puts e.to_s.magenta
|
19
|
+
puts "can't destroy server:#{host.name}".magenta if host
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Pec
|
2
|
+
class Director
|
3
|
+
class Helper
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def ports_assign(host)
|
7
|
+
host.networks.map do |ether|
|
8
|
+
begin
|
9
|
+
ip = IP.new(ether.ip_address)
|
10
|
+
rescue ArgumentError => e
|
11
|
+
raise(Pec::Errors::Port, "ip:#{ether.ip_address} #{e}")
|
12
|
+
end
|
13
|
+
|
14
|
+
port_subnet = Pec::Network::Subnet.fetch(ip.network.to_s)
|
15
|
+
raise(Pec::Errors::Subnet, "subnet:#{ip.network.to_s} is not fond!") unless port_subnet
|
16
|
+
|
17
|
+
port = Pec::Network::Port.new.assign(ether.name, ip, port_subnet, get_security_group_id(host.security_group))
|
18
|
+
raise(Pec::Errors::Port, "ip addess:#{ip.to_addr} can't create port!") unless port
|
19
|
+
|
20
|
+
puts "#{host.name}: assingn ip #{port.ip_address}".green
|
21
|
+
port
|
22
|
+
end if host.networks
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_nics(ports)
|
26
|
+
{ 'nics' => ports.map { |port| { port_id: port.id } }}
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_security_group_id(security_groups)
|
30
|
+
security_groups.map do |sg_name|
|
31
|
+
sg = Pec::Compute::Security_Group.fetch(sg_name)
|
32
|
+
raise(Pec::Errors::SecurityGroup, "security_group:#{sg_name} is not found!") unless sg
|
33
|
+
sg["id"]
|
34
|
+
end if security_groups
|
35
|
+
end
|
36
|
+
|
37
|
+
def parse_from_addresses(addresses)
|
38
|
+
addresses.map do |net, ethers|
|
39
|
+
ethers.map do |ether|
|
40
|
+
ether["addr"]
|
41
|
+
end
|
42
|
+
end.flatten
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Pec
|
2
|
+
class Director
|
3
|
+
class MakeDirector
|
4
|
+
def execute!(host)
|
5
|
+
Pec::Resource.set_tenant(host.tenant)
|
6
|
+
make(host)
|
7
|
+
end
|
8
|
+
|
9
|
+
def do_it?(host)
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def make(host)
|
14
|
+
if Pec::Compute::Server.exists?(host.name)
|
15
|
+
puts "skip create server! name:#{host.name} is exists!".yellow
|
16
|
+
return true
|
17
|
+
end
|
18
|
+
|
19
|
+
ports = Pec::Director::Helper.ports_assign(host)
|
20
|
+
flavor_ref = Pec::Compute::Flavor.get_ref(host.flavor)
|
21
|
+
image_ref = Pec::Compute::Image.get_ref(host.image)
|
22
|
+
options = { "user_data" => Pec::Configure::UserData.make(host, ports) }
|
23
|
+
|
24
|
+
options.merge!(Pec::Director::Helper.get_nics(ports))
|
25
|
+
|
26
|
+
Pec::Compute::Server.create(host.name, image_ref, flavor_ref, options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def err_message(e, host)
|
30
|
+
puts e.to_s.magenta
|
31
|
+
puts "can't create server:#{host.name}".magenta if host
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Pec
|
2
|
+
class Director
|
3
|
+
class VmStatusDirector
|
4
|
+
def execute!(host)
|
5
|
+
Pec::Resource.set_tenant(host.tenant)
|
6
|
+
show_summary(host)
|
7
|
+
end
|
8
|
+
|
9
|
+
def do_it?(host)
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def show_summary(host)
|
14
|
+
server = Pec::Compute::Server.fetch(host.name)
|
15
|
+
status = "uncreated"
|
16
|
+
compute_node = ""
|
17
|
+
tenant_name = ""
|
18
|
+
flavor = ""
|
19
|
+
ip_address = ""
|
20
|
+
if server
|
21
|
+
detail = Pec::Resource.get.get_server_details(server["id"])
|
22
|
+
status = detail["status"]
|
23
|
+
compute_node = detail["OS-EXT-SRV-ATTR:host"]
|
24
|
+
flavor = detail["flavor"]["id"]
|
25
|
+
tenant_name = Pec::Compute::Tenant.get_name(detail["tenant_id"])
|
26
|
+
ip_address = Pec::Director::Helper.parse_from_addresses(detail["addresses"]).join(",")
|
27
|
+
end
|
28
|
+
|
29
|
+
puts sprintf(" %-30s |%-10s | %-10s | %-10s | %-30s | %-48s", host.name, status, tenant_name, flavor, compute_node, ip_address)
|
30
|
+
end
|
31
|
+
|
32
|
+
def err_message(e, host)
|
33
|
+
puts e.magenta
|
34
|
+
puts "can't create server:#{host.name}".magenta if host
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/pec/errors.rb
CHANGED
data/lib/pec/init.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
module Pec
|
2
|
+
class Init
|
3
|
+
class << self
|
4
|
+
def create_template_dir
|
5
|
+
dirname = "user_datas"
|
6
|
+
unless FileTest.exist?(dirname)
|
7
|
+
FileUtils.mkdir_p(dirname)
|
8
|
+
open("#{dirname}/web_server.yaml.sample","w") do |e|
|
9
|
+
YAML.dump(Pec::Configure::Sample.user_data, e)
|
10
|
+
end if FileTest.exist?(dirname)
|
11
|
+
puts "create directry user_datas".green
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_sample_config
|
16
|
+
unless File.exist?("Pec.yaml")
|
17
|
+
open("Pec.yaml","w") do |e|
|
18
|
+
YAML.dump(Pec::Configure::Sample.pec_file, e)
|
19
|
+
end
|
20
|
+
puts "create configure file Pec.yaml".green
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def create_fog_config
|
25
|
+
thor = Thor.new
|
26
|
+
if !File.exist?(File.expand_path("~/.fog")) || thor.yes?("Do you want to overwrite the existing ~/.fog? [y/N]")
|
27
|
+
thor.say("Start Configure by OpenStack", :yellow)
|
28
|
+
params = {}
|
29
|
+
|
30
|
+
params = %w(auth_uri username api_key tenant).inject({}) do |user_input, c|
|
31
|
+
user_input["openstack_#{c}"] = thor.ask("openstack #{c}:")
|
32
|
+
user_input
|
33
|
+
end
|
34
|
+
|
35
|
+
thor.say("Configure Complete!", :blue) if open(File.expand_path("~/.fog"), "w") do |e|
|
36
|
+
YAML.dump({ "default" => params }, e)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/pec/network/port.rb
CHANGED
@@ -2,38 +2,59 @@ require 'json'
|
|
2
2
|
module Pec
|
3
3
|
class Network
|
4
4
|
class Port
|
5
|
-
|
5
|
+
extend Query
|
6
6
|
attr_reader :name, :subnet
|
7
|
-
|
8
|
-
|
7
|
+
@@use_ip_list = []
|
8
|
+
|
9
|
+
def assign(name, ip, subnet, security_group_ids)
|
9
10
|
@name = name
|
10
11
|
@subnet = subnet
|
11
|
-
@security_groups = security_groups
|
12
|
-
@config = fetch(ip_addr)
|
13
|
-
end
|
14
12
|
|
15
|
-
def assign!(ip)
|
16
13
|
# dhcp ip recycle
|
17
14
|
if request_any_address?(ip)
|
18
|
-
@
|
19
|
-
ip = IP.new("#{@
|
15
|
+
@port = fetch_free_port
|
16
|
+
ip = IP.new("#{@port["fixed_ips"][0]["ip_address"]}/#{ip.pfxlen}") unless @port.nil?
|
20
17
|
end
|
21
|
-
|
22
18
|
case
|
23
19
|
when exists? && !used?
|
24
|
-
|
20
|
+
recreate(ip, subnet, security_group_ids)
|
25
21
|
when !exists?
|
26
|
-
create(ip)
|
22
|
+
create(ip, subnet, security_group_ids)
|
27
23
|
when used?
|
28
24
|
raise(Pec::Errors::Port, "ip:#{ip.to_addr} is used!")
|
29
25
|
end
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def create(ip, subnet, security_group_ids)
|
30
|
+
options = { security_groups: security_group_ids }
|
31
|
+
options.merge!({ fixed_ips: [{ subnet_id: subnet["id"], ip_address: ip.to_addr}]}) if ip.to_s != subnet["cidr"]
|
32
|
+
response = Pec::Resource.get.create_port(subnet["network_id"], options)
|
33
|
+
if response
|
34
|
+
@port = response.data[:body]["port"]
|
35
|
+
@@use_ip_list << response.data[:body]["port"]["fixed_ips"][0]["ip_address"]
|
36
|
+
response.data[:body]["port"]["id"]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete(ip)
|
41
|
+
target_port = fetch_by_ip(ip.to_addr)
|
42
|
+
response = Pec::Resource.get.delete_port(target_port["id"]) if target_port
|
43
|
+
end
|
44
|
+
|
45
|
+
def recreate(ip, subnet, security_group_ids)
|
46
|
+
create(ip, subnet, security_group_ids) if delete(ip)
|
30
47
|
end
|
31
48
|
|
32
49
|
def request_any_address?(ip)
|
33
50
|
ip.to_s == subnet["cidr"]
|
34
51
|
end
|
35
52
|
|
36
|
-
def
|
53
|
+
def list
|
54
|
+
Pec::Resource.get.port_list
|
55
|
+
end
|
56
|
+
|
57
|
+
def fetch_by_ip(ip_addr)
|
37
58
|
list.find {|p| p["fixed_ips"][0]["ip_address"] == ip_addr }
|
38
59
|
end
|
39
60
|
|
@@ -47,52 +68,31 @@ module Pec
|
|
47
68
|
end
|
48
69
|
|
49
70
|
def exists?
|
50
|
-
!@
|
71
|
+
!@port.nil?
|
51
72
|
end
|
52
73
|
|
53
74
|
def used?
|
54
|
-
@
|
75
|
+
@port && !@port["device_owner"].empty?
|
55
76
|
end
|
56
77
|
|
57
78
|
def id
|
58
|
-
@
|
79
|
+
@port["id"]
|
59
80
|
end
|
60
81
|
|
61
82
|
def mac_address
|
62
|
-
@
|
83
|
+
@port["mac_address"]
|
63
84
|
end
|
64
85
|
|
65
86
|
def ip_address
|
66
|
-
@
|
87
|
+
@port["fixed_ips"][0]["ip_address"]
|
67
88
|
end
|
68
89
|
|
69
90
|
def network_id
|
70
|
-
@
|
91
|
+
@port["network_id"]
|
71
92
|
end
|
72
93
|
|
73
94
|
def netmask
|
74
|
-
IP.new(@
|
75
|
-
end
|
76
|
-
|
77
|
-
def create(ip)
|
78
|
-
options = { security_groups: @security_groups }
|
79
|
-
options.merge!({ fixed_ips: [{ subnet_id: @subnet["id"], ip_address: ip.to_addr}]}) if ip.to_s != subnet["cidr"]
|
80
|
-
response = Fog::Network[:openstack].create_port(@subnet["network_id"], options)
|
81
|
-
|
82
|
-
if response
|
83
|
-
@config = response.data[:body]["port"]
|
84
|
-
@@use_ip_list << response.data[:body]["port"]["fixed_ips"][0]["ip_address"]
|
85
|
-
response.data[:body]["port"]["id"]
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def delete(ip)
|
90
|
-
port = fetch(ip.to_addr)
|
91
|
-
response = Fog::Network[:openstack].delete_port(port["id"]) if port
|
92
|
-
end
|
93
|
-
|
94
|
-
def replace(ip)
|
95
|
-
create(ip) if delete(ip)
|
95
|
+
IP.new(@port["fixed_ips"][0]["ip_address"]).netmask.to_s
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
data/lib/pec/network/subnet.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
module Pec
|
2
2
|
class Network
|
3
3
|
class Subnet
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
extend Query
|
5
|
+
class << self
|
6
|
+
def fetch(cidr)
|
7
|
+
subnet = list.find {|p| p["cidr"] == cidr }
|
8
|
+
raise(Pec::Errors::Subnet, "cidr:#{cidr} is not fond!") unless subnet
|
9
|
+
subnet
|
10
|
+
end
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|
data/lib/pec/query.rb
CHANGED
@@ -1,22 +1,9 @@
|
|
1
1
|
require 'active_support/core_ext/string/inflections'
|
2
|
-
require 'fog'
|
3
2
|
module Pec
|
4
3
|
module Query
|
5
|
-
def get_adapter
|
6
|
-
case
|
7
|
-
when self.class.name.include?('Network')
|
8
|
-
Fog::Network[:openstack]
|
9
|
-
when self.class.name.include?('Compute')
|
10
|
-
Fog::Compute[:openstack]
|
11
|
-
else
|
12
|
-
raise
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
4
|
def list
|
17
|
-
|
18
|
-
|
19
|
-
@_list[name] ||= get_adapter.send("list_#{name}").data[:body][name]
|
5
|
+
class_name = self.name.demodulize.downcase
|
6
|
+
Pec::Resource.get.send("#{class_name}_list")
|
20
7
|
end
|
21
8
|
|
22
9
|
def fetch(name)
|
data/lib/pec/resource.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
module Pec
|
3
|
+
class Resource
|
4
|
+
include Singleton
|
5
|
+
class << self
|
6
|
+
@@_resource = {}
|
7
|
+
@@_tenant = nil
|
8
|
+
def get
|
9
|
+
raise(Pec::Errors::Resource, "Please be tenant is always set") unless @@_tenant
|
10
|
+
unless ENV['PEC_TEST']
|
11
|
+
@@_resource[@@_tenant] ||= Pec::Resource::OpenStack.new(@@_tenant)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def set_tenant(tenant)
|
16
|
+
@@_tenant = tenant
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Pec
|
2
|
+
class Resource
|
3
|
+
class OpenStack
|
4
|
+
def initialize(tenant)
|
5
|
+
tenant_hash = { openstack_tenant: tenant }
|
6
|
+
@network = Fog::Network::OpenStack.new(tenant_hash)
|
7
|
+
@compute = Fog::Compute::OpenStack.new(tenant_hash)
|
8
|
+
end
|
9
|
+
|
10
|
+
def port_list
|
11
|
+
@_ports ||= @network.list_ports[:body]['ports']
|
12
|
+
end
|
13
|
+
|
14
|
+
def subnet_list
|
15
|
+
@_subnets ||= @network.list_subnets[:body]['subnets']
|
16
|
+
end
|
17
|
+
|
18
|
+
def server_list
|
19
|
+
@_servers ||= @compute.list_servers[:body]['servers']
|
20
|
+
end
|
21
|
+
|
22
|
+
def security_group_list
|
23
|
+
@_security_groups ||= @compute.list_security_groups[:body]['security_groups']
|
24
|
+
end
|
25
|
+
|
26
|
+
def image_list
|
27
|
+
@_images ||= @compute.list_images[:body]['images']
|
28
|
+
end
|
29
|
+
|
30
|
+
def flavor_list
|
31
|
+
@_flavors ||= @compute.list_flavors[:body]['flavors']
|
32
|
+
end
|
33
|
+
|
34
|
+
def tenant_list
|
35
|
+
@_tenants ||= @compute.list_tenants[:body]['tenants']
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_server(name, image_ref, flavor_ref, options)
|
39
|
+
@compute.create_server(name, image_ref, flavor_ref, options)
|
40
|
+
end
|
41
|
+
|
42
|
+
def delete_server(server_id)
|
43
|
+
@compute.delete_server(server_id)
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_server_details(server_id)
|
47
|
+
@compute.get_server_details(server_id)[:body]['server']
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_port(network_id, options)
|
51
|
+
@network.create_port(network_id, options)
|
52
|
+
end
|
53
|
+
|
54
|
+
def delete_port(port_id)
|
55
|
+
@network.delete_port(port_id)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/pec/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kazuhiko yamashita
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: openstac vm booter.
|
14
14
|
email:
|
@@ -36,17 +36,25 @@ files:
|
|
36
36
|
- lib/pec/compute/image.rb
|
37
37
|
- lib/pec/compute/security_group.rb
|
38
38
|
- lib/pec/compute/server.rb
|
39
|
+
- lib/pec/compute/tenant.rb
|
39
40
|
- lib/pec/configure.rb
|
40
41
|
- lib/pec/configure/ethernet.rb
|
41
42
|
- lib/pec/configure/host.rb
|
42
43
|
- lib/pec/configure/sample.rb
|
43
44
|
- lib/pec/configure/user_data.rb
|
45
|
+
- lib/pec/director.rb
|
46
|
+
- lib/pec/director/destroy_director.rb
|
47
|
+
- lib/pec/director/helper.rb
|
48
|
+
- lib/pec/director/make_director.rb
|
49
|
+
- lib/pec/director/vm_status_director.rb
|
44
50
|
- lib/pec/errors.rb
|
51
|
+
- lib/pec/init.rb
|
45
52
|
- lib/pec/network/port.rb
|
46
53
|
- lib/pec/network/subnet.rb
|
47
54
|
- lib/pec/query.rb
|
55
|
+
- lib/pec/resource.rb
|
56
|
+
- lib/pec/resource/openstack.rb
|
48
57
|
- lib/pec/version.rb
|
49
|
-
- lib/pec/vm_director.rb
|
50
58
|
- pec.gemspec
|
51
59
|
homepage: http://ten-snapon.com
|
52
60
|
licenses:
|
data/lib/pec/vm_director.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
module Pec
|
2
|
-
class VmDirector
|
3
|
-
def initialize
|
4
|
-
@subnet = Pec::Network::Subnet.new
|
5
|
-
@flavor = Pec::Compute::Flavor.new
|
6
|
-
@image = Pec::Compute::Image.new
|
7
|
-
@security_group = Pec::Compute::Security_Group.new
|
8
|
-
@compute = Pec::Compute::Server.new
|
9
|
-
end
|
10
|
-
|
11
|
-
def make(config)
|
12
|
-
if @compute.exists?(config.name)
|
13
|
-
puts "skip create server! name:#{config.name} is exists!"
|
14
|
-
return true
|
15
|
-
end
|
16
|
-
|
17
|
-
ports = get_ports(config)
|
18
|
-
flavor_ref = @flavor.get_ref(config.flavor)
|
19
|
-
image_ref = @image.get_ref(config.image)
|
20
|
-
options = { "user_data" => Pec::Configure::UserData.make(config, ports) }
|
21
|
-
|
22
|
-
@compute.create(config.name, image_ref, flavor_ref, ports, options)
|
23
|
-
end
|
24
|
-
|
25
|
-
def destroy!(server_name)
|
26
|
-
@compute.destroy!(host.name)
|
27
|
-
end
|
28
|
-
|
29
|
-
def get_ports(config)
|
30
|
-
config.networks.map do |ether|
|
31
|
-
begin
|
32
|
-
ip = IP.new(ether.ip_address)
|
33
|
-
rescue ArgumentError => e
|
34
|
-
raise(Pec::Errors::Port, "ip:#{ether.ip_address} #{e}")
|
35
|
-
end
|
36
|
-
|
37
|
-
subnet = @subnet.fetch(ip.network.to_s)
|
38
|
-
raise(Pec::Errors::Subnet, "subnet:#{ip.network.to_s} is not fond!") unless subnet
|
39
|
-
|
40
|
-
port = Pec::Network::Port.new(ether.name, ip.to_addr, subnet, get_security_group_id(config.security_group))
|
41
|
-
raise(Pec::Errors::Port, "ip addess:#{ip.to_addr} can't create port!") unless port.assign!(ip)
|
42
|
-
port
|
43
|
-
end if config.networks
|
44
|
-
end
|
45
|
-
|
46
|
-
def get_security_group_id(security_groups)
|
47
|
-
security_groups.map do |name|
|
48
|
-
sg = @security_group.fetch(name)
|
49
|
-
raise(Pec::Errors::SecurityGroup, "security_group:#{name} is not found!") unless sg
|
50
|
-
sg["id"]
|
51
|
-
end if security_groups
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|