softlayer-report-cli 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []