cf-runtime 0.0.2 → 0.1.0

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.
@@ -22,5 +22,9 @@ begin
22
22
  require 'cfruntime/redis'
23
23
  rescue LoadError
24
24
  end
25
+ begin
26
+ require 'cfruntime/aws_s3'
27
+ rescue LoadError
28
+ end
25
29
  require 'cfruntime/properties'
26
30
  require 'cfruntime/version'
@@ -1,4 +1,5 @@
1
1
  require 'amqp'
2
+ require 'cfruntime/properties'
2
3
  module CFRuntime
3
4
  class AMQPClient
4
5
 
@@ -0,0 +1,43 @@
1
+ require 'aws/s3'
2
+ require 'cfruntime/properties'
3
+ module CFRuntime
4
+ class AWSS3Client
5
+
6
+ # Creates and returns an AWS-S3 +Client+ instance.
7
+ # Passes optional Hash of non-connection-related options to +AWS::S3::Base.establish_connection!+.
8
+ # Raises +ArgumentError+ If zero or multiple blob services are found.
9
+ def self.create(options={})
10
+ service_names = CloudApp.service_names_of_type('blob')
11
+ if service_names.length != 1
12
+ raise ArgumentError.new("Expected 1 service of blob type, " +
13
+ "but found #{service_names.length}. " +
14
+ "Consider using create_from_svc(service_name) instead.")
15
+ end
16
+ create_from_svc(service_names[0],options)
17
+ end
18
+
19
+ # Creates and returns a AWS-S3 +Client+ instance connected to a blob service with the
20
+ # specified name.
21
+ # Passes optional Hash of non-connection-related options to +AWS::S3::Base.establish_connection!+.
22
+ # Raises +ArgumentError+ If specified blob service is not found.
23
+ def self.create_from_svc(service_name, options={})
24
+ AWS::S3::Base.establish_connection!(options_for_svc(service_name,options))
25
+ end
26
+
27
+ # Merges provided options with connection options for specified blob service.
28
+ # Returns merged Hash containing (:access_key_id, :secret_access_key, :server, :port).
29
+ # Raises +ArgumentError+ If specified blob service is not found.
30
+ def self.options_for_svc(service_name,options={})
31
+ service_props = CFRuntime::CloudApp.service_props(service_name)
32
+ if service_props.nil?
33
+ raise ArgumentError.new("Service with name #{service_name} not found")
34
+ end
35
+ cfoptions = options
36
+ cfoptions[:server] = service_props[:host]
37
+ cfoptions[:port] = service_props[:port]
38
+ cfoptions[:access_key_id ] = service_props[:username]
39
+ cfoptions[:secret_access_key] = service_props[:password]
40
+ cfoptions
41
+ end
42
+ end
43
+ end
@@ -27,10 +27,10 @@ require 'stringio'
27
27
  # Some parts adapted from
28
28
  # http://golang.org/src/pkg/json/decode.go and
29
29
  # http://golang.org/src/pkg/utf8/utf8.go
30
- module CFRuntime::OkJson
30
+ module CFRuntime
31
+ module OkJson
31
32
  extend self
32
33
 
33
-
34
34
  # Decodes a json document in string s and
35
35
  # returns the corresponding ruby value.
36
36
  # String s must be valid UTF-8. If you have
@@ -593,4 +593,5 @@ module CFRuntime::OkJson
593
593
 
594
594
  Spc = ' '[0]
595
595
  Unesc = {?b=>?\b, ?f=>?\f, ?n=>?\n, ?r=>?\r, ?t=>?\t}
596
+ end
596
597
  end
