hpcloudmangler 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .rake*
data/.rvmrc ADDED
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
+ # development environment upon cd'ing into the directory
5
+
6
+ # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
7
+ # Only full ruby name is supported here, for short names use:
8
+ # echo "rvm use 1.9.3" > .rvmrc
9
+ environment_id="ruby-1.9.3-p374@hpcloudmangler"
10
+
11
+ # Uncomment the following lines if you want to verify rvm version per project
12
+ # rvmrc_rvm_version="1.18.5 (stable)" # 1.10.1 seams as a safe start
13
+ # eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
14
+ # echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
15
+ # return 1
16
+ # }
17
+
18
+ # First we attempt to load the desired environment directly from the environment
19
+ # file. This is very fast and efficient compared to running through the entire
20
+ # CLI and selector. If you want feedback on which environment was used then
21
+ # insert the word 'use' after --create as this triggers verbose mode.
22
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
23
+ && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
24
+ then
25
+ \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
26
+ [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
27
+ \. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
28
+ else
29
+ # If the environment file has not yet been created, use the RVM CLI to select.
30
+ rvm --create "$environment_id" || {
31
+ echo "Failed to create RVM environment '${environment_id}'."
32
+ return 1
33
+ }
34
+ fi
35
+
36
+ # If you use bundler, this might be useful to you:
37
+ if [[ -s Gemfile ]] && {
38
+ ! builtin command -v bundle >/dev/null ||
39
+ builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
40
+ }
41
+ then
42
+ printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
43
+ gem install bundler
44
+ fi
45
+ if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
46
+ then
47
+ bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
48
+ fi
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in hpcloudmangler.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Michael Surma
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Hpcloudmangler
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'hpcloudmangler'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install hpcloudmangler
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require "hpcloudmangler/cli"
3
+
4
+ HP::Cloud::Mangler::Cli.start
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'hpcloudmangler/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "hpcloudmangler"
8
+ spec.version = HP::Cloud::Mangler::VERSION
9
+ spec.authors = ["Michael Surma"]
10
+ spec.email = ["michael.surma@hp.com"]
11
+ spec.description = %q{Command line tool for dealing with HP Cloud resources.}
12
+ spec.summary = %q{Provides at a base level the ability to manage security groups for HP Cloud compute instances.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rest-client"
24
+ spec.add_runtime_dependency "thor"
25
+ spec.add_runtime_dependency "formatador"
26
+ spec.add_runtime_dependency "rest-client"
27
+ spec.add_runtime_dependency "multi_json"
28
+ spec.add_runtime_dependency "highline"
29
+ spec.add_runtime_dependency "io"
30
+ end
@@ -0,0 +1,150 @@
1
+ require 'hpcloudmangler'
2
+ require 'thor'
3
+ require 'multi_json'
4
+ require 'rest-client'
5
+ require 'formatador'
6
+ require 'pp'
7
+
8
+ module HP
9
+ module Cloud
10
+ module Mangler
11
+ class Cli < Thor
12
+ begin
13
+ require 'io/console'
14
+ rescue LoadError
15
+ end
16
+ @options = {}
17
+ @token = ''
18
+ default_task :list_tenants
19
+
20
+ desc "list_sec_groups", "Task to list available security groups. Requires a Tenant ID."
21
+ def list_sec_groups
22
+ @auth_opts = HP::Cloud::Mangler::Client.userdata
23
+ @token = authenticate(@auth_opts)
24
+ sg_list_url = generate_uri(@options[:hp_compute_uri], @auth_opts[:auth][:tenantId].to_s, @options[:suffix])
25
+ sg_list = call_rest_uri(sg_list_url, "get", @token[:access][:token][:id])
26
+ data = parse_resp(sg_list)
27
+ Formatador.display_table(data[:security_groups], [:id, :name, :description])
28
+ end
29
+ desc "create_sec_group", "Task to create a new security group"
30
+ def create_sec_group
31
+ auth= HP::Cloud::Mangler::Client.userdata
32
+ @token = authenticate(auth)
33
+ suffix = "os-security-groups"
34
+ create_sg_url = generate_uri(@options[:hp_compute_uri], auth[:auth][:tenantId].to_s, suffix)
35
+ sg_name = ask("Please provide a security group name (Example: my-sec-group): ")
36
+ sg_desc = ask("Please provide a security group description: ")
37
+ sg_data = { 'security_group' => { 'description' => sg_desc, 'name' => sg_name } }
38
+ begin
39
+ clientconnect = RestClient.post(
40
+ create_sg_url,
41
+ sg_data.to_json,
42
+ rest_header(@token[:access][:token][:id])
43
+ )
44
+ rescue RestClient::ExceptionWithResponse => e
45
+ puts "HTTP failed: #{e.http_code}: #{e.http_body}"
46
+ end
47
+ resp = MultiJson.decode(clientconnect, :symbolize_names => true)
48
+ tabledata = {:security_group => [ resp[:security_group] ] }
49
+ Formatador.display_table(tabledata[:security_group], [:tenant_id, :id, :name, :description])
50
+ end
51
+ desc "delete_sec_group", "Task to delete a security group"
52
+ method_option :groupid, :type => :numeric, :required => true, :desc => "Security Group ID"
53
+ def delete_sec_group
54
+ Process.exit unless options[:groupid]
55
+ suffix = "os-security-groups" + '/' + "#{options[:groupid]}"
56
+ auth= HP::Cloud::Mangler::Client.userdata
57
+ @token = authenticate(auth)
58
+ delete_sg_url = generate_uri(@options[:hp_compute_uri], auth[:auth][:tenantId].to_s, suffix)
59
+ begin
60
+ resp = RestClient.delete(delete_sg_url, rest_header(@token[:access][:token][:id]))
61
+ rescue RestClient::ExceptionWithResponse => e
62
+ puts "HTTP failed: #{e.http_code}: #{e.http_body}"
63
+ end
64
+ Formatador.display_line('[green]' + "Security group successfully deleted." + " <#{resp.code}>" + '[/]')
65
+ end
66
+ desc "add_sec_grp_to_sec_grp", "*** NOT IMPLEMENTED YET. Task for adding a security group to another security group"
67
+ def add_sec_grp_to_sec_grp
68
+
69
+ end
70
+ desc "list_tenants", "Task to list tenants available to a particular user"
71
+ def list_tenants
72
+ auth = HP::Cloud::Mangler::Client.userdata
73
+ @token = authenticate(auth)
74
+ tenants_list_url = generate_uri(@options[:hp_auth_uri], "tenants")
75
+ tenants_list = call_rest_uri(tenants_list_url, "get", @token[:access][:token][:id])
76
+ data = parse_resp(tenants_list)
77
+ pp tenants_list.code
78
+ Formatador.display_table(data[:tenants], [:id, :name, :description])
79
+ end
80
+ desc "list_sg_details", "Task to list the details for a security group"
81
+ method_option :groupid, :type => :numeric, :required => true, :desc => "Security Group ID"
82
+ def list_sg_details
83
+ Process.exit unless options[:groupid]
84
+ suffix = "os-security-groups" + '/' + "#{options[:groupid]}"
85
+ @auth_opts = HP::Cloud::Mangler::Client.userdata
86
+ @token = authenticate(@auth_opts)
87
+ sg_detail_url = generate_uri(@options[:hp_compute_uri], @auth_opts[:auth][:tenantId].to_s, suffix)
88
+ data = parse_resp(call_rest_uri(sg_detail_url, "get", @token[:access][:token][:id]))
89
+ Formatador.display_line
90
+ Formatador.display_line('[bold]' + "Rules for Security Group: " + data[:security_group][:name] + '[/]')
91
+ Formatador.display_table(data[:security_group][:rules], [:id, :from_port, :to_port, :ip_range])
92
+ end
93
+ desc "getauthtoken", "Task to get an HP Cloud auth token"
94
+ def getauthtoken
95
+ auth = HP::Cloud::Mangler::Client.userdata
96
+ @token = authenticate(auth)
97
+ pp @token[:access][:token][:id]
98
+ end
99
+ private
100
+ def authenticate(opts)
101
+ config_file = File.expand_path("~/pso-ops-tools/fog-utils/data/hpcs.json")
102
+ @options = HP::Cloud::Mangler::Settings.load!( config_file, {:suffix => 'os-security-groups'} )
103
+ auth_uri = generate_uri(@options[:hp_auth_uri], "tokens")
104
+ auth_response = call_rest_uri(auth_uri, "post", opts)
105
+ if auth_response.code == 200
106
+ Formatador.display_line('[green]' + "Authentication successful." + '[/]')
107
+ return parse_resp(auth_response)
108
+ else
109
+ Formatador.display_line('[red]' + "Authentication failed with a " + "#{auth_response.code} error code." +'[/]')
110
+ exit
111
+ end
112
+ end
113
+ def generate_uri (base, *tenant, suffix)
114
+ if tenant[0].nil? || tenant[0] == 0
115
+ return base + suffix
116
+ else
117
+ return base + tenant[0].to_s + '/' + suffix
118
+ end
119
+ end
120
+
121
+ def rest_header (*token)
122
+ if token[0].nil? || token[0] == 0
123
+ return {:content_type => :json, :accept => :json}
124
+ else
125
+ return {:content_type => :json, :accept => :json, 'X-Auth-Token' => token[0]}
126
+ end
127
+ end
128
+
129
+ def call_rest_uri (uri, request_type="get", *auth_creds)
130
+ if request_type =~ /get/
131
+ begin
132
+ return RestClient.get(uri, rest_header(auth_creds[0]))
133
+ rescue => e
134
+ e.response
135
+ end
136
+ elsif request_type =~ /post/
137
+ begin
138
+ return RestClient.post(uri, auth_creds.to_json, rest_header)
139
+ rescue => e
140
+ e.response
141
+ end
142
+ end
143
+ end
144
+ def parse_resp (response)
145
+ MultiJson.decode(response, :symbolize_names => true)
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,19 @@
1
+ module HP
2
+ module Cloud
3
+ module Mangler
4
+ module Client
5
+ require 'highline/import'
6
+ require 'rest-client'
7
+ extend self
8
+ @_creds = {:auth => {:passwordCredentials => {:username => '', :password => ''}, :tenantId => '',},}
9
+ def userdata
10
+ default_tenant_id = 48875247310267
11
+ @_creds[:auth][:passwordCredentials][:username] = ask("Please enter your username: ", String) {|q| q.validate = /\w+/}
12
+ @_creds[:auth][:passwordCredentials][:password] = ask("Enter your password: ", String) { |q| q.echo = false }
13
+ @_creds[:auth][:tenantId] = ask("Please enter a tenant id: ", Integer) { |q| q.default = default_tenant_id.to_s }
14
+ return @_creds
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ module HP
2
+ module Cloud
3
+ module Mangler
4
+ class Config
5
+ attr_accessor :config_hash, :settings_path, :target
6
+
7
+ def initialize(options={})
8
+ @settings_path = File.expand_path(HP::Cloud::Mangler::DEFAULT_CONFIG_PATH)
9
+ @target = options[:target] || HP::Cloud::Mangler::DEFAULT_TARGET
10
+ @config_hash = HP::Cloud::Mangler::Settings.load! || {}
11
+ end
12
+
13
+ def tokens
14
+ config_hash["tokens"] || {}
15
+ end
16
+
17
+ def update(attr, value)
18
+ if attr == :tokens
19
+ config_hash["tokens"] = tokens.merge({ target => value })
20
+ else
21
+ config_hash[attr.to_s] = value
22
+ end
23
+
24
+ File.open(settings_path, 'w') do |out|
25
+ YAML.dump(config_hash, out)
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def load_settings
32
+ File.exists?(settings_path) ? YAML.load_file(settings_path) : nil
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,19 @@
1
+ module HP
2
+ module Cloud
3
+ module Mangler
4
+ module Settings
5
+ require 'multi_json'
6
+ extend self
7
+
8
+ @_settings = {}
9
+ attr_reader :_settings
10
+ # This is the main point of entry - we call Settings.load! and provide
11
+ # a name of the file to read as it's argument. We can also pass in some
12
+ # options.
13
+ def load!(filename, options = {})
14
+ @_settings = MultiJson.decode(IO.read(filename), :symbolize_names => true).merge options
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ module HP
2
+ module Cloud
3
+ module Mangler
4
+ VERSION = "0.0.4"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ require "hpcloudmangler/version"
2
+ require "hpcloudmangler/settings"
3
+ require "hpcloudmangler/client"
4
+ require "hpcloudmangler/config"
5
+
6
+ module HP
7
+ module Cloud
8
+ module Mangler
9
+ DEFAULT_CONFIG_PATH = "~/.hpcloudmangler/data".freeze
10
+ DEFAULT_TARGET = "hpcloud_cache"
11
+ # Your code goes here...
12
+ end
13
+ end
14
+ end
15
+
16
+
17
+
metadata ADDED
@@ -0,0 +1,212 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hpcloudmangler
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michael Surma
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rest-client
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: thor
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: formatador
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rest-client
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: multi_json
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: highline
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: io
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ description: Command line tool for dealing with HP Cloud resources.
159
+ email:
160
+ - michael.surma@hp.com
161
+ executables:
162
+ - hpcloudmangler
163
+ extensions: []
164
+ extra_rdoc_files: []
165
+ files:
166
+ - .gitignore
167
+ - .rvmrc
168
+ - Gemfile
169
+ - LICENSE.txt
170
+ - README.md
171
+ - Rakefile
172
+ - bin/hpcloudmangler
173
+ - hpcloudmangler.gemspec
174
+ - lib/hpcloudmangler.rb
175
+ - lib/hpcloudmangler/cli.rb
176
+ - lib/hpcloudmangler/client.rb
177
+ - lib/hpcloudmangler/config.rb
178
+ - lib/hpcloudmangler/settings.rb
179
+ - lib/hpcloudmangler/version.rb
180
+ homepage: ''
181
+ licenses:
182
+ - MIT
183
+ post_install_message:
184
+ rdoc_options: []
185
+ require_paths:
186
+ - lib
187
+ required_ruby_version: !ruby/object:Gem::Requirement
188
+ none: false
189
+ requirements:
190
+ - - ! '>='
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ segments:
194
+ - 0
195
+ hash: 4589646534006710409
196
+ required_rubygems_version: !ruby/object:Gem::Requirement
197
+ none: false
198
+ requirements:
199
+ - - ! '>='
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ segments:
203
+ - 0
204
+ hash: 4589646534006710409
205
+ requirements: []
206
+ rubyforge_project:
207
+ rubygems_version: 1.8.25
208
+ signing_key:
209
+ specification_version: 3
210
+ summary: Provides at a base level the ability to manage security groups for HP Cloud
211
+ compute instances.
212
+ test_files: []