azure 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (283) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -11
  3. data/.travis.yml +11 -33
  4. data/ChangeLog.txt +20 -5
  5. data/Gemfile +15 -15
  6. data/README.md +541 -537
  7. data/Rakefile +129 -127
  8. data/azure.gemspec +43 -42
  9. data/lib/azure.rb +52 -51
  10. data/lib/azure/base_management/affinity_group.rb +32 -32
  11. data/lib/azure/base_management/base_management_service.rb +234 -234
  12. data/lib/azure/base_management/location.rb +27 -27
  13. data/lib/azure/base_management/management_http_request.rb +171 -148
  14. data/lib/azure/base_management/serialization.rb +129 -129
  15. data/lib/azure/base_management/sql_management_http_request.rb +45 -0
  16. data/lib/azure/blob/blob.rb +31 -31
  17. data/lib/azure/blob/blob_service.rb +1423 -1423
  18. data/lib/azure/blob/block.rb +30 -30
  19. data/lib/azure/blob/container.rb +31 -31
  20. data/lib/azure/blob/serialization.rb +284 -284
  21. data/lib/azure/cloud_service_management/cloud_service.rb +38 -31
  22. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +134 -125
  23. data/lib/azure/cloud_service_management/serialization.rb +101 -63
  24. data/lib/azure/core.rb +39 -36
  25. data/lib/azure/core/auth/authorizer.rb +36 -36
  26. data/lib/azure/core/auth/shared_key.rb +110 -110
  27. data/lib/azure/core/auth/shared_key_lite.rb +48 -48
  28. data/lib/azure/core/auth/signer.rb +48 -48
  29. data/lib/azure/core/configuration.rb +211 -184
  30. data/lib/azure/core/error.rb +22 -22
  31. data/lib/azure/core/filtered_service.rb +43 -43
  32. data/lib/azure/core/http/debug_filter.rb +35 -35
  33. data/lib/azure/core/http/http_error.rb +88 -88
  34. data/lib/azure/core/http/http_filter.rb +52 -52
  35. data/lib/azure/core/http/http_request.rb +157 -157
  36. data/lib/azure/core/http/http_response.rb +140 -140
  37. data/lib/azure/core/http/retry_policy.rb +73 -73
  38. data/lib/azure/core/http/signer_filter.rb +33 -33
  39. data/lib/azure/core/service.rb +62 -62
  40. data/lib/azure/core/signed_service.rb +42 -42
  41. data/lib/azure/core/utility.rb +190 -190
  42. data/lib/azure/queue/message.rb +29 -29
  43. data/lib/azure/queue/queue.rb +28 -28
  44. data/lib/azure/queue/queue_service.rb +567 -567
  45. data/lib/azure/queue/serialization.rb +106 -106
  46. data/lib/azure/service/access_policy.rb +25 -25
  47. data/lib/azure/service/enumeration_results.rb +20 -20
  48. data/lib/azure/service/logging.rb +31 -31
  49. data/lib/azure/service/metrics.rb +30 -30
  50. data/lib/azure/service/retention_policy.rb +24 -24
  51. data/lib/azure/service/serialization.rb +239 -239
  52. data/lib/azure/service/signed_identifier.rb +29 -29
  53. data/lib/azure/service/storage_service.rb +78 -78
  54. data/lib/azure/service/storage_service_properties.rb +31 -31
  55. data/lib/azure/service_bus/action.rb +21 -21
  56. data/lib/azure/service_bus/auth/wrap_service.rb +88 -88
  57. data/lib/azure/service_bus/auth/wrap_signer.rb +68 -68
  58. data/lib/azure/service_bus/brokered_message.rb +123 -123
  59. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -159
  60. data/lib/azure/service_bus/correlation_filter.rb +45 -45
  61. data/lib/azure/service_bus/empty_rule_action.rb +29 -29
  62. data/lib/azure/service_bus/false_filter.rb +38 -38
  63. data/lib/azure/service_bus/filter.rb +21 -21
  64. data/lib/azure/service_bus/interval.rb +103 -103
  65. data/lib/azure/service_bus/queue.rb +229 -229
  66. data/lib/azure/service_bus/resource.rb +108 -108
  67. data/lib/azure/service_bus/rule.rb +97 -97
  68. data/lib/azure/service_bus/rule_aspect.rb +34 -34
  69. data/lib/azure/service_bus/serialization.rb +160 -160
  70. data/lib/azure/service_bus/service_bus_service.rb +828 -828
  71. data/lib/azure/service_bus/sql_filter.rb +50 -50
  72. data/lib/azure/service_bus/sql_rule_action.rb +50 -50
  73. data/lib/azure/service_bus/subscription.rb +183 -183
  74. data/lib/azure/service_bus/topic.rb +186 -186
  75. data/lib/azure/service_bus/true_filter.rb +38 -38
  76. data/lib/azure/sql_database_management/serialization.rb +111 -90
  77. data/lib/azure/sql_database_management/sql_database.rb +31 -31
  78. data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -202
  79. data/lib/azure/storage_management/serialization.rb +190 -50
  80. data/lib/azure/storage_management/storage_account.rb +40 -29
  81. data/lib/azure/storage_management/storage_management_service.rb +166 -99
  82. data/lib/azure/table/auth/shared_key.rb +92 -92
  83. data/lib/azure/table/auth/shared_key_lite.rb +44 -44
  84. data/lib/azure/table/batch.rb +329 -329
  85. data/lib/azure/table/batch_response.rb +118 -118
  86. data/lib/azure/table/edmtype.rb +126 -126
  87. data/lib/azure/table/entity.rb +30 -30
  88. data/lib/azure/table/guid.rb +23 -23
  89. data/lib/azure/table/query.rb +111 -111
  90. data/lib/azure/table/serialization.rb +107 -107
  91. data/lib/azure/table/table_service.rb +559 -559
  92. data/lib/azure/version.rb +30 -30
  93. data/lib/azure/virtual_machine_image_management/serialization.rb +49 -49
  94. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +27 -27
  95. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +27 -27
  96. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +66 -66
  97. data/lib/azure/virtual_machine_management/serialization.rb +257 -247
  98. data/lib/azure/virtual_machine_management/virtual_machine.rb +41 -57
  99. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +317 -304
  100. data/lib/azure/virtual_network_management/serialization.rb +186 -186
  101. data/lib/azure/virtual_network_management/virtual_network.rb +36 -36
  102. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -109
  103. data/test/fixtures/affinity_group.xml +33 -33
  104. data/test/fixtures/all_containers.xml +20 -20
  105. data/test/fixtures/all_tables.xml +22 -22
  106. data/test/fixtures/certificate.pem +21 -21
  107. data/test/fixtures/container_acl.xml +11 -11
  108. data/test/fixtures/create_sql_database_server.xml +1 -1
  109. data/test/fixtures/create_storage_desc_error.xml +5 -0
  110. data/test/fixtures/create_storage_extendedprop_error.xml +8 -0
  111. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -0
  112. data/test/fixtures/create_storage_full_error.xml +6 -0
  113. data/test/fixtures/create_storage_label_error.xml +5 -0
  114. data/test/fixtures/create_storage_location_error.xml +5 -0
  115. data/test/fixtures/create_storage_name_error.xml +6 -0
  116. data/test/fixtures/create_table_response_entry.xml +15 -15
  117. data/test/fixtures/delete_storage_container_error.xml +5 -0
  118. data/test/fixtures/delete_storage_error.xml +5 -0
  119. data/test/fixtures/deployment_error.xml +5 -5
  120. data/test/fixtures/get_storage_account_error.xml +5 -0
  121. data/test/fixtures/get_storage_account_properties.xml +32 -0
  122. data/test/fixtures/get_storage_account_properties_new.xml +32 -0
  123. data/test/fixtures/http_error.xml +5 -5
  124. data/test/fixtures/insert_entity_response_entry.xml +25 -25
  125. data/test/fixtures/list_affinity_groups.xml +22 -22
  126. data/test/fixtures/list_blobs.xml +120 -120
  127. data/test/fixtures/list_block_all_with_none_committed.xml +21 -21
  128. data/test/fixtures/list_blocks_all.xml +22 -22
  129. data/test/fixtures/list_blocks_committed.xml +12 -12
  130. data/test/fixtures/list_cloud_services.xml +38 -28
  131. data/test/fixtures/list_containers.xml +37 -37
  132. data/test/fixtures/list_firewall_management_endpoint.xml +27 -0
  133. data/test/fixtures/list_images.xml +110 -110
  134. data/test/fixtures/list_locations.xml +62 -62
  135. data/test/fixtures/list_page_ranges.xml +10 -10
  136. data/test/fixtures/list_sql_database.xml +36 -36
  137. data/test/fixtures/list_sql_server_firewall.xml +23 -23
  138. data/test/fixtures/list_storage_accounts.xml +45 -45
  139. data/test/fixtures/list_virtual_networks.xml +92 -92
  140. data/test/fixtures/logging.xml +11 -11
  141. data/test/fixtures/management_certificate.pem +55 -55
  142. data/test/fixtures/messages.xml +12 -12
  143. data/test/fixtures/metrics.xml +10 -10
  144. data/test/fixtures/privatekey.key +28 -28
  145. data/test/fixtures/query_entities_empty_response.xml +7 -7
  146. data/test/fixtures/query_entities_response.xml +45 -45
  147. data/test/fixtures/queue_service_properties.xml +22 -22
  148. data/test/fixtures/queue_service_properties_original.xml +19 -19
  149. data/test/fixtures/queues.xml +16 -16
  150. data/test/fixtures/retention_policy.xml +5 -5
  151. data/test/fixtures/sb_default_create_queue_response.xml +23 -23
  152. data/test/fixtures/sb_default_create_topic_response.xml +18 -18
  153. data/test/fixtures/sb_get_access_token_response.txt +1 -1
  154. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -9
  155. data/test/fixtures/storage_service_properties.xml +23 -23
  156. data/test/fixtures/update_storage_account.xml +16 -0
  157. data/test/fixtures/update_storage_error.xml +5 -0
  158. data/test/fixtures/updated_storage_accounts.xml +53 -0
  159. data/test/fixtures/virtual_machine.xml +108 -107
  160. data/test/fixtures/windows_virtual_machine.xml +106 -106
  161. data/test/integration/affinity_group/Affinity_test.rb +55 -55
  162. data/test/integration/affinity_group/Create_Affinity_test.rb +63 -63
  163. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -56
  164. data/test/integration/affinity_group/List_Affinity_test.rb +41 -41
  165. data/test/integration/affinity_group/Update_Affinity_test.rb +82 -82
  166. data/test/integration/blob/blob_gb18030_test.rb +199 -199
  167. data/test/integration/blob/blob_metadata_test.rb +75 -75
  168. data/test/integration/blob/blob_pages_test.rb +119 -119
  169. data/test/integration/blob/blob_properties_test.rb +77 -77
  170. data/test/integration/blob/block_blob_test.rb +254 -254
  171. data/test/integration/blob/container/container_acl_test.rb +69 -69
  172. data/test/integration/blob/container/container_metadata_test.rb +50 -50
  173. data/test/integration/blob/container/create_container_test.rb +60 -60
  174. data/test/integration/blob/container/delete_container_test.rb +39 -39
  175. data/test/integration/blob/container/get_container_properties_test.rb +48 -48
  176. data/test/integration/blob/container/list_containers_test.rb +79 -79
  177. data/test/integration/blob/container/root_container_test.rb +53 -53
  178. data/test/integration/blob/copy_blob_test.rb +113 -113
  179. data/test/integration/blob/create_blob_snapshot_test.rb +80 -80
  180. data/test/integration/blob/create_page_blob_test.rb +83 -83
  181. data/test/integration/blob/delete_blob_test.rb +159 -159
  182. data/test/integration/blob/get_blob_test.rb +65 -65
  183. data/test/integration/blob/informative_errors_test.rb +38 -38
  184. data/test/integration/blob/lease/acquire_lease_test.rb +36 -36
  185. data/test/integration/blob/lease/break_lease_test.rb +40 -40
  186. data/test/integration/blob/lease/release_lease_test.rb +40 -40
  187. data/test/integration/blob/lease/renew_lease_test.rb +42 -42
  188. data/test/integration/blob/list_blobs_test.rb +113 -113
  189. data/test/integration/database/create_sql_server_firewall_test.rb +86 -86
  190. data/test/integration/database/create_sql_server_test.rb +53 -57
  191. data/test/integration/database/delete_sql_server_firewall_test.rb +70 -72
  192. data/test/integration/database/delete_sql_server_test.rb +58 -63
  193. data/test/integration/database/list_sql_server_firewall_test.rb +45 -46
  194. data/test/integration/database/list_sql_servers_test.rb +44 -45
  195. data/test/integration/database/reset_password_sql_server_test.rb +55 -56
  196. data/test/integration/location/Location_List_test.rb +39 -39
  197. data/test/integration/queue/clear_messages_test.rb +42 -42
  198. data/test/integration/queue/create_message_test.rb +75 -75
  199. data/test/integration/queue/create_queue_test.rb +50 -50
  200. data/test/integration/queue/delete_message_test.rb +67 -67
  201. data/test/integration/queue/delete_queue_test.rb +45 -45
  202. data/test/integration/queue/informative_errors_test.rb +41 -41
  203. data/test/integration/queue/list_messages_encoded_test.rb +79 -79
  204. data/test/integration/queue/list_messages_test.rb +79 -79
  205. data/test/integration/queue/list_queues_test.rb +44 -44
  206. data/test/integration/queue/peek_messages_test.rb +59 -59
  207. data/test/integration/queue/queue_gb18030_test.rb +131 -131
  208. data/test/integration/queue/queue_metadata_test.rb +40 -40
  209. data/test/integration/queue/update_message_test.rb +74 -74
  210. data/test/integration/service_bus/informative_errors_test.rb +36 -36
  211. data/test/integration/service_bus/queues_scenario_test.rb +200 -200
  212. data/test/integration/service_bus/queues_test.rb +265 -265
  213. data/test/integration/service_bus/rules_test.rb +144 -144
  214. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -182
  215. data/test/integration/service_bus/scenario_test.rb +101 -101
  216. data/test/integration/service_bus/subscriptions_test.rb +211 -211
  217. data/test/integration/service_bus/topics_scenario_test.rb +406 -406
  218. data/test/integration/service_bus/topics_test.rb +129 -129
  219. data/test/integration/storage_management/storage_management_test.rb +160 -0
  220. data/test/integration/table/create_table_test.rb +35 -35
  221. data/test/integration/table/delete_entity_batch_test.rb +106 -106
  222. data/test/integration/table/delete_entity_test.rb +93 -93
  223. data/test/integration/table/delete_table_test.rb +39 -39
  224. data/test/integration/table/get_table_test.rb +36 -36
  225. data/test/integration/table/informative_errors_test.rb +38 -38
  226. data/test/integration/table/insert_entity_batch_test.rb +99 -99
  227. data/test/integration/table/insert_entity_test.rb +87 -87
  228. data/test/integration/table/insert_or_merge_entity_batch_test.rb +158 -158
  229. data/test/integration/table/insert_or_merge_entity_test.rb +142 -142
  230. data/test/integration/table/insert_or_replace_entity_batch_test.rb +151 -151
  231. data/test/integration/table/insert_or_replace_entity_test.rb +136 -136
  232. data/test/integration/table/merge_entity_batch_test.rb +127 -127
  233. data/test/integration/table/merge_entity_test.rb +112 -112
  234. data/test/integration/table/query_entities_test.rb +194 -194
  235. data/test/integration/table/query_tables_test.rb +42 -42
  236. data/test/integration/table/query_test.rb +250 -250
  237. data/test/integration/table/table_acl_test.rb +51 -51
  238. data/test/integration/table/table_gb18030_test.rb +355 -355
  239. data/test/integration/table/update_entity_batch_test.rb +148 -148
  240. data/test/integration/table/update_entity_test.rb +130 -130
  241. data/test/integration/test_helper.rb +42 -44
  242. data/test/integration/vm/VM_Create_test.rb +213 -235
  243. data/test/integration/vm/VM_Delete_test.rb +55 -55
  244. data/test/integration/vm/VM_List_test.rb +71 -71
  245. data/test/integration/vm/VM_ShutDown_test.rb +59 -59
  246. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -37
  247. data/test/integration/vm_image/virtual_machine_image_test.rb +36 -36
  248. data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -122
  249. data/test/integration/vnet/Virtual_Network_list_test.rb +53 -53
  250. data/test/support/env.rb +19 -19
  251. data/test/support/fixtures.rb +36 -36
  252. data/test/support/name_generator.rb +160 -160
  253. data/test/support/stubs.rb +42 -42
  254. data/test/support/virtual_machine_name_generator.rb +117 -127
  255. data/test/support/virtual_network_helper.rb +73 -73
  256. data/test/test_helper.rb +52 -52
  257. data/test/unit/affinity_group/affinity_group_test.rb +192 -192
  258. data/test/unit/affinity_group/serialization_test.rb +88 -88
  259. data/test/unit/base_management/location_test.rb +57 -57
  260. data/test/unit/blob/blob_service_test.rb +1946 -1946
  261. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -94
  262. data/test/unit/cloud_service_management/serialization_test.rb +169 -76
  263. data/test/unit/core/auth/shared_key_lite_test.rb +51 -51
  264. data/test/unit/core/auth/shared_key_test.rb +58 -58
  265. data/test/unit/core/auth/signer_test.rb +30 -30
  266. data/test/unit/core/http/http_error_test.rb +57 -57
  267. data/test/unit/core/http/http_request_test.rb +66 -66
  268. data/test/unit/core/http/http_response_test.rb +45 -45
  269. data/test/unit/core/http/retry_policy_test.rb +23 -23
  270. data/test/unit/database/serialization_test.rb +97 -95
  271. data/test/unit/database/sql_database_server_service_test.rb +288 -152
  272. data/test/unit/service/serialization_test.rb +501 -501
  273. data/test/unit/service/storage_service_test.rb +290 -290
  274. data/test/unit/storage_management/serialization_test.rb +232 -65
  275. data/test/unit/storage_management/storage_management_service_test.rb +233 -94
  276. data/test/unit/table/edmtype_test.rb +107 -107
  277. data/test/unit/virtual_machine_image_management/serialization_test.rb +34 -34
  278. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +60 -60
  279. data/test/unit/virtual_machine_management/serialization_test.rb +119 -116
  280. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +383 -386
  281. data/test/unit/vnet/serialization_test.rb +187 -187
  282. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -131
  283. metadata +55 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62ec5ac4060752caa7ec50960e5998037b302946
4
- data.tar.gz: b7900421641be2a0991650f25cc1587debd61101
3
+ metadata.gz: 16b612bbee697e6b52ae74452eb8c74474582c95
4
+ data.tar.gz: c54be6fa7ef63f2867b680ad272ae5745e62b51b
5
5
  SHA512:
6
- metadata.gz: 25db854eb7daecf25f254dd543bd5bdbba38dc57fd8d38dbe9f766c1a417986823bd708f1cc1424d83012fb926de7ed94a56e56375274a9ed8da3b23eb60697f
7
- data.tar.gz: 133bc4824ce2517618a68799d1cb9f25a82a8f4b008a16b459fd5764114a6af4bc47da5947020f29b5bfaf30f4b56052f89e693eb7390776ebae18466a0303c7
6
+ metadata.gz: ac0c2777f58a96237eb85db41f6990932b352d1873aa8c7bd256b9422ed4ab760ce590618006f517b2d56baf4cb9376b6288929a9093f01a7ebe464d0edaa9d2
7
+ data.tar.gz: 7fe4e38feb67a395d7a7e986d3415cb434f13857298ccb27b09356485d46a447165bf6c006c00e5b600e41c2a96ada8877b07aea16c0d14fdc4a1832045f7ec2
data/.gitignore CHANGED
@@ -1,12 +1,12 @@
1
- .rvmrc
2
- tags
3
- /pkg
4
- /doc
5
- Gemfile.lock
6
- nbproject/*
7
- *.gem
8
- .idea/*
9
- .project
10
-
11
-
1
+ .rvmrc
2
+ tags
3
+ /pkg
4
+ /doc
5
+ Gemfile.lock
6
+ nbproject/*
7
+ *.gem
8
+ .idea/*
9
+ .project
10
+
11
+
12
12
  .DS_Store
@@ -1,33 +1,11 @@
1
- ---
2
- language: ruby
3
-
4
- rvm:
5
- - 1.9.3
6
- - 2.0.0
7
-
8
- script:
9
- - rake test:unit
10
- - if [ "$TRAVIS_SECURE_ENV_VARS" == "true" ] ; then rake test:integration ; fi
11
-
12
- env:
13
- global:
14
- - secure: ! 'EMSKuCl/BixCkv7eLIVYj3UbCg0AVUj4h87k11XFwNgRfj1f884lzgNAbIKX
15
-
16
- IknDibQFz7OwMApMK12SmbmzXGKV1WlGevDL1Jbv1pYxfvjjRJYy1yaXJTBu
17
-
18
- Y0tyvX2psZLFsMT1k1/NehzDuRYnzFGhDKdVgUCh+YTNa8KY3Kg='
19
- - secure: ! 'UzKA8lMUIUuNqHplayxTM9qFD5e70B5AdRXa1iSHRgOrzBoRuWHr2OrI9cUC
20
-
21
- XQ8tncOhU8mMXLL3xKzyOxTE+TX2rEE6c5tHMM0099+yCQBjwRgcZCIMlcDy
22
-
23
- T+hCPOPZngFWM8z38S3wH39bOM3ddGO05I8jCN1HqXRcR92BS0I='
24
- - secure: ! 'nWqLZqxm8u7bxU1gsnzEH9NT8NNnTwFNyDTAZRcHTUcuiR5jVI3+YH1+cFQ3
25
-
26
- e/J1JBwqPO0T/IaR59ujGWpfd2UFSUvSa95cKlDg1BgDzQQ3yYS3gNssqoQW
27
-
28
- Zbfabil9akFl2CZWliR1maQKkjDaEeUI6MLeBrj9i8giB2gxLg0='
29
- - secure: ! 'BL/xe3bbmKhcK9gXI6dOhM7XPh/5YhiaEanEWGvgUQfcHMrmqiDHnjbeF+8M
30
-
31
- +SwmmseAD7EzT/Q3gjJh3PcB35IIUsX/RyFuNNghuuiHg9G+uiRG9YQi9AFT
32
-
33
- gIBIuWS3/vDYs05G1fib1rfFBRq66kJo6lIO8XFdSs+9jcLvPiI='
1
+ ---
2
+ language: ruby
3
+
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.0.0
7
+
8
+ script:
9
+ - rake test:unit
10
+ - if [ "$TRAVIS_SECURE_ENV_VARS" == "true" ] ; then rake test:integration ; fi
11
+
@@ -1,5 +1,20 @@
1
- 2012.04.25 - version 0.5.0
2
- * First release
3
- * Ruby 1.9.3 and 2.0 support
4
- * Storage support: Blob, Table and Queue
5
- * Service Bus support: Queue, Topic/Subscription
1
+ 2014.02.18 - version 0.6.1
2
+ * Fixed http redirection error.
3
+ * Add a new role to existing deployment
4
+ * Add support for including VMs in availability sets
5
+
6
+ 2013.12.02 - version 0.6.0
7
+ * Add the following service management API
8
+ * Virtual Machine
9
+ * Virtual Machine Image
10
+ * Virtual Network
11
+ * Cloud Service
12
+ * Storage
13
+ * Sql Database
14
+ * Location and Affinity Group
15
+
16
+ 2013.04.25 - version 0.5.0
17
+ * First release
18
+ * Ruby 1.9.3 and 2.0 support
19
+ * Storage support: Blob, Table and Queue
20
+ * Service Bus support: Queue, Topic/Subscription
data/Gemfile CHANGED
@@ -1,16 +1,16 @@
1
- #-------------------------------------------------------------------------
2
- # # Copyright (c) Microsoft and contributors. All rights reserved.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- #--------------------------------------------------------------------------
15
- source 'https://rubygems.org'
1
+ #-------------------------------------------------------------------------
2
+ # # Copyright (c) Microsoft and contributors. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ source 'https://rubygems.org'
16
16
  gemspec
data/README.md CHANGED
@@ -1,537 +1,541 @@
1
- # Windows Azure SDK for Ruby [![Build Status](https://travis-ci.org/WindowsAzure/azure-sdk-for-ruby.png?branch=dev)](https://travis-ci.org/WindowsAzure/azure-sdk-for-ruby)
2
-
3
-
4
- This project provides a Ruby package that makes it easy to access and manage Windows Azure Services like Storage, Service Bus and Virtual Machines.
5
-
6
- # Library Features
7
- * Storage
8
- * Blobs
9
- * create, list, and delete containers, work with container metadata and permissions, list blobs in container
10
- * create block and page blobs (from a stream, a file, or a string), work with blob blocks and pages, delete blobs
11
- * work with blob properties, metadata, leases, snapshot a blob
12
- * Tables
13
- * create and delete tables
14
- * create, query, insert, update, merge, and delete entities
15
- * Queues
16
- * create, list, and delete queues, and work with queue metadata
17
- * create, get, peek, update, delete messages
18
- * Service Bus
19
- * Queues
20
- * create, list and delete queues
21
- * send, receive, unlock and delete messages
22
- * Topics
23
- * create, list, and delete topics
24
- * send, receive, unlock and delete messages
25
- * create, list, and delete subscriptions
26
- * create, list, and delete rules
27
- * Base Management
28
- * list locations
29
- * Affinity Group
30
- * get, list, create, update, delete affinity groups
31
- * Virtual Machine Management
32
- * Images
33
- * list images
34
- * Disks
35
- * list disks
36
- * delete disks
37
- * Virtual Machines
38
- * create linux based VMs and ssh with cert and key option enabled for ssh and WINRM (both http & https)enabled for windows based VMs
39
- * list, shut down, delete, find virtual machine deployments. While shutting down your VMs the provisioning state would be deallocated and this VM will not be included in the billing cycle.
40
- * Create VM for a specific virtual network
41
- * Cloud Services
42
- * create, list, delete cloud services
43
- * Storage Accounts
44
- * create, list storage accounts, list locations
45
- * SQL Database Server Management
46
- * list,create,list sqldb servers & password reset for a sqldbserver
47
- * list,set,delete firewall rules for a sqldb server
48
-
49
- * Virtual Network Management
50
- * List VNet
51
- * Create VNet
52
- * via parameters
53
- * via xml file
54
-
55
- # Useful commands for certificate operations
56
-
57
- * Currently the sdk supports *.pem or *.pfx (passwordless pfx) for service management operations. Following are the steps discussed on various cert operations.
58
-
59
- * To create pfx, simply download the publishsettings file for your subscription, copy the contents of Management Certificate from the publishsettings and save it in a file and name the file
60
- as your cert.pfx. This pfx will be a passwordless pfx which can be supplied as a cert parameter for Service Management Commands
61
-
62
- * Using the following openssl commands to extract the pem file and pass the pem file as management cert parameter.
63
-
64
- * To get only private key from pfx use Openssl.exe pkcs12 -in cert.pfx -nocerts -out cert.pem
65
-
66
- * To remove passphrase from the above private key use Openssl.exe rsa -in cert.pem -out certprivnopassword.pem
67
-
68
- * To extract both public & private keys from pfx use Openssl.exe pkcs12 -in cert.pfx -out certprivpub.pem
69
-
70
- * To extract only public key from pem use Openssl x509 -inform pem -in certprivpub.pem -pubkey -out certpub.pem -outform pem
71
-
72
- * Finally copy the public key & private key to a file *.pem and pass that pem file to management cert parameter.
73
-
74
- * To extract pem from custom certificate, export the pfx, follow the above steps to convert to pem and pass that pem file to management cert parameter.
75
-
76
- # Supported Ruby Versions
77
-
78
- * Ruby 1.9.3
79
- * Ruby 2.0
80
-
81
- **Notice** that Ruby 2.0 x64 on Windows is not supported due to the [lack of nokogiri](https://github.com/sparklemotion/nokogiri/issues/864).
82
-
83
- # Getting Started
84
-
85
- ## Install the rubygem package
86
-
87
- You can install the azure rubygem package directly.
88
-
89
- ```bash
90
- gem install azure
91
- ```
92
-
93
- ## Download Source Code
94
-
95
- To get the source code of the SDK via **git** just type:
96
-
97
- ```bash
98
- git clone https://github.com/WindowsAzure/azure-sdk-for-ruby.git
99
- cd ./azure-sdk-for-ruby
100
- ```
101
- Then, run bundler to install all the gem dependencies:
102
-
103
- ```bash
104
- bundle install
105
- ```
106
-
107
- ## Generate Documentation
108
-
109
- Running the command ``rdoc`` will generate the API documentation in the `./doc` directory.
110
-
111
- ## Setup Connection
112
-
113
- You can use this SDK against the Windows Azure Services in the cloud, or against the local Storage Emulator if you are on Windows. Service Bus and Windows Azure Service Management emulation are not supported. Of course, to use the Windows Azure Services in the cloud, you need to first [create a Windows Azure account](http://www.windowsazure.com/en-us/pricing/free-trial/). After that, you can get the information you need to configure Storage and Service Bus from the [Windows Azure Portal](https://manage.windowsazure.com).
114
-
115
- There are two ways you can set up the connections:
116
-
117
- 1. [via code](#via-code)
118
- 2. [via environment variables](#via-environment-variables)
119
-
120
- ### Via Code
121
- * Against Windows Azure Services in the cloud
122
-
123
- ```ruby
124
- require "azure"
125
-
126
- Azure.configure do |config|
127
- # Configure these 2 properties to use Storage
128
- config.storage_account_name = "<your azure storage account name>"
129
- config.storage_access_key = "<your azure storage access key>"
130
- # Configure these 3 properties to use Service Bus
131
- config.sb_namespace = "<your azure service bus namespace>"
132
- config.sb_access_key = "<your azure service bus access key>"
133
- config.sb_issuer = "<your azure service bus issuer>"
134
- # Configure these 3 properties to use Service Management
135
- config.management_certificate = "<path to your *.pem or *.pfx>". We support passwordless pfx & pem cert formats.
136
- config.subscription_id = "<your Subscriptionid>"
137
- config.management_endpoint = "https://management.core.windows.net"
138
- end
139
- ```
140
- * Against local Emulator (Windows Only)
141
- ```ruby
142
- require "azure"
143
-
144
- Azure.configure do |config|
145
- # Configure these 2 properties to use local Storage Emulator
146
- config.storage_account_name = "devstoreaccount1"
147
- config.storage_access_key = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="
148
- config.storage_blob_host = "http://127.0.0.1:10000/devstoreaccount1"
149
- config.storage_queue_host = "http://127.0.0.1:10001/devstoreaccount1"
150
- config.storage_table_host = "http://127.0.0.1:10002/devstoreaccount1"
151
- # Local Service Bus Emulator is not supported
152
- # Local Service Management emulation is not supported
153
- end
154
- ```
155
- ### Via Environment Variables
156
- * Against Windows Azure Services in the cloud
157
- * Storage
158
-
159
- ```bash
160
- AZURE_STORAGE_ACCOUNT = <your azure storage account name>
161
- AZURE_STORAGE_ACCESS_KEY = <your azure storage access key>
162
- ```
163
- * Service Bus
164
-
165
- ```bash
166
- AZURE_SERVICEBUS_NAMESPACE = <your azure service bus namespace>
167
- AZURE_SERVICEBUS_ACCESS_KEY = <your azure service bus access key>
168
- AZURE_SERVICEBUS_ISSUER = <your azure service bus issuer>
169
- ```
170
- * Service Management
171
-
172
- ```bash
173
-
174
- AZURE_MANAGEMENT_CERTIFICATE = <path to *.pem or *.pfx> . We support passwordless pfx & pem cert formats.
175
- AZURE_SUBSCRIPTION_ID = <your subscription ID>
176
- AZURE_MANAGEMENT_ENDPOINT = <The endpoint URL of Windows Azure management service>
177
-
178
- ```
179
- * Against local Emulator (Windows Only)
180
- * Storage
181
-
182
- ```bash
183
- AZURE_STORAGE_ACCOUNT = devstoreaccount1
184
- AZURE_STORAGE_ACCESS_KEY = Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==
185
- AZURE_STORAGE_BLOB_HOST = http://127.0.0.1:10000/devstoreaccount1
186
- AZURE_STORAGE_QUEUE_HOST = http://127.0.0.1:10001/devstoreaccount1
187
- AZURE_STORAGE_TABLE_HOST = http://127.0.0.1:10002/devstoreaccount1
188
- ```
189
- * Service Bus: not supported
190
- * Service Management: not supported
191
- ## Run Test
192
- You can use the following commands to run:
193
- * all the tests: ``rake test``
194
- * a specific suite of tests: ``rake test:integration:blob``
195
- * one particular test file: ``ruby -I"lib:test" "<path of the test file>"``
196
- # Usage
197
- **For more examples, please see the [Windows Azure Ruby Developer Center](http://www.windowsazure.com/en-us/develop/ruby)**
198
- ## Storage
199
-
200
- ### Blobs
201
-
202
- ```ruby
203
- # Require the azure rubygem
204
- require "azure"
205
-
206
- # Create an azure storage blob service object
207
- azure_blob_service = Azure::BlobService.new
208
-
209
- # Create a container
210
- container = azure_blob_service.create_container("test-container")
211
-
212
- # Upload a Blob
213
- content = File.open('test.jpg', 'rb') { |file| file.read }
214
- azure_blob_service.create_block_blob(container.name, "image-blob", content)
215
-
216
- # List containers
217
- azure_blob_service.list_containers()
218
-
219
- # List Blobs
220
- azure_blob_service.list_blobs(container.name)
221
-
222
- # Download a Blob
223
- blob, content = azure_blob_service.get_blob(container.name, "image-blob")
224
- File.open("download.png", "wb") {|f| f.write(content)}
225
-
226
- # Delete a Blob
227
- azure_blob_service.delete_blob(container.name, "image-blob")
228
- ```
229
- ### Tables
230
-
231
- ```ruby
232
- # Require the azure rubygem
233
- require "azure"
234
-
235
- # Create an azure storage table service object
236
- azure_table_service = Azure::TableService.new
237
-
238
- # Create a table
239
- azure_table_service.create_table("testtable")
240
-
241
- # Insert an entity
242
- entity = { "content" => "test entity", :partition_key => "test-partition-key", :row_key => "1" }
243
- azure_table_service.insert_entity("testtable", entity)
244
-
245
- # Get an entity
246
- result = azure_table_service.get_entity("testtable", "test-partition-key", "1")
247
-
248
- # Update an entity
249
- result.properties["content"] = "test entity with updated content"
250
- azure_table_service.update_entity(result.table, result.properties)
251
-
252
- # Query entities
253
- query = { :filter => "content eq 'test entity'" }
254
- result, token = azure_table_service.query_entities("testtable", query)
255
-
256
- # Delete an entity
257
- azure_table_service.delete_entity("testtable", "test-partition-key", "1")
258
-
259
- # delete a table
260
- azure_table_service.delete_table("testtable")
261
- ```
262
- ### Queues
263
-
264
- ```ruby
265
- # Require the azure rubygem
266
- require "azure"
267
-
268
- # Create an azure storage queue service object
269
- azure_queue_service = Azure::QueueService.new
270
-
271
- # Create a queue
272
- azure_queue_service.create_queue("test-queue")
273
-
274
- # Create a message
275
- azure_queue_service.create_message("test-queue", "test message")
276
-
277
- # Get one or more messages with setting the visibility timeout
278
- result = azure_queue_service.list_messages("test-queue", 30, {:number_of_messages => 10})
279
-
280
- # Get one or more messages without setting the visibility timeout
281
- result = azure_queue_service.peek_messages("test-queue", {:number_of_messages => 10})
282
-
283
- # Update a message
284
- message = azure_queue_service.list_messages("test-queue", 30)
285
- pop_receipt, time_next_visible = azure_queue_service.update_message("test-queue", message.id, message.pop_receipt, "updated test message", 30)
286
-
287
- # Delete a message
288
- message = azure_queue_service.list_messages("test-queue", 30)
289
- azure_queue_service.delete_message("test-queue", message.id, message.pop_receipt)
290
-
291
- # Delete a queue
292
- azure_queue_service.delete_queue("test-queue")
293
- ```
294
- ## Service Bus
295
-
296
- ```ruby
297
- # Require the azure rubygem
298
- require "azure"
299
-
300
- # Create an azure service bus object
301
- azure_service_bus = Azure::ServiceBus::ServiceBus.new
302
-
303
- # Create a queue with just the queue name
304
- queue1 = azure_service_bus.create_queue("test-queue-1")
305
-
306
- # Create a queue with a queue object
307
- queue2 = Azure::ServiceBus::Queue.new("test-queue-2")
308
- queue2.max_size_in_megabytes = 2048
309
- queue2 = azure_service_bus.create_queue(queue2)
310
-
311
- # Send a queue message with just the message body
312
- azure_service_bus.send_queue_message("test-queue-1", "test queue message")
313
-
314
- # Send a queue message with a brokered message object
315
- message = Azure::ServiceBus::BrokeredMessage.new("another test queue message")
316
- message.correlation_id = "test-correlation-id-1"
317
- azure_service_bus.send_queue_message("test-queue-1", message)
318
-
319
- # Receive a queue message
320
- message = azure_service_bus.receive_queue_message("test-queue-1")
321
-
322
- # Delete a queue message
323
- azure_service_bus.delete_queue_message(message)
324
-
325
- # Delete a queue
326
- azure_service_bus.delete_queue("test-queue-1")
327
- ```
328
- ### Topics
329
-
330
- ```ruby
331
- # Require the azure rubygem
332
- require "azure"
333
-
334
- # Create an azure service bus object
335
- azure_service_bus = Azure::ServiceBus::ServiceBus.new
336
-
337
- # Create a topic with just the topic name
338
- topic1 = azure_service_bus.create_topic("test-topic-1")
339
-
340
- # Create a topic with a topic object
341
- topic2 = Azure::ServiceBus::Topic.new("test-topic-2")
342
- topic2.max_size_in_megabytes = 2048
343
- topic2 = azure_service_bus.create_topic(topic2)
344
-
345
- # Create a subscription
346
- subscription = Azure::ServiceBus::Subscription.new("test-subscription-1")
347
- subscription.topic = topic1.name
348
- subscription = azure_service_bus.create_subscription(subscription)
349
-
350
- # Send a topic message with just the message body
351
- azure_service_bus.send_topic_message(topic1, "test topic message")
352
-
353
- # Send a topic message with a brokered message object
354
- message = Azure::ServiceBus::BrokeredMessage.new("another test topic message")
355
- message.correlation_id = "test-correlation-id-1"
356
- azure_service_bus.send_topic_message(topic1, message)
357
-
358
- # Receive a subscription message
359
- message = azure_service_bus.receive_subscription_message(topic1.name, subscription.name)
360
-
361
- # Delete a subscription message
362
- azure_service_bus.delete_subscription_message(message)
363
-
364
- # Delete a subscription
365
- azure_service_bus.delete_subscription(subscription)
366
-
367
- # Delete a topic
368
- azure_service_bus.delete_topic(topic1)
369
- ```
370
- ## Virtual Machine Management
371
-
372
- ```ruby
373
- # Require the azure rubygem
374
- require 'azure'
375
-
376
- Azure.configure do |config|
377
- # Configure these 3 properties to use Storage
378
- config.management_certificate = "path to *.pem or *.pfx file"
379
- config.subscription_id = "your subscription id"
380
- config.management_endpoint = "https://management.core.windows.net"
381
- end
382
-
383
- #Create a virtual machine service object
384
- virtual_machine_service = Azure::VirtualMachineManagementService.new
385
-
386
- #Get a list of existing virtual machines in your subscription
387
- virtual_machine_service.list_virtual_machines
388
-
389
- #API to shutdown Virtual Machine
390
- virtual_machine_service.shutdown_virtual_machine('vm_name', 'cloud_service_name')
391
-
392
- #API to start Virtual Machine
393
- virtual_machine_service.start_virtual_machine('vm_name', 'cloud_service_name')
394
-
395
- #API to delete Virtual Machine
396
- virtual_machine_service.delete_virtual_machine('vm_name', 'cloud_service_name')
397
-
398
- #API to start deployment
399
- params = {
400
- :vm_name => 'vm_name',
401
- :vm_user => 'azureuser',
402
- :image => '5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-63APR20130415',
403
- :password => 'Password',
404
- :location => 'West US',
405
- :affinity_group_name => 'affinity1'
406
- }
407
- options = {
408
- :storage_account_name => 'storage_suse',
409
- :winrm_transport => ['https','http'], #Currently http is supported. To enable https, set the transport protocol to https, simply rdp to the VM once VM is in ready state, export the certificate ( CN name would be the deployment name) from the certstore of the VM and install to your local machine and communicate WinRM via https.
410
- :cloud_service_name => 'cloud_service_name',
411
- :deployment_name =>'vm_name',
412
- :tcp_endpoints => '80,3389:3390',
413
- :private_key_file => 'c:/private_key.key', #required for ssh or winrm(https) certificate.
414
- :certificate_file => 'c:/certificate.pem', #required for ssh or winrm(https) certificate.
415
- :ssh_port => 2222,
416
- :vm_size => 'Small', #valid choices are (ExtraSmall, Small, Medium, Large, ExtraLarge, A6, A7)
417
- :virtual_network_name => 'xplattestvnet'
418
- }
419
- virtual_machine_service.create_virtual_machine(params, options)
420
-
421
- #Get a list of available virtual machine images
422
- virtual_machine_image_service = Azure::VirtualMachineImageManagementService.new
423
- virtual_machine_image_service.list_virtual_machine_images
424
-
425
- #Get a list of available regional data center locations
426
- base_management = Azure::BaseManagementService.new
427
- base_management.list_locations
428
- ```
429
- ## Affinity Group Management
430
-
431
- ```ruby
432
- # Require the azure rubygem
433
- require 'azure'
434
-
435
- #Create a affinity group service object
436
- base_management_service = Azure::BaseManagementService.new
437
-
438
- #Get a list of affinity group that are provisioned for a subscription.
439
- base_management_service.list_affinity_groups
440
-
441
- #API to delete affinity group
442
- base_management_service.delete_affinity_group('affinity-group-name')
443
-
444
- #API to add a new affinity group to a subscription
445
- options = {:description => 'Some Description'}
446
- base_management_service.create_affinity_group('affinity-group-name', 'West US', 'Label Name', options)
447
-
448
- #API to update affinity group
449
- options = {:description => 'Some Description'}
450
- base_management_service.update_affinity_group('affinity-group-name', 'Label Name', options)
451
-
452
- #API to list properties associated with the specified affinity group
453
- base_management_service.get_affinity_group('affinity-group-name')
454
- ```
455
- ## SQL Database Server Management
456
-
457
- ```ruby
458
- # Require the azure rubygem
459
- require 'azure'
460
-
461
- Azure.configure do |config|
462
- config.management_certificate = "path to *.pem or *.pfx file"
463
- config.subscription_id = "your subscription id"
464
- config.management_endpoint = "https://management.database.windows.net:8443/"
465
- #To access other service management apis use "https://management.core.windows.net".
466
- end
467
-
468
- #Create a database server service object
469
- sql_db_service = Azure::SqlDatabaseManagementService.new
470
-
471
- #Get a list of SQL Database servers that are provisioned for a subscription.
472
- sql_db_service.list_servers
473
-
474
- #API to delete SQL Database server
475
- sql_db_service.delete_server('server_name')
476
-
477
- #API to adds a new SQL Database server to a subscription
478
- sql_db_service.create_server('admin-login', 'ComplexPassword', 'West US')
479
-
480
- #API to sets the administrative password of a SQL Database server for a subscription
481
- sql_db_service.reset_password('server-name', 'NewPassword')
482
-
483
- #Get a list of all the server-level firewall rules for a SQL Database server that belongs to a subscription
484
- sql_db_service.list_sql_server_firewall_rules("server-name")
485
-
486
- #API to adds a new server-level firewall rule or updates an existing server-level firewall rule for a SQL Database server with requester’s IP address.
487
- sql_db_service.delete_sql_server_firewall_rule("server-name", "rule-name")
488
-
489
- #API to add/updates server-level firewall rule for a SQL Database server that belongs to a subscription
490
- ip_range = {:start_ip_address => "0.0.0.1", :end_ip_address => "0.0.0.5"}
491
- sql_db_service.set_sql_server_firewall_rule("server-name", "rule-name", ip_range)
492
-
493
- # If ip_range was not specified in the above api then the IP of the machine from where the api is being called would be set as the rule.
494
- # To toggle between the option to allow windows azure services to access db server similar to azure portal just set the fire wall rule
495
- # with iprange to be 0.0.0.0 as start and end.Remove the rule to unset this option.
496
- ```
497
- ##VIRTUAL NETWORK MANAGEMENT
498
-
499
- ```ruby
500
- # Require the azure rubygem
501
- require 'azure'
502
-
503
- #Create a virtual network service object
504
-
505
- vnet = Azure::VirtualNetworkManagementService.new
506
-
507
- #API to get a list of virtual networks created for a subscription.
508
-
509
- vnet.list_virtual_networks
510
-
511
- #API to configure virtual network with required and optional parameters
512
-
513
- address_space = ['172.16.0.0/12', '10.0.0.0/8', '192.168.0.0/24']
514
-
515
- subnets = [{:name => 'subnet-1', :ip_address=>'172.16.0.0', :cidr=>12}, {:name => 'subnet-2', :ip_address=>'10.0.0.0', :cidr=>8}]
516
-
517
- dns_servers = [{:name => 'dns-1', :ip_address=>'1.2.3.4'}, {:name => 'dns-2', :ip_address=>'8.7.6.5'}]
518
-
519
- options = {:subnet => subnets, :dns => dns_servers}
520
-
521
- vnet.set_network_configuration('virtual-network-name', 'affinity-group-name', address_space, options)
522
-
523
- #API to configure virtual network from xml file that can be exported from management portal and customized to add or delete vnet
524
-
525
- vnetxml = './customnetwork.xml'
526
-
527
- vnet.set_network_configuration(vnetxml)
528
- ```
529
- # Need Help?
530
- Be sure to check out the Windows Azure [Developer Forums on Stack Overflow and MSDN](http://go.microsoft.com/fwlink/?LinkId=234489) if you have trouble with the provided code.
531
- # Contribute Code or Provide Feedback
532
- If you would like to become an active contributor to this project please follow the instructions provided in [Windows Azure Projects Contribution Guidelines](http://windowsazure.github.com/guidelines.html).
533
- If you encounter any bugs with the library please file an issue in the [Issues](https://github.com/WindowsAzure/azure-sdk-for-ruby/issues) section of the project.
534
- # Learn More
535
- For documentation on how to host Ruby applications on Windows Azure, please see the [Windows Azure Ruby Developer Center](http://www.windowsazure.com/en-us/develop/ruby/).
536
- For documentation on Azure PowerShell CLI tool for Windows, please see our readme [here](http://github.com/windowsazure/azure-sdk-tools).
537
- For documentation on the Azure cross platform CLI tool for Windows, Mac and Linux, please see our readme [here](http://github.com/windowsazure/azure-sdk-tools-xplat).
1
+ # Windows Azure SDK for Ruby [![Build Status](https://travis-ci.org/WindowsAzure/azure-sdk-for-ruby.png?branch=dev)](https://travis-ci.org/WindowsAzure/azure-sdk-for-ruby)
2
+
3
+
4
+ This project provides a Ruby package that makes it easy to access and manage Windows Azure Services like Storage, Service Bus and Virtual Machines.
5
+
6
+ # Library Features
7
+ * Storage
8
+ * Blobs
9
+ * create, list, and delete containers, work with container metadata and permissions, list blobs in container
10
+ * create block and page blobs (from a stream, a file, or a string), work with blob blocks and pages, delete blobs
11
+ * work with blob properties, metadata, leases, snapshot a blob
12
+ * Tables
13
+ * create and delete tables
14
+ * create, query, insert, update, merge, and delete entities
15
+ * Queues
16
+ * create, list, and delete queues, and work with queue metadata
17
+ * create, get, peek, update, delete messages
18
+ * Service Bus
19
+ * Queues
20
+ * create, list and delete queues
21
+ * send, receive, unlock and delete messages
22
+ * Topics
23
+ * create, list, and delete topics
24
+ * send, receive, unlock and delete messages
25
+ * create, list, and delete subscriptions
26
+ * create, list, and delete rules
27
+ * Base Management
28
+ * list locations
29
+ * get, list, create, update, delete affinity groups
30
+ * Virtual Machine Management
31
+ * list images
32
+ * list, delete Disks
33
+ * Virtual Machines
34
+ * create linux based VMs and ssh with cert and key option enabled for ssh and WINRM (both http & https)enabled for windows based VMs
35
+ * list, shut down, delete, find virtual machine deployments. While shutting down your VMs the provisioning state would be deallocated and this VM will not be included in the billing cycle.
36
+ * Create VM for a specific virtual network
37
+ * Cloud Service Management
38
+ * create, list, delete cloud services
39
+ * Storage Account Management
40
+ * create, list storage accounts, list locations
41
+ * SQL Database Server Management
42
+ * list, create SQL Database servers
43
+ * reset password for a SQL Database server
44
+ * list, set, delete firewall rules for a SQL Database server
45
+ * Virtual Network Management
46
+ * List VNet
47
+ * Create VNet via parameters or xml file
48
+
49
+ # Supported Ruby Versions
50
+
51
+ * Ruby 1.9.3
52
+ * Ruby 2.0
53
+
54
+ **Notice** that Ruby 2.0 x64 on Windows is not supported due to the [lack of nokogiri](https://github.com/sparklemotion/nokogiri/issues/864).
55
+
56
+ # Getting Started
57
+
58
+ ## Install the rubygem package
59
+
60
+ You can install the azure rubygem package directly.
61
+
62
+ ```bash
63
+ gem install azure
64
+ ```
65
+
66
+ ## Download Source Code
67
+
68
+ To get the source code of the SDK via **git** just type:
69
+
70
+ ```bash
71
+ git clone https://github.com/WindowsAzure/azure-sdk-for-ruby.git
72
+ cd ./azure-sdk-for-ruby
73
+ ```
74
+ Then, run bundler to install all the gem dependencies:
75
+
76
+ ```bash
77
+ bundle install
78
+ ```
79
+
80
+ ## Generate Documentation
81
+
82
+ Running the command ``rdoc`` will generate the API documentation in the `./doc` directory.
83
+
84
+ ## Setup Connection
85
+
86
+ You can use this SDK against the Windows Azure Services in the cloud, or against the local Storage Emulator if you are on Windows. Service Bus and Windows Azure Service Management emulation are not supported. Of course, to use the Windows Azure Services in the cloud, you need to first [create a Windows Azure account](http://www.windowsazure.com/en-us/pricing/free-trial/). After that, you can get the information you need to configure Storage and Service Bus from the [Windows Azure Portal](https://manage.windowsazure.com).
87
+
88
+ There are two ways you can set up the connections:
89
+
90
+ 1. [via code](#via-code)
91
+ 2. [via environment variables](#via-environment-variables)
92
+
93
+ ### Via Code
94
+ * Against Windows Azure Services in the cloud
95
+
96
+ ```ruby
97
+ require "azure"
98
+
99
+ Azure.configure do |config|
100
+ # Configure these 2 properties to use Storage
101
+ config.storage_account_name = "<your azure storage account name>"
102
+ config.storage_access_key = "<your azure storage access key>"
103
+ # Configure these 3 properties to use Service Bus
104
+ config.sb_namespace = "<your azure service bus namespace>"
105
+ config.sb_access_key = "<your azure service bus access key>"
106
+ config.sb_issuer = "<your azure service bus issuer>"
107
+ # Configure these 3 properties to use Service Management. We support passwordless pfx & pem cert formats.
108
+ config.management_certificate = "<path to your *.pem or *.pfx>"
109
+ config.subscription_id = "<your Subscriptionid>"
110
+ config.management_endpoint = "https://management.core.windows.net"
111
+ # This property enables/disables SQL Server authentication. By default SQL Server authentication is enabled. SQL Server authentication will also be enabled if you do not set this property
112
+ config.sql_database_authentication_mode = <:management_certificate or :sql_server>
113
+ # Configure SQL Server authentication API endpoint here
114
+ config.sql_database_management_endpoint = "http://management.database.windows.net:8443"
115
+ end
116
+ ```
117
+ * Against local Emulator (Windows Only)
118
+ ```ruby
119
+ require "azure"
120
+
121
+ Azure.configure do |config|
122
+ # Configure these 2 properties to use local Storage Emulator
123
+ config.storage_account_name = "devstoreaccount1"
124
+ config.storage_access_key = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="
125
+ config.storage_blob_host = "http://127.0.0.1:10000/devstoreaccount1"
126
+ config.storage_queue_host = "http://127.0.0.1:10001/devstoreaccount1"
127
+ config.storage_table_host = "http://127.0.0.1:10002/devstoreaccount1"
128
+ # Local Service Bus Emulator is not supported
129
+ # Local Service Management emulation is not supported
130
+ end
131
+ ```
132
+ ### Via Environment Variables
133
+ * Against Windows Azure Services in the cloud
134
+ * Storage
135
+
136
+ ```bash
137
+ AZURE_STORAGE_ACCOUNT = <your azure storage account name>
138
+ AZURE_STORAGE_ACCESS_KEY = <your azure storage access key>
139
+ ```
140
+ * Service Bus
141
+
142
+ ```bash
143
+ AZURE_SERVICEBUS_NAMESPACE = <your azure service bus namespace>
144
+ AZURE_SERVICEBUS_ACCESS_KEY = <your azure service bus access key>
145
+ AZURE_SERVICEBUS_ISSUER = <your azure service bus issuer>
146
+ ```
147
+ * Service Management
148
+
149
+ ```bash
150
+ AZURE_MANAGEMENT_CERTIFICATE = <path to *.pem or *.pfx>
151
+ AZURE_SUBSCRIPTION_ID = <your subscription ID>
152
+ AZURE_MANAGEMENT_ENDPOINT = <The endpoint URL of Windows Azure management service>
153
+ AZURE_SQL_DATABASE_MANAGEMENT_ENDPOINT = <SQL Database Management Endpoint>
154
+ AZURE_SQL_DATABASE_AUTHENTICATION_MODE = <:management_certificate or :sql_server>
155
+ ```
156
+ * Against local Emulator (Windows Only)
157
+ * Storage
158
+
159
+ ```bash
160
+ AZURE_STORAGE_ACCOUNT = devstoreaccount1
161
+ AZURE_STORAGE_ACCESS_KEY = Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==
162
+ AZURE_STORAGE_BLOB_HOST = http://127.0.0.1:10000/devstoreaccount1
163
+ AZURE_STORAGE_QUEUE_HOST = http://127.0.0.1:10001/devstoreaccount1
164
+ AZURE_STORAGE_TABLE_HOST = http://127.0.0.1:10002/devstoreaccount1
165
+ ```
166
+ * Service Bus: not supported
167
+ * Service Management: not supported
168
+ ## Run Test
169
+ You can use the following commands to run:
170
+ * all the tests: ``rake test``
171
+ * a specific suite of tests: ``rake test:integration:blob``
172
+ * one particular test file: ``ruby -I"lib:test" "<path of the test file>"``
173
+ # Usage
174
+ **For more examples, please see the [Windows Azure Ruby Developer Center](http://www.windowsazure.com/en-us/develop/ruby)**
175
+ ## Storage
176
+
177
+ ### Blobs
178
+
179
+ ```ruby
180
+ # Require the azure rubygem
181
+ require "azure"
182
+
183
+ # Create an azure storage blob service object
184
+ azure_blob_service = Azure::BlobService.new
185
+
186
+ # Create a container
187
+ container = azure_blob_service.create_container("test-container")
188
+
189
+ # Upload a Blob
190
+ content = File.open('test.jpg', 'rb') { |file| file.read }
191
+ azure_blob_service.create_block_blob(container.name, "image-blob", content)
192
+
193
+ # List containers
194
+ azure_blob_service.list_containers()
195
+
196
+ # List Blobs
197
+ azure_blob_service.list_blobs(container.name)
198
+
199
+ # Download a Blob
200
+ blob, content = azure_blob_service.get_blob(container.name, "image-blob")
201
+ File.open("download.png", "wb") {|f| f.write(content)}
202
+
203
+ # Delete a Blob
204
+ azure_blob_service.delete_blob(container.name, "image-blob")
205
+ ```
206
+ ### Tables
207
+
208
+ ```ruby
209
+ # Require the azure rubygem
210
+ require "azure"
211
+
212
+ # Create an azure storage table service object
213
+ azure_table_service = Azure::TableService.new
214
+
215
+ # Create a table
216
+ azure_table_service.create_table("testtable")
217
+
218
+ # Insert an entity
219
+ entity = { "content" => "test entity", :partition_key => "test-partition-key", :row_key => "1" }
220
+ azure_table_service.insert_entity("testtable", entity)
221
+
222
+ # Get an entity
223
+ result = azure_table_service.get_entity("testtable", "test-partition-key", "1")
224
+
225
+ # Update an entity
226
+ result.properties["content"] = "test entity with updated content"
227
+ azure_table_service.update_entity(result.table, result.properties)
228
+
229
+ # Query entities
230
+ query = { :filter => "content eq 'test entity'" }
231
+ result, token = azure_table_service.query_entities("testtable", query)
232
+
233
+ # Delete an entity
234
+ azure_table_service.delete_entity("testtable", "test-partition-key", "1")
235
+
236
+ # delete a table
237
+ azure_table_service.delete_table("testtable")
238
+ ```
239
+ ### Queues
240
+
241
+ ```ruby
242
+ # Require the azure rubygem
243
+ require "azure"
244
+
245
+ # Create an azure storage queue service object
246
+ azure_queue_service = Azure::QueueService.new
247
+
248
+ # Create a queue
249
+ azure_queue_service.create_queue("test-queue")
250
+
251
+ # Create a message
252
+ azure_queue_service.create_message("test-queue", "test message")
253
+
254
+ # Get one or more messages with setting the visibility timeout
255
+ result = azure_queue_service.list_messages("test-queue", 30, {:number_of_messages => 10})
256
+
257
+ # Get one or more messages without setting the visibility timeout
258
+ result = azure_queue_service.peek_messages("test-queue", {:number_of_messages => 10})
259
+
260
+ # Update a message
261
+ message = azure_queue_service.list_messages("test-queue", 30)
262
+ pop_receipt, time_next_visible = azure_queue_service.update_message("test-queue", message.id, message.pop_receipt, "updated test message", 30)
263
+
264
+ # Delete a message
265
+ message = azure_queue_service.list_messages("test-queue", 30)
266
+ azure_queue_service.delete_message("test-queue", message.id, message.pop_receipt)
267
+
268
+ # Delete a queue
269
+ azure_queue_service.delete_queue("test-queue")
270
+ ```
271
+ ## Service Bus
272
+
273
+ ```ruby
274
+ # Require the azure rubygem
275
+ require "azure"
276
+
277
+ # Create an azure service bus object
278
+ azure_service_bus = Azure::ServiceBusService.new
279
+
280
+ # Create a queue with just the queue name
281
+ queue1 = azure_service_bus.create_queue("test-queue-1")
282
+
283
+ # Create a queue with a queue object
284
+ queue2 = Azure::ServiceBus::Queue.new("test-queue-2")
285
+ queue2.max_size_in_megabytes = 2048
286
+ queue2 = azure_service_bus.create_queue(queue2)
287
+
288
+ # Send a queue message with just the message body
289
+ azure_service_bus.send_queue_message("test-queue-1", "test queue message")
290
+
291
+ # Send a queue message with a brokered message object
292
+ message = Azure::ServiceBus::BrokeredMessage.new("another test queue message")
293
+ message.correlation_id = "test-correlation-id-1"
294
+ azure_service_bus.send_queue_message("test-queue-1", message)
295
+
296
+ # Receive a queue message
297
+ message = azure_service_bus.receive_queue_message("test-queue-1")
298
+
299
+ # Delete a queue message
300
+ azure_service_bus.delete_queue_message(message)
301
+
302
+ # Delete a queue
303
+ azure_service_bus.delete_queue("test-queue-1")
304
+ ```
305
+ ### Topics
306
+
307
+ ```ruby
308
+ # Require the azure rubygem
309
+ require "azure"
310
+
311
+ # Create an azure service bus object
312
+ azure_service_bus = Azure::ServiceBusService.new
313
+
314
+ # Create a topic with just the topic name
315
+ topic1 = azure_service_bus.create_topic("test-topic-1")
316
+
317
+ # Create a topic with a topic object
318
+ topic2 = Azure::ServiceBus::Topic.new("test-topic-2")
319
+ topic2.max_size_in_megabytes = 2048
320
+ topic2 = azure_service_bus.create_topic(topic2)
321
+
322
+ # Create a subscription
323
+ subscription = Azure::ServiceBus::Subscription.new("test-subscription-1")
324
+ subscription.topic = topic1.name
325
+ subscription = azure_service_bus.create_subscription(subscription)
326
+
327
+ # Send a topic message with just the message body
328
+ azure_service_bus.send_topic_message(topic1, "test topic message")
329
+
330
+ # Send a topic message with a brokered message object
331
+ message = Azure::ServiceBus::BrokeredMessage.new("another test topic message")
332
+ message.correlation_id = "test-correlation-id-1"
333
+ azure_service_bus.send_topic_message(topic1, message)
334
+
335
+ # Receive a subscription message
336
+ message = azure_service_bus.receive_subscription_message(topic1.name, subscription.name)
337
+
338
+ # Delete a subscription message
339
+ azure_service_bus.delete_subscription_message(message)
340
+
341
+ # Delete a subscription
342
+ azure_service_bus.delete_subscription(subscription)
343
+
344
+ # Delete a topic
345
+ azure_service_bus.delete_topic(topic1)
346
+ ```
347
+ ## Virtual Machine Management
348
+
349
+ ```ruby
350
+ # Require the azure rubygem
351
+ require 'azure'
352
+
353
+ Azure.configure do |config|
354
+ # Configure these 3 properties to use Storage
355
+ config.management_certificate = "path to *.pem or *.pfx file"
356
+ config.subscription_id = "your subscription id"
357
+ config.management_endpoint = "https://management.core.windows.net"
358
+ end
359
+
360
+ #Create a virtual machine service object
361
+ virtual_machine_service = Azure::VirtualMachineManagementService.new
362
+
363
+ #Get a list of existing virtual machines in your subscription
364
+ virtual_machine_service.list_virtual_machines
365
+
366
+ #API to shutdown Virtual Machine
367
+ virtual_machine_service.shutdown_virtual_machine('vm_name', 'cloud_service_name')
368
+
369
+ #API to start Virtual Machine
370
+ virtual_machine_service.start_virtual_machine('vm_name', 'cloud_service_name')
371
+
372
+ #API to delete Virtual Machine
373
+ virtual_machine_service.delete_virtual_machine('vm_name', 'cloud_service_name')
374
+
375
+ #API to start deployment
376
+ params = {
377
+ :vm_name => 'vm_name',
378
+ :vm_user => 'azureuser',
379
+ :image => '5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-63APR20130415',
380
+ :password => 'Password',
381
+ :location => 'West US'
382
+ }
383
+ options = {
384
+ :storage_account_name => 'storage_suse',
385
+ :winrm_transport => ['https','http'], #Currently http is supported. To enable https, set the transport protocol to https, simply rdp to the VM once VM is in ready state, export the certificate ( CN name would be the deployment name) from the certstore of the VM and install to your local machine and communicate WinRM via https.
386
+ :cloud_service_name => 'cloud_service_name',
387
+ :deployment_name =>'vm_name',
388
+ :tcp_endpoints => '80,3389:3390',
389
+ :private_key_file => 'c:/private_key.key', #required for ssh or winrm(https) certificate.
390
+ :certificate_file => 'c:/certificate.pem', #required for ssh or winrm(https) certificate.
391
+ :ssh_port => 2222,
392
+ :vm_size => 'Small', #valid choices are (ExtraSmall, Small, Medium, Large, ExtraLarge, A6, A7)
393
+ :affinity_group_name => 'affinity1',
394
+ :virtual_network_name => 'xplattestvnet',
395
+ :subnet_name => 'subnet1',
396
+ :availability_set_name => 'availabiltyset1'
397
+ }
398
+ virtual_machine_service.create_virtual_machine(params,options,add_role=false)
399
+ # Here add_role is used as a flag to create multiple roles under the same cloud service. This parameter is false
400
+ # by default. Atleast a single deployment should be created under a hosted service prior to setting this flag.
401
+
402
+ #API usage to add new roles under cloud service creating VM
403
+
404
+ virtual_machine_service.create_virtual_machine(params,options,add_role=true)
405
+
406
+ #Get a list of available virtual machine images
407
+ virtual_machine_image_service = Azure::VirtualMachineImageManagementService.new
408
+ virtual_machine_image_service.list_virtual_machine_images
409
+
410
+ #Get a list of available regional data center locations
411
+ base_management = Azure::BaseManagementService.new
412
+ base_management.list_locations
413
+ ```
414
+ ## Affinity Group Management
415
+
416
+ ```ruby
417
+ # Require the azure rubygem
418
+ require 'azure'
419
+
420
+ #Create a affinity group service object
421
+ base_management_service = Azure::BaseManagementService.new
422
+
423
+ #Get a list of affinity group that are provisioned for a subscription.
424
+ base_management_service.list_affinity_groups
425
+
426
+ #API to delete affinity group
427
+ base_management_service.delete_affinity_group('affinity-group-name')
428
+
429
+ #API to add a new affinity group to a subscription
430
+ options = {:description => 'Some Description'}
431
+ base_management_service.create_affinity_group('affinity-group-name', 'West US', 'Label Name', options)
432
+
433
+ #API to update affinity group
434
+ options = {:description => 'Some Description'}
435
+ base_management_service.update_affinity_group('affinity-group-name', 'Label Name', options)
436
+
437
+ #API to list properties associated with the specified affinity group
438
+ base_management_service.get_affinity_group('affinity-group-name')
439
+ ```
440
+ ## SQL Database Server Management
441
+
442
+ ```ruby
443
+ # Require the azure rubygem
444
+ require 'azure'
445
+
446
+ Azure.configure do |config|
447
+ config.management_certificate = "path to *.pem or *.pfx file"
448
+ config.subscription_id = "your subscription id"
449
+ config.management_endpoint = "https://management.database.windows.net:8443/"
450
+ #To access other service management apis use "https://management.core.windows.net".
451
+ end
452
+
453
+ #Create a database server service object
454
+ sql_db_service = Azure::SqlDatabaseManagementService.new
455
+
456
+ #Get a list of SQL Database servers that are provisioned for a subscription.
457
+ sql_db_service.list_servers
458
+
459
+ #API to delete SQL Database server
460
+ sql_db_service.delete_server('server_name')
461
+
462
+ #API to adds a new SQL Database server to a subscription
463
+ sql_db_service.create_server('admin-login', 'ComplexPassword', 'West US')
464
+
465
+ #API to sets the administrative password of a SQL Database server for a subscription
466
+ sql_db_service.reset_password('server-name', 'NewPassword')
467
+
468
+ #Get a list of all the server-level firewall rules for a SQL Database server that belongs to a subscription
469
+ sql_db_service.list_sql_server_firewall_rules("server-name")
470
+
471
+ #API to adds a new server-level firewall rule or updates an existing server-level firewall rule for a SQL Database server with requester’s IP address.
472
+ sql_db_service.delete_sql_server_firewall_rule("server-name", "rule-name")
473
+
474
+ #API to add/updates server-level firewall rule for a SQL Database server that belongs to a subscription
475
+ ip_range = {:start_ip_address => "0.0.0.1", :end_ip_address => "0.0.0.5"}
476
+ sql_db_service.set_sql_server_firewall_rule("server-name", "rule-name", ip_range)
477
+
478
+ # If ip_range was not specified in the above api then the IP of the machine from where the api is being called would be set as the rule.
479
+ # To toggle between the option to allow windows azure services to access db server similar to azure portal just set the fire wall rule
480
+ # with iprange to be 0.0.0.0 as start and end.Remove the rule to unset this option.
481
+ ```
482
+ ## Virtual Network Management
483
+
484
+ ```ruby
485
+ # Require the azure rubygem
486
+ require 'azure'
487
+
488
+ #Create a virtual network service object
489
+
490
+ vnet = Azure::VirtualNetworkManagementService.new
491
+
492
+ #API to get a list of virtual networks created for a subscription.
493
+
494
+ vnet.list_virtual_networks
495
+
496
+ #API to configure virtual network with required and optional parameters
497
+
498
+ address_space = ['172.16.0.0/12', '10.0.0.0/8', '192.168.0.0/24']
499
+
500
+ subnets = [{:name => 'subnet-1', :ip_address=>'172.16.0.0', :cidr=>12}, {:name => 'subnet-2', :ip_address=>'10.0.0.0', :cidr=>8}]
501
+
502
+ dns_servers = [{:name => 'dns-1', :ip_address=>'1.2.3.4'}, {:name => 'dns-2', :ip_address=>'8.7.6.5'}]
503
+
504
+ options = {:subnet => subnets, :dns => dns_servers}
505
+
506
+ vnet.set_network_configuration('virtual-network-name', 'affinity-group-name', address_space, options)
507
+
508
+ #API to configure virtual network from xml file that can be exported from management portal and customized to add or delete vnet
509
+
510
+ vnetxml = './customnetwork.xml'
511
+
512
+ vnet.set_network_configuration(vnetxml)
513
+ ```
514
+
515
+ # Useful commands for certificate operations
516
+
517
+ Currently the sdk supports *.pem or *.pfx (passwordless pfx) for service management operations. Following are the steps discussed on various cert operations.
518
+
519
+ * To create pfx, simply download the publishsettings file for your subscription, copy the contents of Management Certificate from the publishsettings and save it in a file and name the file as your cert.pfx. This pfx will be a passwordless pfx which can be supplied as a cert parameter for Service Management Commands
520
+ * Using the following openssl commands to extract the pem file and pass the pem file as management cert parameter.
521
+ * To get only private key from pfx use Openssl.exe pkcs12 -in cert.pfx -nocerts -out cert.pem
522
+ * To remove passphrase from the above private key use ``Openssl.exe rsa -in cert.pem -out certprivnopassword.pem``
523
+ * To extract both public & private keys from pfx use ``Openssl.exe pkcs12 -in cert.pfx -out certprivpub.pem``
524
+ * To extract only public key from pem use ``Openssl.exe x509 -inform pem -in certprivpub.pem -pubkey -out certpub.pem -outform pem``
525
+ * Finally copy the public key & private key to a file *.pem and pass that pem file to management cert parameter.
526
+ * To extract pem from custom certificate, export the pfx, follow the above steps to convert to pem and pass that pem file to management cert parameter.
527
+
528
+ # Need Help?
529
+
530
+ Be sure to check out the Windows Azure [Developer Forums on Stack Overflow and MSDN](http://go.microsoft.com/fwlink/?LinkId=234489) if you have trouble with the provided code.
531
+
532
+ # Contribute Code or Provide Feedback
533
+
534
+ If you would like to become an active contributor to this project please follow the instructions provided in [Windows Azure Projects Contribution Guidelines](http://windowsazure.github.com/guidelines.html).
535
+ If you encounter any bugs with the library please file an issue in the [Issues](https://github.com/WindowsAzure/azure-sdk-for-ruby/issues) section of the project.
536
+
537
+ # Learn More
538
+
539
+ For documentation on how to host Ruby applications on Windows Azure, please see the [Windows Azure Ruby Developer Center](http://www.windowsazure.com/en-us/develop/ruby/).
540
+ For documentation on Azure PowerShell CLI tool for Windows, please see our readme [here](http://github.com/windowsazure/azure-sdk-tools).
541
+ For documentation on the Azure cross platform CLI tool for Windows, Mac and Linux, please see our readme [here](http://github.com/windowsazure/azure-sdk-tools-xplat).