profitbricks 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/.autotest +23 -0
  2. data/.gemtest +0 -0
  3. data/.rspec +3 -0
  4. data/CHANGELOG.md +6 -0
  5. data/Gemfile +8 -0
  6. data/Gemfile.lock +53 -0
  7. data/Manifest.txt +106 -0
  8. data/README.md +70 -0
  9. data/Rakefile +31 -0
  10. data/bin/profitbricks +3 -0
  11. data/examples/create_datacenter.rb +57 -0
  12. data/lib/profitbricks/config.rb +16 -0
  13. data/lib/profitbricks/data_center.rb +100 -0
  14. data/lib/profitbricks/extensions.rb +9 -0
  15. data/lib/profitbricks/image.rb +47 -0
  16. data/lib/profitbricks/ip_block.rb +49 -0
  17. data/lib/profitbricks/model.rb +102 -0
  18. data/lib/profitbricks/nic.rb +103 -0
  19. data/lib/profitbricks/profitbricks.rb +86 -0
  20. data/lib/profitbricks/server.rb +83 -0
  21. data/lib/profitbricks/storage.rb +84 -0
  22. data/lib/profitbricks.rb +15 -0
  23. data/profitbricks.gemspec +34 -0
  24. data/spec/fixtures/add_public_ip_to_nic/success.json +10 -0
  25. data/spec/fixtures/add_public_ip_to_nic/success.xml +1 -0
  26. data/spec/fixtures/clear_data_center/success.json +10 -0
  27. data/spec/fixtures/clear_data_center/success.xml +1 -0
  28. data/spec/fixtures/connect_storage_to_server/success.json +10 -0
  29. data/spec/fixtures/connect_storage_to_server/success.xml +1 -0
  30. data/spec/fixtures/create_data_center/success.json +10 -0
  31. data/spec/fixtures/create_data_center/success.xml +1 -0
  32. data/spec/fixtures/create_nic/success.json +11 -0
  33. data/spec/fixtures/create_nic/success.xml +1 -0
  34. data/spec/fixtures/create_server/minimal.json +11 -0
  35. data/spec/fixtures/create_server/minimal.xml +1 -0
  36. data/spec/fixtures/create_storage/success.json +11 -0
  37. data/spec/fixtures/create_storage/success.xml +1 -0
  38. data/spec/fixtures/delete_data_center/success.json +8 -0
  39. data/spec/fixtures/delete_data_center/success.xml +1 -0
  40. data/spec/fixtures/delete_nic/success.json +10 -0
  41. data/spec/fixtures/delete_nic/success.xml +1 -0
  42. data/spec/fixtures/delete_server/success.json +10 -0
  43. data/spec/fixtures/delete_server/success.xml +1 -0
  44. data/spec/fixtures/delete_storage/failture.json +16 -0
  45. data/spec/fixtures/delete_storage/failture.xml +1 -0
  46. data/spec/fixtures/delete_storage/success.json +10 -0
  47. data/spec/fixtures/delete_storage/success.xml +1 -0
  48. data/spec/fixtures/disconnect_storage_from_server/failture.json +16 -0
  49. data/spec/fixtures/disconnect_storage_from_server/failture.xml +1 -0
  50. data/spec/fixtures/disconnect_storage_from_server/success.json +10 -0
  51. data/spec/fixtures/disconnect_storage_from_server/success.xml +1 -0
  52. data/spec/fixtures/get_all_data_centers/empty.json +1 -0
  53. data/spec/fixtures/get_all_data_centers/empty.xml +1 -0
  54. data/spec/fixtures/get_all_data_centers/test_datacenter.json +10 -0
  55. data/spec/fixtures/get_all_data_centers/test_datacenter.xml +1 -0
  56. data/spec/fixtures/get_all_images/success.json +100 -0
  57. data/spec/fixtures/get_all_images/success.xml +1 -0
  58. data/spec/fixtures/get_all_public_ip_blocks/success.json +16 -0
  59. data/spec/fixtures/get_all_public_ip_blocks/success.xml +1 -0
  60. data/spec/fixtures/get_data_center/create.json +147 -0
  61. data/spec/fixtures/get_data_center/create.xml +1 -0
  62. data/spec/fixtures/get_data_center/two_servers_with_storage.json +147 -0
  63. data/spec/fixtures/get_data_center/two_servers_with_storage.xml +1 -0
  64. data/spec/fixtures/get_data_center_state/in_process.json +1 -0
  65. data/spec/fixtures/get_data_center_state/in_process.xml +1 -0
  66. data/spec/fixtures/get_data_center_state/success.json +1 -0
  67. data/spec/fixtures/get_data_center_state/success.xml +1 -0
  68. data/spec/fixtures/get_image/success.json +15 -0
  69. data/spec/fixtures/get_image/success.xml +1 -0
  70. data/spec/fixtures/get_nic/success.json +16 -0
  71. data/spec/fixtures/get_nic/success.xml +1 -0
  72. data/spec/fixtures/get_nic/two_ips.json +19 -0
  73. data/spec/fixtures/get_nic/two_ips.xml +1 -0
  74. data/spec/fixtures/get_server/after_create.json +17 -0
  75. data/spec/fixtures/get_server/after_create.xml +1 -0
  76. data/spec/fixtures/get_server/connected_storage.json +26 -0
  77. data/spec/fixtures/get_server/connected_storage.xml +1 -0
  78. data/spec/fixtures/get_storage/success.json +14 -0
  79. data/spec/fixtures/get_storage/success.xml +1 -0
  80. data/spec/fixtures/reboot_server/success.json +1 -0
  81. data/spec/fixtures/reboot_server/success.xml +1 -0
  82. data/spec/fixtures/release_public_ip_block/success.json +1 -0
  83. data/spec/fixtures/release_public_ip_block/success.xml +1 -0
  84. data/spec/fixtures/remove_public_ip_from_nic/success.json +10 -0
  85. data/spec/fixtures/remove_public_ip_from_nic/success.xml +1 -0
  86. data/spec/fixtures/reserve_public_ip_block/success.json +13 -0
  87. data/spec/fixtures/reserve_public_ip_block/success.xml +1 -0
  88. data/spec/fixtures/set_image_os_type/success.json +1 -0
  89. data/spec/fixtures/set_image_os_type/success.xml +1 -0
  90. data/spec/fixtures/set_internet_access/success.json +10 -0
  91. data/spec/fixtures/set_internet_access/success.xml +1 -0
  92. data/spec/fixtures/update_data_center/success.json +10 -0
  93. data/spec/fixtures/update_data_center/success.xml +1 -0
  94. data/spec/fixtures/update_nic/success.json +10 -0
  95. data/spec/fixtures/update_nic/success.xml +1 -0
  96. data/spec/fixtures/update_server/basic.json +10 -0
  97. data/spec/fixtures/update_server/basic.xml +1 -0
  98. data/spec/fixtures/update_storage/success.json +10 -0
  99. data/spec/fixtures/update_storage/success.xml +1 -0
  100. data/spec/profitbricks/data_center_spec.rb +95 -0
  101. data/spec/profitbricks/image_spec.rb +23 -0
  102. data/spec/profitbricks/ip_block_spec.rb +26 -0
  103. data/spec/profitbricks/model_spec.rb +68 -0
  104. data/spec/profitbricks/nic_spec.rb +55 -0
  105. data/spec/profitbricks/server_spec.rb +41 -0
  106. data/spec/profitbricks/storage_spec.rb +47 -0
  107. data/spec/spec_helper.rb +45 -0
  108. metadata +193 -0
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getServerResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><dataCenterId>b3eebede-5c78-417c-b1bc-ff5de01a0602</dataCenterId><dataCenterVersion>35</dataCenterVersion><serverId>4cb6550f-3777-4818-8f4c-51233162a980</serverId><serverName>Power of two</serverName><cores>1</cores><ram>256</ram><internetAccess>false</internetAccess><connectedStorages><busType>VIRTIO</busType><deviceNumber>900</deviceNumber><size>5</size><storageId>f55952bc-da27-4e29-af89-ed212ea28e11</storageId><storageName>Test Storage</storageName></connectedStorages><provisioningState>AVAILABLE</provisioningState><virtualMachineState>RUNNING</virtualMachineState><creationTime>2012-03-04T23:04:26.329+01:00</creationTime><lastModificationTime>2012-03-05T11:25:11.704+01:00</lastModificationTime><osType>UNKNOWN</osType></return></ns2:getServerResponse></S:Body></S:Envelope>
@@ -0,0 +1,14 @@
1
+ {
2
+ "get_storage_response": {
3
+ "@xmlns:ns2": "http://ws.api.profitbricks.com/",
4
+ "return": {
5
+ "data_center_id": "b3eebede-5c78-417c-b1bc-ff5de01a0602",
6
+ "data_center_version": "31",
7
+ "os_type": "UNKNOWN",
8
+ "provisioning_state": "INACTIVE",
9
+ "size": "5",
10
+ "storage_id": "f55952bc-da27-4e29-af89-ed212ea28e11",
11
+ "storage_name": "Test Storage"
12
+ }
13
+ }
14
+ }
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getStorageResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><dataCenterId>b3eebede-5c78-417c-b1bc-ff5de01a0602</dataCenterId><dataCenterVersion>31</dataCenterVersion><storageId>f55952bc-da27-4e29-af89-ed212ea28e11</storageId><size>5</size><storageName>Test Storage</storageName><provisioningState>INACTIVE</provisioningState><osType>UNKNOWN</osType></return></ns2:getStorageResponse></S:Body></S:Envelope>
@@ -0,0 +1 @@
1
+ {"reboot_server_response":{"return":{"request_id":"1187"},"@xmlns:ns2":"http://ws.api.profitbricks.com/"}}
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:rebootServerResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><requestId>1187</requestId></return></ns2:rebootServerResponse></S:Body></S:Envelope>
@@ -0,0 +1 @@
1
+ {"release_public_ip_block_response":{"return":{"request_id":"1429"},"@xmlns:ns2":"http://ws.api.profitbricks.com/"}}
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:releasePublicIpBlockResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><requestId>1429</requestId></return></ns2:releasePublicIpBlockResponse></S:Body></S:Envelope>
@@ -0,0 +1,10 @@
1
+ {
2
+ "remove_public_ip_from_nic_response": {
3
+ "@xmlns:ns2": "http://ws.api.profitbricks.com/",
4
+ "return": {
5
+ "data_center_id": "b3eebede-5c78-417c-b1bc-ff5de01a0602",
6
+ "data_center_version": "59",
7
+ "request_id": "1428"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:removePublicIpFromNicResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><requestId>1428</requestId><dataCenterId>b3eebede-5c78-417c-b1bc-ff5de01a0602</dataCenterId><dataCenterVersion>59</dataCenterVersion></return></ns2:removePublicIpFromNicResponse></S:Body></S:Envelope>
@@ -0,0 +1,13 @@
1
+ {
2
+ "reserve_public_ip_block_response": {
3
+ "@xmlns:ns2": "http://ws.api.profitbricks.com/",
4
+ "return": {
5
+ "block_id": "167bc48c-4f80-4870-b5db-13d7d762e1cd",
6
+ "ips": [
7
+ "46.16.74.12",
8
+ "46.16.74.13"
9
+ ],
10
+ "request_id": "1426"
11
+ }
12
+ }
13
+ }
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:reservePublicIpBlockResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><requestId>1426</requestId><blockId>167bc48c-4f80-4870-b5db-13d7d762e1cd</blockId><ips>46.16.74.12</ips><ips>46.16.74.13</ips></return></ns2:reservePublicIpBlockResponse></S:Body></S:Envelope>
@@ -0,0 +1 @@
1
+ {"set_image_os_type_response":{"return":{"request_id":"1310"},"@xmlns:ns2":"http://ws.api.profitbricks.com/"}}
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:setImageOsTypeResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><requestId>1310</requestId></return></ns2:setImageOsTypeResponse></S:Body></S:Envelope>
@@ -0,0 +1,10 @@
1
+ {
2
+ "set_internet_access_response": {
3
+ "@xmlns:ns2": "http://ws.api.profitbricks.com/",
4
+ "return": {
5
+ "data_center_id": "b3eebede-5c78-417c-b1bc-ff5de01a0602",
6
+ "data_center_version": "46",
7
+ "request_id": "1335"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:setInternetAccessResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><requestId>1335</requestId><dataCenterId>b3eebede-5c78-417c-b1bc-ff5de01a0602</dataCenterId><dataCenterVersion>46</dataCenterVersion></return></ns2:setInternetAccessResponse></S:Body></S:Envelope>
@@ -0,0 +1,10 @@
1
+ {
2
+ "update_data_center_response": {
3
+ "@xmlns:ns2": "http://ws.api.profitbricks.com/",
4
+ "return": {
5
+ "data_center_id": "b3eebede-5c78-417c-b1bc-ff5de01a0602",
6
+ "data_center_version": "12",
7
+ "request_id": "1180"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:updateDataCenterResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><requestId>1180</requestId><dataCenterId>b3eebede-5c78-417c-b1bc-ff5de01a0602</dataCenterId><dataCenterVersion>12</dataCenterVersion></return></ns2:updateDataCenterResponse></S:Body></S:Envelope>
@@ -0,0 +1,10 @@
1
+ {
2
+ "update_nic_response": {
3
+ "@xmlns:ns2": "http://ws.api.profitbricks.com/",
4
+ "return": {
5
+ "data_center_id": "b3eebede-5c78-417c-b1bc-ff5de01a0602",
6
+ "data_center_version": "56",
7
+ "request_id": "1422"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:updateNicResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><requestId>1422</requestId><dataCenterId>b3eebede-5c78-417c-b1bc-ff5de01a0602</dataCenterId><dataCenterVersion>56</dataCenterVersion></return></ns2:updateNicResponse></S:Body></S:Envelope>
@@ -0,0 +1,10 @@
1
+ {
2
+ "update_server_response": {
3
+ "@xmlns:ns2": "http://ws.api.profitbricks.com/",
4
+ "return": {
5
+ "data_center_id": "b3eebede-5c78-417c-b1bc-ff5de01a0602",
6
+ "data_center_version": "20",
7
+ "request_id": "1189"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:updateServerResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><requestId>1189</requestId><dataCenterId>b3eebede-5c78-417c-b1bc-ff5de01a0602</dataCenterId><dataCenterVersion>20</dataCenterVersion></return></ns2:updateServerResponse></S:Body></S:Envelope>
@@ -0,0 +1,10 @@
1
+ {
2
+ "update_storage_response": {
3
+ "@xmlns:ns2": "http://ws.api.profitbricks.com/",
4
+ "return": {
5
+ "data_center_id": "b3eebede-5c78-417c-b1bc-ff5de01a0602",
6
+ "data_center_version": "40",
7
+ "request_id": "1295"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:updateStorageResponse xmlns:ns2="http://ws.api.profitbricks.com/"><return><requestId>1295</requestId><dataCenterId>b3eebede-5c78-417c-b1bc-ff5de01a0602</dataCenterId><dataCenterVersion>40</dataCenterVersion></return></ns2:updateStorageResponse></S:Body></S:Envelope>
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Profitbricks::DataCenter do
4
+ include Savon::Spec::Macros
5
+
6
+ it "should create a new datacenter" do
7
+ savon.expects(:create_data_center).returns(:success)
8
+ savon.expects(:get_data_center).returns(:create)
9
+ dc = DataCenter.create('Test2')
10
+ dc.name.should == 'Test2'
11
+ dc.id.should == "b3eebede-5c78-417c-b1bc-ff5de01a0602"
12
+ dc.version.should == 9
13
+ end
14
+
15
+ it "should get a list of all datacenters" do
16
+ savon.expects(:get_all_data_centers).returns(:test_datacenter)
17
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
18
+ Profitbricks::DataCenter.all().count.should == 1
19
+ end
20
+
21
+ it "should handle an empty list of datacenters correctly" do
22
+ savon.expects(:get_all_data_centers).returns(:empty)
23
+ Profitbricks::DataCenter.all().count.should == 0
24
+ end
25
+
26
+ it "should find a datacenter with a given name" do
27
+ savon.expects(:get_all_data_centers).returns(:test_datacenter)
28
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
29
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
30
+ dc = Profitbricks::DataCenter.find(:name => 'Test')
31
+ dc.name.should == "Test"
32
+ dc.id.should == "b3eebede-5c78-417c-b1bc-ff5de01a0602"
33
+ dc.provisioning_state.should == "INPROCESS"
34
+ dc.version.should == 9
35
+
36
+ dc.servers.count.should == 2
37
+ dc.servers.first.class.should == Server
38
+ end
39
+
40
+ it "should reload a datacenter" do
41
+ savon.expects(:get_all_data_centers).returns(:test_datacenter)
42
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
43
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
44
+ dc = Profitbricks::DataCenter.find(:name => 'Test')
45
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
46
+ dc.reload.should == true
47
+ end
48
+
49
+ it "should update its provisioning_state" do
50
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
51
+ savon.expects(:get_data_center_state).returns(:success)
52
+ dc = Profitbricks::DataCenter.find(:id => "b3eebede-5c78-417c-b1bc-ff5de01a0602")
53
+ dc.update_state().should == 'AVAILABLE'
54
+ dc.provisioning_state.should == 'AVAILABLE'
55
+ end
56
+
57
+ it "should wait for provisioning to finish" do
58
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
59
+ dc = Profitbricks::DataCenter.find(:id => "b3eebede-5c78-417c-b1bc-ff5de01a0602")
60
+ savon.expects(:get_data_center_state).returns(:success)
61
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
62
+ dc.wait_for_provisioning
63
+ end
64
+
65
+ it "should rename a datacenter" do
66
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
67
+ savon.expects(:update_data_center).returns(:success)
68
+ dc = Profitbricks::DataCenter.find(:id => "b3eebede-5c78-417c-b1bc-ff5de01a0602")
69
+ dc.rename("Test2")
70
+ dc.name.should == 'Test2'
71
+ end
72
+
73
+ it "should rename a datacenter via setter" do
74
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
75
+ savon.expects(:update_data_center).returns(:success)
76
+ dc = Profitbricks::DataCenter.find(:id => "b3eebede-5c78-417c-b1bc-ff5de01a0602")
77
+ dc.name = "Test2"
78
+ dc.name.should == 'Test2'
79
+ end
80
+
81
+ it "should clear the datacenter" do
82
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
83
+ savon.expects(:clear_data_center).returns(:success)
84
+ dc = Profitbricks::DataCenter.find(:id => "b3eebede-5c78-417c-b1bc-ff5de01a0602")
85
+ dc.clear
86
+ dc.servers.count.should == 0
87
+ end
88
+
89
+ it "should delete a datacenter" do
90
+ savon.expects(:get_data_center).returns(:two_servers_with_storage)
91
+ savon.expects(:delete_data_center).returns(:success)
92
+ dc = Profitbricks::DataCenter.find(:id => "b3eebede-5c78-417c-b1bc-ff5de01a0602")
93
+ dc.delete.should == true
94
+ end
95
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Profitbricks::Image do
4
+ include Savon::Spec::Macros
5
+
6
+ it "should find all images" do
7
+ savon.expects(:get_all_images).returns(:success)
8
+ Image.all.count.should == 7
9
+ end
10
+
11
+ it "should find an image by name" do
12
+ savon.expects(:get_all_images).returns(:success)
13
+ image = Image.find(:name => "Windows8-ConsumerPreview-64bit-English.iso")
14
+ image.os_type.should == "UNKNOWN"
15
+ end
16
+
17
+ it "should update the os_type" do
18
+ savon.expects(:get_all_images).returns(:success)
19
+ savon.expects(:set_image_os_type).returns(:success)
20
+ image = Image.find(:name => "Windows8-ConsumerPreview-64bit-English.iso")
21
+ image.set_os_type("WINDOWS").os_type.should == "WINDOWS"
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Profitbricks::IpBlock do
4
+ include Savon::Spec::Macros
5
+
6
+ it "should reserve a block" do
7
+ savon.expects(:reserve_public_ip_block).returns(:success)
8
+ block = IpBlock.reserve(2)
9
+ block.ips.count.should == 2
10
+ end
11
+
12
+ it "should list all available blocks" do
13
+ savon.expects(:get_all_public_ip_blocks).returns(:success)
14
+ blocks = IpBlock.all()
15
+ blocks.count.should == 1
16
+ blocks.first.ips.count.should == 2
17
+ end
18
+
19
+ it "should release a block properly" do
20
+ savon.expects(:get_all_public_ip_blocks).returns(:success)
21
+ savon.expects(:release_public_ip_block).returns(:success)
22
+ blocks = IpBlock.all()
23
+ blocks.first.release.should == true
24
+ end
25
+
26
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ module Profitbricks
4
+ class ModelTest < Profitbricks::Model
5
+ end
6
+
7
+ class ModelHasManyTest < Profitbricks::Model
8
+ has_many :model_tests
9
+ end
10
+
11
+ class ModelBelongsToTest < Profitbricks::Model
12
+ belongs_to :model_has_many_test
13
+ end
14
+ end
15
+
16
+ describe Profitbricks::Model do
17
+ it "should define an attribute correclty" do
18
+ mt = Profitbricks::ModelTest.new({:name => 'Test'})
19
+ mt.name.should == 'Test'
20
+ end
21
+
22
+ it "should truncate redundant attribute name" do
23
+ mt = Profitbricks::ModelTest.new({:model_test_name => 'Test'})
24
+ mt.name.should == 'Test'
25
+ end
26
+
27
+ it "should create a has_many association correclty" do
28
+ mt = Profitbricks::ModelHasManyTest.new( :model_tests => {:name => 'One'} )
29
+ mt.model_tests.count.should == 1
30
+ mt.model_tests.first.name.should == 'One'
31
+ end
32
+
33
+ it "should create a has_many association with two entries correclty" do
34
+ mt = Profitbricks::ModelHasManyTest.new( :model_tests => [{:name => 'One'}, {:name => 'Two'}] )
35
+ mt.model_tests.count.should == 2
36
+ mt.model_tests.first.name.should == 'One'
37
+ mt.model_tests.last.name.should == 'Two'
38
+ end
39
+
40
+ it "should create a belongs_to association correclty" do
41
+ mt = Profitbricks::ModelBelongsToTest.new( :model_has_many_test => {:name => 'One'} )
42
+ mt.model_has_many_test.class.should == Profitbricks::ModelHasManyTest
43
+ mt.model_has_many_test.name.should == 'One'
44
+ end
45
+
46
+ it "should raise an LoadError exception" do
47
+ lambda {
48
+ module Profitbricks
49
+ class Profitbricks::InvalidAssociation < Profitbricks::Model
50
+ belongs_to :non_existant
51
+ end
52
+ end
53
+ }.should raise_error(LoadError)
54
+ end
55
+ describe "get_xml_and_update_attributes" do
56
+ it "should execute update_attributes correclty" do
57
+ mt = Profitbricks::ModelTest.new({:name => 'Test', :camel_case => 'works'})
58
+ xml = mt.get_xml_and_update_attributes({:name => 'Test2', :camel_case => 'fails?'}, [:name, :camel_case])
59
+ xml.should == "<camelCase>fails?</camelCase><modelTestName>Test2</modelTestName>"
60
+ mt.name.should == 'Test2'
61
+ mt.camel_case.should == 'fails?'
62
+ end
63
+ it "should work as class method" do
64
+ xml = Profitbricks::ModelTest.get_xml_and_update_attributes({:name => 'Test2', :camel_case => 'fails?'}, [:name, :camel_case])
65
+ xml.should == "<camelCase>fails?</camelCase><modelTestName>Test2</modelTestName>"
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Profitbricks::Nic do
4
+ include Savon::Spec::Macros
5
+
6
+ it "create a new Nic" do
7
+ savon.expects(:create_nic).returns(:success)
8
+ savon.expects(:get_nic).returns(:success)
9
+ nic = Nic.create(:lan_id => 1, :ip => "192.168.0.11", :name => "Internal", :server_id => "4cb6550f-3777-4818-8f4c-51233162a980")
10
+ nic.name.should == "Internal"
11
+ nic.lan_id.should == 1
12
+ nic.ip.should == "192.168.0.11"
13
+ end
14
+
15
+ it "should update an existing Nic" do
16
+ savon.expects(:get_nic).returns(:success)
17
+ savon.expects(:update_nic).returns(:success)
18
+ nic = Nic.find(:id => "cba8af39-b5de-477b-9795-2f02ea9cf04f")
19
+ nic.update(:name => "External").should == true
20
+ nic.name.should == "External"
21
+ end
22
+
23
+ it "should set the internet access" do
24
+ savon.expects(:get_nic).returns(:success)
25
+ savon.expects(:set_internet_access).returns(:success)
26
+ nic = Nic.find(:id => "cba8af39-b5de-477b-9795-2f02ea9cf04f")
27
+ (nic.set_internet_access = true).should == true
28
+ end
29
+
30
+ it "should be deleted" do
31
+ savon.expects(:get_nic).returns(:success)
32
+ savon.expects(:delete_nic).returns(:success)
33
+ nic = Nic.find(:id => "cba8af39-b5de-477b-9795-2f02ea9cf04f")
34
+ nic.delete.should == true
35
+ end
36
+
37
+ it "should add an ip" do
38
+ savon.expects(:get_nic).returns(:success)
39
+ savon.expects(:add_public_ip_to_nic).returns(:success)
40
+ nic = Nic.find(:id => "cba8af39-b5de-477b-9795-2f02ea9cf04f")
41
+ nic.add_ip("46.16.74.13")
42
+ nic.ips.count.should == 2
43
+ lambda {
44
+ nic.ip
45
+ }.should raise_error ArgumentError
46
+ end
47
+
48
+ it "should remove an ip" do
49
+ savon.expects(:get_nic).returns(:success)
50
+ savon.expects(:remove_public_ip_from_nic).returns(:success)
51
+ nic = Nic.find(:id => "cba8af39-b5de-477b-9795-2f02ea9cf04f")
52
+ nic.remove_ip("46.16.74.13")
53
+ nic.ips.count.should == 1
54
+ end
55
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Profitbricks::Server do
4
+ include Savon::Spec::Macros
5
+
6
+ it "should create a new server with minimal arguments" do
7
+ savon.expects(:create_server).returns(:minimal)
8
+ savon.expects(:get_server).returns(:after_create)
9
+ s = Server.create(:cores => 1, :ram => 256, :name => 'Test Server', :data_center_id => "b3eebede-5c78-417c-b1bc-ff5de01a0602")
10
+ s.cores.should == 1
11
+ s.ram.should == 256
12
+ s.name.should == 'Test Server'
13
+ s.data_center_id.should == "b3eebede-5c78-417c-b1bc-ff5de01a0602"
14
+ end
15
+ it "should reboot on request" do
16
+ savon.expects(:get_server).returns(:after_create)
17
+ savon.expects(:reboot_server).returns(:success)
18
+ s = Server.find(:id => "b3eebede-5c78-417c-b1bc-ff5de01a0602")
19
+ s.reboot.should == true
20
+ end
21
+
22
+ it "should be deleted" do
23
+ savon.expects(:get_server).returns(:after_create)
24
+ savon.expects(:delete_server).returns(:success)
25
+ s = Server.find(:id => "b3eebede-5c78-417c-b1bc-ff5de01a0602")
26
+ s.delete.should == true
27
+ end
28
+
29
+ describe "updating" do
30
+ it "should update basic attributes correctly" do
31
+ savon.expects(:get_server).returns(:after_create)
32
+ savon.expects(:update_server).returns(:basic)
33
+ s = Server.find(:id => "b3eebede-5c78-417c-b1bc-ff5de01a0602")
34
+ s.update(:cores => 2, :ram => 512, :name => "Power of two", :os_type => 'WINDOWS')
35
+ s.cores.should == 2
36
+ s.ram.should == 512
37
+ s.name.should == "Power of two"
38
+ s.os_type.should == 'WINDOWS'
39
+ end
40
+ end
41
+ end