cloudassault 0.0.1

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