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
@@ -1,35 +0,0 @@
|
|
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
|
-
options = Pec::Director::Helper.set_nics(options, ports)
|
24
|
-
options = Pec::Director::Helper.set_availability_zone(options, host)
|
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
|
@@ -1,41 +0,0 @@
|
|
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
|
-
availability_zone = ""
|
17
|
-
compute_node = ""
|
18
|
-
tenant_name = ""
|
19
|
-
flavor = ""
|
20
|
-
ip_address = ""
|
21
|
-
if server
|
22
|
-
detail = Pec::Resource.get.get_server_details(server["id"])
|
23
|
-
status = detail["status"]
|
24
|
-
availability_zone = detail["OS-EXT-AZ:availability_zone"]
|
25
|
-
compute_node = detail["OS-EXT-SRV-ATTR:host"]
|
26
|
-
tenant_name = Pec::Compute::Tenant.get_name(detail["tenant_id"])
|
27
|
-
flavor = Pec::Compute::Flavor.get_name(detail["flavor"]["id"])
|
28
|
-
ip_address = Pec::Director::Helper.parse_from_addresses(detail["addresses"]).join(",")
|
29
|
-
end
|
30
|
-
|
31
|
-
puts sprintf(" %-35s %-10s %-10s %-10s %-10s %-35s %-48s",
|
32
|
-
host.name, status, tenant_name, flavor, availability_zone, compute_node, ip_address)
|
33
|
-
end
|
34
|
-
|
35
|
-
def err_message(e, host)
|
36
|
-
puts e.magenta
|
37
|
-
puts "can't create server:#{host.name}".magenta if host
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/pec/network/port.rb
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
module Pec
|
3
|
-
class Network
|
4
|
-
class Port
|
5
|
-
extend Query
|
6
|
-
class << self
|
7
|
-
@@use_ip_list = []
|
8
|
-
|
9
|
-
def assign(name, ip, subnet, security_group_ids)
|
10
|
-
ip = get_free_port_ip(ip, subnet) if request_any_address?(ip, subnet)
|
11
|
-
port_state = Pec::Network::PortState.new(name, fetch_by_ip(ip.to_addr))
|
12
|
-
|
13
|
-
assign_port = case
|
14
|
-
when port_state.exists? && !port_state.used?
|
15
|
-
recreate(ip, subnet, security_group_ids)
|
16
|
-
when !port_state.exists?
|
17
|
-
create(ip, subnet, security_group_ids)
|
18
|
-
when port_state.used?
|
19
|
-
raise(Pec::Errors::Port, "ip:#{ip.to_addr} is used!")
|
20
|
-
end
|
21
|
-
Pec::Network::PortState.new(name, assign_port)
|
22
|
-
end
|
23
|
-
|
24
|
-
def create(ip, subnet, security_group_ids)
|
25
|
-
options = set_security_group(security_group_ids)
|
26
|
-
options = set_fixed_ip(options, subnet, ip)
|
27
|
-
response = Pec::Resource.get.create_port(subnet["network_id"], options)
|
28
|
-
raise(Pec::Errors::Port, "ip:#{ip.to_addr} is not created!") unless response[:status] == 201
|
29
|
-
append_assigned_ip(response)
|
30
|
-
port_from_response(response)
|
31
|
-
end
|
32
|
-
|
33
|
-
def delete(ip)
|
34
|
-
target_port = fetch_by_ip(ip.to_addr)
|
35
|
-
response = Pec::Resource.get.delete_port(target_port["id"]) if target_port
|
36
|
-
raise(Pec::Errors::Host, "ip:#{ip.to_addr} response err status:#{response[:status]}") unless response[:status] == 204
|
37
|
-
true
|
38
|
-
end
|
39
|
-
|
40
|
-
def recreate(ip, subnet, security_group_ids)
|
41
|
-
create(ip, subnet, security_group_ids) if delete(ip)
|
42
|
-
end
|
43
|
-
|
44
|
-
def set_security_group(security_group_ids)
|
45
|
-
{ security_groups: security_group_ids }
|
46
|
-
end
|
47
|
-
|
48
|
-
def set_fixed_ip(options, subnet, ip)
|
49
|
-
ip.to_s != subnet["cidr"] ? options.merge({ fixed_ips: [{ subnet_id: subnet["id"], ip_address: ip.to_addr}]}) : options
|
50
|
-
end
|
51
|
-
|
52
|
-
def append_assigned_ip(response)
|
53
|
-
@@use_ip_list << ip_from_port(port_from_response(response))
|
54
|
-
end
|
55
|
-
|
56
|
-
def assigned_ip?(port)
|
57
|
-
@@use_ip_list.include?(ip_from_port(port))
|
58
|
-
end
|
59
|
-
|
60
|
-
def get_free_port_ip(ip, subnet)
|
61
|
-
port = get_free_port(subnet)
|
62
|
-
port ? IP.new("#{ip_from_port(port)}/#{ip.pfxlen}") : ip
|
63
|
-
end
|
64
|
-
|
65
|
-
def fetch_by_ip(ip_addr)
|
66
|
-
list.find {|p| ip_from_port(p) == ip_addr }
|
67
|
-
end
|
68
|
-
|
69
|
-
def port_from_response(response)
|
70
|
-
response.data[:body]["port"]
|
71
|
-
end
|
72
|
-
|
73
|
-
def ip_from_port(port)
|
74
|
-
port["fixed_ips"][0]["ip_address"]
|
75
|
-
end
|
76
|
-
|
77
|
-
def get_free_port(subnet)
|
78
|
-
list.find do |p|
|
79
|
-
same_subnet?(p, subnet) &&
|
80
|
-
unused?(p) &&
|
81
|
-
admin_state_up?(p) &&
|
82
|
-
!assigned_ip?(p)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def request_any_address?(ip, subnet)
|
87
|
-
ip.to_s == subnet["cidr"]
|
88
|
-
end
|
89
|
-
|
90
|
-
def same_subnet?(port, subnet)
|
91
|
-
port["fixed_ips"][0]["subnet_id"] == subnet["id"]
|
92
|
-
end
|
93
|
-
|
94
|
-
def unused?(port)
|
95
|
-
port["device_owner"].empty?
|
96
|
-
end
|
97
|
-
|
98
|
-
def admin_state_up?(port)
|
99
|
-
port["admin_state_up"]
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
module Pec
|
3
|
-
class Network
|
4
|
-
class PortState
|
5
|
-
attr_reader :device_name
|
6
|
-
def initialize(device_name, port)
|
7
|
-
@device_name = device_name
|
8
|
-
@port = port
|
9
|
-
end
|
10
|
-
|
11
|
-
def exists?
|
12
|
-
!@port.nil?
|
13
|
-
end
|
14
|
-
|
15
|
-
def used?
|
16
|
-
@port && !@port["device_owner"].empty?
|
17
|
-
end
|
18
|
-
|
19
|
-
def id
|
20
|
-
@port["id"]
|
21
|
-
end
|
22
|
-
|
23
|
-
def mac_address
|
24
|
-
@port["mac_address"]
|
25
|
-
end
|
26
|
-
|
27
|
-
def ip_address
|
28
|
-
@port["fixed_ips"][0]["ip_address"]
|
29
|
-
end
|
30
|
-
|
31
|
-
def network_id
|
32
|
-
@port["network_id"]
|
33
|
-
end
|
34
|
-
|
35
|
-
def netmask(cidr)
|
36
|
-
IP.new("#{@port["fixed_ips"][0]["ip_address"]}/#{cidr}").netmask.to_s
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
data/lib/pec/network/subnet.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
module Pec
|
2
|
-
class Network
|
3
|
-
class Subnet
|
4
|
-
extend Query
|
5
|
-
class << self
|
6
|
-
def fetch_by_cidr(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
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
data/lib/pec/query.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/string/inflections'
|
2
|
-
module Pec
|
3
|
-
module Query
|
4
|
-
def list
|
5
|
-
class_name = self.name.demodulize.downcase
|
6
|
-
Pec::Resource.get.send("#{class_name}_list")
|
7
|
-
end
|
8
|
-
|
9
|
-
def fetch(name)
|
10
|
-
list.find {|s| s["name"] == name}
|
11
|
-
end
|
12
|
-
|
13
|
-
def get_ref(name)
|
14
|
-
class_name = self.class.name.demodulize.downcase
|
15
|
-
response = fetch(name)
|
16
|
-
raise(Pec::Errors::Query, "#{class_name}:#{name} ref is not fond!") unless response
|
17
|
-
response["links"][0]["href"]
|
18
|
-
end
|
19
|
-
|
20
|
-
def get_name(id)
|
21
|
-
list.find {|p| p["id"] == id }["name"]
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/lib/pec/resource.rb
DELETED
@@ -1,26 +0,0 @@
|
|
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
|
-
else
|
13
|
-
@@_resource[@@_tenant] ||= Pec::Resource::Mock.new(@@_tenant)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def set_tenant(tenant)
|
18
|
-
@@_tenant = tenant
|
19
|
-
end
|
20
|
-
|
21
|
-
def get_tenant
|
22
|
-
@@_tenant
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/lib/pec/resource/mock.rb
DELETED
@@ -1,172 +0,0 @@
|
|
1
|
-
module Pec
|
2
|
-
class Resource
|
3
|
-
class Mock
|
4
|
-
def initialize(tenant)
|
5
|
-
tenant_hash = { "openstack_tenant" => tenant }
|
6
|
-
end
|
7
|
-
|
8
|
-
def port_list
|
9
|
-
1.upto(10).map do |c|
|
10
|
-
{
|
11
|
-
"id" => c,
|
12
|
-
"fixed_ips" => [
|
13
|
-
{ "subnet_id" => c,
|
14
|
-
"ip_address" => "#{c}." * 3 + "#{c}"
|
15
|
-
}
|
16
|
-
],
|
17
|
-
"network_id" => c,
|
18
|
-
"device_owner" => c % 2 == 0 ? c.to_s : "",
|
19
|
-
"admin_state_up" => c % 2 == 0 ? "True" : "False"
|
20
|
-
}
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def subnet_list
|
25
|
-
1.upto(10).map do |c|
|
26
|
-
{
|
27
|
-
"id" => c,
|
28
|
-
"cidr" => "#{c}." * 3 + "0/24",
|
29
|
-
"network_id" => c
|
30
|
-
}
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def server_list
|
35
|
-
10.upto(20).map do |c|
|
36
|
-
{
|
37
|
-
"id" => c,
|
38
|
-
"name" => c,
|
39
|
-
"status" => c %2 == 0 ? "Active" : "SHUTOFF"
|
40
|
-
}
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def security_group_list
|
45
|
-
1.upto(10).map do |c|
|
46
|
-
{
|
47
|
-
"id" => c,
|
48
|
-
"name" => c
|
49
|
-
}
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def image_list
|
54
|
-
ref_list
|
55
|
-
end
|
56
|
-
|
57
|
-
def flavor_list
|
58
|
-
ref_list
|
59
|
-
end
|
60
|
-
|
61
|
-
def ref_list
|
62
|
-
1.upto(10).map do |c|
|
63
|
-
{
|
64
|
-
"id" => c,
|
65
|
-
"name" => c,
|
66
|
-
"links" => [
|
67
|
-
"href" => c
|
68
|
-
]
|
69
|
-
}
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
def tenant_list
|
75
|
-
1.upto(10).map do |c|
|
76
|
-
{
|
77
|
-
"id" => c,
|
78
|
-
"name" => c
|
79
|
-
}
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def create_server(name, image_ref, flavor_ref, options)
|
84
|
-
object = Object.new
|
85
|
-
object.set_value(name, 202)
|
86
|
-
object
|
87
|
-
end
|
88
|
-
|
89
|
-
def delete_server(server_id)
|
90
|
-
object = Object.new
|
91
|
-
object.set_value(server_id, 204)
|
92
|
-
object
|
93
|
-
end
|
94
|
-
|
95
|
-
def get_server_details(server_id)
|
96
|
-
if server_id.to_i % 2 == 0
|
97
|
-
{
|
98
|
-
"status" => "active",
|
99
|
-
"OS-EXT-SRV-ATTR:host" => "#{server_id}.compute.node",
|
100
|
-
"flavor" => {
|
101
|
-
"id" => server_id
|
102
|
-
},
|
103
|
-
"tenant_id" => server_id,
|
104
|
-
"addresses" => {
|
105
|
-
"test_net" => [
|
106
|
-
"addr" => server_id
|
107
|
-
]
|
108
|
-
}
|
109
|
-
}
|
110
|
-
else
|
111
|
-
{
|
112
|
-
"status" => "uncreated",
|
113
|
-
"OS-EXT-SRV-ATTR:host" => "#{server_id}.compute.node",
|
114
|
-
"flavor" => {
|
115
|
-
"id" => server_id
|
116
|
-
},
|
117
|
-
"tenant_id" => server_id,
|
118
|
-
"addresses" => {
|
119
|
-
"test_net" => {
|
120
|
-
"addr" => server_id
|
121
|
-
}
|
122
|
-
}
|
123
|
-
}
|
124
|
-
end
|
125
|
-
end
|
126
|
-
def create_port(network_id, options)
|
127
|
-
object = Object.new
|
128
|
-
object.set_value(network_id, 201)
|
129
|
-
object
|
130
|
-
end
|
131
|
-
|
132
|
-
def delete_port(port_id)
|
133
|
-
object = Object.new
|
134
|
-
object.set_value(port_id, 204)
|
135
|
-
object
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
class Object
|
141
|
-
attr_reader :status
|
142
|
-
def set_value(value, status)
|
143
|
-
@value = value
|
144
|
-
@status = @value.to_i % 2 == 0 ? 999 : status
|
145
|
-
end
|
146
|
-
|
147
|
-
def [](key)
|
148
|
-
@status
|
149
|
-
end
|
150
|
-
|
151
|
-
def data
|
152
|
-
{
|
153
|
-
:body => {
|
154
|
-
"port" => {
|
155
|
-
"id" => @value,
|
156
|
-
"fixed_ips" => [
|
157
|
-
{
|
158
|
-
"subnet_id" => @value,
|
159
|
-
"ip_address" => "#{@value}." * 3 + "#{@value}"
|
160
|
-
}
|
161
|
-
],
|
162
|
-
"network_id" => @value,
|
163
|
-
"device_owner" => @value.to_i % 2 == 0 ? @value : "",
|
164
|
-
"admin_state_up" => @value.to_i % 2 == 0 ? "True" : "False"
|
165
|
-
},
|
166
|
-
"server" => {
|
167
|
-
"id" => @value
|
168
|
-
}
|
169
|
-
}
|
170
|
-
}
|
171
|
-
end
|
172
|
-
end
|