@@ -0,0 +1,7 @@
1
+ require "cfruntime/parser/blob_parser"
2
+ require "cfruntime/parser/default_parser"
3
+ require "cfruntime/parser/mongodb_parser"
4
+ require "cfruntime/parser/mysql_parser"
5
+ require "cfruntime/parser/postgresql_parser"
6
+ require "cfruntime/parser/rabbitmq_parser"
7
+ require "cfruntime/parser/redis_parser"
@@ -0,0 +1,15 @@
1
+ module CFRuntime
2
+ class BlobParser
3
+ def self.parse(svc)
4
+ serviceopts = {}
5
+ { :username => :username,
6
+ :password => :password,
7
+ :hostname => :host,
8
+ :port => :port
9
+ }.each do |from, to|
10
+ serviceopts[to] = svc["credentials"][from.to_s]
11
+ end
12
+ serviceopts
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ module CFRuntime
2
+ class DefaultParser
3
+ # Default parsing behavior simply returns
4
+ # the passed-in map with all keys converted
5
+ # to symbols
6
+ def self.parse(svc)
7
+ symbolize_keys(svc)
8
+ end
9
+
10
+ private
11
+ def self.symbolize_keys(hash)
12
+ if hash.is_a? Hash
13
+ new_hash = {}
14
+ hash.each {|k, v| new_hash[k.to_sym] = symbolize_keys(v) }
15
+ new_hash
16
+ else
17
+ hash
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ module CFRuntime
2
+ class MongodbParser
3
+ def self.parse(svc)
4
+ serviceopts = {}
5
+ cred = svc["credentials"]
6
+ if cred["url"]
7
+ uri=URI.parse(cred["url"])
8
+ user=URI.unescape(uri.user) if uri.user
9
+ passwd=URI.unescape(uri.password) if uri.password
10
+ host=uri.host
11
+ port=uri.port
12
+ if uri.path =~ %r{^/(.*)}
13
+ raise ArgumentError.new("multiple segments in path of mongo URI: #{uri}") if $1.index('/')
14
+ db = URI.unescape($1)
15
+ end
16
+ url = cred["url"]
17
+ else
18
+ # The old credentials format with no URL
19
+ user,passwd,host,port, db = %w(username password hostname port db).map {|key|
20
+ cred[key]}
21
+ url = "mongodb://#{user}:#{passwd}@#{host}:#{port}/#{db}"
22
+ end
23
+ serviceopts[:username] = user
24
+ serviceopts[:password] = passwd
25
+ serviceopts[:host] = host
26
+ serviceopts[:port] = port
27
+ serviceopts[:url] = url
28
+ serviceopts[:db] = db
29
+ serviceopts
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,19 @@
1
+ module CFRuntime
2
+ class MysqlParser
3
+ def self.parse(svc)
4
+ serviceopts = {}
5
+ { :username => :username,
6
+ :password => :password,
7
+ :hostname => :host,
8
+ :port => :port,
9
+ :name => :database
10
+ }.each do |from, to|
11
+ serviceopts[to] = svc["credentials"][from.to_s]
12
+ end
13
+ serviceopts[:url] = svc["credentials"]["url"] ||
14
+ "mysql://#{serviceopts[:username]}:#{serviceopts[:password]}@" +
15
+ "#{serviceopts[:host]}:#{serviceopts[:port]}/#{serviceopts[:database]}"
16
+ serviceopts
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module CFRuntime
2
+ class PostgresqlParser
3
+ def self.parse(svc)
4
+ serviceopts = {}
5
+ { :username => :username,
6
+ :password => :password,
7
+ :hostname => :host,
8
+ :port => :port,
9
+ :name => :database
10
+ }.each do |from, to|
11
+ serviceopts[to] = svc["credentials"][from.to_s]
12
+ end
13
+ serviceopts[:url] = svc["credentials"]["url"] ||
14
+ "postgresql://#{serviceopts[:username]}:#{serviceopts[:password]}@" +
15
+ "#{serviceopts[:host]}:#{serviceopts[:port]}/#{serviceopts[:database]}"
16
+ serviceopts
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,34 @@
1
+ module CFRuntime
2
+ class RabbitmqParser
3
+ def self.parse(svc)
4
+ serviceopts = {}
5
+ cred = svc["credentials"]
6
+ vhost = cred["vhost"] || "/" #The RabbitMQ default vhost
7
+ if cred["url"]
8
+ # The new "srs" credentials format
9
+ uri=URI.parse(cred["url"])
10
+ user=URI.unescape(uri.user) if uri.user
11
+ passwd=URI.unescape(uri.password) if uri.password
12
+ host=uri.host
13
+ port=uri.port
14
+ if uri.path =~ %r{^/(.*)}
15
+ raise ArgumentError.new("multiple segments in path of amqp URI: #{uri}") if $1.index('/')
16
+ vhost = URI.unescape($1)
17
+ end
18
+ serviceopts[:url] = cred["url"]
19
+ else
20
+ # The "old" credentials format
21
+ user,passwd,host,port = %w(user pass hostname port).map {|key|
22
+ cred[key]}
23
+ serviceopts[:url] = "amqp://#{user}:#{passwd}@#{host}:#{port}"
24
+ serviceopts[:url] = "#{serviceopts[:url]}/#{vhost}" if vhost != "/"
25
+ end
26
+ serviceopts[:username] = user
27
+ serviceopts[:password] = passwd
28
+ serviceopts[:host] = host
29
+ serviceopts[:port] = port
30
+ serviceopts[:vhost] = vhost
31
+ serviceopts
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,19 @@
1
+ module CFRuntime
2
+ class RedisParser
3
+ def self.parse(svc)
4
+ serviceopts = {}
5
+ { :username => :username,
6
+ :password => :password,
7
+ :hostname => :host,
8
+ :port => :port,
9
+ :name => :database
10
+ }.each do |from, to|
11
+ serviceopts[to] = svc["credentials"][from.to_s]
12
+ end
13
+ serviceopts[:url] = svc["credentials"]["url"] ||
14
+ "redis://#{serviceopts[:username]}:#{serviceopts[:password]}@" +
15
+ "#{serviceopts[:host]}:#{serviceopts[:port]}/#{serviceopts[:database]}"
16
+ serviceopts
17
+ end
18
+ end
19
+ end
@@ -1,10 +1,9 @@
1
- module CFRuntime
2
-
3
- require 'uri'
4
- require File.join(File.dirname(__FILE__), 'okjson')
1
+ require "uri"
2
+ require "cfruntime/okjson"
3
+ require "cfruntime/parser"
5
4
 
