pec 0.4.4 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +4 -1
- data/lib/pec.rb +35 -32
- data/lib/pec/builder/port.rb +120 -0
- data/lib/pec/builder/server.rb +28 -0
- data/lib/pec/builder/user_data.rb +39 -0
- data/lib/pec/cli.rb +3 -3
- data/lib/pec/configure.rb +17 -26
- data/lib/pec/director.rb +103 -44
- data/lib/pec/init.rb +1 -1
- data/lib/pec/logger.rb +21 -0
- data/lib/pec/version.rb +1 -1
- data/pec.gemspec +1 -1
- metadata +8 -24
- data/lib/pec/compute/flavor.rb +0 -7
- data/lib/pec/compute/image.rb +0 -7
- data/lib/pec/compute/server.rb +0 -30
- data/lib/pec/compute/tenant.rb +0 -16
- data/lib/pec/configure/ethernet.rb +0 -81
- data/lib/pec/configure/host.rb +0 -40
- data/lib/pec/configure/sample.rb +0 -55
- data/lib/pec/configure/user_data.rb +0 -36
- data/lib/pec/director/destroy_director.rb +0 -23
- data/lib/pec/director/helper.rb +0 -51
- data/lib/pec/director/make_director.rb +0 -35
- data/lib/pec/director/vm_status_director.rb +0 -41
- data/lib/pec/network/port.rb +0 -104
- data/lib/pec/network/port_state.rb +0 -40
- data/lib/pec/network/security_group.rb +0 -7
- data/lib/pec/network/subnet.rb +0 -14
- data/lib/pec/query.rb +0 -24
- data/lib/pec/resource.rb +0 -26
- data/lib/pec/resource/mock.rb +0 -172
- data/lib/pec/resource/openstack.rb +0 -60
data/lib/pec/init.rb
CHANGED
@@ -27,7 +27,7 @@ module Pec
|
|
27
27
|
thor.say("Start Configure by OpenStack", :yellow)
|
28
28
|
params = {}
|
29
29
|
|
30
|
-
params = %w(auth_url username api_key tenant
|
30
|
+
params = %w(auth_url username api_key tenant).inject({}) do |user_input, c|
|
31
31
|
user_input["openstack_#{c}"] = thor.ask("openstack #{c}:")
|
32
32
|
user_input
|
33
33
|
end
|
data/lib/pec/logger.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Pec
|
2
|
+
class Logger
|
3
|
+
class << self
|
4
|
+
def notice(m)
|
5
|
+
puts m.white
|
6
|
+
end
|
7
|
+
|
8
|
+
def info(m)
|
9
|
+
puts m.green
|
10
|
+
end
|
11
|
+
|
12
|
+
def warning(m)
|
13
|
+
puts m.to_s.yellow
|
14
|
+
end
|
15
|
+
|
16
|
+
def critical(m)
|
17
|
+
puts m.to_s.magenta
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/pec/version.rb
CHANGED
data/pec.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["pyama@pepabo.com"]
|
11
11
|
|
12
12
|
spec.summary = %q{openstack vm booter.}
|
13
|
-
spec.description = %q{
|
13
|
+
spec.description = %q{openstack vm booter.}
|
14
14
|
spec.homepage = "http://ten-snapon.com"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
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.
|
4
|
+
version: 0.5.0
|
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-
|
11
|
+
date: 2015-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -122,7 +122,7 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
-
description:
|
125
|
+
description: openstack vm booter.
|
126
126
|
email:
|
127
127
|
- pyama@pepabo.com
|
128
128
|
executables:
|
@@ -143,31 +143,15 @@ files:
|
|
143
143
|
- bin/setup
|
144
144
|
- exe/pec
|
145
145
|
- lib/pec.rb
|
146
|
+
- lib/pec/builder/port.rb
|
147
|
+
- lib/pec/builder/server.rb
|
148
|
+
- lib/pec/builder/user_data.rb
|
146
149
|
- lib/pec/cli.rb
|
147
|
-
- lib/pec/compute/flavor.rb
|
148
|
-
- lib/pec/compute/image.rb
|
149
|
-
- lib/pec/compute/server.rb
|
150
|
-
- lib/pec/compute/tenant.rb
|
151
150
|
- lib/pec/configure.rb
|
152
|
-
- lib/pec/configure/ethernet.rb
|
153
|
-
- lib/pec/configure/host.rb
|
154
|
-
- lib/pec/configure/sample.rb
|
155
|
-
- lib/pec/configure/user_data.rb
|
156
151
|
- lib/pec/director.rb
|
157
|
-
- lib/pec/director/destroy_director.rb
|
158
|
-
- lib/pec/director/helper.rb
|
159
|
-
- lib/pec/director/make_director.rb
|
160
|
-
- lib/pec/director/vm_status_director.rb
|
161
152
|
- lib/pec/errors.rb
|
162
153
|
- lib/pec/init.rb
|
163
|
-
- lib/pec/
|
164
|
-
- lib/pec/network/port_state.rb
|
165
|
-
- lib/pec/network/security_group.rb
|
166
|
-
- lib/pec/network/subnet.rb
|
167
|
-
- lib/pec/query.rb
|
168
|
-
- lib/pec/resource.rb
|
169
|
-
- lib/pec/resource/mock.rb
|
170
|
-
- lib/pec/resource/openstack.rb
|
154
|
+
- lib/pec/logger.rb
|
171
155
|
- lib/pec/version.rb
|
172
156
|
- pec.gemspec
|
173
157
|
homepage: http://ten-snapon.com
|
@@ -190,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
174
|
version: '0'
|
191
175
|
requirements: []
|
192
176
|
rubyforge_project:
|
193
|
-
rubygems_version: 2.
|
177
|
+
rubygems_version: 2.2.2
|
194
178
|
signing_key:
|
195
179
|
specification_version: 4
|
196
180
|
summary: openstack vm booter.
|
data/lib/pec/compute/flavor.rb
DELETED
data/lib/pec/compute/image.rb
DELETED
data/lib/pec/compute/server.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module Pec
|
2
|
-
class Compute
|
3
|
-
class Server
|
4
|
-
extend Query
|
5
|
-
class << self
|
6
|
-
def create(name, image_ref, flavor_ref, options)
|
7
|
-
response = Pec::Resource.get.create_server(name, image_ref, flavor_ref, options)
|
8
|
-
raise(Pec::Errors::Host, "server_name:#{name} response err status:#{response[:status]}") unless response[:status] == 202
|
9
|
-
puts "success create for server_name:#{name.to_s}".blue
|
10
|
-
|
11
|
-
response.data[:body]["server"]["id"]
|
12
|
-
end
|
13
|
-
|
14
|
-
def exists?(server_name)
|
15
|
-
fetch(server_name)
|
16
|
-
end
|
17
|
-
|
18
|
-
def destroy!(server_name)
|
19
|
-
server = fetch(server_name)
|
20
|
-
raise(Pec::Errors::Host, "server_name:#{server_name} is not fond!") unless server
|
21
|
-
response = Pec::Resource.get.delete_server(server["id"]) if server
|
22
|
-
|
23
|
-
raise(Pec::Errors::Host, "server_name:#{name} response err status:#{response[:status]}") unless response[:status] == 204
|
24
|
-
puts "server_name:#{server_name} is deleted!".green
|
25
|
-
true
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
data/lib/pec/compute/tenant.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
module Pec
|
2
|
-
class Configure
|
3
|
-
class Ethernet
|
4
|
-
attr_reader :name, :bootproto, :ip_address, :options
|
5
|
-
def initialize(name, config)
|
6
|
-
check_require_key(name, config)
|
7
|
-
check_network_key(name, config)
|
8
|
-
|
9
|
-
@name = config[0];
|
10
|
-
@bootproto = config[1]["bootproto"];
|
11
|
-
@ip_address = config[1]["ip_address"];
|
12
|
-
@options = config[1].reject do |k,v|
|
13
|
-
{ k => v } if k == "bootproto" || k == "ip_address"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def get_port_content(ports)
|
18
|
-
base = {
|
19
|
-
"bootproto" => @bootproto,
|
20
|
-
"name" => config_name,
|
21
|
-
"device" => device_name,
|
22
|
-
"type" => type,
|
23
|
-
"onboot" => onboot,
|
24
|
-
"hwaddr" => mac_address(ports),
|
25
|
-
}
|
26
|
-
base.merge!({ "netmask" => netmask(ports), "ipaddr" => port_ip_address(ports) }) if static?
|
27
|
-
base.merge!(@options) if @options
|
28
|
-
base.map {|k,v| "#{k.upcase}=#{v}"}.join("\n")
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
def config_name
|
33
|
-
@options["name"] || @name
|
34
|
-
end
|
35
|
-
|
36
|
-
def device_name
|
37
|
-
@options["device"] || @name
|
38
|
-
end
|
39
|
-
|
40
|
-
def type
|
41
|
-
@options["type"] || 'Ethernet'
|
42
|
-
end
|
43
|
-
|
44
|
-
def onboot
|
45
|
-
@options["onboot"] || 'yes'
|
46
|
-
end
|
47
|
-
|
48
|
-
def mac_address(ports)
|
49
|
-
ports.find { |p| p.device_name == @name }.mac_address
|
50
|
-
end
|
51
|
-
|
52
|
-
def netmask(ports)
|
53
|
-
ports.find { |p| p.device_name == @name }.netmask(@ip_address.split("/").last)
|
54
|
-
end
|
55
|
-
|
56
|
-
def port_ip_address(ports)
|
57
|
-
ports.find { |p| p.device_name == @name }.ip_address
|
58
|
-
end
|
59
|
-
|
60
|
-
def static?
|
61
|
-
@bootproto == "static"
|
62
|
-
end
|
63
|
-
|
64
|
-
def check_require_key(name, config)
|
65
|
-
raise(Pec::Errors::Ethernet, "skip! #{name}: bootproto is required!") if config[1]["bootproto"].nil?
|
66
|
-
true
|
67
|
-
end
|
68
|
-
|
69
|
-
def check_network_key(name, config)
|
70
|
-
net = config[1]
|
71
|
-
case
|
72
|
-
when (net["bootproto"] == "static" && net["ip_address"].nil?)
|
73
|
-
raise(Pec::Errors::Ethernet, "skip! #{name}: ip_address is required by bootproto static")
|
74
|
-
when (net["bootproto"] != "static" && net["bootproto"] != "dhcp")
|
75
|
-
raise(Pec::Errors::Ethernet, "skip! #{name}: bootproto set the value dhcp or static")
|
76
|
-
end
|
77
|
-
true
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
data/lib/pec/configure/host.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
module Pec
|
2
|
-
class Configure
|
3
|
-
class Host
|
4
|
-
attr_reader :name, :image, :flavor,:security_group, :user_data, :networks, :templates, :tenant, :availability_zone
|
5
|
-
def initialize(config)
|
6
|
-
check_format(config)
|
7
|
-
append_network(config[1])
|
8
|
-
@name = config[0];
|
9
|
-
@image = config[1]["image"];
|
10
|
-
@flavor = config[1]["flavor"];
|
11
|
-
@security_group = config[1]["security_group"];
|
12
|
-
@user_data = config[1]["user_data"];
|
13
|
-
@templates = config[1]["templates"]
|
14
|
-
@tenant = config[1]["tenant"]
|
15
|
-
@availability_zone = config[1]["availability_zone"]
|
16
|
-
end
|
17
|
-
|
18
|
-
def append_network(config)
|
19
|
-
@networks ||= []
|
20
|
-
config["networks"].each do |net|
|
21
|
-
raise(Pec::Errors::Ethernet, "please! network interface format is Array") unless net.kind_of?(Array)
|
22
|
-
|
23
|
-
if ethernet = Pec::Configure::Ethernet.new(config, net)
|
24
|
-
@networks << ethernet
|
25
|
-
end
|
26
|
-
|
27
|
-
end if config["networks"]
|
28
|
-
end
|
29
|
-
|
30
|
-
def check_format(config)
|
31
|
-
err = %w(image flavor tenant).find {|r| !config[1].key?(r) || config[1][r].nil? }
|
32
|
-
raise(Pec::Errors::Host,"skip! #{config[0]}: #{err} is required!") unless err.nil?
|
33
|
-
|
34
|
-
err = %w(security_group templates).find {|r| config[1].key?(r) && !config[1][r].kind_of?(Array) }
|
35
|
-
raise(Pec::Errors::Host,"#{config[0]}: please! #{err} format is Array!") unless err.nil?
|
36
|
-
true
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
data/lib/pec/configure/sample.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
module Pec
|
2
|
-
class Configure
|
3
|
-
class Sample
|
4
|
-
class << self
|
5
|
-
def pec_file
|
6
|
-
{
|
7
|
-
"your_sever_name" => {
|
8
|
-
"tenant" => "your_tenant",
|
9
|
-
"image" => "centos-7",
|
10
|
-
"flavor" => "m1.small",
|
11
|
-
"networks" => {
|
12
|
-
"eth0" => {
|
13
|
-
"bootproto" => "static",
|
14
|
-
"ip_address" => "10.0.0.0/24",
|
15
|
-
"gateway" => "10.0.0.254",
|
16
|
-
"dns1" => "10.0.0.10"
|
17
|
-
},
|
18
|
-
"eth1" => {
|
19
|
-
"bootproto" => "static",
|
20
|
-
"ip_address" => "20.0.0.11/24",
|
21
|
-
"gateway" => "20.0.0.254",
|
22
|
-
"dns1" => "20.0.0.10"
|
23
|
-
}
|
24
|
-
},
|
25
|
-
"security_group" => [
|
26
|
-
"default",
|
27
|
-
"www from any"
|
28
|
-
],
|
29
|
-
"templates" => [
|
30
|
-
"web_server.yaml"
|
31
|
-
],
|
32
|
-
"user_data" => {
|
33
|
-
"hostname" => "pec",
|
34
|
-
"fqdn" => "pec.pyama.com"
|
35
|
-
}
|
36
|
-
}
|
37
|
-
}
|
38
|
-
end
|
39
|
-
def user_data
|
40
|
-
{
|
41
|
-
"hostname" => "pec",
|
42
|
-
"fqdn" => "pec.pyama.com",
|
43
|
-
"users" => [
|
44
|
-
{
|
45
|
-
"name" => "centos",
|
46
|
-
"groups" => "sudo",
|
47
|
-
"shell" => "/bin/sh"
|
48
|
-
}
|
49
|
-
]
|
50
|
-
}
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'base64'
|
2
|
-
module Pec
|
3
|
-
class Configure
|
4
|
-
class UserData
|
5
|
-
class << self
|
6
|
-
def make(config, ports)
|
7
|
-
user_data = {}
|
8
|
-
user_data["write_files"] = make_port_content(config, ports) if ports
|
9
|
-
user_data.deep_merge!(config.user_data) if config.user_data
|
10
|
-
user_data.deep_merge!(get_template(config)) if get_template(config)
|
11
|
-
Base64.encode64("#cloud-config\n" + user_data.to_yaml)
|
12
|
-
end
|
13
|
-
|
14
|
-
def get_template(config)
|
15
|
-
config.templates.inject({}) do |merge_template, template|
|
16
|
-
template.to_s.concat('.yaml') unless template.to_s.match(/.*\.yaml/)
|
17
|
-
raise(Pec::Errors::UserData, "template:#{template} is not fond!") unless FileTest.exist?("user_data/#{template}")
|
18
|
-
merge_template.deep_merge!(YAML.load_file("user_data/#{template}").to_hash)
|
19
|
-
end if config.templates
|
20
|
-
end
|
21
|
-
|
22
|
-
def make_port_content(config, ports)
|
23
|
-
config.networks.map do |ether|
|
24
|
-
path = ether.options['path'] || "/etc/sysconfig/network-scripts/ifcfg-#{ether.name}"
|
25
|
-
{
|
26
|
-
'content' => ether.get_port_content(ports),
|
27
|
-
'owner' => "root:root",
|
28
|
-
'path' => path,
|
29
|
-
'permissions' => "0644"
|
30
|
-
}
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,23 +0,0 @@
|
|
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
|
data/lib/pec/director/helper.rb
DELETED
@@ -1,51 +0,0 @@
|
|
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
|
-
ip = IP.new(ether.ip_address)
|
9
|
-
|
10
|
-
unless port_subnet = Pec::Network::Subnet.fetch_by_cidr(ip.network.to_s)
|
11
|
-
raise(Pec::Errors::Subnet, "subnet:#{ip.network.to_s} is not fond!")
|
12
|
-
end
|
13
|
-
|
14
|
-
unless port = Pec::Network::Port.assign(ether.name, ip, port_subnet, get_security_group_id(host.security_group))
|
15
|
-
raise(Pec::Errors::Port, "ip addess:#{ip.to_addr} can't create port!")
|
16
|
-
end
|
17
|
-
|
18
|
-
puts "#{host.name}: assingn ip #{port.ip_address}".green
|
19
|
-
port
|
20
|
-
end if host.networks
|
21
|
-
rescue ArgumentError => e
|
22
|
-
raise(Pec::Errors::Port, "ip:#{ether.ip_address} #{e}")
|
23
|
-
end
|
24
|
-
|
25
|
-
def set_nics(options, ports)
|
26
|
-
ports ? options.merge({ 'nics' => ports.map { |port| { port_id: port.id } } }) : options
|
27
|
-
end
|
28
|
-
|
29
|
-
def set_availability_zone(options, host)
|
30
|
-
host.availability_zone ? options.merge({ 'availability_zone' => host.availability_zone }) : options
|
31
|
-
end
|
32
|
-
|
33
|
-
def get_security_group_id(security_groups)
|
34
|
-
security_groups.map do |sg_name|
|
35
|
-
sg = Pec::Network::Security_Group.fetch(sg_name)
|
36
|
-
raise(Pec::Errors::SecurityGroup, "security_group:#{sg_name} is not found!") unless sg
|
37
|
-
sg["id"]
|
38
|
-
end if security_groups
|
39
|
-
end
|
40
|
-
|
41
|
-
def parse_from_addresses(addresses)
|
42
|
-
addresses.map do |net, ethers|
|
43
|
-
ethers.map do |ether|
|
44
|
-
ether["addr"]
|
45
|
-
end
|
46
|
-
end.flatten
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|