pagoda-client 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.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in pagoda-api.gemspec
4
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler'
2
+ require "rspec/core/rake_task"
3
+
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ desc "Run all specs"
7
+ RSpec::Core::RakeTask.new('spec') do |t|
8
+ t.rspec_opts = ['--colour --format documentation']
9
+ end
data/lib/.DS_Store ADDED
Binary file
@@ -0,0 +1,73 @@
1
+ module Pagoda
2
+ module Api
3
+ module App
4
+
5
+ #############
6
+ # Get
7
+ #############
8
+ def app_available?(app)
9
+ json get("/apps/#{app}/available.json")
10
+ end
11
+
12
+ def app_list
13
+ json get("/apps.json")
14
+ end
15
+
16
+ def app_info(app)
17
+ json get("/apps/#{app}")
18
+ end
19
+
20
+ #############
21
+ # put
22
+ #############
23
+
24
+
25
+ def app_scale_up(app, qty=1)
26
+ put("/apps/#{app}/scale-up", {:quantity => qty})
27
+ end
28
+
29
+ def app_scale_down(app, qty=1)
30
+ put("/apps/#{app}/scale-down", {:quantity => qty})
31
+ end
32
+
33
+ def app_update(app, updates)
34
+ put("/apps/#{app}", {:app => updates}).to_s
35
+ end
36
+
37
+
38
+ #############
39
+ # post
40
+ #############
41
+ def app_create(name)
42
+ user_id = user_info[:id]
43
+ json post("/apps", {:app => {:name => name, :owner_id => user_id}})
44
+ end
45
+
46
+ def app_deploy_latest(app)
47
+ post("/apps/#{app}/deploys")
48
+ end
49
+
50
+ def app_deploy(app, branch, commit)
51
+ post("/apps/#{app}/deploys", {:deploy => {:git_branch => branch, :commit => commit}})
52
+ end
53
+
54
+ def app_rollback(app)
55
+ json post("/apps/#{app}/deploys/rollback")
56
+ end
57
+
58
+ def app_fast_forward(app)
59
+ # Not sure what goes in here yet
60
+ end
61
+
62
+
63
+ #############
64
+ # Delete
65
+ #############
66
+
67
+ def app_destroy(app)
68
+ delete("/apps/#{app}.json")
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,6 @@
1
+ module Pagoda::Api
2
+ module Billing
3
+
4
+
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Pagoda::Api
2
+ module Collaborator
3
+
4
+
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ module Pagoda::Api
2
+ module Componant
3
+
4
+ def component_info(app, component_name)
5
+ json get("/apps/#{app}/components/#{component_name}")
6
+ end
7
+
8
+ def component_list(app)
9
+ json get("/apps/#{app}/components")
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,35 @@
1
+ module Pagoda
2
+ module Api
3
+ module Database
4
+
5
+ def database_list(app)
6
+ json get("/apps/#{app}/databases")
7
+ end
8
+
9
+ def database_info(app, database)
10
+ json get("/apps/#{app}/databases/#{database}")
11
+ end
12
+
13
+ def database_create(app)
14
+ post("/apps/#{app}/databases", {:type => :mysql})
15
+ end
16
+
17
+ def database_destroy(app, database)
18
+ delete("/apps/#{app}/databases/#{database}")
19
+ end
20
+
21
+ def database_update(app, database, cpu, ram)
22
+ # \/ maybe???
23
+ # put("/apps/#{app}/databases/#{database}", { :update => {:cpu => cpu, :ram => ram } } )
24
+ end
25
+
26
+ def database_exists?(app, database)
27
+ get("/apps/#{app}/databases/#{database}")
28
+ true
29
+ rescue RestClient::ResourceNotFound => e
30
+ false
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,6 @@
1
+ module Pagoda::Api
2
+ module Email
3
+
4
+
5
+ end
6
+ end
@@ -0,0 +1,15 @@
1
+ module Pagoda
2
+ module Api
3
+ module Transaction
4
+
5
+ def transaction_info(app, transaction)
6
+ json get("/apps/#{app}/transactions/#{transaction}")
7
+ end
8
+
9
+ def transaction_list(app)
10
+ json get("/apps/#{app}/transactions")
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Pagoda::Api
2
+ module User
3
+
4
+ def user_info
5
+ json get("/account.json")
6
+ end
7
+
8
+ def user_add_key(key)
9
+ post("/account/keys.json", {:ssh_key => { :key => key }})
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,105 @@
1
+ require 'json'
2
+ require 'rest_client'
3
+
4
+ # Mix-In's
5
+ require 'pagoda-client/apis/app'
6
+ require 'pagoda-client/apis/user'
7
+ require 'pagoda-client/apis/componant'
8
+ require 'pagoda-client/apis/billing'
9
+ require 'pagoda-client/apis/email'
10
+ require 'pagoda-client/apis/collaborator'
11
+ require 'pagoda-client/apis/transaction'
12
+ require 'pagoda-client/apis/database'
13
+
14
+ module Pagoda
15
+ class Client
16
+ VERSION = "0.1.0"
17
+
18
+ # Mix ins (cleaner)
19
+ include Api::App
20
+ include Api::User
21
+ include Api::Componant
22
+ include Api::Billing
23
+ include Api::Email
24
+ include Api::Collaborator
25
+ include Api::Transaction
26
+ include Api::Database
27
+
28
+ attr_reader :user, :password
29
+
30
+ def initialize(user, password)
31
+ @user = user
32
+ @password = password
33
+ end
34
+
35
+ class << self
36
+ def version
37
+ VERSION
38
+ end
39
+
40
+ def gem_version_string
41
+ "pagoda-gem/#{version}"
42
+ end
43
+ end
44
+
45
+ def api_key
46
+ user_info[:authentication_token]
47
+ end
48
+
49
+ def valid_credentials?
50
+ get("/apps")
51
+ true
52
+ rescue RestClient::Unauthorized
53
+ false
54
+ #will poke pagoda and validate credentials
55
+ end
56
+
57
+ def host
58
+ "https://dashboard.newpagodabox.com"
59
+ end
60
+
61
+ protected
62
+
63
+ def resource(uri)
64
+ RestClient.proxy = ENV['HTTP_PROXY'] || ENV['http_proxy']
65
+ # RestClient::Resource.new("http://127.0.0.1:3000#{uri}", :user => @user, :password => @password, :content_type => 'application/json')
66
+ RestClient::Resource.new("#{host}#{uri}", @user, @password)
67
+ end
68
+
69
+ def get(uri, extra_headers={})
70
+ process(:get, uri, extra_headers)
71
+ end
72
+
73
+ def post(uri, payload="", extra_headers={})
74
+ process(:post, uri, extra_headers, payload)
75
+ end
76
+
77
+ def put(uri, payload="", extra_headers={})
78
+ process(:put, uri, extra_headers, payload)
79
+ end
80
+
81
+ def delete(uri, extra_headers={})
82
+ process(:delete, uri, extra_headers)
83
+ end
84
+
85
+ def process(method, uri, extra_headers={}, payload=nil)
86
+ headers = pagoda_headers.merge(extra_headers)
87
+ args = [method, payload, headers].compact
88
+ response = resource(uri).send(*args)
89
+ end
90
+
91
+ def pagoda_headers
92
+ {
93
+ 'User-Agent' => self.class.gem_version_string,
94
+ 'X-Ruby-Version' => RUBY_VERSION,
95
+ 'X-Ruby-Platform' => RUBY_PLATFORM,
96
+ 'Accept' => 'application/json'
97
+ }
98
+ end
99
+
100
+ def json(content)
101
+ JSON.parse(content, :symbolize_names => true)
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1,5 @@
1
+ require 'pagoda-client/client'
2
+
3
+ module Pagoda
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "pagoda-client"
6
+ s.version = "0.1.0"
7
+ s.authors = ["Lyon"]
8
+ s.email = ["lyon@pagodabox.com"]
9
+ s.homepage = "http://www.pagodabox.com"
10
+ s.summary = %q{Pagodabox API client}
11
+ s.description = %q{Api client used to talk to pagodabox.}
12
+
13
+ s.rubyforge_project = "pagoda-client"
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ # testing dependencies
21
+ s.add_development_dependency "rspec"
22
+ s.add_development_dependency "webmock"
23
+ # s.add_development_dependency "simplecov"
24
+
25
+
26
+ # real dependencies
27
+ s.add_dependency "rest-client"
28
+ s.add_dependency "json_pure"
29
+
30
+
31
+ end
@@ -0,0 +1,135 @@
1
+ require 'json'
2
+ require 'webmock'
3
+
4
+ require 'pagoda-client'
5
+
6
+ include WebMock::API
7
+
8
+ def stub_api_request(method, path, body=nil)
9
+ url = "https://user:password@api.pagodabox.com"
10
+ (body ? stub_request(method, "#{url}#{path}").with(body: body) : stub_request(method, "#{url}#{path}"))
11
+ end
12
+
13
+
14
+ describe Pagoda::Client do
15
+
16
+ before :all do
17
+ @client = Pagoda::Client.new("user","password")
18
+ end
19
+
20
+ it "should have more functionality added" do
21
+ pending("additional functionality needed to make this a real client")
22
+ end
23
+
24
+
25
+ describe "app" do
26
+
27
+ it "gathers the app list correctly" do
28
+ stub = [
29
+ {id: 1, name: "app1", componants: 3},
30
+ {id: 2, name: 'appledumpling', componants: 6}
31
+ ]
32
+ stub_api_request(:get, "/apps").to_return(body: stub.to_json)
33
+ @client.app_list.should == stub
34
+ end
35
+
36
+ it "collects informationt about the app" do
37
+ stub = {
38
+ :name => "App",
39
+ :git_url => "github.com",
40
+ :owner => {
41
+ :username => "lyon",
42
+ :email => "lyon@pagodabox.com"
43
+ },
44
+ :collaborators => [
45
+ {
46
+ :username => "tyler",
47
+ :email => "tyler@pagodabox.com"
48
+ },
49
+ {
50
+ :username => "clay",
51
+ :email => "clay@pagodabox.com"
52
+ }
53
+ ]
54
+ }
55
+ stub_api_request(:get, "/apps/app").to_return(body: stub.to_json)
56
+ @client.app_info("app").should == stub
57
+ end
58
+
59
+ it "show the transaction list for an app" do
60
+ stub = [
61
+ {:id => '1', :name => 'app.increment', :description => 'spawn new instance of app', :state => 'started', :status => nil},
62
+ {:id => '2', :name => 'app.deploy', :description => 'deploy code', :state => 'ready', :status => nil}
63
+ ]
64
+ stub_api_request(:get, "/apps/testapp/transactions").to_return(:body => stub.to_json)
65
+ @client.app_transaction_list('testapp').should == stub
66
+ end
67
+
68
+ it "lists transaction details" do
69
+ stub = {
70
+ :id => '123',
71
+ :name => 'app.increment',
72
+ :description => 'spawn new instance of app',
73
+ :state => 'started',
74
+ :status => nil}
75
+ stub_api_request(:get, "/apps/testapp/transactions/123").to_return(:body => stub.to_json)
76
+ @client.app_transaction_info('testapp', '123').should == stub
77
+ end
78
+
79
+ it "deploys lastest" do
80
+ stub = {:id => '1', :name => 'app.deploy', :description => 'deploy new code', :state => 'started', :status => nil}
81
+ stub_api_request(:post, "/apps/testapp/deploy").to_return(:body => stub.to_json)
82
+ @client.app_deploy_latest('testapp').code.should == 200
83
+ end
84
+
85
+ it "deploys to a specific branch and commit" do
86
+ stub = {:id => '1', :name => 'app.deploy', :description => 'deploy new code', :state => 'started', :status => nil}
87
+ stub_api_request(:post, "/apps/testapp/deploy").to_return(:body => stub.to_json)
88
+ @client.app_deploy('testapp', "master", "1abs3d432").code.should == 200
89
+ end
90
+
91
+ it "scales up" do
92
+ stub_api_request(:put, "/apps/testapp/scale-up").with(:body => {"quantity"=>"1"})
93
+ @client.app_scale_up('testapp').code.should == 200
94
+ end
95
+
96
+ it "scales down" do
97
+ stub_api_request(:put, "/apps/testapp/scale-down").with(:body => {"quantity"=>"3"})
98
+ @client.app_scale_down('testapp', 3).code.should == 200
99
+ end
100
+
101
+ end
102
+
103
+ describe "database" do
104
+
105
+ it "can tell if a database exists or not" do
106
+ stub = {:error => "what are you doing? get outa here"}
107
+ stub_api_request(:get, "/apps/app/databases/db").to_return(status: 200,body: stub)
108
+ @client.database_exists?("app", "db").should == true
109
+ end
110
+
111
+ it "returns false if a database doesnt exist" do
112
+ stub = {:error => "what are you doing? get outa here"}
113
+ stub_api_request(:get, "/apps/app/databases/nodb").to_return(status: 404, body: stub)
114
+ @client.database_exists?("app", "nodb").should == false
115
+ end
116
+
117
+ it "lists databases for an application" do
118
+ stub = [
119
+ {:id => '1', :name => 'carrie', :type => 'mysql', :ram => 10 },
120
+ {:id => '2', :name => 'cherisse', :type => 'mongodb', :ram => 512}
121
+ ]
122
+ stub_api_request(:get, "/apps/app/databases").to_return(body: stub.to_json)
123
+ @client.database_list("app").should == stub
124
+ end
125
+
126
+ it "creates a new database" do
127
+ stub_api_request(:post, "/apps/app/databases").to_return(status: 200)
128
+ @client.database_create("app").code.should == 200
129
+ end
130
+
131
+
132
+
133
+ end
134
+
135
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pagoda-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Lyon
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-12 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &2152906460 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2152906460
25
+ - !ruby/object:Gem::Dependency
26
+ name: webmock
27
+ requirement: &2152905640 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2152905640
36
+ - !ruby/object:Gem::Dependency
37
+ name: rest-client
38
+ requirement: &2152904680 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2152904680
47
+ - !ruby/object:Gem::Dependency
48
+ name: json_pure
49
+ requirement: &2152903200 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *2152903200
58
+ description: Api client used to talk to pagodabox.
59
+ email:
60
+ - lyon@pagodabox.com
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - .gitignore
66
+ - Gemfile
67
+ - Rakefile
68
+ - lib/.DS_Store
69
+ - lib/pagoda-client.rb
70
+ - lib/pagoda-client/apis/app.rb
71
+ - lib/pagoda-client/apis/billing.rb
72
+ - lib/pagoda-client/apis/collaborator.rb
73
+ - lib/pagoda-client/apis/componant.rb
74
+ - lib/pagoda-client/apis/database.rb
75
+ - lib/pagoda-client/apis/email.rb
76
+ - lib/pagoda-client/apis/transaction.rb
77
+ - lib/pagoda-client/apis/user.rb
78
+ - lib/pagoda-client/client.rb
79
+ - pagoda-client.gemspec
80
+ - spec/client_spec.rb
81
+ homepage: http://www.pagodabox.com
82
+ licenses: []
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project: pagoda-client
101
+ rubygems_version: 1.8.10
102
+ signing_key:
103
+ specification_version: 3
104
+ summary: Pagodabox API client
105
+ test_files:
106
+ - spec/client_spec.rb