cloudability 0.0.5 → 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.
@@ -0,0 +1,18 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/1.4.4
3
+ Date: Thu, 26 Dec 2013 07:58:43 GMT
4
+ Content-Type: application/json
5
+ Content-Length: 17437
6
+ Connection: keep-alive
7
+ Status: 200 OK
8
+ Strict-Transport-Security: max-age=31536000
9
+ Set-Cookie: _mkra_ctxt=38a29ac591a907a6ea6462573e6309c4--200; path=/; secure
10
+ X-UA-Compatible: IE=Edge,chrome=1
11
+ ETag: "ea20a4170651ebda67ae994220b6c558"
12
+ Cache-Control: max-age=0, private, must-revalidate
13
+ X-Request-Id: 95e301a456925e1ff3b97bf0cb673bde
14
+ X-Runtime: 0.663877
15
+ X-Rack-Cache: miss
16
+ Origin: app.cloudability.com
17
+
18
+ [{"id":1,"category":"Invoice Costs","title":"Account","description":null,"end_date":"today","start_date":"last week","end_date_is_relative":true,"start_date_is_relative":true,"owned_by_user":false,"shared":false,"custom":false,"metrics":[{"type":"metric","name":"invoiced_cost","label":"Total Invoiced Costs","description":"Total cost including taxes and credits","data_type":"currency","group":{"key":"billing","name":"Billing"},"sub_group":{"key":"costs","name":"Costs"}}],"dimensions":[{"type":"dimension","name":"linked_account_name","label":"Linked Account Name","description":"The account name for a linked account in consolidated billing","data_type":"string","group":{"key":"billing","name":"Billing"},"sub_group":{"key":"vendor","name":"Vendor"}}],"filters":[],"report_dimension_links":[]},{"id":2,"category":"Top Products","title":"All Products","description":null,"end_date":"today","start_date":"last week","end_date_is_relative":true,"start_date_is_relative":true,"owned_by_user":false,"shared":false,"custom":false,"metrics":[{"type":"metric","name":"invoiced_cost","label":"Total Invoiced Costs","description":"Total cost including taxes and credits","data_type":"currency","group":{"key":"billing","name":"Billing"},"sub_group":{"key":"costs","name":"Costs"}}],"dimensions":[{"type":"dimension","name":"service_key","label":"Product Code","description":"Shortened name of the product","data_type":"string","group":{"key":"billing","name":"Billing"},"sub_group":{"key":"vendor","name":"Vendor"}}],"filters":[],"report_dimension_links":[]}]
@@ -0,0 +1,18 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/1.4.4
3
+ Date: Thu, 26 Dec 2013 18:23:36 GMT
4
+ Content-Type: application/json
5
+ Content-Length: 39
6
+ Connection: keep-alive
7
+ Status: 200 OK
8
+ Strict-Transport-Security: max-age=31536000
9
+ Set-Cookie: _mkra_ctxt=4b25dd0859fe4bffe0cff2b14c615917--200; path=/; secure
10
+ X-UA-Compatible: IE=Edge,chrome=1
11
+ ETag: "8762e8222fbc8f34a7359e143314adab"
12
+ Cache-Control: max-age=0, private, must-revalidate
13
+ X-Request-Id: c7062d59dc778b533dc4e0cfd94a9431
14
+ X-Runtime: 0.010188
15
+ X-Rack-Cache: miss
16
+ Origin: app.cloudability.com
17
+
18
+ ["==","!=","<=",">=","<",">","=@","=~"]
@@ -0,0 +1,18 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/1.4.4
3
+ Date: Thu, 26 Dec 2013 18:21:53 GMT
4
+ Content-Type: application/json
5
+ Content-Length: 15116
6
+ Connection: keep-alive
7
+ Status: 200 OK
8
+ Strict-Transport-Security: max-age=31536000
9
+ Set-Cookie: _mkra_ctxt=de570b8bd77b09a8585e532d37847226--200; path=/; secure
10
+ X-UA-Compatible: IE=Edge,chrome=1
11
+ ETag: "c96f24bb9f20de7fcca0972b52aa64f9"
12
+ Cache-Control: max-age=0, private, must-revalidate
13
+ X-Request-Id: 656a6fc360cb046750819e6fc2cc1028
14
+ X-Runtime: 0.044087
15
+ X-Rack-Cache: miss
16
+ Origin: app.cloudability.com
17
+
18
+ [{"type":"metric","name":"estimated_cost","label":"Estimated Cost","description":"Estimated based on usage hours multiplied by on-demand pricing","data_type":"currency","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"billing","name":"Billing"}},{"type":"metric","name":"avg_estimated_cost","label":"Avg Estimated Cost","description":"Average estimated cost","data_type":"currency","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"billing","name":"Billing"}},{"type":"metric","name":"avg_estimated_hourly_cost","label":"Avg Estimated Hourly Instance Cost","description":"Average estimated hourly cost","data_type":"currency","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"billing","name":"Billing"}},{"type":"metric","name":"num_attached_storage","label":"Storage Devices","description":"Number of attached storage devices","data_type":"integer","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"usage","name":"Usage"}},{"type":"metric","name":"inbound_bandwidth","label":"Bandwidth In","description":"The number of bytes inbound on the network","data_type":"bytes","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"usage","name":"Usage"}}]
@@ -0,0 +1,18 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/1.4.4
3
+ Date: Fri, 27 Dec 2013 05:31:15 GMT
4
+ Content-Type: application/json
5
+ Content-Length: 44476
6
+ Connection: keep-alive
7
+ Status: 200 OK
8
+ Strict-Transport-Security: max-age=31536000
9
+ Set-Cookie: _mkra_ctxt=1f0f9e994c1eda7c8aaca1c638e169e7--200; path=/; secure
10
+ X-UA-Compatible: IE=Edge,chrome=1
11
+ ETag: "575c428e918fe64a860eaf6e6cc8ba2e"
12
+ Cache-Control: max-age=0, private, must-revalidate
13
+ X-Request-Id: 9534fd1ae2484ed36a74011e9f5816e4
14
+ X-Runtime: 1.713328
15
+ X-Rack-Cache: miss
16
+ Origin: app.cloudability.com
17
+
18
+ [{"id":2,"category":"Utilization","title":"Longest Running","description":null,"end_date":"today","start_date":"last week","end_date_is_relative":true,"start_date_is_relative":true,"owned_by_user":false,"shared":false,"custom":false,"metrics":[{"type":"metric","name":"hours_since_launch","label":"Hours Since Launch","description":"Hours since instance launch","data_type":"float","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"time","name":"Time"}},{"type":"metric","name":"utilization_hours","label":"Utilization Hours","description":"Utilization hours","data_type":"integer","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"usage","name":"Usage"}},{"type":"metric","name":"avg_estimated_hourly_cost","label":"Avg Estimated Hourly Instance Cost","description":"Average estimated hourly cost","data_type":"currency","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"billing","name":"Billing"}}],"dimensions":[{"type":"dimension","name":"instance_identifier","label":"Instance ID","description":"Instance ID","data_type":"string","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"common","name":"Common"}},{"type":"dimension","name":"instance_size","label":"Size","description":"Size of the Instance","data_type":"string","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"common","name":"Common"}}],"filters":[],"report_dimension_links":[]},{"id":3,"category":"Utilization","title":"Instance Aging","description":null,"end_date":"today","start_date":"last week","end_date_is_relative":true,"start_date_is_relative":true,"owned_by_user":false,"shared":false,"custom":false,"metrics":[{"type":"metric","name":"terminated_instances","label":"Terminated Instances","description":"Number of terminated instances","data_type":"integer","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"usage","name":"Usage"}},{"type":"metric","name":"running_instances","label":"Running Instances","description":"Number of running instances","data_type":"integer","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"usage","name":"Usage"}}],"dimensions":[{"type":"dimension","name":"days_since_launch","label":"Days Alive","description":"Days since instance was launched","data_type":"integer","group":{"key":"compute","name":"Compute"},"sub_group":{"key":"usage","name":"Usage"}}],"filters":[],"report_dimension_links":[]}]
@@ -1,4 +1,6 @@
1
1
  require 'rubygems'
2
+ require 'coveralls'
3
+ Coveralls.wear!
2
4
  require 'bundler'
3
5
  require 'fakeweb'
4
6
  require 'cloudability'
@@ -33,7 +35,6 @@ module FakeRequestHelpers
33
35
  end
34
36
  end
35
37
 
36
-
37
38
  RSpec.configure do |c|
38
39
  c.include(FakeRequestHelpers)
39
40
 
@@ -43,6 +44,7 @@ RSpec.configure do |c|
43
44
  end
44
45
 
45
46
  FakeWeb.allow_net_connect = false
47
+ FakeWeb.allow_net_connect = %r[^https?://coveralls.io/api/v1/jobs]
46
48
 
47
49
  # Creating fixtures:
48
50
  # curl -is https://app.cloudability.com/api/0/billing_reports?auth_token=token&by=account > spec/fixtures/billing_report
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudability
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Colby Aley
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-25 00:00:00.000000000 Z
12
+ date: 2013-12-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -81,6 +81,20 @@ dependencies:
81
81
  - - ~>
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0.6'
84
+ - !ruby/object:Gem::Dependency
85
+ name: coveralls
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
84
98
  description: Ruby wrapper for the Cloudability API
85
99
  email:
86
100
  - colby@cloudability.com
@@ -97,24 +111,33 @@ files:
97
111
  - Rakefile
98
112
  - cloudability.gemspec
99
113
  - lib/cloudability.rb
100
- - lib/cloudability/billing.rb
101
- - lib/cloudability/budgets.rb
102
- - lib/cloudability/credentials.rb
103
- - lib/cloudability/organizations.rb
104
- - lib/cloudability/time_helper.rb
114
+ - lib/cloudability/client/billing_reports.rb
115
+ - lib/cloudability/client/budgets.rb
116
+ - lib/cloudability/client/cost_reports.rb
117
+ - lib/cloudability/client/credentials.rb
118
+ - lib/cloudability/client/organizations.rb
119
+ - lib/cloudability/client/usage_reports.rb
105
120
  - lib/cloudability/version.rb
106
121
  - spec/cloduability/billing_spec.rb
107
122
  - spec/cloduability/budgets_spec.rb
123
+ - spec/cloduability/cost_spec.rb
108
124
  - spec/cloduability/credentials_spec.rb
109
125
  - spec/cloduability/organizations_spec.rb
110
- - spec/fixtures/all_budgets
126
+ - spec/cloduability/usage_spec.rb
127
+ - spec/fixtures/billing_reports
128
+ - spec/fixtures/budgets
129
+ - spec/fixtures/cost/filters
130
+ - spec/fixtures/cost/measures
131
+ - spec/fixtures/cost/report
132
+ - spec/fixtures/cost/reports
111
133
  - spec/fixtures/credentials
112
134
  - spec/fixtures/organization
113
135
  - spec/fixtures/organization_invitation
114
136
  - spec/fixtures/organization_invitations
115
137
  - spec/fixtures/organization_roles
116
- - spec/fixtures/report_by_account
117
- - spec/fixtures/report_by_period
138
+ - spec/fixtures/usage/filters
139
+ - spec/fixtures/usage/measures
140
+ - spec/fixtures/usage/reports
118
141
  - spec/spec_helper.rb
119
142
  homepage: https://github.com/colbyaley/cloudability
120
143
  licenses:
@@ -143,14 +166,22 @@ summary: Ruby wrapper for the Cloudability API built with HTTParty
143
166
  test_files:
144
167
  - spec/cloduability/billing_spec.rb
145
168
  - spec/cloduability/budgets_spec.rb
169
+ - spec/cloduability/cost_spec.rb
146
170
  - spec/cloduability/credentials_spec.rb
147
171
  - spec/cloduability/organizations_spec.rb
148
- - spec/fixtures/all_budgets
172
+ - spec/cloduability/usage_spec.rb
173
+ - spec/fixtures/billing_reports
174
+ - spec/fixtures/budgets
175
+ - spec/fixtures/cost/filters
176
+ - spec/fixtures/cost/measures
177
+ - spec/fixtures/cost/report
178
+ - spec/fixtures/cost/reports
149
179
  - spec/fixtures/credentials
150
180
  - spec/fixtures/organization
151
181
  - spec/fixtures/organization_invitation
152
182
  - spec/fixtures/organization_invitations
153
183
  - spec/fixtures/organization_roles
154
- - spec/fixtures/report_by_account
155
- - spec/fixtures/report_by_period
184
+ - spec/fixtures/usage/filters
185
+ - spec/fixtures/usage/measures
186
+ - spec/fixtures/usage/reports
156
187
  - spec/spec_helper.rb
@@ -1,65 +0,0 @@
1
- module Cloudability
2
- class Billing
3
- include HTTParty
4
- base_uri "https://app.cloudability.com/api/0"
5
- format :json
6
-
7
- attr_accessor :auth_token
8
-
9
- def initialize(options={})
10
- raise ArgumentError, "You must provide an auth token" if options[:auth_token].nil?
11
-
12
- @auth_token = options[:auth_token]
13
- @params=[]
14
- end
15
-
16
- # Define which dimension the billing report will return.
17
- #
18
- # @param [Symbol] dimension to report on.
19
- # @return [Array] array of Hashie::Mashes
20
- def report_by(dimension)
21
- case dimension
22
- when :account
23
- @params << "&by=account"
24
- when :credential
25
- @params << "&by=credential"
26
- when :period
27
- @params << "&by=period"
28
- when :service
29
- @params << "&by=service"
30
- when :vendor
31
- @params << "&by=vendor"
32
- else
33
- raise ArgumentError, "You must provide a valid dimension to report on."
34
- end
35
-
36
- billings = get_url(@params)
37
- billings.map { |b| Hashie::Mash.new(b) }
38
- end
39
-
40
- # Find a particular period, based on its month.
41
- # Period must be in YY-MM-01 format with the date always 01.
42
- def filter_by_period(period)
43
- unless period =~ /^[0-9]{2}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/
44
- raise ArgumentError, "You must provide a valid date in the form of 'YY-MM-DD'."
45
- end
46
-
47
- @params << "&period=#{period}"
48
- single_billing = get_url(@params).first
49
-
50
- Hashie::Mash.new(single_billing)
51
- end
52
-
53
- private
54
-
55
- # GET a URL with HTTParty
56
- #
57
- # @param [Array] array of URL params to pass to HTTParty
58
- def get_url(params)
59
- joined_param = params.join
60
- response = self.class.get("/billing_reports?auth_token=#{@auth_token}#{joined_param}")
61
- response.success? ? response : raise(response.response)
62
- end
63
-
64
- end
65
- end
@@ -1,61 +0,0 @@
1
- module Cloudability
2
- class Budgets
3
- include HTTParty
4
- base_uri "https://app.cloudability.com/api/1"
5
- format :json
6
-
7
- attr_accessor :auth_token
8
-
9
- def initialize(options={})
10
- raise ArgumentError, "You must provide an auth token" if options[:auth_token].nil?
11
- @auth_token = options[:auth_token]
12
- end
13
-
14
- # Return all the budgets for the current account, and return as mash's.
15
- def find_all
16
- convert_to_mashes(get_budgets)
17
- end
18
-
19
- # Find a particular budget, based on its id, and return a mash.
20
- def find_by_id(id)
21
- find_all.select {|b| b.id == id}.first
22
- end
23
-
24
- # Find a particular budget, based on its subject, and return a mash.
25
- def find_by_subject(subject)
26
- unless subject.length == 14
27
- raise ArgumentError, "You must provide a valid subject such as 1234-5678-9101."
28
- end
29
-
30
- find_all.select {|b| b.subject == subject}.first
31
- end
32
-
33
- # Find a particular budget, based on a key, and return a mash.
34
- def find_by_key(options={})
35
- case options[:key]
36
- when :id
37
- budget = find_by_id(options[:value])
38
- when :subject
39
- budget = find_by_subject(options[:value])
40
- else
41
- raise ArgumentError, "You must provide a valid key."
42
- end
43
- end
44
-
45
- private
46
-
47
- def get_budgets
48
- response = self.class.get("/budgets/index?auth_token=#{@auth_token}")
49
- response.success? ? response : raise(response.response)
50
- end
51
-
52
- # Convert the JSON into an Array of Mashes.
53
- #
54
- # @param [String] JSON array
55
- # @return [Array] array of Hashie::Mashes
56
- def convert_to_mashes(response)
57
- response.map { |budget| Hashie::Mash.new(budget) }
58
- end
59
-
60
- end
61
- end
@@ -1,34 +0,0 @@
1
- module Cloudability
2
- class Credentials
3
- include HTTParty
4
- base_uri "https://app.cloudability.com/api/0"
5
- format :json
6
-
7
- attr_accessor :auth_token
8
-
9
- def initialize(options={})
10
- raise ArgumentError, "You must provide an auth token" if options[:auth_token].nil?
11
- @auth_token = options[:auth_token]
12
- end
13
-
14
- def find_all
15
- convert_to_mashes(get_credentials)
16
- end
17
-
18
- private
19
-
20
- def get_credentials
21
- response = self.class.get("/credentials/index?auth_token=#{@auth_token}")
22
- response.success? ? response : raise(response.response)
23
- end
24
-
25
- # Convert the JSON into an Array of Mashes.
26
- #
27
- # @param [String] JSON array
28
- # @return [Array] array of Hashie::Mashes
29
- def convert_to_mashes(response)
30
- response.map { |credential| Hashie::Mash.new(credential) }
31
- end
32
-
33
- end
34
- end
@@ -1,71 +0,0 @@
1
- module Cloudability
2
- class Organizations
3
- include HTTParty
4
- base_uri "https://app.cloudability.com/api/1"
5
- format :json
6
-
7
- attr_accessor :auth_token
8
-
9
- def initialize(options={})
10
- raise ArgumentError, "You must provide an auth token" if options[:auth_token].nil?
11
-
12
- @auth_token = options[:auth_token]
13
- end
14
-
15
- def my_organization
16
- response = get_url("/organizations?auth_token=#{@auth_token}")
17
- Hashie::Mash.new(response)
18
- end
19
-
20
- def invitations
21
- response = get_url("/organizations/invitations?auth_token=#{@auth_token}")
22
- convert_to_mashes(response)
23
- end
24
-
25
- def roles
26
- response = get_url("/organizations/roles?auth_token=#{@auth_token}")
27
- convert_to_mashes(response)
28
- end
29
-
30
- # Invite a user to your organization
31
- #
32
- # @param [Hash] args to pass to HTTParty
33
- # @option [String] email (required)
34
- # @option [String] name
35
- # @option [String] role_id
36
- def invite_user(args)
37
- raise ArgumentError, "You must provide an email" if args[:email].nil?
38
-
39
- response = post_url("/organizations/invitations?auth_token=#{@auth_token}", args)
40
- Hashie::Mash.new(response)
41
- end
42
-
43
- private
44
-
45
- # POST a URL with HTTParty
46
- #
47
- # @param [String] URL to post
48
- # @param [Hash] params to pass to HTTParty
49
- def post_url(url, params={})
50
- response = self.class.post(url, query: params)
51
- response.success? ? response : raise(response.response)
52
- end
53
-
54
- # GET a URL with HTTParty
55
- #
56
- # @param [String] URL to get
57
- def get_url(url)
58
- response = self.class.get(url)
59
- response.success? ? response : raise(response.response)
60
- end
61
-
62
- # Convert the JSON into an Array of Mashes.
63
- #
64
- # @param [String] JSON array
65
- # @return [Array] array of Hashie::Mashes
66
- def convert_to_mashes(response)
67
- response.map { |budget| Hashie::Mash.new(budget) }
68
- end
69
-
70
- end
71
- end
@@ -1,25 +0,0 @@
1
- require 'date'
2
- require 'hashie'
3
-
4
- # Cloudability requires time periods formatted in YYYY-MM-01 The date must always be 1.
5
- # This provides a set of helpers to always return the correct period format.
6
-
7
- class TimeHelper
8
-
9
- def last_three_months
10
- dt = DateTime.now
11
-
12
- current_month = dt.strftime("%Y-%m-01")
13
- last_month = (dt << 1).strftime("%Y-%m-01")
14
- three_month = (dt << 2).strftime("%Y-%m-01")
15
-
16
- hash = { current: current_month, last: last_month, three: three_month }
17
- Hashie::Mash.new(hash)
18
- end
19
-
20
- # Returns the current month
21
- def current_month
22
- DateTime.now.strftime("%Y-%m-01")
23
- end
24
-
25
- end