openstack-quantum-client 0.1.3
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.
- data/Gemfile +4 -0
- data/README.markdown +2 -0
- data/Rakefile +2 -0
- data/lib/openstack-quantum-client.rb +14 -0
- data/lib/openstack-quantum-client/l2l3.rb +70 -0
- data/lib/openstack-quantum-client/l2l3/attachment_detail.rb +24 -0
- data/lib/openstack-quantum-client/l2l3/dhcp.rb +22 -0
- data/lib/openstack-quantum-client/l2l3/dhcp_entry.rb +17 -0
- data/lib/openstack-quantum-client/l2l3/filter_rule.rb +31 -0
- data/lib/openstack-quantum-client/l2l3/filtered_range.rb +17 -0
- data/lib/openstack-quantum-client/l2l3/firewall.rb +22 -0
- data/lib/openstack-quantum-client/l2l3/network.rb +31 -0
- data/lib/openstack-quantum-client/l2l3/port.rb +35 -0
- data/lib/openstack-quantum-client/version.rb +5 -0
- data/openstack-quantum-client-0.1.2.gem +0 -0
- data/openstack-quantum-client.gemspec +19 -0
- data/spec/openstack-quantum-messager/l2l3/attachment_detail_spec.rb +40 -0
- data/spec/openstack-quantum-messager/l2l3/dhcp_entry_spec.rb +26 -0
- data/spec/openstack-quantum-messager/l2l3/dhcp_spec.rb +32 -0
- data/spec/openstack-quantum-messager/l2l3/filter_rule_spec.rb +61 -0
- data/spec/openstack-quantum-messager/l2l3/filtered_range_spec.rb +22 -0
- data/spec/openstack-quantum-messager/l2l3/firewall_spec.rb +32 -0
- data/spec/openstack-quantum-messager/l2l3/network_spec.rb +47 -0
- data/spec/openstack-quantum-messager/l2l3/port_spec.rb +46 -0
- data/spec/openstack-quantum-messager/l2l3_spec.rb +21 -0
- data/spec/openstack_quantum_messager_spec.rb +4 -0
- data/spec/spec_helper.rb +2 -0
- metadata +107 -0
data/Gemfile
ADDED
data/README.markdown
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require "httparty"
|
3
|
+
require "json"
|
4
|
+
require "openstack-quantum-client/version"
|
5
|
+
require "openstack-quantum-client/l2l3"
|
6
|
+
require "openstack-quantum-client/l2l3/attachment_detail"
|
7
|
+
require "openstack-quantum-client/l2l3/dhcp"
|
8
|
+
require "openstack-quantum-client/l2l3/dhcp_entry"
|
9
|
+
require "openstack-quantum-client/l2l3/firewall"
|
10
|
+
require "openstack-quantum-client/l2l3/filter_rule"
|
11
|
+
require "openstack-quantum-client/l2l3/filtered_range"
|
12
|
+
require "openstack-quantum-client/l2l3/network"
|
13
|
+
require "openstack-quantum-client/l2l3/port"
|
14
|
+
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Openstack
|
3
|
+
module QuantumClient
|
4
|
+
class L2l3
|
5
|
+
attr_reader :quantum_url
|
6
|
+
attr_reader :quantum_extension_url
|
7
|
+
|
8
|
+
# The initialize l2l3 class should be initialized passing a hash
|
9
|
+
# with url and tenant:
|
10
|
+
# Example:
|
11
|
+
#
|
12
|
+
# {:url => "http://localhost:9696", :tenant => "XYZ"}
|
13
|
+
def initialize(config)
|
14
|
+
@quantum_extension_url = "#{config[:url]}/v1.0/extensions/l2l3/tenants/#{config[:tenant]}"
|
15
|
+
@quantum_url = "#{config[:url]}/v1.0/tenants/#{config[:tenant]}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def attachment_detail
|
19
|
+
@attachment_detail ||= AttachmentDetail.new(@quantum_extension_url)
|
20
|
+
end
|
21
|
+
|
22
|
+
def firewall
|
23
|
+
@firewall ||= Firewall.new(@quantum_extension_url)
|
24
|
+
end
|
25
|
+
|
26
|
+
def filtered_range
|
27
|
+
@filtered_range ||= FilteredRange.new(@quantum_extension_url)
|
28
|
+
end
|
29
|
+
|
30
|
+
def filter_rule
|
31
|
+
@filter_rule ||= FilterRule.new(@quantum_extension_url)
|
32
|
+
end
|
33
|
+
|
34
|
+
def dhcp
|
35
|
+
@dhcp ||= Dhcp.new(@quantum_extension_url)
|
36
|
+
end
|
37
|
+
|
38
|
+
def dhcp_entry
|
39
|
+
@dhcp_entry ||= DhcpEntry.new(@quantum_extension_url)
|
40
|
+
end
|
41
|
+
|
42
|
+
def port
|
43
|
+
@port ||= Port.new(@quantum_url)
|
44
|
+
end
|
45
|
+
|
46
|
+
def network
|
47
|
+
@network ||= Network.new(@quantum_url)
|
48
|
+
end
|
49
|
+
|
50
|
+
protected
|
51
|
+
def post_to_quantum(post_url, info)
|
52
|
+
send_to_quantum("post", post_url, info)
|
53
|
+
end
|
54
|
+
|
55
|
+
def put_to_quantum(post_url, info)
|
56
|
+
send_to_quantum("put", post_url, info)
|
57
|
+
end
|
58
|
+
|
59
|
+
def send_to_quantum(http_method, post_url, info)
|
60
|
+
response = HTTParty.send(
|
61
|
+
http_method,
|
62
|
+
post_url,
|
63
|
+
:body => info.to_json,
|
64
|
+
:headers => {"Content-Type" => "application/json"}
|
65
|
+
)
|
66
|
+
response
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Openstack
|
3
|
+
module QuantumClient
|
4
|
+
class AttachmentDetail < L2l3
|
5
|
+
def initialize(quantum_extension_url)
|
6
|
+
@quantum_extension_url = quantum_extension_url
|
7
|
+
end
|
8
|
+
|
9
|
+
def list(filters={})
|
10
|
+
HTTParty.get("#{quantum_extension_url}/attachment_details.json", :query => filters)
|
11
|
+
end
|
12
|
+
|
13
|
+
def create(mac, ip)
|
14
|
+
url = "#{quantum_extension_url}/attachment_details.json"
|
15
|
+
post_to_quantum(url, {"attachment_detail" => {"interface_id" => mac, "ip" => ip}})
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete(id)
|
19
|
+
url = "#{quantum_extension_url}/attachment_details/#{id}.json"
|
20
|
+
HTTParty.delete(url)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Openstack
|
3
|
+
module QuantumClient
|
4
|
+
class Dhcp < L2l3
|
5
|
+
def initialize(quantum_url)
|
6
|
+
@quantum_url = "#{quantum_url}/dhcps.json"
|
7
|
+
end
|
8
|
+
|
9
|
+
def create(name, address)
|
10
|
+
post_to_quantum(
|
11
|
+
@quantum_url,
|
12
|
+
{"dhcp" => {"name" => name, "address" => address}}
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def list
|
17
|
+
response = HTTParty.get(@quantum_url)
|
18
|
+
JSON.parse(response.body)["dhcps"] if response
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Openstack
|
3
|
+
module QuantumClient
|
4
|
+
class DhcpEntry < L2l3
|
5
|
+
def initialize(quantum_url)
|
6
|
+
@quantum_url = "#{quantum_url}/dhcp_entries.json"
|
7
|
+
end
|
8
|
+
|
9
|
+
def create(address, mac)
|
10
|
+
post_to_quantum(
|
11
|
+
@quantum_url,
|
12
|
+
{"dhcp_entry" => {"mac" => mac, "address" => address}}
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Openstack
|
3
|
+
module QuantumClient
|
4
|
+
class FilterRule < L2l3
|
5
|
+
def initialize(quantum_url)
|
6
|
+
@quantum_url = quantum_url
|
7
|
+
end
|
8
|
+
|
9
|
+
def create(src, dst, dst_port, proto)
|
10
|
+
full_url = "#{@quantum_url}/filter_rules.json"
|
11
|
+
post_hash = {
|
12
|
+
"filter_rule" => {
|
13
|
+
"src" => src,
|
14
|
+
"dst" => dst,
|
15
|
+
"dst_port" => dst_port,
|
16
|
+
"proto" => proto
|
17
|
+
}
|
18
|
+
}
|
19
|
+
post_to_quantum(full_url, post_hash)
|
20
|
+
end
|
21
|
+
|
22
|
+
def delete(id)
|
23
|
+
HTTParty.delete("#{@quantum_url}/filter_rules/#{id}.json" )
|
24
|
+
end
|
25
|
+
|
26
|
+
def show(id)
|
27
|
+
HTTParty.get("#{@quantum_url}/filter_rules/#{id}.json" )
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Openstack
|
3
|
+
module QuantumClient
|
4
|
+
class FilteredRange < L2l3
|
5
|
+
def initialize(quantum_url)
|
6
|
+
@quantum_url = "#{quantum_url}/firewalls/%s/filtered_ranges.json"
|
7
|
+
end
|
8
|
+
|
9
|
+
def create(firewall_uuid, address, mask)
|
10
|
+
post_to_quantum(
|
11
|
+
@quantum_url % firewall_uuid.to_s,
|
12
|
+
{"filtered_range" => {"address" => address, "mask" => mask}}
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Openstack
|
3
|
+
module QuantumClient
|
4
|
+
class Firewall < L2l3
|
5
|
+
def initialize(quantum_url)
|
6
|
+
@quantum_url = "#{quantum_url}/firewalls.json"
|
7
|
+
end
|
8
|
+
|
9
|
+
def create(name, address)
|
10
|
+
post_to_quantum(
|
11
|
+
@quantum_url,
|
12
|
+
{"firewall" => {"name" => name, "address" => address}}
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def list
|
17
|
+
response = HTTParty.get(@quantum_url)
|
18
|
+
JSON.parse(response.body)["firewalls"] if response
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Openstack
|
3
|
+
module QuantumClient
|
4
|
+
class Network < L2l3
|
5
|
+
def initialize(quantum_url)
|
6
|
+
@quantum_url = quantum_url
|
7
|
+
end
|
8
|
+
|
9
|
+
def create(name)
|
10
|
+
full_url = "#{@quantum_url}/networks.json"
|
11
|
+
post_to_quantum(full_url, {"network" => {"name" => name}})
|
12
|
+
end
|
13
|
+
|
14
|
+
def list(filters={})
|
15
|
+
HTTParty.get("#{@quantum_url}/networks.json", :query => filters)
|
16
|
+
end
|
17
|
+
|
18
|
+
def show(id)
|
19
|
+
HTTParty.get("#{@quantum_url}/networks/#{id}.json")
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_or_create_by_name(network_name)
|
23
|
+
networks = list(:name => network_name)["networks"]
|
24
|
+
if networks.empty?
|
25
|
+
create(network_name)
|
26
|
+
end
|
27
|
+
list(:name => network_name)["networks"].last
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module Openstack
|
3
|
+
module QuantumClient
|
4
|
+
class Port < L2l3
|
5
|
+
def initialize(quantum_url)
|
6
|
+
@quantum_url = quantum_url
|
7
|
+
end
|
8
|
+
|
9
|
+
def create(network_id)
|
10
|
+
full_url = "#{@quantum_url}/networks/#{network_id}/ports.json"
|
11
|
+
post_to_quantum(full_url, nil)
|
12
|
+
end
|
13
|
+
|
14
|
+
def plug(network_id, id, interface_id)
|
15
|
+
full_url = "#{@quantum_url}/networks/#{network_id}/ports/#{id}/attachment.json"
|
16
|
+
response = put_to_quantum(full_url, {"attachment" => {"id" => interface_id}})
|
17
|
+
response.code < 300
|
18
|
+
end
|
19
|
+
|
20
|
+
def unplug(network_id, id)
|
21
|
+
full_url = "#{@quantum_url}/networks/#{network_id}/ports/#{id}/attachment.json"
|
22
|
+
response = HTTParty.delete(full_url)
|
23
|
+
response.code < 300
|
24
|
+
end
|
25
|
+
|
26
|
+
def delete(network_id, id)
|
27
|
+
HTTParty.delete("#{@quantum_url}/networks/#{network_id}/ports/#{id}.json")
|
28
|
+
end
|
29
|
+
|
30
|
+
def list(network_id, filters={})
|
31
|
+
HTTParty.get("#{@quantum_url}/networks/#{network_id}/ports.json", :query => filters)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
Binary file
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/openstack-quantum-client/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "openstack-quantum-client"
|
6
|
+
gem.version = Openstack::QuantumClient::VERSION
|
7
|
+
gem.authors = ["PotHix", "Morellon"]
|
8
|
+
gem.email = ["pothix@pothix.com", "morellon@gmail.com"]
|
9
|
+
gem.description = %q{A simple gem to deal with openstack quantum}
|
10
|
+
gem.summary = %q{The main objective of this gem is to deal easily with openstack quantum}
|
11
|
+
gem.homepage = "http://www.locaweb.com.br"
|
12
|
+
|
13
|
+
gem.files = Dir["./**/*"].reject {|file| file =~ /\.git|pkg/}
|
14
|
+
gem.require_paths = ["lib"]
|
15
|
+
|
16
|
+
gem.add_dependency "httparty"
|
17
|
+
gem.add_development_dependency "rspec"
|
18
|
+
gem.add_development_dependency "fakeweb"
|
19
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
3
|
+
|
4
|
+
describe Openstack::QuantumClient::AttachmentDetail do
|
5
|
+
before do
|
6
|
+
config = {:url => "http://localhost:9696", :tenant => "XYZ"}
|
7
|
+
@client = Openstack::QuantumClient::L2l3.new(config)
|
8
|
+
@attachment_detail = {"attachment_detail" => {"interface_id" => "a4:ba:db:05:6e:f8", "ip" => "192.168.3.4"}}
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should generate the correct json syntax for attachment_detail creation" do
|
12
|
+
url = "http://localhost:9696/v1.0/extensions/l2l3/tenants/XYZ/attachment_details.json"
|
13
|
+
HTTParty.should_receive(:post).with(
|
14
|
+
url,
|
15
|
+
:body => @attachment_detail.to_json,
|
16
|
+
:headers => {"Content-Type" => "application/json"}
|
17
|
+
)
|
18
|
+
@client.attachment_detail.create("a4:ba:db:05:6e:f8", "192.168.3.4")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return the attachment_detail uuid" do
|
22
|
+
attachment_detail = @client.attachment_detail.create("a4:ba:db:05:6e:f8", "192.168.3.4")
|
23
|
+
attachment_detail.should_not be_nil
|
24
|
+
attachment_detail["id"].should match(/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should delete the attachment_detail" do
|
28
|
+
attachment_detail = @client.attachment_detail.create("a4:ba:db:05:6e:f8", "192.168.3.4")
|
29
|
+
response_code = @client.attachment_detail.delete(attachment_detail["id"]).code
|
30
|
+
response_code.should == 200
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should list the attachment_details" do
|
34
|
+
mac = "a4:ba:db:05:6e:f9"
|
35
|
+
@client.attachment_detail.create(mac, "192.168.3.4")
|
36
|
+
attachment_details = @client.attachment_detail.list(:attachment => mac)["attachment_details"]
|
37
|
+
attachment_details.size.should == 1
|
38
|
+
attachment_details.first["interface_id"].should == mac
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
3
|
+
|
4
|
+
describe Openstack::QuantumClient::DhcpEntry do
|
5
|
+
before do
|
6
|
+
config = {:url => "http://localhost:9696", :tenant => "XYZ"}
|
7
|
+
@client = Openstack::QuantumClient::L2l3.new(config)
|
8
|
+
@dhcp_entry_info = {"dhcp_entry" => {"mac" => "a4:ba:db:05:6e:f8", "address" => "192.168.3.4"}}
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should generate the correct json syntax for dhcp inclusion" do
|
12
|
+
url = "http://localhost:9696/v1.0/extensions/l2l3/tenants/XYZ/dhcp_entries.json"
|
13
|
+
HTTParty.should_receive(:post).with(
|
14
|
+
url,
|
15
|
+
:body => @dhcp_entry_info.to_json,
|
16
|
+
:headers => {"Content-Type" => "application/json"}
|
17
|
+
)
|
18
|
+
@client.dhcp_entry.create("192.168.3.4", "a4:ba:db:05:6e:f8")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return the dhcp uuid" do
|
22
|
+
dhcp_entry_info = @client.dhcp.create("dhcp1", "192.168.3.4")
|
23
|
+
dhcp_entry_info.should_not be_nil
|
24
|
+
dhcp_entry_info["id"].should match(/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/)
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
3
|
+
|
4
|
+
describe Openstack::QuantumClient::Dhcp do
|
5
|
+
before do
|
6
|
+
config = {:url => "http://localhost:9696", :tenant => "XYZ"}
|
7
|
+
@client = Openstack::QuantumClient::L2l3.new(config)
|
8
|
+
@dhcp_info = {"dhcp" => {"name" => "dhcp1", "address" => "192.168.1.1"} }
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should generate the correct json syntax for dhcp inclusion" do
|
12
|
+
url = "http://localhost:9696/v1.0/extensions/l2l3/tenants/XYZ/dhcps.json"
|
13
|
+
HTTParty.should_receive(:post).with(
|
14
|
+
url,
|
15
|
+
:body => @dhcp_info.to_json,
|
16
|
+
:headers => {"Content-Type" => "application/json"}
|
17
|
+
)
|
18
|
+
@client.dhcp.create("dhcp1", "192.168.1.1")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return the dhcp uuid" do
|
22
|
+
dhcp_info = @client.dhcp.create("dhcp1", "192.168.1.1")
|
23
|
+
dhcp_info.should_not be_nil
|
24
|
+
dhcp_info["id"].should match(/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should return a dhcps array" do
|
28
|
+
dhcp_info = @client.dhcp.list
|
29
|
+
dhcp_info.should_not be_nil
|
30
|
+
dhcp_info.should be_instance_of(Array)
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
3
|
+
|
4
|
+
describe Openstack::QuantumClient::FilterRule do
|
5
|
+
before do
|
6
|
+
config = {:url => "http://localhost:9696", :tenant => "XYZ"}
|
7
|
+
@client = Openstack::QuantumClient::L2l3.new(config)
|
8
|
+
@filter_rule_info = {
|
9
|
+
"filter_rule" => {
|
10
|
+
"src" => "192.168.1.1/32",
|
11
|
+
"dst" => "10.0.0.1",
|
12
|
+
"dst_port" => 22,
|
13
|
+
"proto" => "tcp"
|
14
|
+
}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should generate the correct json syntax for filter_rule inclusion" do
|
19
|
+
url = "http://localhost:9696/v1.0/extensions/l2l3/tenants/XYZ/filter_rules.json"
|
20
|
+
HTTParty.should_receive(:post).with(
|
21
|
+
url,
|
22
|
+
:body => @filter_rule_info.to_json,
|
23
|
+
:headers => {"Content-Type" => "application/json"}
|
24
|
+
)
|
25
|
+
@client.filter_rule.create("192.168.1.1/32","10.0.0.1",22,"tcp")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return the filter_rule uuid" do
|
29
|
+
filter_rule_info = @client.filter_rule.create("192.168.1.1/32","10.0.0.1",22,"tcp")
|
30
|
+
filter_rule_info.should_not be_nil
|
31
|
+
filter_rule_info["id"].should match(/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/)
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when using rule uuid" do
|
35
|
+
it "should delete the filter_rule by uuid" do
|
36
|
+
rule = @client.filter_rule.create("192.168.1.1/32","10.0.0.1",22,"tcp")
|
37
|
+
|
38
|
+
filter_rule_info = @client.filter_rule.delete(rule["id"])
|
39
|
+
filter_rule_info.should_not be_nil
|
40
|
+
filter_rule_info["id"].should match(rule["id"])
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should get the filter_rule by uuid" do
|
44
|
+
rule = @client.filter_rule.create("192.168.1.1/32","10.0.0.1",22,"tcp")
|
45
|
+
|
46
|
+
filter_rule_info = @client.filter_rule.show(rule["id"])
|
47
|
+
filter_rule_info.should_not be_nil
|
48
|
+
filter_rule_info["id"].should match(rule["id"])
|
49
|
+
filter_rule_info["src"].should match(rule["src"])
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should get the filter_rule status" do
|
53
|
+
firewall = @client.firewall.create("firewall1", "192.168.1.1")
|
54
|
+
filtered_range = @client.filtered_range.create(firewall["id"], "10.0.0.1", "26")
|
55
|
+
rule = @client.filter_rule.create("192.168.1.1/32","10.0.0.1",22,"tcp")
|
56
|
+
|
57
|
+
filter_rule_info = @client.filter_rule.show(rule["id"])
|
58
|
+
filter_rule_info["status"].should match("INSERTING")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
3
|
+
|
4
|
+
describe Openstack::QuantumClient::FilteredRange do
|
5
|
+
before do
|
6
|
+
config = {:url => "http://localhost:9696", :tenant => "XYZ"}
|
7
|
+
@client = Openstack::QuantumClient::L2l3.new(config)
|
8
|
+
@filtered_range_info = {"filtered_range" => {"address" => "192.168.1.1", "mask" => "26"}}
|
9
|
+
|
10
|
+
@firewall = @client.firewall.create("firewall1", "192.168.1.1")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should generate the correct json syntax for firewall inclusion" do
|
14
|
+
url = "http://localhost:9696/v1.0/extensions/l2l3/tenants/XYZ/firewalls/%s/filtered_ranges.json"
|
15
|
+
HTTParty.should_receive(:post).with(
|
16
|
+
url % @firewall["uuid"],
|
17
|
+
:body => @filtered_range_info.to_json,
|
18
|
+
:headers => {"Content-Type" => "application/json"}
|
19
|
+
)
|
20
|
+
@client.filtered_range.create(@firewall["uuid"], "192.168.1.1", "26")
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
3
|
+
|
4
|
+
describe Openstack::QuantumClient::Firewall do
|
5
|
+
before do
|
6
|
+
config = {:url => "http://localhost:9696", :tenant => "XYZ"}
|
7
|
+
@client = Openstack::QuantumClient::L2l3.new(config)
|
8
|
+
@firewall_info = {"firewall" => {"name" => "firewall1", "address" => "192.168.1.1"} }
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should generate the correct json syntax for firewall inclusion" do
|
12
|
+
url = "http://localhost:9696/v1.0/extensions/l2l3/tenants/XYZ/firewalls.json"
|
13
|
+
HTTParty.should_receive(:post).with(
|
14
|
+
url,
|
15
|
+
:body => @firewall_info.to_json,
|
16
|
+
:headers => {"Content-Type" => "application/json"}
|
17
|
+
)
|
18
|
+
@client.firewall.create("firewall1", "192.168.1.1")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return the firewall uuid" do
|
22
|
+
firewall_info = @client.firewall.create("firewall1", "192.168.1.1")
|
23
|
+
firewall_info.should_not be_nil
|
24
|
+
firewall_info["id"].should match(/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should return a firewalls array" do
|
28
|
+
firewall_info = @client.firewall.list
|
29
|
+
firewall_info.should_not be_nil
|
30
|
+
firewall_info.should be_instance_of(Array)
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
3
|
+
|
4
|
+
describe Openstack::QuantumClient::Network do
|
5
|
+
before do
|
6
|
+
config = {:url => "http://localhost:9696", :tenant => "XYZ"}
|
7
|
+
@client = Openstack::QuantumClient::L2l3.new(config)
|
8
|
+
@network_info = {"network" => {"name" => "network1"}}
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should generate the correct json syntax for network inclusion" do
|
12
|
+
url = "http://localhost:9696/v1.0/tenants/XYZ/networks.json"
|
13
|
+
HTTParty.should_receive(:post).with(
|
14
|
+
url,
|
15
|
+
:body => @network_info.to_json,
|
16
|
+
:headers => {"Content-Type" => "application/json"}
|
17
|
+
)
|
18
|
+
@client.network.create("network1")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return the network uuid" do
|
22
|
+
network_info = @client.network.create("network1")["network"]
|
23
|
+
network_info.should_not be_nil
|
24
|
+
network_info["id"].should match(/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should list networks filtered" do
|
28
|
+
@client.network.create("network1")
|
29
|
+
@client.network.create("network2")
|
30
|
+
network_list = @client.network.list(:name => "network2")["networks"]
|
31
|
+
network_list.size.should == 1
|
32
|
+
network_info = @client.network.show(network_list.first["id"])["network"]
|
33
|
+
network_info["name"].should == "network2"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return the last network created by name" do
|
37
|
+
network_id = @client.network.create("network1")
|
38
|
+
network = @client.network.find_or_create_by_name("network1")
|
39
|
+
network["id"].should eql(network_id["network"]["id"])
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should create a network if can't find it" do
|
43
|
+
network = "new_network"
|
44
|
+
@client.network.list(:name => network)["networks"].should be_empty
|
45
|
+
@client.network.find_or_create_by_name(network).should_not be_nil
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
3
|
+
|
4
|
+
describe Openstack::QuantumClient::Port do
|
5
|
+
before do
|
6
|
+
config = {:url => "http://localhost:9696", :tenant => "XYZ"}
|
7
|
+
@client = Openstack::QuantumClient::L2l3.new(config)
|
8
|
+
@port_info = {}
|
9
|
+
@network_id = @client.network.create("net")["network"]["id"]
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should generate the correct json syntax for port inclusion" do
|
13
|
+
url = "http://localhost:9696/v1.0/tenants/XYZ/networks/#{@network_id}/ports.json"
|
14
|
+
HTTParty.should_receive(:post).with(
|
15
|
+
url,
|
16
|
+
:body => "null",
|
17
|
+
:headers => {"Content-Type" => "application/json"}
|
18
|
+
)
|
19
|
+
@client.port.create(@network_id)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return the port uuid" do
|
23
|
+
port_info = @client.port.create(@network_id)["port"]
|
24
|
+
port_info.should_not be_nil
|
25
|
+
port_info["id"].should match(/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should plug an interface" do
|
29
|
+
mac = "4a:94:c4:98:38:57"
|
30
|
+
port_info = @client.port.create(@network_id)["port"]
|
31
|
+
@client.port.plug(@network_id, port_info["id"], mac).should be_true
|
32
|
+
new_port_info = @client.port.list(@network_id, :attachment => mac)["ports"].first
|
33
|
+
new_port_info["id"].should == port_info["id"]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should unplug an interface" do
|
37
|
+
mac = "4a:94:c4:98:38:57"
|
38
|
+
port_info = @client.port.create(@network_id)["port"]
|
39
|
+
@client.port.unplug(@network_id, port_info["id"]).should be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should delete the port" do
|
43
|
+
port_info = @client.port.create(@network_id)["port"]
|
44
|
+
@client.port.delete(@network_id, port_info["id"]).code.should == 204
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
3
|
+
|
4
|
+
describe Openstack::QuantumClient::L2l3 do
|
5
|
+
before do
|
6
|
+
config = {:url => "http://localhost:9696", :tenant => "XYZ"}
|
7
|
+
@client = Openstack::QuantumClient::L2l3.new(config)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should generate the correct url" do
|
11
|
+
@client.quantum_extension_url.should eql("http://localhost:9696/v1.0/extensions/l2l3/tenants/XYZ")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should create a new instance of dhcp" do
|
15
|
+
@client.dhcp.should be_instance_of(Openstack::QuantumClient::Dhcp)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should create a new instance of dhcp entry" do
|
19
|
+
@client.dhcp_entry.should be_instance_of(Openstack::QuantumClient::DhcpEntry)
|
20
|
+
end
|
21
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: openstack-quantum-client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- PotHix
|
9
|
+
- Morellon
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-01-31 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: httparty
|
17
|
+
requirement: &17179240 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *17179240
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
28
|
+
requirement: &17178820 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *17178820
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: fakeweb
|
39
|
+
requirement: &17178400 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *17178400
|
48
|
+
description: A simple gem to deal with openstack quantum
|
49
|
+
email:
|
50
|
+
- pothix@pothix.com
|
51
|
+
- morellon@gmail.com
|
52
|
+
executables: []
|
53
|
+
extensions: []
|
54
|
+
extra_rdoc_files: []
|
55
|
+
files:
|
56
|
+
- ./openstack-quantum-client.gemspec
|
57
|
+
- ./README.markdown
|
58
|
+
- ./openstack-quantum-client-0.1.2.gem
|
59
|
+
- ./spec/spec_helper.rb
|
60
|
+
- ./spec/openstack_quantum_messager_spec.rb
|
61
|
+
- ./spec/openstack-quantum-messager/l2l3_spec.rb
|
62
|
+
- ./spec/openstack-quantum-messager/l2l3/dhcp_entry_spec.rb
|
63
|
+
- ./spec/openstack-quantum-messager/l2l3/filtered_range_spec.rb
|
64
|
+
- ./spec/openstack-quantum-messager/l2l3/network_spec.rb
|
65
|
+
- ./spec/openstack-quantum-messager/l2l3/firewall_spec.rb
|
66
|
+
- ./spec/openstack-quantum-messager/l2l3/filter_rule_spec.rb
|
67
|
+
- ./spec/openstack-quantum-messager/l2l3/dhcp_spec.rb
|
68
|
+
- ./spec/openstack-quantum-messager/l2l3/port_spec.rb
|
69
|
+
- ./spec/openstack-quantum-messager/l2l3/attachment_detail_spec.rb
|
70
|
+
- ./Gemfile
|
71
|
+
- ./Rakefile
|
72
|
+
- ./lib/openstack-quantum-client.rb
|
73
|
+
- ./lib/openstack-quantum-client/version.rb
|
74
|
+
- ./lib/openstack-quantum-client/l2l3.rb
|
75
|
+
- ./lib/openstack-quantum-client/l2l3/dhcp_entry.rb
|
76
|
+
- ./lib/openstack-quantum-client/l2l3/attachment_detail.rb
|
77
|
+
- ./lib/openstack-quantum-client/l2l3/firewall.rb
|
78
|
+
- ./lib/openstack-quantum-client/l2l3/network.rb
|
79
|
+
- ./lib/openstack-quantum-client/l2l3/filter_rule.rb
|
80
|
+
- ./lib/openstack-quantum-client/l2l3/filtered_range.rb
|
81
|
+
- ./lib/openstack-quantum-client/l2l3/port.rb
|
82
|
+
- ./lib/openstack-quantum-client/l2l3/dhcp.rb
|
83
|
+
homepage: http://www.locaweb.com.br
|
84
|
+
licenses: []
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 1.8.10
|
104
|
+
signing_key:
|
105
|
+
specification_version: 3
|
106
|
+
summary: The main objective of this gem is to deal easily with openstack quantum
|
107
|
+
test_files: []
|