5
+ module CFRuntime
6
6
  class CloudApp
7
-
8
7
  class << self
9
8
  # Returns true if this code is running on Cloud Foundry
10
9
  def running_in_cloud?()
@@ -29,54 +28,21 @@ module CFRuntime
29
28
  # of a specified type are found.
30
29
  def service_props(service_name)
31
30
  registered_svcs = {}
32
- if ENV['VCAP_SERVICES']
33
- svcs = CFRuntime::OkJson.decode(ENV['VCAP_SERVICES'])
34
- else
35
- svcs = {}
36
- end
31
+ svcs = ENV['VCAP_SERVICES'] ? CFRuntime::OkJson.decode(ENV['VCAP_SERVICES']) : {}
37
32
  svcs.each do |key,list|
38
33
  label, version = key.split('-')
34
+ begin
35
+ parser = Object.const_get("CFRuntime").const_get("#{label.capitalize}Parser")
36
+ rescue NameError
37
+ parser = Object.const_get("CFRuntime").const_get("DefaultParser")
38
+ end
39
39
  list.each do |svc|
40
40
  name = svc["name"]
41
41
  serviceopts = {}
42
42
  serviceopts[:label] = label
43
43
  serviceopts[:version] = version
44
44
  serviceopts[:name] = name
45
- cred = svc["credentials"]
46
- if label =~ /rabbitmq/
47
- if cred['url']
48
- #The RabbitMQ default vhost
49
- vhost = '/'
50
- # The new "srs" credentials format
51
- uri=URI.parse(cred['url'])
52
- user=URI.unescape(uri.user) if uri.user
53
- passwd=URI.unescape(uri.password) if uri.password
54
- host=uri.host
55
- port=uri.port
56
- if uri.path =~ %r{^/(.*)}
57
- raise ArgumentError.new("multiple segments in path of amqp URI: #{uri}") if $1.index('/')
58
- vhost = URI.unescape($1)
59
- end
60
- serviceopts[:url] = cred['url']
61
- else
62
- # The "old" credentials format
63
- user,passwd,host,port,vhost = %w(user pass hostname port vhost).map {|key|
64
- cred[key]}
65
- end
66
- serviceopts[:vhost] = vhost
67
- else
68
- user,passwd,host,port,dbname,db = %w(username password hostname port name db).map {|key|
69
- cred[key]}
70
- if label == "mongodb"
71
- serviceopts[:db] = db
72
- else
73
- serviceopts[:database] = dbname
74
- end
75
- end
76
- serviceopts[:username] = user
77
- serviceopts[:password] = passwd
78
- serviceopts[:host] = host
79
- serviceopts[:port] = port
45
+ serviceopts.merge!(parser.parse(svc))
80
46
  registered_svcs[name] = serviceopts
81
47
  if list.count == 1
82
48
  registered_svcs[label] = serviceopts
@@ -118,7 +84,5 @@ module CFRuntime
118
84
  service_names
119
85
  end
120
86
  end
121
-
122
87
  end
123
-
124
- end
88
+ end
@@ -1,3 +1,3 @@
1
1
  module CFRuntime
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cf-runtime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
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-07-31 00:00:00.000000000 Z
12
+ date: 2012-10-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
@@ -107,6 +107,22 @@ dependencies:
107
107
  - - ~>
108
108
  - !ruby/object:Gem::Version
109
109
  version: 0.2.7
110
+ - !ruby/object:Gem::Dependency
111
+ name: aws-s3
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.6.3
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.6.3
110
126
  - !ruby/object:Gem::Dependency
111
127
  name: rake
112
128
  requirement: !ruby/object:Gem::Requirement
@@ -214,10 +230,19 @@ files:
214
230
  - LICENSE
215
231
  - README.md
216
232
  - lib/cfruntime/amqp.rb
233
+ - lib/cfruntime/aws_s3.rb
217
234
  - lib/cfruntime/carrot.rb
218
235
  - lib/cfruntime/mongodb.rb
219
236
  - lib/cfruntime/mysql.rb
220
237
  - lib/cfruntime/okjson.rb
238
+ - lib/cfruntime/parser/blob_parser.rb
239
+ - lib/cfruntime/parser/default_parser.rb
240
+ - lib/cfruntime/parser/mongodb_parser.rb
241
+ - lib/cfruntime/parser/mysql_parser.rb
242
+ - lib/cfruntime/parser/postgresql_parser.rb
243
+ - lib/cfruntime/parser/rabbitmq_parser.rb
244
+ - lib/cfruntime/parser/redis_parser.rb
245
+ - lib/cfruntime/parser.rb
221
246
  - lib/cfruntime/postgres.rb
222
247
  - lib/cfruntime/properties.rb
223
248
  - lib/cfruntime/redis.rb