cloudassault 0.0.1

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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
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
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cloudassault.gemspec
4
+ gemspec
data/README ADDED
@@ -0,0 +1,6 @@
1
+ CloudAssault Ruby Client
2
+
3
+ The CloudAssault Ruby client is an API binding for ruby that can be used to make calls against the CloudAssault infrastructure.
4
+
5
+ https://www.cloudassault.com
6
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ task :default => :spec
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/cloudassault/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Adam Schepis"]
6
+ gem.email = ["adam.schepis@gmail.com"]
7
+ gem.description = "CloudAssault API client for ruby"
8
+ gem.summary = "CloudAssault API"
9
+ gem.homepage = "https://www.cloudassault.com/api"
10
+
11
+ gem.rubyforge_project = "cloudassault"
12
+
13
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
14
+ gem.files = `git ls-files`.split("\n")
15
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ gem.name = "cloudassault"
17
+ gem.require_paths = ["lib"]
18
+ gem.version = CloudAssault::VERSION
19
+
20
+ gem.add_development_dependency "rspec"
21
+ gem.add_development_dependency "webmock"
22
+ gem.add_dependency "rest-client"
23
+ gem.add_dependency "json"
24
+ end
@@ -0,0 +1,88 @@
1
+ require 'rest-client'
2
+ require 'json'
3
+ require 'base64'
4
+
5
+ class CloudAssault::Client
6
+ attr_reader :base_url, :user_id
7
+
8
+ def initialize(options = {})
9
+ @base_url = options[:base_url] || 'https://www.cloudassault.com/'
10
+ @user_agent = "cloudassault/ruby/#{CloudAssault::VERSION}"
11
+ @default_headers = {'User-Agent' => @user_agent, 'Accept' => 'application/json'}
12
+ end
13
+
14
+ def load_root
15
+ CloudAssault.logger.debug "GET Request: #{@base_url} ;; Headers: #{build_headers.inspect}" if CloudAssault.logger
16
+ r = RestClient.get @base_url, build_headers
17
+ link_arr = r.headers[:link].split(',')
18
+
19
+ links = link_arr.map {|l| s=l.split(';'); {:link => s[0], :rel => s[1].split('=')[1]}}
20
+ links.each do |l|
21
+ if l[:rel] == 'home'
22
+ index = l[:link].rindex('/')
23
+ @user_id = l[:link].slice(index + 1).to_i
24
+ return
25
+ end
26
+ end
27
+ end
28
+
29
+ def user
30
+ load_root if @user_id.nil?
31
+
32
+ url = @base_url + "users/#{@user_id}"
33
+ CloudAssault.logger.debug "GET Request: #{url} ;; Headers: #{build_headers.inspect}" if CloudAssault.logger
34
+ r = RestClient.get url, build_headers
35
+ user = JSON.parse(r.body,:symbolize_names => true)
36
+ user[:account_balance] = user[:account_balance].to_f
37
+ user
38
+ end
39
+
40
+ def jobs
41
+ load_root if @user_id.nil?
42
+
43
+ url = @base_url + "users/#{@user_id}/jobs"
44
+ CloudAssault.logger.debug "GET Request: #{url} ;; Headers: #{build_headers.inspect}" if CloudAssault.logger
45
+ r = RestClient.get url, build_headers
46
+ JSON.parse(r.body)
47
+ end
48
+
49
+ def estimate_simple_load_test(name, desc, url, connections, minutes)
50
+ request = test_hash(name, desc, url, connections, minutes)
51
+
52
+ url = @base_url + "simple_load_tests/estimate"
53
+ headers = build_headers.merge({'Content-Type' => 'application/json'})
54
+ CloudAssault.logger.debug "POST Request: #{url} ;; Headers: #{headers.inspect}" if CloudAssault.logger
55
+ r = RestClient.post url, request.to_json, headers
56
+ JSON.parse(r.body,:symbolize_names => true)
57
+ end
58
+
59
+ def create_simple_load_test(name, desc, url, connections, minutes, options = {})
60
+ request = test_hash(name, desc, url, connections, minutes)
61
+ request[:payment] = options[:payment] if (options[:payment])
62
+
63
+ url = @base_url + "simple_load_tests"
64
+ headers = build_headers.merge({'Content-Type' => 'application/json'})
65
+ body = request.to_json
66
+ CloudAssault.logger.debug "POST Request: #{url} ;; Headers: #{headers.inspect} ;; Body: #{body}" if CloudAssault.logger
67
+ r = RestClient.post url, body, headers
68
+ JSON.parse(r.body,:symbolize_names => true)
69
+ end
70
+
71
+ private
72
+ def test_hash(name, desc, url, connections, minutes)
73
+ {:simple_load_test => {
74
+ :url => url,
75
+ :concurrent_connections => connections,
76
+ :duration_in_minutes => minutes,
77
+ :job_attributes => {
78
+ :name => name,
79
+ :description => desc
80
+ }
81
+ }}
82
+ end
83
+
84
+ def build_headers
85
+ b64 = Base64.strict_encode64("#{CloudAssault.API_KEY}:")
86
+ @default_headers.merge({'Authorization' => "Basic #{b64}"})
87
+ end
88
+ end
@@ -0,0 +1,7 @@
1
+ module CloudAssault
2
+ VERSION = "0.0.1"
3
+
4
+ def self.version_string
5
+ "CloudAssault version #{CloudAssault::VERSION}"
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ require "cloudassault/version"
2
+ require 'cloudassault/client'
3
+
4
+ module CloudAssault
5
+ class << self
6
+ attr_accessor :API_KEY
7
+ attr_accessor :logger
8
+ end
9
+
10
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+ require 'base64'
3
+
4
+ describe CloudAssault::Client do
5
+ before(:each) do
6
+ CloudAssault.API_KEY = 'SomeTestAPIKey'
7
+ stub_request(:get, "https://#{CloudAssault.API_KEY}:@www.cloudassault.com/")
8
+ .with(:headers => {'Accept' => 'application/json', 'User-Agent'=>"cloudassault/ruby/#{CloudAssault::VERSION}"})
9
+ .to_return(:status => 200, :headers => {'Content-Type' => 'application/json', 'Link' => 'https://www.cloudassault.com/users/1; rel=home, https://www.cloudassault.com/users/1/jobs; rel=jobs'})
10
+ @client = CloudAssault::Client.new
11
+ end
12
+
13
+ it 'should optionally take a base url as a param' do
14
+ b = CloudAssault::Client.new(:base_url => 'https://staging.cloudassault.com/')
15
+
16
+ @client.should_not == nil
17
+ b.should_not == nil
18
+
19
+ @client.base_url.should == 'https://www.cloudassault.com/'
20
+ b.base_url.should == 'https://staging.cloudassault.com/'
21
+ end
22
+
23
+ it "should get the root to determine the user's id" do
24
+ @client.load_root
25
+ @client.user_id.should == 1
26
+ end
27
+
28
+ it "should get the user's profile" do
29
+ stub_request(:get, "https://#{CloudAssault.API_KEY}:@www.cloudassault.com/users/1").with(:headers => {'Accept' => 'application/json'}).to_return(:body => '{"account_balance":"100.0","email":"support@cloudassault.com"}', :status => 200, :headers => {'Content-Type' => 'application/json'})
30
+ u = @client.user
31
+ u[:email].should == 'support@cloudassault.com'
32
+ u[:account_balance].should == 100.00
33
+
34
+ end
35
+
36
+ it "should list a user's jobs" do
37
+ stub_request(:get, "https://#{CloudAssault.API_KEY}:@www.cloudassault.com/users/1/jobs").with(:headers => {'Accept' => 'application/json'}).to_return(:body => '[{"canceled_at":null,"completed_at":"2011-09-17T03:04:28Z","cost":null,"description":"test","id":1,"name":"test test","job_type":"SimpleLoadTest","links":[{"href":"http://cloudassault.com/simple_load_tests/1","rel":"simple_load_test"}]},{"canceled_at":null,"completed_at":"2011-09-17T03:16:28Z","cost":null,"description":"cnn.com","id":2,"name":"cnn.com","job_type":"SimpleLoadTest","links":[{"href":"http://cloudassault.com/simple_load_tests/2","rel":"simple_load_test"}]},{"canceled_at":null,"completed_at":"2011-09-21T11:07:56Z","cost":null,"description":"test","id":16,"name":"Sample Test 3","job_type":"SimpleLoadTest","links":[{"href":"http://cloudassault.com/simple_load_tests/16","rel":"simple_load_test"}]}]', :status => 200, :headers => {'Content-Type' => 'application/json'})
38
+
39
+ tests = @client.jobs
40
+ tests.length.should == 3
41
+ end
42
+
43
+ it "should allow estimation of tests" do
44
+ stub_request(:post, "https://#{CloudAssault.API_KEY}:@www.cloudassault.com/simple_load_tests/estimate")
45
+ .with(:body => '{"simple_load_test":{"url":"https://www.cloudassault.com/","concurrent_connections":15,"duration_in_minutes":5,"job_attributes":{"name":"Test CloudAssault","description":"description"}}}', :headers => {'Accept' => 'application/json', 'Content-Type' => 'application/json'})
46
+ .to_return(:body => '{"estimated_price":2.17}', :status => 200, :headers => {'Content-Type' => 'application/json'})
47
+
48
+ estimate = @client.estimate_simple_load_test('Test CloudAssault', 'description', 'https://www.cloudassault.com/', 15, 5)
49
+ estimate[:estimated_price].should == 2.17
50
+ end
51
+
52
+ it "should allow a user to create tests" do
53
+ stub_request(:post, "https://#{CloudAssault.API_KEY}:@www.cloudassault.com/simple_load_tests")
54
+ .with(:body => '{"simple_load_test":{"url":"https://www.cloudassault.com/","concurrent_connections":15,"duration_in_minutes":5,"job_attributes":{"name":"Test CloudAssault","description":"description"}},"payment":{"number":"4242424242424242","exp_month":"02","exp_year":"2012","cvc":"123"}}', :headers => {'Accept' => 'application/json', 'Content-Type' => 'application/json'})
55
+ .to_return(:body => '{"actual_duration":null,"concurrent_connections":15,"duration_in_minutes":5,"id":1,"num_errors":null,"num_requests":null,"overall_avg_response_time":null,"ramp_up_time_in_minutes":0,"transfer_in":null,"transfer_out":null,"url":"https://www.cloudassault.com/","result_data":[],"job":{"canceled_at":null,"completed_at":null,"cost":null,"description":"description","id":1,"name":"Test CloudAssault","user_id":1}}', :status => 200, :headers => {'Content-Type' => 'application/json'})
56
+
57
+ payment_info = {
58
+ :number => '4242424242424242',
59
+ :exp_month => '02',
60
+ :exp_year => '2012',
61
+ :cvc => '123'
62
+ }
63
+ test = @client.create_simple_load_test('Test CloudAssault', 'description', 'https://www.cloudassault.com/', 15, 5, :payment => payment_info)
64
+ test[:id].should == 1
65
+ test[:job][:name].should == 'Test CloudAssault'
66
+ end
67
+
68
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe CloudAssault do
4
+ it 'should return correct version string' do
5
+ CloudAssault.version_string.should == "CloudAssault version #{CloudAssault::VERSION}"
6
+ end
7
+
8
+ it 'should allow you to set the API key' do
9
+ CloudAssault.API_KEY = 'testAPIkey'
10
+ CloudAssault.API_KEY.should == 'testAPIkey'
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ require 'rspec'
2
+ require 'cloudassault'
3
+ require 'webmock/rspec'
4
+
5
+ RSpec.configure do |config|
6
+ config.color_enabled = true
7
+ config.formatter = 'documentation'
8
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloudassault
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Adam Schepis
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-11-28 00:00:00 -05:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rspec
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ type: :development
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: webmock
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: "0"
36
+ type: :development
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: rest-client
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: json
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ type: :runtime
59
+ version_requirements: *id004
60
+ description: CloudAssault API client for ruby
61
+ email:
62
+ - adam.schepis@gmail.com
63
+ executables: []
64
+
65
+ extensions: []
66
+
67
+ extra_rdoc_files: []
68
+
69
+ files:
70
+ - .gitignore
71
+ - Gemfile
72
+ - README
73
+ - Rakefile
74
+ - cloudassault.gemspec
75
+ - lib/cloudassault.rb
76
+ - lib/cloudassault/client.rb
77
+ - lib/cloudassault/version.rb
78
+ - spec/client_spec.rb
79
+ - spec/cloudassault_spec.rb
80
+ - spec/spec_helper.rb
81
+ has_rdoc: true
82
+ homepage: https://www.cloudassault.com/api
83
+ licenses: []
84
+
85
+ post_install_message:
86
+ rdoc_options: []
87
+
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: "0"
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: "0"
102
+ requirements: []
103
+
104
+ rubyforge_project: cloudassault
105
+ rubygems_version: 1.6.2
106
+ signing_key:
107
+ specification_version: 3
108
+ summary: CloudAssault API
109
+ test_files:
110
+ - spec/client_spec.rb
111
+ - spec/cloudassault_spec.rb
112
+ - spec/spec_helper.rb