bosh_openstack_registry 0.0.3 → 0.0.4

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/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # BOSH OpenStack Registry
2
+ Copyright (c) 2009-2012 VMware, Inc.
3
+
4
+ For online documentation see: http://rubydoc.info/gems/bosh_openstack_registry/
5
+
6
+ ## Usage
7
+
8
+ bin/migrate [<options>]
9
+ -c, --config FILE OpenStack Registry configuration file
10
+
11
+ bin/openstack_registry [<options>]
12
+ -c, --config FILE OpenStack Registry configuration file
13
+
14
+ ## Configuration
15
+
16
+ These options are passed to the OpenStack Registry when it is instantiated.
17
+
18
+ ### Registry options
19
+
20
+ These are the options for the Registry HTTP server (by default server is
21
+ bound to address 0.0.0.0):
22
+
23
+ * `port` (required)
24
+ Registry port
25
+ * `user` (required)
26
+ Registry user (for HTTP Basic authentication)
27
+ * `password` (required)
28
+ Registry password (for HTTP Basic authentication)
29
+
30
+ ### Database options
31
+
32
+ These are the options for the database connection where registry will store
33
+ server properties:
34
+
35
+ * `database` (required)
36
+ DB connection URI
37
+ * `max_connections` (required)
38
+ Maximum size of the connection pool
39
+ * `pool_timeout` (required)
40
+ Number of seconds to wait if a connection cannot be acquired before
41
+ raising an error
42
+
43
+ ### OpenStack options
44
+
45
+ These are the credentials to connect to OpenStack services:
46
+
47
+ * `auth_url` (required)
48
+ URL of the OpenStack Identity endpoint to connect to
49
+ * `username` (required)
50
+ OpenStack user name
51
+ * `api_key` (required)
52
+ OpenStack API key
53
+ * `tenant` (required)
54
+ OpenStack tenant name
55
+ * `region` (optional)
56
+ OpenStack region
57
+
58
+ ## Example
59
+
60
+ This is a sample of an OpenStack Registry configuration file:
61
+
62
+ ---
63
+ loglevel: debug
64
+
65
+ http:
66
+ port: 25695
67
+ user: admin
68
+ password: admin
69
+
70
+ db:
71
+ database: "sqlite:///:memory:"
72
+ max_connections: 32
73
+ pool_timeout: 10
74
+
75
+ openstack:
76
+ auth_url: "http://127.0.0.1:5000/v2.0/tokens"
77
+ username: foo
78
+ api_key: bar
79
+ tenant: foo
80
+ region:
@@ -17,7 +17,7 @@ module Bosh::OpenstackRegistry
17
17
 
18
18
  get "/servers/:server_id/settings" do
19
19
  ip_check = authorized? ? nil : request.ip
20
- settings = @server_manager.read_settings(params[:server_id])
20
+ settings = @server_manager.read_settings(params[:server_id], ip_check)
21
21
  json(:status => "ok", :settings => settings)
22
22
  end
23
23
 
@@ -32,7 +32,8 @@ module Bosh::OpenstackRegistry
32
32
  :openstack_auth_url => @openstack_properties["auth_url"],
33
33
  :openstack_username => @openstack_properties["username"],
34
34
  :openstack_api_key => @openstack_properties["api_key"],
35
- :openstack_tenant => @openstack_properties["tenant"]
35
+ :openstack_tenant => @openstack_properties["tenant"],
36
+ :openstack_region => @openstack_properties["region"]
36
37
  }
37
38
 
38
39
  @db = connect_db(config["db"])
@@ -44,7 +44,7 @@ module Bosh::OpenstackRegistry
44
44
 
45
45
  private
46
46
 
47
- def handle_em_error(e)
47
+ def handle_em_error(e, level = :fatal)
48
48
  @logger.send(level, e.to_s)
49
49
  if e.respond_to?(:backtrace) && e.backtrace.respond_to?(:join)
50
50
  @logger.send(level, e.backtrace.join("\n"))
@@ -27,7 +27,12 @@ module Bosh::OpenstackRegistry
27
27
  ##
28
28
  # Reads server settings
29
29
  # @param [String] server_id OpenStack server id
30
- def read_settings(server_id)
30
+ # @param [optional, String] remote_ip If this IP is provided, check will
31
+ # be performed to see if the server id actually has this IP address
32
+ # according to OpenStack.
33
+ def read_settings(server_id, remote_ip = nil)
34
+ check_instance_ips(remote_ip, server_id) if remote_ip
35
+
31
36
  get_server(server_id).settings
32
37
  end
33
38
 
@@ -37,6 +42,16 @@ module Bosh::OpenstackRegistry
37
42
 
38
43
  private
39
44
 
45
+ def check_instance_ips(ip, server_id)
46
+ return if ip == "127.0.0.1"
47
+ actual_ips = server_ips(server_id)
48
+ unless actual_ips.include?(ip)
49
+ raise ServerError, "Server IP mismatch, expected IP is " \
50
+ "`%s', actual IP(s): `%s'" %
51
+ [ ip, actual_ips.join(", ") ]
52
+ end
53
+ end
54
+
40
55
  def get_server(server_id)
41
56
  server = Models::OpenstackServer[:server_id => server_id]
42
57
 
@@ -47,6 +62,19 @@ module Bosh::OpenstackRegistry
47
62
  server
48
63
  end
49
64
 
65
+ # Get the list of IPs belonging to this server
66
+ def server_ips(server_id)
67
+ server = @openstack.servers.get(server_id)
68
+ raise ServerNotFound, "Server `#{server_id}' not found" unless server
69
+ ips = []
70
+ server.addresses.each do |network, addresses|
71
+ addresses.each do |addr|
72
+ ips.push(addr.kind_of?(Hash) ? addr["addr"] : addr)
73
+ end
74
+ end
75
+ ips
76
+ end
77
+
50
78
  end
51
79
 
52
80
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Bosh
4
4
  module OpenstackRegistry
5
- VERSION = "0.0.3"
5
+ VERSION = "0.0.4"
6
6
  end
7
7
  end
@@ -15,4 +15,5 @@ openstack:
15
15
  auth_url: "http://127.0.0.1:5000/v2.0/tokens"
16
16
  username: foo
17
17
  api_key: bar
18
- tenant: foo
18
+ tenant: foo
19
+ region:
data/spec/spec_helper.rb CHANGED
@@ -101,7 +101,8 @@ def valid_config
101
101
  "auth_url" => "http://127.0.0.1:5000/v2.0/tokens",
102
102
  "username" => "foo",
103
103
  "api_key" => "bar",
104
- "tenant" => "foo"
104
+ "tenant" => "foo",
105
+ "region" => ""
105
106
  }
106
107
  }
107
108
  end
@@ -22,7 +22,7 @@ describe Bosh::OpenstackRegistry::ApiController do
22
22
 
23
23
  it "returns settings for given OpenStack server (IP check)" do
24
24
  @server_manager.should_receive(:read_settings).
25
- with("foo").and_return("bar")
25
+ with("foo", "127.0.0.1").and_return("bar")
26
26
 
27
27
  @session.get("/servers/foo/settings")
28
28
 
@@ -32,7 +32,7 @@ describe Bosh::OpenstackRegistry::ApiController do
32
32
 
33
33
  it "returns settings (authorized user, no IP check)" do
34
34
  @server_manager.should_receive(:read_settings).
35
- with("foo").and_return("bar")
35
+ with("foo", nil).and_return("bar")
36
36
 
37
37
  @session.basic_authorize("admin", "admin")
38
38
  @session.get("/servers/foo/settings")
@@ -5,10 +5,10 @@ require File.expand_path("../../spec_helper", __FILE__)
5
5
  describe Bosh::OpenstackRegistry::ServerManager do
6
6
 
7
7
  before(:each) do
8
- openstack = double(Fog::Compute)
9
- Fog::Compute.stub(:new).and_return(openstack)
10
- @openstack = mock("openstack")
11
- Bosh::OpenstackRegistry.openstack = @openstack
8
+ @compute = double(Fog::Compute)
9
+ Fog::Compute.stub(:new).and_return(@compute)
10
+ openstack = mock("openstack")
11
+ Bosh::OpenstackRegistry.openstack = openstack
12
12
  end
13
13
 
14
14
  let(:manager) do
@@ -19,18 +19,62 @@ describe Bosh::OpenstackRegistry::ServerManager do
19
19
  Bosh::OpenstackRegistry::Models::OpenstackServer.create(params)
20
20
  end
21
21
 
22
+ def actual_ip_is(private_ip, floating_ip = nil)
23
+ servers = mock("servers")
24
+ server = mock("server", :addresses => {
25
+ "private" => [{"version" => 4, "addr" => private_ip}],
26
+ "public" => [floating_ip]
27
+ })
28
+
29
+ @compute.should_receive(:servers).and_return(servers)
30
+ servers.should_receive(:get).with("foo").and_return(server)
31
+ end
32
+
22
33
  describe "reading settings" do
