softlayer-report-cli 0.2.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7b038ab57c48cd72de0980ba48501b8304ba2e4e
4
+ data.tar.gz: ecf1c0152693d59d7c579fa3b4080c1224eef106
5
+ SHA512:
6
+ metadata.gz: f3c675c38caf44728709d4c29512c644d03fd753f6312932f20116df3ea3582b809390c1641d29ba4b24a9370becc09628ac70971868b408d6480660170fae33
7
+ data.tar.gz: 7176472855bd6a8c10803d811884ba23c48648152b3a2b1960cb58ee76e4bdabea2c79193bf44df5392638f5562be8c2986dd412772b0798231d0dfb40f3bf6e
@@ -0,0 +1,30 @@
1
+ Gemfile.lock
2
+ .env
3
+ .DS_Store
4
+ .last_rev
5
+ *.sublime-*
6
+ vendor/bundle
7
+ vendor/cache
8
+ *.gem
9
+ *.rbc
10
+ .config
11
+ .yardoc
12
+ InstalledFiles
13
+ _yardoc
14
+ coverage
15
+ doc/
16
+ lib/bundler/man
17
+ pkg
18
+ rdoc
19
+ spec/reports
20
+ test/tmp
21
+ test/version_tmp
22
+ tmp
23
+ *.so
24
+ *.o
25
+ *.a
26
+ mkmf.log
27
+ .vagrant
28
+ logs
29
+ .idea
30
+ .bundle/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Renier Morales
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,131 @@
1
+ Generic CLI written in Ruby for SoftLayer. Currently only supports account reporting and system cancellation.
2
+
3
+ Supports various filtering and searching parameters, as well as multiple output formats (plain text,
4
+ CSV, JSON).
5
+
6
+ ## Examples
7
+
8
+ $ softlayer report -s datacenter:hou02 domain:foo.mydomain.com
9
+ +----------+---------------+--------------------------------+---------------+------------+-------+----------+---------+---------------------+
10
+ | ID | TYPE | HOSTNAME | IP | DATACENTER | COST | USERNAME | NAME | EMAIL |
11
+ +----------+---------------+--------------------------------+---------------+------------+-------+----------+---------+---------------------+
12
+ | 10756577 | VirtualServer | spzabclcent1.foo.mydomain.com | 10.193.91.62 | Houston 2 | 30.24 | joedoe | Joe Doe | joedoe@mydomain.com |
13
+ | 10756579 | VirtualServer | spzabclcent2.foo.mydomain.com | 10.173.58.246 | Houston 2 | 30.24 | joedoe | Joe Doe | joedoe@mydomain.com |
14
+ | 10390509 | VirtualServer | spzabclrhel71.foo.mydomain.com | 10.193.67.91 | Houston 2 | 74.16 | joedoe | Joe Doe | joedoe@mydomain.com |
15
+ | 10390511 | VirtualServer | spzabclrhel72.foo.mydomain.com | 10.193.67.72 | Houston 2 | 74.16 | joedoe | Joe Doe | joedoe@mydomain.com |
16
+ +----------+---------------+--------------------------------+---------------+------------+-------+----------+---------+---------------------+
17
+
18
+ $ softlayer report -s datacenter:hou02 domain:foo.mydomain.com -f json | jq
19
+ [
20
+ {
21
+ "cost": 30.24,
22
+ "datacenter": "Houston 2",
23
+ "email": "joedoe@mydomain.com",
24
+ "hostname": "spzabclcent1.foo.mydomain.com",
25
+ "id": 10756577,
26
+ "ip": "173.193.91.62",
27
+ "name": "Joe Doe",
28
+ "type": "VirtualServer",
29
+ "username": "joedoe"
30
+ },
31
+ {
32
+ "cost": 30.24,
33
+ "datacenter": "Houston 2",
34
+ "email": "joedoe@mydomain.com",
35
+ "hostname": "spzabclcent2.foo.mydomain.com",
36
+ "id": 10756579,
37
+ "ip": "184.173.58.246",
38
+ "name": "Joe Doe",
39
+ "type": "VirtualServer",
40
+ "username": "joedoe"
41
+ },
42
+ {
43
+ "cost": 74.16,
44
+ "datacenter": "Houston 2",
45
+ "email": "joedoe@mydomain.com",
46
+ "hostname": "spzabclrhel71.foo.mydomain.com",
47
+ "id": 10390509,
48
+ "ip": "173.193.67.91",
49
+ "name": "Joe Doe",
50
+ "type": "VirtualServer",
51
+ "username": "joedoe"
52
+ },
53
+ {
54
+ "cost": 74.16,
55
+ "datacenter": "Houston 2",
56
+ "email": "joedoe@mydomain.com",
57
+ "hostname": "spzabclrhel72.foo.mydomain.com",
58
+ "id": 10390511,
59
+ "ip": "173.193.67.72",
60
+ "name": "Joe Doe",
61
+ "type": "VirtualServer",
62
+ "username": "joedoe"
63
+ }
64
+ ]
65
+
66
+ $ softlayer report -s datacenter:hou02 domain:foo.mydomain.com -f csv
67
+ ID,TYPE,HOSTNAME,IP,DATACENTER,COST,USERNAME,NAME,EMAIL
68
+ 10756577,VirtualServer,spzabclcent1.foo.mydomain.com,173.193.91.62,Houston 2,30.24,joedoe,Joe Doe,joedoe@mydomain.com
69
+ 10756579,VirtualServer,spzabclcent2.foo.mydomain.com,184.173.58.246,Houston 2,30.24,joedoe,Joe Doe,joedoe@mydomain.com
70
+ 10390509,VirtualServer,spzabclrhel71.foo.mydomain.com,173.193.67.91,Houston 2,74.16,joedoe,Joe Doe,joedoe@mydomain.com
71
+ 10390511,VirtualServer,spzabclrhel72.foo.mydomain.com,173.193.67.72,Houston 2,74.16,joedoe,Joe Doe,joedoe@mydomain.com
72
+
73
+ $ softlayer report -s datacenter:hou02 domain:foo.mydomain.com -c id ip hostname name
74
+ +----------+--------------------------------+---------------+---------+
75
+ | ID | IP | HOSTNAME | NAME |
76
+ +----------+--------------------------------+---------------+---------+
77
+ | 10756577 | spzabclcent1.foo.mydomain.com | 10.193.91.62 | Joe Doe |
78
+ | 10756579 | spzabclcent2.foo.mydomain.com | 10.173.58.246 | Joe Doe |
79
+ | 10390509 | spzabclrhel71.foo.mydomain.com | 10.193.67.91 | Joe Doe |
80
+ | 10390511 | spzabclrhel72.foo.mydomain.com | 10.193.67.72 | Joe Doe |
81
+ +----------+--------------------------------+---------------+---------+
82
+
83
+ ## Installation
84
+
85
+ **Requires Ruby installed and the bundler gem**
86
+
87
+ Currently, this is not yet in rubygems. Follow these steps to get it installed for now:
88
+
89
+ git clone https://github.com/renier/softlayer-report-cli.git
90
+ cd softlayer-report-cli.git
91
+ bundle install
92
+ bundle exec rake build
93
+ gem install pkg/*.gem
94
+
95
+ ## Usage
96
+
97
+ $ softlayer help
98
+ Commands:
99
+ softlayer cancel ID ... # cancel a softlayer system or systems by ID
100
+ softlayer help [COMMAND] # Describe available commands or one specific command
101
+ softlayer report # print a softlayer account report
102
+
103
+ $ softlayer help report
104
+ Usage:
105
+ softlayer report
106
+
107
+ Options:
108
+ -u, [--username=USERNAME] # SoftLayer username
109
+ -p, [--api-key=API_KEY] # SoftLayer api key
110
+ -c, [--columns=one two three] # List of columns to display
111
+ # Default: id type hostname ip datacenter cost username name email
112
+ -s, [--search=key:value] # Search filters (e.g. datacenter:wdc01 domain:foobar.com)
113
+ -f, [--format=FORMAT] # Output format
114
+ # Default: plain
115
+ # Possible values: plain, csv, json
116
+ -o, [--output-file=OUTPUT_FILE] # Path to output file (default: stdout)
117
+
118
+ print a softlayer account report
119
+
120
+ $ softlayer help cancel
121
+ Usage:
122
+ softlayer cancel ID
123
+
124
+ cancel a softlayer system by ID
125
+
126
+ Credentials can also be provided with a configuration file at _~/.softlayer_. See [softlayer-ruby](https://github.com/softlayer/softlayer-ruby/blob/master/lib/softlayer/Config.rb#L11) for details.
127
+
128
+ ## License
129
+
130
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
131
+
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'softlayer/cli'
5
+
6
+ SoftLayer::CLI.start(ARGV)
@@ -0,0 +1,162 @@
1
+ require 'softlayer_api'
2
+ require 'thor'
3
+ require 'softlayer/cli/version'
4
+ require 'softlayer/cli/formatter'
5
+
6
+ class Hash
7
+ def symbolize_keys!
8
+ keys.each do |key|
9
+ self[(key.to_sym rescue key) || key] = delete(key)
10
+ end
11
+ end
12
+ end
13
+
14
+ module SoftLayer
15
+ class CLI < Thor
16
+ OUTPUT_TYPES = %w[plain csv json]
17
+ COLUMNS = %w[id type hostname ip datacenter cost username name email provision_date]
18
+ OBJECT_MASK =
19
+ 'mask[billingItem[cancellationDate,recurringFee,hourlyRecurringFee,'\
20
+ 'activeAssociatedChildren[recurringFee,hourlyRecurringFee],'\
21
+ 'orderItem[order[userRecord[username,email,firstName,lastName]]]]]'
22
+
23
+ desc 'report', 'print a softlayer account report'
24
+ option :username,
25
+ type: :string, desc: 'SoftLayer username', aliases: '-u'
26
+ option :api_key,
27
+ type: :string, desc: 'SoftLayer api key', aliases: '-p'
28
+ option :columns,
29
+ type: :array, desc: 'List of columns to display',
30
+ default: COLUMNS.join(' '), aliases: '-c'
31
+ option :search,
32
+ type: :hash, desc: 'Search filters (e.g. datacenter:wdc01 domain:foobar.com)',
33
+ aliases: '-s'
34
+ option :format,
35
+ type: :string, desc: "Output format",
36
+ default: 'plain', enum: OUTPUT_TYPES, aliases: '-f'
37
+ option :output_file,
38
+ type: :string, desc: 'Path to output file (default: stdout)', aliases: '-o'
39
+ def report
40
+ # Create the softlayer client
41
+ client_opts = {}
42
+ client_opts[:username] = options['username'] if options['username']
43
+ client_opts[:api_key] = options['api_key'] if options['api_key']
44
+ SoftLayer::Client.default_client = SoftLayer::Client.new(client_opts)
45
+
46
+ search_opts = options['search'] ? {}.merge(options['search']) : {}
47
+ search_opts.symbolize_keys!
48
+ search_opts[:object_mask] = OBJECT_MASK
49
+ search_opts[:result_limit] = { offset: 0, limit: 150 }
50
+
51
+ column_opts = COLUMNS
52
+ column_opts = options['columns'] if options['columns'].is_a? Array
53
+
54
+ # Generate table
55
+ rows = []
56
+ %w[BareMetalServer VirtualServer].each do |class_name| # Do for both VMs and physical servers
57
+ loop do
58
+ servers = SoftLayer.const_get(class_name).find_servers(search_opts)
59
+ servers.each do |server|
60
+ # Ignore disconnected servers
61
+ next if server.respond_to?(:status) && server.status == 'DISCONNECTED'
62
+ # Ignore cancelled servers
63
+ cancellation_date = server['billingItem'] && server['billingItem']['cancellationDate']
64
+ next unless cancellation_date.nil? || cancellation_date.strip.empty?
65
+
66
+ # Gather column data
67
+ row = []
68
+ row << server.id if column_opts.include? 'id'
69
+ row << class_name if column_opts.include? 'type'
70
+ row << server.fqdn if column_opts.include? 'hostname'
71
+ row << (server['primaryIpAddress'] || server['primaryBackendIpAddress']) if column_opts.include? 'ip'
72
+ row << server['datacenter']['longName'] if column_opts.include? 'datacenter'
73
+
74
+ if server['billingItem']
75
+ cost = server['billingItem']['recurringFee'].to_f
76
+ if (server['billingItem']['hourlyRecurringFee'] &&
77
+ !server['billingItem']['hourlyRecurringFee'].strip.empty?)
78
+ cost = server['billingItem']['hourlyRecurringFee'].to_f * 24 * 30
79
+ end
80
+ server['billingItem']['activeAssociatedChildren'].each do |child|
81
+ if child['hourlyRecurringFee'] && !child['hourlyRecurringFee'].strip.empty?
82
+ cost += (child['hourlyRecurringFee'].to_f * 24 * 30)
83
+ else
84
+ cost += child['recurringFee'].to_f
85
+ end
86
+ end
87
+ row << cost.round(2) if column_opts.include? 'cost'
88
+
89
+ user_record = server['billingItem']['orderItem']['order']['userRecord']
90
+ row << user_record['username'] if column_opts.include? 'username'
91
+ row << "#{user_record['firstName']} #{user_record['lastName']}" if column_opts.include? 'name'
92
+ row << user_record['email'] if column_opts.include? 'email'
93
+ else # Allow report to continue even when no billing item is found
94
+ row << '' if column_opts.include? 'cost'
95
+ row << '' if column_opts.include? 'username'
96
+ row << '' if column_opts.include? 'name'
97
+ row << '' if column_opts.include? 'email'
98
+ end
99
+
100
+ row << server['provisionDate'] if column_opts.include? 'provision_date'
101
+
102
+ rows << row
103
+ end
104
+
105
+ break if servers.size < search_opts[:result_limit][:limit]
106
+ search_opts[:result_limit][:offset] += search_opts[:result_limit][:limit]
107
+ end
108
+ end
109
+
110
+ # Output
111
+ CLIFormatter.format(
112
+ rows,
113
+ options['format'],
114
+ COLUMNS.reject { |c| !column_opts.include?(c) },
115
+ options['output_file']
116
+ )
117
+ end
118
+
119
+ desc 'cancel ID ...', 'cancel a softlayer system or systems by ID'
120
+ def cancel(*ids)
121
+ # Create the softlayer client
122
+ client_opts = {}
123
+ client_opts[:username] = options['username'] if options['username']
124
+ client_opts[:api_key] = options['api_key'] if options['api_key']
125
+ SoftLayer::Client.default_client = SoftLayer::Client.new(client_opts)
126
+
127
+ problem_ids = []
128
+ done_ids = []
129
+ while ids.size > 0
130
+ server = nil
131
+ begin
132
+ server = SoftLayer::VirtualServer.server_with_id(ids.last)
133
+ rescue
134
+ begin
135
+ server = SoftLayer::BareMetalServer.server_with_id(ids.last)
136
+ rescue
137
+ end
138
+ end
139
+
140
+ unless server
141
+ STDERR.puts "No server with id #{id} was found."
142
+ problem_ids << ids.pop
143
+ next
144
+ end
145
+
146
+ begin
147
+ server.cancel!
148
+ done_ids << ids.pop
149
+ rescue Exception => e
150
+ STDERR.puts "Error cancelling server #{id}: #{e}"
151
+ problem_ids << ids.pop
152
+ end
153
+ end
154
+
155
+ puts "Cancelled #{done_ids.size} servers."
156
+ if problem_ids.size > 0
157
+ puts "Had trouble cancelling servers #{problem_ids.join(', ')}."
158
+ exit 1
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,44 @@
1
+ module SoftLayer
2
+ class CLIFormatter
3
+ def self.format(content, format = 'plain', headers = CLI::COLUMNS, output_file = nil)
4
+ send(format.to_sym, content, headers, output_file)
5
+ end
6
+
7
+ def self.plain(content, headers, output_file = nil)
8
+ require 'terminal-table'
9
+ table = Terminal::Table.new(headings: headers.map { |c| c.upcase }, rows: content)
10
+ CLISerializer.serialize(table, output_file)
11
+ end
12
+
13
+ def self.csv(content, headers, output_file = nil)
14
+ require 'csv'
15
+ csv_str = CSV.generate do |csv|
16
+ csv << headers.map { |c| c.upcase }
17
+ content.each do |row|
18
+ csv << row
19
+ end
20
+ end
21
+
22
+ CLISerializer.serialize(csv_str, output_file)
23
+ end
24
+
25
+ def self.json(content, headers, output_file = nil)
26
+ json_obj = []
27
+ content.each do |row|
28
+ json_obj << Hash[*headers.zip(row).flatten.compact]
29
+ end
30
+
31
+ CLISerializer.serialize(JSON.generate(json_obj), output_file)
32
+ end
33
+ end
34
+
35
+ class CLISerializer
36
+ def self.serialize(output, output_file = nil)
37
+ if output_file
38
+ IO.write(output_file, output)
39
+ else
40
+ puts output
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,3 @@
1
+ module SoftLayer
2
+ CLI_VERSION = '0.2.0'
3
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'softlayer/cli/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'softlayer-report-cli'
8
+ spec.version = SoftLayer::CLI_VERSION
9
+ spec.authors = ['Renier Morales']
10
+
11
+ spec.summary = %q{SoftLayer Reporting CLI}
12
+ spec.description = %q{SoftLayer Reporting CLI}
13
+ spec.homepage = 'https://github.com/renier/softlayer-report-cli'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = 'bin'
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'softlayer_api', '~> 3.1.0'
22
+ spec.add_dependency 'thor', '~> 0.19.1'
23
+ spec.add_dependency 'terminal-table', '~> 1.5.2'
24
+
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec'
27
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: softlayer-report-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Renier Morales
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: softlayer_api
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.19.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.19.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: terminal-table
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.5.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.5.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: SoftLayer Reporting CLI
84
+ email:
85
+ executables:
86
+ - softlayer
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - Gemfile
94
+ - LICENSE.txt
95
+ - README.md
96
+ - Rakefile
97
+ - bin/softlayer
98
+ - lib/softlayer/cli.rb
99
+ - lib/softlayer/cli/formatter.rb
100
+ - lib/softlayer/cli/version.rb
101
+ - softlayer-report-cli.gemspec
102
+ homepage: https://github.com/renier/softlayer-report-cli
103
+ licenses:
104
+ - MIT
105
+ metadata: {}
106
+ post_install_message:
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 2.2.2
123
+ signing_key:
124
+ specification_version: 4
125
+ summary: SoftLayer Reporting CLI
126
+ test_files: []