fog-cloudatcost 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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +28 -0
  3. data/.gitignore +37 -0
  4. data/.rubocop.yml +1168 -0
  5. data/.travis.yml +38 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +69 -0
  8. data/LICENSE +22 -0
  9. data/README.md +5 -0
  10. data/Rakefile +21 -0
  11. data/fog-cloudatcost.gemspec +32 -0
  12. data/gemfiles/Gemfile-edge +9 -0
  13. data/lib/fog/cloudatcost.rb +5 -0
  14. data/lib/fog/cloudatcost/compute.rb +80 -0
  15. data/lib/fog/cloudatcost/core.rb +9 -0
  16. data/lib/fog/cloudatcost/examples/getting_started.md +82 -0
  17. data/lib/fog/cloudatcost/models/server.rb +96 -0
  18. data/lib/fog/cloudatcost/models/servers.rb +28 -0
  19. data/lib/fog/cloudatcost/models/task.rb +21 -0
  20. data/lib/fog/cloudatcost/models/tasks.rb +28 -0
  21. data/lib/fog/cloudatcost/models/template.rb +10 -0
  22. data/lib/fog/cloudatcost/models/templates.rb +28 -0
  23. data/lib/fog/cloudatcost/requests/console.rb +32 -0
  24. data/lib/fog/cloudatcost/requests/create_server.rb +33 -0
  25. data/lib/fog/cloudatcost/requests/delete_server.rb +33 -0
  26. data/lib/fog/cloudatcost/requests/list_servers.rb +28 -0
  27. data/lib/fog/cloudatcost/requests/list_tasks.rb +28 -0
  28. data/lib/fog/cloudatcost/requests/list_templates.rb +28 -0
  29. data/lib/fog/cloudatcost/requests/power_off.rb +34 -0
  30. data/lib/fog/cloudatcost/requests/power_on.rb +34 -0
  31. data/lib/fog/cloudatcost/requests/rename_server.rb +32 -0
  32. data/lib/fog/cloudatcost/requests/reset.rb +34 -0
  33. data/lib/fog/cloudatcost/requests/reverse_dns.rb +32 -0
  34. data/lib/fog/cloudatcost/requests/run_mode.rb +32 -0
  35. data/lib/fog/cloudatcost/version.rb +5 -0
  36. data/spec/fog/models/server_spec.rb +18 -0
  37. data/spec/fog/models/servers_spec.rb +11 -0
  38. data/spec/fog/models/task_spec.rb +58 -0
  39. data/spec/fog/models/tasks_spec.rb +11 -0
  40. data/spec/fog/models/template_spec.rb +14 -0
  41. data/spec/fog/models/templates_spec.rb +11 -0
  42. data/spec/model_setup.rb +14 -0
  43. data/spec/spec_helper.rb +5 -0
  44. metadata +208 -0
@@ -0,0 +1,38 @@
1
+ language: ruby
2
+ sudo: false
3
+ script: bundle exec rake test
4
+ cache: bundler
5
+ branches:
6
+ except:
7
+ - "/\\Av\\d+\\Z/"
8
+ matrix:
9
+ fast_finish: true
10
+ include:
11
+ - rvm: 1.9.3
12
+ gemfile: Gemfile
13
+ - rvm: 2.0.0
14
+ gemfile: Gemfile
15
+ - rvm: 2.1.0
16
+ gemfile: Gemfile
17
+ - rvm: 2.1.1
18
+ gemfile: Gemfile
19
+ - rvm: 2.1.1
20
+ gemfile: gemfiles/Gemfile-edge
21
+ - rvm: 2.2.0
22
+ gemfile: Gemfile
23
+ - rvm: 2.2.0
24
+ gemfile: gemfiles/Gemfile-edge
25
+ - rvm: 2.3.0
26
+ gemfile: Gemfile
27
+ - rvm: 2.3.0
28
+ gemfile: gemfiles/Gemfile-edge
29
+ - rvm: jruby-19mode
30
+ gemfile: Gemfile
31
+ - rvm: jruby-head
32
+ gemfile: Gemfile
33
+ allow_failures:
34
+ - rvm: jruby-head
35
+
36
+ addons:
37
+ code_climate:
38
+ repo_token: 412dc14b81fbd1f8d7356deb5feac31a8d69583d00ec1ba18040caf99343ee25
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'codeclimate-test-reporter', group: :test, require: nil
@@ -0,0 +1,69 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ fog-cloudatcost (0.1.0)
5
+ fog-core (~> 1.27)
6
+ fog-json (~> 1.0)
7
+ fog-xml (~> 0.1)
8
+ ipaddress (~> 0.8)
9
+
10
+ GEM
11
+ remote: http://rubygems.org/
12
+ specs:
13
+ builder (3.2.2)
14
+ codeclimate-test-reporter (0.4.8)
15
+ simplecov (>= 0.7.1, < 1.0.0)
16
+ diff-lcs (1.2.5)
17
+ docile (1.1.5)
18
+ excon (0.45.4)
19
+ fog-core (1.35.0)
20
+ builder
21
+ excon (~> 0.45)
22
+ formatador (~> 0.2)
23
+ fog-json (1.0.2)
24
+ fog-core (~> 1.0)
25
+ multi_json (~> 1.10)
26
+ fog-xml (0.1.2)
27
+ fog-core
28
+ nokogiri (~> 1.5, >= 1.5.11)
29
+ formatador (0.2.5)
30
+ ipaddress (0.8.2)
31
+ json (1.8.3)
32
+ mini_portile2 (2.0.0)
33
+ multi_json (1.11.2)
34
+ nokogiri (1.6.7.1)
35
+ mini_portile2 (~> 2.0.0.rc2)
36
+ rake (10.4.2)
37
+ rspec (3.4.0)
38
+ rspec-core (~> 3.4.0)
39
+ rspec-expectations (~> 3.4.0)
40
+ rspec-mocks (~> 3.4.0)
41
+ rspec-core (3.4.1)
42
+ rspec-support (~> 3.4.0)
43
+ rspec-expectations (3.4.0)
44
+ diff-lcs (>= 1.2.0, < 2.0)
45
+ rspec-support (~> 3.4.0)
46
+ rspec-mocks (3.4.0)
47
+ diff-lcs (>= 1.2.0, < 2.0)
48
+ rspec-support (~> 3.4.0)
49
+ rspec-support (3.4.1)
50
+ rubyzip (0.9.9)
51
+ simplecov (0.11.1)
52
+ docile (~> 1.1.0)
53
+ json (~> 1.8)
54
+ simplecov-html (~> 0.10.0)
55
+ simplecov-html (0.10.0)
56
+
57
+ PLATFORMS
58
+ ruby
59
+
60
+ DEPENDENCIES
61
+ bundler (~> 1.6)
62
+ codeclimate-test-reporter
63
+ fog-cloudatcost!
64
+ rake (~> 10.0)
65
+ rspec (~> 3.4.0)
66
+ rubyzip (~> 0.9.9)
67
+
68
+ BUNDLED WITH
69
+ 1.11.2
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Suraj Shirvankar
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 all
13
+ 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 THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1,5 @@
1
+ [![Build Status](https://travis-ci.org/h0lyalg0rithm/fog-cloudatcost.svg?branch=master)](https://travis-ci.org/h0lyalg0rithm/fog-cloudatcost)
2
+ [![Code Climate](https://codeclimate.com/github/h0lyalg0rithm/fog-cloudatcost/badges/gpa.svg)](https://codeclimate.com/github/h0lyalg0rithm/fog-cloudatcost)
3
+
4
+ # fog-cloudatcost
5
+ Module for the 'fog' gem to support Amazon Web Services http://panel.cloudatcost.com/
@@ -0,0 +1,21 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+
4
+ require 'rubygems'
5
+ require 'bundler/setup'
6
+ require 'rake/testtask'
7
+
8
+ task :test do
9
+ sh("bundle exec rspec")
10
+ end
11
+
12
+ require_relative 'lib/fog/cloudatcost'
13
+
14
+ task :default => :test
15
+ mock = ENV['FOG_MOCK'] || 'true'
16
+
17
+ namespace :test do
18
+ task :travis do
19
+ sh("export FOG_MOCK=#{mock} && bundle exec rspec")
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'fog/cloudatcost/version'
4
+
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'fog-cloudatcost'
8
+ spec.version = Fog::CloudAtCost::VERSION
9
+ spec.authors = ["Suraj Shirvankar"]
10
+ spec.email = ["surajshirvankar@gmail.com"]
11
+ spec.summary = %q{Module for the 'fog' gem to support CloudAtCost.}
12
+ spec.description = %q{This library can be used as a module for `fog` or as standalone provider
13
+ to use the Amazon Web Services in applications..}
14
+ spec.homepage = 'http://github.com/fog/fog-cloudatcost'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency 'bundler', '~> 1.6'
23
+ spec.add_development_dependency 'rake', '~> 10.0'
24
+ spec.add_development_dependency 'rspec', '~> 3.4.0'
25
+ spec.add_development_dependency 'rubyzip', '~> 0.9.9'
26
+
27
+ spec.add_dependency 'fog-core', '~> 1.27'
28
+ spec.add_dependency 'fog-json', '~> 1.0'
29
+ spec.add_dependency 'fog-xml', '~> 0.1'
30
+ spec.add_dependency 'ipaddress', '~> 0.8'
31
+ end
32
+
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Shared components
4
+ gem 'fog-core', :github => 'fog/fog-core'
5
+ gem 'fog-json', :github => 'fog/fog-json'
6
+
7
+ gem 'codeclimate-test-reporter', group: :test, require: nil
8
+
9
+ gemspec :path => '../'
@@ -0,0 +1,5 @@
1
+ require 'fog/core'
2
+ require 'fog/xml'
3
+ require 'fog/json'
4
+
5
+ require_relative 'cloudatcost/version'
@@ -0,0 +1,80 @@
1
+ require 'fog/cloudatcost/core'
2
+
3
+ module Fog
4
+ module Compute
5
+ class CloudAtCost < Fog::Service
6
+ requires :api_key, :email
7
+
8
+
9
+ model_path 'fog/cloudatcost/models'
10
+ model :server
11
+ collection :servers
12
+ model :task
13
+ collection :tasks
14
+ model :template
15
+ collection :templates
16
+
17
+ request_path 'fog/cloudatcost/requests'
18
+ request :list_servers
19
+ request :list_tasks
20
+ request :console
21
+ request :create_server
22
+ request :list_templates
23
+ request :power_off
24
+ request :power_on
25
+ request :rename_server
26
+ request :reset
27
+ request :reverse_dns
28
+ request :run_mode
29
+
30
+ class Mock
31
+
32
+ def initialize(options={})
33
+ @api_key = options[:api_key]
34
+ @email = options[:email]
35
+ end
36
+
37
+ end
38
+
39
+ class Real
40
+
41
+ def initialize(options={})
42
+ @api_key = options[:api_key]
43
+ @email = options[:email]
44
+ persistent = false
45
+ @connection = Fog::Core::Connection.new 'https://panel.cloudatcost.com', persistent, options
46
+ end
47
+
48
+ def request(params)
49
+ params[:headers] ||= { 'Content-Type' => 'application/x-www-form-urlencoded' }
50
+ params[:query] ||= {}
51
+ required_params = {
52
+ key: "#{@api_key}",
53
+ login: "#{@email}"
54
+ }
55
+ begin
56
+ if params[:method] == 'POST'
57
+ params_body = required_params.merge(params[:body])
58
+ params[:body] = params_body.reduce(""){ |acc,(x,y)| "#{acc}&#{x}=#{y}" }
59
+ else
60
+ params[:query] = required_params.merge(params[:query])
61
+ end
62
+ response = @connection.request(params)
63
+ rescue Excon::Errors::HTTPStatusError => error
64
+ raise case error
65
+ when Excon::Errors::NotFound
66
+ Fog::Compute::Bluebox::NotFound.slurp(error)
67
+ else
68
+ error
69
+ end
70
+ end
71
+ unless response.body.empty?
72
+ response.body = Fog::JSON.decode(response.body)
73
+ end
74
+ response
75
+ end
76
+
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,9 @@
1
+ require 'fog/core'
2
+ require 'fog/json'
3
+
4
+ module Fog
5
+ module CloudAtCost
6
+ extend Fog::Provider
7
+ service(:compute, 'Compute')
8
+ end
9
+ end
@@ -0,0 +1,82 @@
1
+ # Getting started: the compute service
2
+ The CloudAtCost UI is pretty terrible,its slow and it stops working most of the time.Moreover you cannot customize the machines.This is where the fog comes to play.
3
+
4
+ To use fog
5
+
6
+ You'll need a CloudAtCost account and an API token to use this provider.
7
+
8
+ Get one from https://panel.cloudatcost.com.
9
+
10
+ Click on the settings button in menu.
11
+ Make sure you add your ip to the allowed ip field.
12
+
13
+ Write down the API Token.
14
+
15
+ ## Connecting, retrieving and managing server objects
16
+
17
+ First, create a connection to the host:
18
+
19
+ ```ruby
20
+ require 'fog'
21
+
22
+ cac = Fog::Compute.new({
23
+ :provider => 'CloudAtCost',
24
+ :email => 'example@email.com', # Your email address
25
+ :api_key => 'poiuweoruwoeiuroiwuer', # your API Token
26
+ })
27
+ ```
28
+
29
+ ## Listing servers
30
+
31
+ Listing servers and attributes:
32
+
33
+ ```ruby
34
+ cac do |server|
35
+ puts server.ip
36
+ puts server.servername
37
+ puts server.vmname
38
+ puts server.mode
39
+ puts server.label
40
+ end
41
+ ```
42
+
43
+ ## Server creation and life-cycle management
44
+
45
+ Creating a new server :
46
+
47
+ ```ruby
48
+ server = cac.servers.create :cpu => 'foobar', # 1, 2, 4
49
+ :ram => 1024, # multiple of 4 min 512
50
+ :storage => 10, # 10G
51
+ :template_id => 75 #Template id
52
+ ```
53
+
54
+ The server is automatically started after that.
55
+
56
+ As you can see you need the template_id to create the server:
57
+
58
+ ```ruby
59
+ cac.templates.each do |image|
60
+ puts image.id
61
+ puts image.detail
62
+ end
63
+ ```
64
+
65
+ Power off a server:
66
+
67
+ ```ruby
68
+ server = cac.servers.first
69
+ server.power_off
70
+ ```
71
+
72
+ Power on a server:
73
+
74
+ ```ruby
75
+ server.power_on
76
+ ```
77
+
78
+ Destroying the server:
79
+
80
+ ```ruby
81
+ server.destroy
82
+ ```
@@ -0,0 +1,96 @@
1
+ require 'fog/compute/models/server'
2
+
3
+ module Fog
4
+ module Compute
5
+ class CloudAtCost
6
+ class Server < Fog::Compute::Server
7
+ identity :sid
8
+ attribute :id
9
+ attribute :CustID
10
+ attribute :packageid
11
+ attribute :servername
12
+ attribute :label
13
+ attribute :vmname
14
+ attribute :ip
15
+ attribute :netmask
16
+ attribute :gateway
17
+ attribute :hostname
18
+ attribute :rootpass
19
+ attribute :vncport
20
+ attribute :vncpass
21
+ attribute :servertype
22
+ attribute :template
23
+ attribute :cpu
24
+ attribute :cpuusage
25
+ attribute :ram
26
+ attribute :ramusage
27
+ attribute :storage
28
+ attribute :hdusage
29
+ attribute :sdate
30
+ attribute :status
31
+ attribute :panel_note
32
+ attribute :mode
33
+ attribute :uid
34
+ attribute :rdns
35
+ attribute :rdnsdefault
36
+ attribute :template_id
37
+
38
+
39
+ def new_instance?
40
+ not persisted?
41
+ end
42
+
43
+ def save
44
+ raise Fog::Errors::Error.new('Re-saving an existing object may create a duplicate') if persisted?
45
+ save!
46
+ end
47
+
48
+ def save!
49
+ requires :cpu, :ram, :storage, :template_id
50
+ data = service.create_server(cpu, ram, storage, template_id)
51
+ end
52
+
53
+ def destroy
54
+ perform_action :delete_server
55
+ end
56
+
57
+ def power_on
58
+ perform_action :power_on
59
+ end
60
+
61
+ def power_off
62
+ perform_action :power_off
63
+ end
64
+
65
+ def reset
66
+ perform_action :reset
67
+ end
68
+
69
+ def run_mode(mode)
70
+ perform_action :run_mode, mode
71
+ end
72
+
73
+ def rename_server(name)
74
+ perform_action :rename_server, name
75
+ end
76
+
77
+ def reverse_dns(hostname)
78
+ perform_action :reverse_dns, hostname
79
+ end
80
+
81
+ def console
82
+ perform_action :console
83
+ end
84
+
85
+ private
86
+
87
+ def perform_action(action, *args)
88
+ requires :sid
89
+ response = service.send(action, sid, *args)
90
+ response.body
91
+ end
92
+
93
+ end
94
+ end
95
+ end
96
+ end