23
- it "returns settings" do
34
+ it "returns settings after verifying IP address" do
35
+ create_server(:server_id => "foo", :settings => "bar")
36
+ actual_ip_is("10.0.0.1")
37
+ manager.read_settings("foo", "10.0.0.1").should == "bar"
38
+ end
39
+
40
+ it "returns settings after verifying floating IP address" do
41
+ create_server(:server_id => "foo", :settings => "bar")
42
+ actual_ip_is("10.0.0.1", "10.0.1.1")
43
+ manager.read_settings("foo", "10.0.1.1").should == "bar"
44
+ end
45
+
46
+ it "raises an error if IP cannot be verified" do
47
+ create_server(:server_id => "foo", :settings => "bar")
48
+ actual_ip_is("10.0.0.1", "10.0.1.1")
49
+ expect {
50
+ manager.read_settings("foo", "10.0.2.1")
51
+ }.to raise_error(Bosh::OpenstackRegistry::ServerError,
52
+ "Server IP mismatch, expected IP is `10.0.2.1', " \
53
+ "actual IP(s): `10.0.0.1, 10.0.1.1'")
54
+ end
55
+
56
+ it "doesn't check remote IP if it's not provided" do
24
57
  create_server(:server_id => "foo", :settings => "bar")
25
58
  manager.read_settings("foo").should == "bar"
26
59
  end
27
60
 
28
- it "raises an error if server not found" do
61
+ it "raises an error if server not found in registry" do
29
62
  expect {
30
63
  manager.read_settings("foo")
31
64
  }.to raise_error(Bosh::OpenstackRegistry::ServerNotFound,
32
65
  "Can't find server `foo'")
33
66
  end
67
+
68
+ it "raises an error if server not found in OpenStack" do
69
+ expect {
70
+ servers = mock("servers")
71
+ @compute.should_receive(:servers).and_return(servers)
72
+ servers.should_receive(:get).with("foo").and_return(nil)
73
+ create_server(:server_id => "foo", :settings => "bar")
74
+ manager.read_settings("foo", "10.0.0.1")
75
+ }.to raise_error(Bosh::OpenstackRegistry::ServerNotFound,
76
+ "Server `foo' not found")
77
+ end
34
78
  end
35
79
 
36
80
  describe "updating settings" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh_openstack_registry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-23 00:00:00.000000000 Z
12
+ date: 2012-12-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sequel
@@ -80,7 +80,7 @@ dependencies:
80
80
  requirement: !ruby/object:Gem::Requirement
81
81
  none: false
82
82
  requirements:
83
- - - ~>
83
+ - - ! '>='
84
84
  - !ruby/object:Gem::Version
85
85
  version: 1.6.0
86
86
  type: :runtime
@@ -88,7 +88,7 @@ dependencies:
88
88
  version_requirements: !ruby/object:Gem::Requirement
89
89
  none: false
90
90
  requirements:
91
- - - ~>
91
+ - - ! '>='
92
92
  - !ruby/object:Gem::Version
93
93
  version: 1.6.0
94
94
  description: BOSH OpenStack registry
@@ -110,7 +110,7 @@ files:
110
110
  - lib/openstack_registry/server_manager.rb
111
111
  - lib/openstack_registry/version.rb
112
112
  - lib/openstack_registry/yaml_helper.rb
113
- - README
113
+ - README.md
114
114
  - Rakefile
115
115
  - spec/assets/sample_config.yml
116
116
  - spec/spec_helper.rb
@@ -130,18 +130,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
130
  - - ! '>='
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
- segments:
134
- - 0
135
- hash: -1388648985805055139
136
133
  required_rubygems_version: !ruby/object:Gem::Requirement
137
134
  none: false
138
135
  requirements:
139
136
  - - ! '>='
140
137
  - !ruby/object:Gem::Version
141
138
  version: '0'
142
- segments:
143
- - 0
144
- hash: -1388648985805055139
145
139
  requirements: []
146
140
  rubyforge_project:
147
141
  rubygems_version: 1.8.24
@@ -155,3 +149,4 @@ test_files:
155
149
  - spec/unit/config_spec.rb
156
150
  - spec/unit/runner_spec.rb
157
151
  - spec/unit/server_manager_spec.rb
152
+ has_rdoc:
data/README DELETED
@@ -1,3 +0,0 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
- BOSH OpenStack Registry