cf_ruby_client 0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bb88cdcfbf1e3f243eeac061f2e1aaeb38306052
4
+ data.tar.gz: 0e0cfea9483a2e2b0e6499a442db477bc053ecdd
5
+ SHA512:
6
+ metadata.gz: a0ec5b7b0c9a4986d5f0c99a888a548111b63aee272eb1c05869da1a45cc7f2dcbd556801e2e7168c449ab6bdb4dae9f30df3a55a18cf9c86b18ed4808d3eceb
7
+ data.tar.gz: 30837d40d690a58999784241f39575510432478976c63c9dff37d4279a66f3837c918400c5abb9c060f4f627fb66790e2e946066fa86207ded2dad2f7d305237
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /*.gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.4
4
+ before_install: gem install bundler -v 1.11.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cf_ruby_client.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # cf_ruby_client
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ ```ruby
8
+ gem 'cf_ruby_client'
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```
14
+ CfRubyClient.configure(
15
+ api_endpoint: 'http://api.10.244.0.34.xip.io',
16
+ uaa_endpoint: 'http://uaa.10.244.0.34.xip.io',
17
+ username: 'admin',
18
+ password: 'admin',
19
+ passcode: 'admin'
20
+ )
21
+ ```
22
+
23
+ ```
24
+ app = CfRubyClient::App.new("guid")
25
+ app.instances
26
+ ```
27
+
28
+ ## Development
29
+
30
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
31
+
32
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
33
+
34
+ ## Contributing
35
+
36
+ Bug reports and pull requests are welcome on GitHub at https://github.com/a9hcp/cf_ruby_client.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
7
+
8
+ Dir.glob('tasks/**/*.rake').each(&method(:import))
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "cf_ruby_client"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cf_ruby_client/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "cf_ruby_client"
8
+ spec.version = CfRubyClient::VERSION
9
+ spec.authors = ["Michael Both", "Lucas Pinto"]
10
+ spec.email = ["mboth@avarteq.de", "pinto@avarteq.de"]
11
+
12
+ spec.summary = %q{Gem for interacting with CF cloud controller API}
13
+ spec.description = %q{This gem may be used in rails apps for interacting with CF cloud controller API.}
14
+ spec.homepage = "https://github.com/anynines/cf_ruby_client"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "cf-uaa-lib", "~> 3.9"
22
+ spec.add_dependency "rest-client", "~> 2.0"
23
+
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.11"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "rspec", "~> 3.0"
28
+ spec.add_development_dependency "ffaker", "~> 2.2"
29
+ spec.add_development_dependency "sinatra", "~> 1.4"
30
+ spec.add_development_dependency "webmock", "~> 1.22"
31
+ end
@@ -0,0 +1,33 @@
1
+ module CfRubyClient
2
+ class App < Base
3
+ STARTED_STATE = "STARTED"
4
+
5
+ def self.all
6
+ url_path = "/v2/apps"
7
+ JSON::parse(CfRubyClient::Base.new.fetch_entities(url_path))
8
+ end
9
+
10
+ attr_reader :guid
11
+
12
+ def initialize(guid)
13
+ @guid = guid
14
+ end
15
+
16
+ def instances
17
+ return [] unless started?
18
+
19
+ url_path = "/v2/apps/#{guid}/instances"
20
+ JSON::parse(fetch_entities(url_path)).keys.map do |index|
21
+ AppInstance.new(guid, index)
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def started?
28
+ url_path = "/v2/apps/#{guid}"
29
+ app_json = JSON::parse(fetch_entities(url_path))
30
+ app_json["entity"]["state"] == STARTED_STATE
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ module CfRubyClient
2
+ class AppInstance < Base
3
+
4
+ attr_reader :app_guid, :index
5
+
6
+ def initialize(guid, index)
7
+ @app_guid = guid
8
+ @index = index
9
+ end
10
+
11
+ def restart
12
+ url_path = "/v2/apps/#{app_guid}/instances/#{index}"
13
+ delete_entity(url_path)
14
+ end
15
+
16
+ def status
17
+ url_path = "/v2/apps/#{app_guid}/instances"
18
+ JSON::parse(fetch_entities(url_path))[index.to_s]
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,121 @@
1
+ module CfRubyClient
2
+ class Base
3
+
4
+ def api_endpoint
5
+ cloud_foundry_config.api_endpoint
6
+ end
7
+
8
+ def uaa_endpoint
9
+ cloud_foundry_config.uaa_endpoint
10
+ end
11
+
12
+ def authorization_string
13
+ @authorization_string ||= Login.new.authorization_string
14
+ end
15
+
16
+ def resource(url)
17
+ RestClient::Resource.new(
18
+ api_endpoint + url,
19
+ headers: headers_hash,
20
+ verify_ssl: cloud_foundry_config.skip_ssl_validation ? OpenSSL::SSL::VERIFY_NONE : OpenSSL::SSL::VERIFY_PEER
21
+ )
22
+ end
23
+
24
+ def fetch_entities(url)
25
+ logger.info "cf_ruby_client: GETting: #{url.inspect}"
26
+ resource(url).get(:Authorization => authorization_string) do |response, request, result, &block|
27
+ case response.code
28
+ when 200
29
+ response
30
+ when 404
31
+ logger.warn "cf_ruby_client: not found"
32
+ "{}"
33
+ else
34
+ logger.error "cf_ruby_client: Received: #{response.inspect}"
35
+ response.return!(&block)
36
+ end
37
+ end
38
+ end
39
+
40
+ def delete_entity(url)
41
+ logger.info "cf_ruby_client: DELETEing: #{url.inspect}"
42
+ resource(url).delete(:Authorization => authorization_string) do |response, request, result, &block|
43
+ case response.code
44
+ when 204
45
+ true
46
+ when 404
47
+ logger.warn "cf_ruby_client: not found"
48
+ false
49
+ else
50
+ logger.error "cf_ruby_client: Received: #{response.inspect}"
51
+ response.return!(&block)
52
+ end
53
+ end
54
+ end
55
+
56
+ def post_entity(url, body = nil)
57
+ logger.info "cf_ruby_client: POSTing: #{url}, body: #{body.inspect}"
58
+ resource(url).post(body.to_json, :Authorization => authorization_string) do |response, request, result, &block|
59
+ case response.code
60
+ when 200
61
+ true
62
+ when 404
63
+ logger.warn "cf_ruby_client: not found"
64
+ false
65
+ else
66
+ logger.error "cf_ruby_client: Received: #{response.inspect}"
67
+ response.return!(&block)
68
+ end
69
+ end
70
+ end
71
+
72
+ def patch_entity(url, body = nil)
73
+ logger.info "cf_ruby_client: PATCHing: #{url}, body: #{body.inspect}"
74
+ resource(url).patch(body.to_json, :Authorization => authorization_string) do |response, request, result, &block|
75
+ case response.code
76
+ when 200
77
+ true
78
+ when 404
79
+ logger.warn "cf_ruby_client: not found"
80
+ false
81
+ else
82
+ logger.error "cf_ruby_client: Received: #{response.inspect}"
83
+ response.return!(&block)
84
+ end
85
+ end
86
+ end
87
+
88
+ def put_entity(url, body = nil)
89
+ logger.info "cf_ruby_client: PUTting: #{url}, body: #{body.inspect}"
90
+ resource(url).put(body.to_json, :Authorization => authorization_string) do |response, request, result, &block|
91
+ case response.code
92
+ when 201
93
+ true
94
+ when 404
95
+ logger.warn "cf_ruby_client: not found"
96
+ false
97
+ else
98
+ logger.error "cf_ruby_client: Received: #{response.inspect}"
99
+ response.return!(&block)
100
+ end
101
+ end
102
+ end
103
+
104
+ def logger
105
+ ::CfRubyClient.logger
106
+ end
107
+
108
+ def cloud_foundry_config
109
+ ::CfRubyClient.configuration
110
+ end
111
+
112
+ private
113
+
114
+ def headers_hash
115
+ {
116
+ 'Accept' => 'application/json',
117
+ 'Content-Type' => 'application/json'
118
+ }
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,14 @@
1
+ module CfRubyClient
2
+ class << self
3
+ attr_accessor :configuration, :logger
4
+ end
5
+
6
+ def self.configure(options={})
7
+ [:api_endpoint, :uaa_endpoint, :username, :password, :passcode].each do |required_argument|
8
+ raise ArgumentError.new("Configuration #{required_argument} required") if options[required_argument].nil?
9
+ end
10
+ options[:skip_ssl_validation] ||= false
11
+ self.logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
12
+ self.configuration = OpenStruct.new(options)
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ module CfRubyClient
2
+ class Login < Base
3
+
4
+ def authorization_string
5
+ token.info["token_type"] + " " + token.info["access_token"]
6
+ end
7
+
8
+ def token
9
+ @token ||= begin
10
+ token_issuer = CF::UAA::TokenIssuer.new(
11
+ uaa_endpoint,
12
+ "cf",
13
+ nil,
14
+ skip_ssl_validation: cloud_foundry_config.skip_ssl_validation
15
+ )
16
+ token_issuer.owner_password_grant(
17
+ username: cloud_foundry_config.username,
18
+ password: cloud_foundry_config.password
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,110 @@
1
+ module CfRubyClient
2
+ class ServiceInstance < Base
3
+ SECURITY_GROUPS_PATH = "/v2/security_groups"
4
+ SERVICE_INSTANCES_PATH = "/v2/service_instances"
5
+ APP_RESTARTING_PATH = "/apps/restart_all/bound_to"
6
+
7
+ # TODO: make this configurable
8
+ NAME_PREFIX = "guard_"
9
+
10
+ def self.all
11
+ url_path = "#{SERVICE_INSTANCES_PATH}"
12
+ JSON::parse(CfRubyClient::Base.new.fetch_entities(url_path))
13
+ end
14
+
15
+ attr_reader :service_instance_guid
16
+
17
+ def initialize(service_instance_guid)
18
+ @service_instance_guid = service_instance_guid
19
+ end
20
+
21
+ def instance
22
+ url_path = "#{SERVICE_INSTANCES_PATH}/#{service_instance_guid}"
23
+
24
+ JSON::parse(fetch_entities(url_path))
25
+ end
26
+
27
+ def space_guid
28
+ return nil if instance.nil? or instance.empty?
29
+ instance["entity"]["space_guid"]
30
+ end
31
+
32
+ def service_bindings
33
+ url_path = "#{SERVICE_INSTANCES_PATH}/#{service_instance_guid}/service_bindings"
34
+
35
+ JSON::parse(fetch_entities(url_path))
36
+ end
37
+
38
+ def app_guids
39
+ return [] if service_bindings.nil? or service_bindings.empty?
40
+ service_bindings["resources"].map { |entry| entry["entity"]["app_guid"] }
41
+ end
42
+
43
+ def security_group_guid
44
+ return nil if security_group.empty?
45
+ security_group[:guid]
46
+ end
47
+
48
+ # restarts all applications running on Cloud Foundry which are bound to the
49
+ # service instance passed in the initializer.
50
+ def restart_apps
51
+ url = "#{APP_RESTARTING_PATH}/#{service_instance_guid}"
52
+
53
+ post_entity(url)
54
+ end
55
+
56
+ # gets the security group from the cloud controller associated with the service
57
+ # instance
58
+ def security_group(name)
59
+ url_path = "#{SECURITY_GROUPS_PATH}?q=name:#{name}"
60
+
61
+ extract_security_group(JSON::parse(fetch_entities(url_path)))
62
+ end
63
+
64
+ def create_security_group(body)
65
+ logger.debug "cf_ruby_client: Creating Security Group in the Cloud Controller"
66
+ url = SECURITY_GROUPS_PATH
67
+
68
+ post_entity(url, body)
69
+ end
70
+
71
+ def update_security_group(body, security_group_guid)
72
+ logger.debug "cf_ruby_client: Updating Security Group in the Cloud Controller"
73
+
74
+ url = "#{SECURITY_GROUPS_PATH}/#{security_group_guid}"
75
+
76
+ put_entity(url, body)
77
+ end
78
+
79
+ def delete_security_group(security_group_guid)
80
+ logger.debug "cf_ruby_client: Deleting Security Group in the Cloud Controller"
81
+
82
+ url = "#{SECURITY_GROUPS_PATH}/#{security_group_guid}"
83
+
84
+ delete_entity(url)
85
+ end
86
+
87
+ private
88
+
89
+ def extract_security_group(security_groups)
90
+ logger.debug "cf_ruby_client: Extracting Security Group from: #{security_groups}"
91
+ if security_groups["total_results"] == 0
92
+ return {}
93
+ else
94
+ sanitize_security_group(security_groups["resources"][0])
95
+ end
96
+ end
97
+
98
+ def sanitize_security_group(security_group)
99
+ logger.debug("cf_ruby_client: Sanitizing: #{security_group}")
100
+ # copy guids and space guids into the entity
101
+ entity = security_group["entity"]
102
+ entity["guid"] = security_group["metadata"]["guid"]
103
+ entity["space_guids"] = security_group["metadata"]["space_guids"]
104
+ entity && entity.keep_if do |key, _|
105
+ [:name, :rules, :guid, :space_guid].include? key.to_sym
106
+ end
107
+ end
108
+ end
109
+ end
110
+
@@ -0,0 +1,28 @@
1
+ module CfRubyClient
2
+ class Space < Base
3
+
4
+ def self.all
5
+ url_path = "/v2/spaces"
6
+ JSON::parse(CfRubyClient::Base.new.fetch_entities(url_path))
7
+ end
8
+
9
+ attr_reader :guid
10
+
11
+ def initialize(guid)
12
+ @guid = guid
13
+ end
14
+
15
+ def apps
16
+ url_path = "/v2/spaces/#{guid}/apps"
17
+ JSON::parse(fetch_entities(url_path))
18
+ end
19
+
20
+ def app_guids
21
+ if not(apps.nil? or apps.empty?)
22
+ apps["resources"].collect {|entry| entry["metadata"]["guid"]}
23
+ else
24
+ []
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ module CfRubyClient
2
+ VERSION = "0.6"
3
+ end
@@ -0,0 +1,19 @@
1
+ require "rest-client"
2
+ require 'uaa'
3
+
4
+ require "cf_ruby_client/version"
5
+
6
+ require "cf_ruby_client/configuration.rb"
7
+ require "cf_ruby_client/base.rb"
8
+ require "cf_ruby_client/login.rb"
9
+ require "cf_ruby_client/app.rb"
10
+ require "cf_ruby_client/app_instance.rb"
11
+ require "cf_ruby_client/service_instance.rb"
12
+ require "cf_ruby_client/space.rb"
13
+
14
+
15
+ module CfRubyClient
16
+ def version
17
+ VERSION
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,177 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cf_ruby_client
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.6'
5
+ platform: ruby
6
+ authors:
7
+ - Michael Both
8
+ - Lucas Pinto
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2017-05-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: cf-uaa-lib
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '3.9'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '3.9'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rest-client
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '2.0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '2.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.11'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.11'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '10.0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '10.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '3.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '3.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: ffaker
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '2.2'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '2.2'
98
+ - !ruby/object:Gem::Dependency
99
+ name: sinatra
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.4'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1.4'
112
+ - !ruby/object:Gem::Dependency
113
+ name: webmock
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '1.22'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '1.22'
126
+ description: This gem may be used in rails apps for interacting with CF cloud controller
127
+ API.
128
+ email:
129
+ - mboth@avarteq.de
130
+ - pinto@avarteq.de
131
+ executables: []
132
+ extensions: []
133
+ extra_rdoc_files: []
134
+ files:
135
+ - ".gitignore"
136
+ - ".rspec"
137
+ - ".travis.yml"
138
+ - Gemfile
139
+ - README.md
140
+ - Rakefile
141
+ - bin/console
142
+ - bin/setup
143
+ - cf_ruby_client.gemspec
144
+ - lib/cf_ruby_client.rb
145
+ - lib/cf_ruby_client/app.rb
146
+ - lib/cf_ruby_client/app_instance.rb
147
+ - lib/cf_ruby_client/base.rb
148
+ - lib/cf_ruby_client/configuration.rb
149
+ - lib/cf_ruby_client/login.rb
150
+ - lib/cf_ruby_client/service_instance.rb
151
+ - lib/cf_ruby_client/space.rb
152
+ - lib/cf_ruby_client/version.rb
153
+ homepage: https://github.com/anynines/cf_ruby_client
154
+ licenses: []
155
+ metadata: {}
156
+ post_install_message:
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ requirements: []
171
+ rubyforge_project:
172
+ rubygems_version: 2.5.1
173
+ signing_key:
174
+ specification_version: 4
175
+ summary: Gem for interacting with CF cloud controller API
176
+ test_files: []
177
+ has_rdoc: