fog-sakuracloud 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.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +65 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +35 -0
  8. data/Rakefile +113 -0
  9. data/fog-sakuracloud.gemspec +41 -0
  10. data/gemfiles/Gemfile.1.8.7 +6 -0
  11. data/lib/fog/sakuracloud.rb +16 -0
  12. data/lib/fog/sakuracloud/compute.rb +65 -0
  13. data/lib/fog/sakuracloud/models/compute/plan.rb +15 -0
  14. data/lib/fog/sakuracloud/models/compute/plans.rb +22 -0
  15. data/lib/fog/sakuracloud/models/compute/server.rb +40 -0
  16. data/lib/fog/sakuracloud/models/compute/servers.rb +63 -0
  17. data/lib/fog/sakuracloud/models/compute/ssh_key.rb +13 -0
  18. data/lib/fog/sakuracloud/models/compute/ssh_keys.rb +22 -0
  19. data/lib/fog/sakuracloud/models/compute/zone.rb +13 -0
  20. data/lib/fog/sakuracloud/models/compute/zones.rb +22 -0
  21. data/lib/fog/sakuracloud/models/volume/archive.rb +14 -0
  22. data/lib/fog/sakuracloud/models/volume/archives.rb +22 -0
  23. data/lib/fog/sakuracloud/models/volume/disk.rb +37 -0
  24. data/lib/fog/sakuracloud/models/volume/disks.rb +27 -0
  25. data/lib/fog/sakuracloud/models/volume/plan.rb +12 -0
  26. data/lib/fog/sakuracloud/models/volume/plans.rb +22 -0
  27. data/lib/fog/sakuracloud/requests/compute/boot_server.rb +31 -0
  28. data/lib/fog/sakuracloud/requests/compute/create_server.rb +41 -0
  29. data/lib/fog/sakuracloud/requests/compute/delete_server.rb +33 -0
  30. data/lib/fog/sakuracloud/requests/compute/list_plans.rb +46 -0
  31. data/lib/fog/sakuracloud/requests/compute/list_servers.rb +44 -0
  32. data/lib/fog/sakuracloud/requests/compute/list_ssh_keys.rb +40 -0
  33. data/lib/fog/sakuracloud/requests/compute/list_zones.rb +40 -0
  34. data/lib/fog/sakuracloud/requests/compute/stop_server.rb +37 -0
  35. data/lib/fog/sakuracloud/requests/volume/attach_disk.rb +30 -0
  36. data/lib/fog/sakuracloud/requests/volume/configure_disk.rb +35 -0
  37. data/lib/fog/sakuracloud/requests/volume/create_disk.rb +43 -0
  38. data/lib/fog/sakuracloud/requests/volume/delete_disk.rb +30 -0
  39. data/lib/fog/sakuracloud/requests/volume/list_archives.rb +46 -0
  40. data/lib/fog/sakuracloud/requests/volume/list_disks.rb +50 -0
  41. data/lib/fog/sakuracloud/requests/volume/list_plans.rb +40 -0
  42. data/lib/fog/sakuracloud/version.rb +5 -0
  43. data/lib/fog/sakuracloud/volume.rb +88 -0
  44. data/tests/helper.rb +8 -0
  45. data/tests/sakuracloud/helper.rb +7 -0
  46. data/tests/sakuracloud/requests/compute/plans_tests.rb +32 -0
  47. data/tests/sakuracloud/requests/compute/servers_tests.rb +46 -0
  48. data/tests/sakuracloud/requests/compute/ssh_keys_tests.rb +30 -0
  49. data/tests/sakuracloud/requests/compute/zones_tests.rb +30 -0
  50. data/tests/sakuracloud/requests/volume/archives_tests.rb +31 -0
  51. data/tests/sakuracloud/requests/volume/disks_tests.rb +47 -0
  52. data/tests/sakuracloud/requests/volume/plans_tests.rb +30 -0
  53. metadata +326 -0
@@ -0,0 +1,40 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Compute
5
+ class SakuraCloud
6
+ class Server < Fog::Model
7
+ identity :id, :aliases => 'ID'
8
+ attribute :name, :aliases => 'Name'
9
+ attribute :server_plan, :aliases => 'ServerPlan'
10
+ attribute :instance, :aliases => 'Instance'
11
+ attribute :disks, :aliases => 'Disks'
12
+ attribute :interfaces, :aliases => 'Interfaces'
13
+
14
+ def save
15
+ requires :name, :server_plan
16
+ data = service.create_server(@attributes[:name], @attributes[:server_plan]).body["Server"]
17
+ merge_attributes(data)
18
+ true
19
+ end
20
+
21
+ def boot
22
+ requires :id
23
+ service.boot_server(@attributes[:id])
24
+ end
25
+
26
+ def stop(force = false)
27
+ requires :id
28
+ service.stop_server(@attributes[:id], force)
29
+ end
30
+
31
+ def delete(disks = [])
32
+ requires :id
33
+ service.delete_server(@attributes[:id], disks)
34
+ true
35
+ end
36
+ alias_method :destroy, :delete
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,63 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/sakuracloud/models/compute/server'
3
+
4
+ module Fog
5
+ module Compute
6
+ class SakuraCloud
7
+ class Servers < Fog::Collection
8
+ model Fog::Compute::SakuraCloud::Server
9
+
10
+ def all
11
+ load service.list_servers.body['Servers']
12
+ end
13
+
14
+ def get(id)
15
+ all.find { |f| f.id == id }
16
+ rescue Fog::Errors::NotFound
17
+ nil
18
+ end
19
+
20
+ def create(options = {})
21
+ user = options[:user] || 'root'
22
+ Fog::Logger.warning("Create Server")
23
+ data = service.create_server(Fog::UUID.uuid, options[:serverplan]).body["Server"]
24
+ server = service.servers.new
25
+ server.merge_attributes(data)
26
+
27
+ if options[:volume]
28
+ disk = create_and_attach_volume(server, options)
29
+ server.reload
30
+ end
31
+ server.boot if options[:boot]
32
+ server
33
+ end
34
+
35
+ private
36
+ def create_and_attach_volume(server, options)
37
+ Fog::Logger.warning("Create Volume")
38
+ sakuracloud_api_token = options[:sakuracloud_api_token] || Fog.credentials[:sakuracloud_api_token]
39
+ sakuracloud_api_token_secret = options[:sakuracloud_api_token_secret] || Fog.credentials[:sakuracloud_api_token_secret]
40
+ volume = Fog::Volume::SakuraCloud.new(:sakuracloud_api_token => sakuracloud_api_token, :sakuracloud_api_token_secret => sakuracloud_api_token_secret)
41
+ disk = volume.disks.create :name => Fog::UUID.uuid,
42
+ :plan => options[:volume][:diskplan].to_i,
43
+ :source_archive => options[:volume][:sourcearchive].to_s
44
+ Fog::Logger.warning("Waiting disk until available")
45
+ disk.wait_for { availability == 'available' }
46
+ volume.attach_disk(disk.id, server.id)
47
+ disk_attached?(server, disk.id)
48
+ Fog::Logger.warning("Modifing disk")
49
+ volume.configure_disk(disk.id, options[:sshkey])
50
+ disk
51
+ end
52
+
53
+ def disk_attached?(server, disk_id)
54
+ until server.disks.find {|s| disk_id.to_s}
55
+ print '.'
56
+ sleep 2
57
+ server.reload
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,13 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Compute
5
+ class SakuraCloud
6
+ class SshKey < Fog::Model
7
+ identity :id, :aliases => 'ID'
8
+ attribute :name, :aliases => 'Name'
9
+ attribute :public_key, :aliases => 'PublicKey'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/sakuracloud/models/compute/ssh_key'
3
+
4
+ module Fog
5
+ module Compute
6
+ class SakuraCloud
7
+ class SshKeys < Fog::Collection
8
+ model Fog::Compute::SakuraCloud::SshKey
9
+
10
+ def all
11
+ load service.list_ssh_keys.body['SSHKeys']
12
+ end
13
+
14
+ def get(id)
15
+ all.find { |f| f.id == id }
16
+ rescue Fog::Errors::NotFound
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,13 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Compute
5
+ class SakuraCloud
6
+ class Zone < Fog::Model
7
+ identity :id, :aliases => 'ID'
8
+ attribute :name, :aliases => 'Name'
9
+ attribute :description, :aliases => 'Description'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/sakuracloud/models/compute/zone'
3
+
4
+ module Fog
5
+ module Compute
6
+ class SakuraCloud
7
+ class Zones < Fog::Collection
8
+ model Fog::Compute::SakuraCloud::Zone
9
+
10
+ def all
11
+ load service.list_zones.body['Zones']
12
+ end
13
+
14
+ def get(id)
15
+ all.find { |f| f.id == id }
16
+ rescue Fog::Errors::NotFound
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Volume
5
+ class SakuraCloud
6
+ class Archive < Fog::Model
7
+ identity :id, :aliases => 'ID'
8
+ attribute :name, :aliases => 'Name'
9
+ attribute :size_mb, :aliases => 'SizeMB'
10
+ attribute :plan, :aliases => 'Plan'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/sakuracloud/models/volume/archive'
3
+
4
+ module Fog
5
+ module Volume
6
+ class SakuraCloud
7
+ class Archives < Fog::Collection
8
+ model Fog::Volume::SakuraCloud::Archive
9
+
10
+ def all
11
+ load service.list_archives.body['Archives']
12
+ end
13
+
14
+ def get(id)
15
+ all.find { |f| f.id == id }
16
+ rescue Fog::Errors::NotFound
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Volume
5
+ class SakuraCloud
6
+ class Disk < Fog::Model
7
+ identity :id, :aliases => 'ID'
8
+ attribute :name, :aliases => 'Name'
9
+ attribute :connection, :aliases => 'Connection'
10
+ attribute :availability, :aliases => 'Availability'
11
+ attribute :plan, :aliases => 'Plan'
12
+ attribute :size_mb, :aliases => 'SizeMB'
13
+ attribute :source_disk, :aliases => 'SourceDisk'
14
+ attribute :source_archive, :aliases => 'SourceArchive'
15
+
16
+ def delete
17
+ service.delete_disk(identity)
18
+ true
19
+ end
20
+ alias_method :destroy, :delete
21
+
22
+ def save
23
+ requires :name, :plan, :source_archive
24
+ data = service.create_disk(@attributes[:name], @attributes[:plan], @attributes[:source_archive]).body["Disk"]
25
+ merge_attributes(data)
26
+ true
27
+ end
28
+
29
+ def configure(sshkey_id)
30
+ requires :id
31
+ service.configure_disk(@attributes[:id], sshkey_id )
32
+ true
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/sakuracloud/models/volume/disk'
3
+
4
+ module Fog
5
+ module Volume
6
+ class SakuraCloud
7
+ class Disks < Fog::Collection
8
+ model Fog::Volume::SakuraCloud::Disk
9
+
10
+ def all
11
+ load service.list_disks.body['Disks']
12
+ end
13
+
14
+ def get(id)
15
+ all.find { |f| f.id == id }
16
+ rescue Fog::Errors::NotFound
17
+ nil
18
+ end
19
+
20
+ def delete(id)
21
+ service.delete_disk(id)
22
+ true
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Volume
5
+ class SakuraCloud
6
+ class Plan < Fog::Model
7
+ identity :id, :aliases => 'ID'
8
+ attribute :name, :aliases => 'Name'
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,22 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/sakuracloud/models/volume/plan'
3
+
4
+ module Fog
5
+ module Volume
6
+ class SakuraCloud
7
+ class Plans < Fog::Collection
8
+ model Fog::Volume::SakuraCloud::Plan
9
+
10
+ def all
11
+ load service.list_plans.body['DiskPlans']
12
+ end
13
+
14
+ def get(id)
15
+ all.find { |f| f.id == id }
16
+ rescue Fog::Errors::NotFound
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+
3
+ module Fog
4
+ module Compute
5
+ class SakuraCloud
6
+ class Real
7
+ def boot_server( id )
8
+ request(
9
+ :headers => {
10
+ 'Authorization' => "Basic #{@auth_encord}"
11
+ },
12
+ :expects => [200],
13
+ :method => 'PUT',
14
+ :path => "#{Fog::SakuraCloud::SAKURACLOUD_API_ENDPOINT}/server/#{id}/power"
15
+ )
16
+ true
17
+ end
18
+ end # Real
19
+
20
+ class Mock
21
+ def boot_server( id )
22
+ response = Excon::Response.new
23
+ response.status = 200
24
+ response.body = {
25
+ }
26
+ response
27
+ end
28
+ end
29
+ end # SakuraCloud
30
+ end # Volume
31
+ end # Fog
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+
3
+ module Fog
4
+ module Compute
5
+ class SakuraCloud
6
+ class Real
7
+ def create_server( name, serverplan )
8
+ body = {
9
+ "Server" => {
10
+ "Name" => name,
11
+ "ServerPlan" => {
12
+ "ID" => serverplan.to_i
13
+ },
14
+ "ConnectedSwitches"=>[{"Scope"=>"shared", "BandWidthMbps"=>100}]
15
+ }
16
+ }
17
+
18
+ request(
19
+ :headers => {
20
+ 'Authorization' => "Basic #{@auth_encord}"
21
+ },
22
+ :expects => [201],
23
+ :method => 'POST',
24
+ :path => "#{Fog::SakuraCloud::SAKURACLOUD_API_ENDPOINT}/server",
25
+ :body => Fog::JSON.encode(body)
26
+ )
27
+ end
28
+ end # Real
29
+
30
+ class Mock
31
+ def create_server( name, serverplan )
32
+ response = Excon::Response.new
33
+ response.status = 201
34
+ response.body = {
35
+ }
36
+ response
37
+ end
38
+ end
39
+ end # SakuraCloud
40
+ end # Volume
41
+ end # Fog
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+
3
+ module Fog
4
+ module Compute
5
+ class SakuraCloud
6
+ class Real
7
+ def delete_server( id, force = false, disks = [] )
8
+ body = { "Force" => force, 'WithDisk' => disks }
9
+
10
+ request(
11
+ :headers => {
12
+ 'Authorization' => "Basic #{@auth_encord}"
13
+ },
14
+ :expects => [200],
15
+ :method => 'DELETE',
16
+ :path => "#{Fog::SakuraCloud::SAKURACLOUD_API_ENDPOINT}/server/#{id}",
17
+ :body => Fog::JSON.encode(body)
18
+ )
19
+ end
20
+ end # Real
21
+
22
+ class Mock
23
+ def delete_server( id, force = false, disks = [] )
24
+ response = Excon::Response.new
25
+ response.status = 200
26
+ response.body = {
27
+ }
28
+ response
29
+ end
30
+ end
31
+ end # SakuraCloud
32
+ end # Volume
33
+ end # Fog
@@ -0,0 +1,46 @@
1
+ # coding: utf-8
2
+
3
+ module Fog
4
+ module Compute
5
+ class SakuraCloud
6
+ class Real
7
+ def list_plans(options = {})
8
+ request(
9
+ :headers => {
10
+ 'Authorization' => "Basic #{@auth_encord}"
11
+ },
12
+ :method => 'GET',
13
+ :path => "#{Fog::SakuraCloud::SAKURACLOUD_API_ENDPOINT}/product/server"
14
+ )
15
+ end
16
+ end
17
+
18
+ class Mock
19
+ def list_plans(options = {})
20
+ response = Excon::Response.new
21
+ response.status = 200
22
+ response.body = {
23
+ "ServerPlans" =>
24
+ [
25
+ {"Index"=>0,
26
+ "ID"=>1001,
27
+ "Name"=>"プラン/1Core-1GB",
28
+ "CPU"=>1,
29
+ "MemoryMB"=>1024,
30
+ "ServiceClass"=>"cloud/plan/1core-1gb",
31
+ "Availability"=>"available"},
32
+ {"Index"=>1,
33
+ "ID"=>2001,
34
+ "Name"=>"プラン/1Core-2GB",
35
+ "CPU"=>1,
36
+ "MemoryMB"=>2048,
37
+ "ServiceClass"=>"cloud/plan/1core-2gb",
38
+ "Availability"=>"available"}
39
+ ]
40
+ }
41
+ response
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end