ropenstack 1.2.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. data/.gitignore +1 -0
  2. data/README.md +2 -1
  3. data/doc/Ropenstack.html +151 -0
  4. data/doc/Ropenstack/Cinder.html +197 -0
  5. data/doc/Ropenstack/Glance.html +292 -0
  6. data/doc/Ropenstack/Keystone.html +737 -0
  7. data/doc/Ropenstack/MalformedRequestError.html +142 -0
  8. data/doc/Ropenstack/NotFoundError.html +142 -0
  9. data/doc/Ropenstack/Nova.html +562 -0
  10. data/doc/Ropenstack/OpenstackService.html +199 -0
  11. data/doc/Ropenstack/Quantum.html +830 -0
  12. data/doc/Ropenstack/Rest.html +483 -0
  13. data/doc/Ropenstack/RopenstackError.html +143 -0
  14. data/doc/Ropenstack/TimeoutError.html +142 -0
  15. data/doc/Ropenstack/UnauthorisedError.html +142 -0
  16. data/doc/created.rid +10 -0
  17. data/doc/images/add.png +0 -0
  18. data/doc/images/brick.png +0 -0
  19. data/doc/images/brick_link.png +0 -0
  20. data/doc/images/bug.png +0 -0
  21. data/doc/images/bullet_black.png +0 -0
  22. data/doc/images/bullet_toggle_minus.png +0 -0
  23. data/doc/images/bullet_toggle_plus.png +0 -0
  24. data/doc/images/date.png +0 -0
  25. data/doc/images/delete.png +0 -0
  26. data/doc/images/find.png +0 -0
  27. data/doc/images/loadingAnimation.gif +0 -0
  28. data/doc/images/macFFBgHack.png +0 -0
  29. data/doc/images/package.png +0 -0
  30. data/doc/images/page_green.png +0 -0
  31. data/doc/images/page_white_text.png +0 -0
  32. data/doc/images/page_white_width.png +0 -0
  33. data/doc/images/plugin.png +0 -0
  34. data/doc/images/ruby.png +0 -0
  35. data/doc/images/tag_blue.png +0 -0
  36. data/doc/images/tag_green.png +0 -0
  37. data/doc/images/transparent.png +0 -0
  38. data/doc/images/wrench.png +0 -0
  39. data/doc/images/wrench_orange.png +0 -0
  40. data/doc/images/zoom.png +0 -0
  41. data/doc/index.html +93 -0
  42. data/doc/js/darkfish.js +153 -0
  43. data/doc/js/jquery.js +18 -0
  44. data/doc/js/navigation.js +142 -0
  45. data/doc/js/search.js +94 -0
  46. data/doc/js/search_index.js +1 -0
  47. data/doc/js/searcher.js +228 -0
  48. data/doc/rdoc.css +543 -0
  49. data/doc/table_of_contents.html +200 -0
  50. data/lib/ropenstack.rb +18 -0
  51. data/lib/ropenstack/blockStorage.rb +25 -0
  52. data/lib/ropenstack/blockStorage/v1.rb +67 -0
  53. data/lib/ropenstack/blockStorage/v2.rb +11 -0
  54. data/lib/ropenstack/common/error.rb +12 -0
  55. data/lib/ropenstack/common/openstackservice.rb +28 -0
  56. data/lib/ropenstack/common/rest.rb +138 -0
  57. data/lib/ropenstack/compute.rb +164 -0
  58. data/lib/ropenstack/compute/v2.rb +11 -0
  59. data/lib/ropenstack/compute/v2/extensions.rb +14 -0
  60. data/lib/ropenstack/compute/v2/extensions/admin.rb +0 -0
  61. data/lib/ropenstack/compute/v2/extensions/agents.rb +0 -0
  62. data/lib/ropenstack/compute/v2/extensions/aggregates.rb +0 -0
  63. data/lib/ropenstack/compute/v2/extensions/certificates.rb +0 -0
  64. data/lib/ropenstack/compute/v2/extensions/cloudpipe.rb +0 -0
  65. data/lib/ropenstack/compute/v2/extensions/console.rb +0 -0
  66. data/lib/ropenstack/compute/v2/extensions/coverage.rb +0 -0
  67. data/lib/ropenstack/compute/v2/extensions/defaultsecuritygroup.rb +0 -0
  68. data/lib/ropenstack/compute/v2/extensions/diagnostics.rb +0 -0
  69. data/lib/ropenstack/compute/v2/extensions/extraspecs.rb +0 -0
  70. data/lib/ropenstack/compute/v2/extensions/fixedips.rb +0 -0
  71. data/lib/ropenstack/compute/v2/extensions/flavors.rb +0 -0
  72. data/lib/ropenstack/compute/v2/extensions/hosts.rb +0 -0
  73. data/lib/ropenstack/compute/v2/extensions/hypervisors.rb +0 -0
  74. data/lib/ropenstack/compute/v2/extensions/images.rb +0 -0
  75. data/lib/ropenstack/compute/v2/extensions/instanceactions.rb +0 -0
  76. data/lib/ropenstack/compute/v2/extensions/interfaces.rb +0 -0
  77. data/lib/ropenstack/compute/v2/extensions/keypairs.rb +20 -0
  78. data/lib/ropenstack/compute/v2/extensions/limits.rb +0 -0
  79. data/lib/ropenstack/compute/v2/extensions/migrations.rb +0 -0
  80. data/lib/ropenstack/compute/v2/extensions/networks.rb +0 -0
  81. data/lib/ropenstack/compute/v2/extensions/quotasets.rb +0 -0
  82. data/lib/ropenstack/compute/v2/extensions/securitygroups.rb +40 -0
  83. data/lib/ropenstack/compute/v2/extensions/servergroups.rb +0 -0
  84. data/lib/ropenstack/compute/v2/extensions/serverpassword.rb +0 -0
  85. data/lib/ropenstack/compute/v2/extensions/services.rb +0 -0
  86. data/lib/ropenstack/compute/v2/extensions/shelvedservers.rb +0 -0
  87. data/lib/ropenstack/compute/v2/extensions/usage.rb +0 -0
  88. data/lib/ropenstack/compute/v2/extensions/virtualinterfaces.rb +0 -0
  89. data/lib/ropenstack/compute/v2/extensions/volumes.rb +20 -0
  90. data/lib/ropenstack/compute/v3.rb +5 -0
  91. data/lib/ropenstack/database.rb +24 -0
  92. data/lib/ropenstack/database/v1.rb +113 -0
  93. data/lib/ropenstack/identity.rb +28 -0
  94. data/lib/ropenstack/identity/v2.rb +178 -0
  95. data/lib/ropenstack/identity/v3.rb +13 -0
  96. data/lib/ropenstack/image.rb +25 -0
  97. data/lib/ropenstack/image/v1.rb +107 -0
  98. data/lib/ropenstack/image/v2.rb +134 -0
  99. data/lib/ropenstack/networking.rb +160 -0
  100. data/lib/ropenstack/networking/v2.rb +5 -0
  101. data/lib/ropenstack/networking/v2/extensions.rb +9 -0
  102. data/lib/ropenstack/networking/v2/extensions/l3.rb +111 -0
  103. data/lib/ropenstack/networking/v2/extensions/lbaas.rb +5 -0
  104. data/lib/ropenstack/networking/v2/extensions/metering.rb +5 -0
  105. data/lib/ropenstack/networking/v2/extensions/quotas.rb +5 -0
  106. data/lib/ropenstack/networking/v2/extensions/securitygroups.rb +5 -0
  107. data/lib/ropenstack/objectStorage.rb +60 -0
  108. data/lib/ropenstack/orchestration.rb +23 -0
  109. data/lib/ropenstack/orchestration/v1.rb +162 -0
  110. data/lib/ropenstack/telemetry.rb +23 -0
  111. data/lib/ropenstack/telemetry/v2.rb +68 -0
  112. data/ropenstack.gemspec +13 -0
  113. metadata +112 -1
@@ -0,0 +1,160 @@
1
+ module Ropenstack
2
+ =begin
3
+ * Name: Networking
4
+ * Description: An implementation of the Networking V2.0 API Client in Ruby
5
+ * Authors: Sam 'Tehsmash' Betts, John Davidge
6
+ * Date: 01/15/2013
7
+ =end
8
+ class Networking < OpenstackService
9
+ require 'ropenstack/networking/v2'
10
+
11
+ ## Extensions
12
+ include Version2::Extensions::L3
13
+ include Version2::Extensions::LBaaS
14
+ include Version2::Extensions::Metering
15
+ include Version2::Extensions::Quotas
16
+ include Version2::Extensions::SecurityGroups
17
+
18
+ ## Networks
19
+
20
+ ##
21
+ # Get a list of a tenants networks
22
+ #
23
+ # :call-seq:
24
+ # networks(id) => A single network with the id matching the parameter
25
+ # networks => All networks visible to the tenant making the request
26
+ ##
27
+ def networks(id = nil)
28
+ endpoint = "networks"
29
+ unless id.nil?
30
+ endpoint = endpoint + "/" + id
31
+ end
32
+ return get_request(address(endpoint), @token)
33
+ end
34
+
35
+ ##
36
+ # Create a new network on Openstack given a name and tenant id.
37
+ ##
38
+ def create_network(name, tenant, admin_state_up = true)
39
+ data = {
40
+ 'network' => {
41
+ 'name' => name,
42
+ 'tenant_id' => tenant,
43
+ 'admin_state_up' => admin_state_up
44
+ }
45
+ }
46
+ return post_request(address("networks"), data, @token)
47
+ end
48
+
49
+ ##
50
+ # Delete a network given a network id.
51
+ ##
52
+ def delete_network(network)
53
+ return delete_request(address("networks/" + network), @token)
54
+ end
55
+
56
+ ## Subnets
57
+
58
+ ##
59
+ # Get a list of subnets
60
+ ##
61
+ def subnets
62
+ return get_request(address("subnets"), @token)
63
+ end
64
+
65
+ ##
66
+ # Create a new ipv4 subnet in a network, given a network id, and
67
+ # a IP range in CIDR format.
68
+ ##
69
+ def create_subnet(network, cidr)
70
+ data = {
71
+ 'subnet' => {
72
+ 'network_id' => network,
73
+ 'ip_version' => 4,
74
+ 'cidr' => cidr
75
+ }
76
+ }
77
+ return post_request(address("subnets"), data, @token)
78
+ end
79
+
80
+ ##
81
+ # Delete a subnet given a subnet id
82
+ ##
83
+ def delete_subnet(subnet)
84
+ return delete_request(address("subnets/" + subnet), @token)
85
+ end
86
+
87
+ ## Ports
88
+
89
+ ##
90
+ # Get a list of ports
91
+ ##
92
+ def ports
93
+ return get_request(address("ports"), @token)
94
+ end
95
+
96
+ ##
97
+ # Get a list of ports specific to a device_id
98
+ ##
99
+ def device_ports(device_id)
100
+ return get_request(address("ports?device_id=#{device_id}"), @token)
101
+ end
102
+
103
+ ##
104
+ # Create a new port given network and device ids, optional
105
+ # parameter subnet id allows for scoping the port to a single subnet.
106
+ ##
107
+ def create_port(network, subnet = nil, device = nil, device_owner = nil)
108
+ data = {
109
+ 'port' => {
110
+ 'network_id' => network,
111
+ }
112
+ }
113
+ unless device_owner.nil?
114
+ data['port']['device_owner'] = device_owner
115
+ end
116
+ unless device.nil?
117
+ data['port']['device_id'] = device
118
+ end
119
+ unless subnet.nil?
120
+ data['port']['fixed_ips'] = [{'subnet_id' => subnet}]
121
+ end
122
+
123
+ puts data
124
+
125
+ return post_request(address("ports"), data, @token)
126
+ end
127
+
128
+ ##
129
+ # Update a specific ports fixed_ips, including subnet and ip data.
130
+ ##
131
+ def update_port(port, fixed_ips)
132
+ data = { 'port' => { 'fixed_ips' => fixed_ips } }
133
+ return put_request(address("ports/"+port), data, @token)
134
+ end
135
+
136
+ ##
137
+ # Weird function for adding a port to multiple subnets if nessessary.
138
+ ##
139
+ def move_port_to_subnets(port_id, subnet_ids)
140
+ id_list = Array.new()
141
+ subnet_ids.each do |id|
142
+ id_list << { "subnet_id" => id }
143
+ end
144
+ return update_port(port_id, id_list)
145
+ end
146
+
147
+ ##
148
+ # Delete a port given a port id.
149
+ ##
150
+ def delete_port(port)
151
+ return delete_request(address("ports/" + port), @token)
152
+ end
153
+
154
+ private
155
+
156
+ def address(endpoint)
157
+ super("/v2.0/#{endpoint}")
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,5 @@
1
+ module Ropenstack
2
+ module Networking::Version2
3
+ require 'ropenstack/networking/v2/extensions'
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ module Ropenstack
2
+ module Networking::Version2::Extensions
3
+ require 'ropenstack/networking/v2/extensions/l3'
4
+ require 'ropenstack/networking/v2/extensions/lbaas'
5
+ require 'ropenstack/networking/v2/extensions/metering'
6
+ require 'ropenstack/networking/v2/extensions/quotas'
7
+ require 'ropenstack/networking/v2/extensions/securitygroups'
8
+ end
9
+ end
@@ -0,0 +1,111 @@
1
+ module Ropenstack::Networking::Version2::Extensions
2
+ module L3
3
+ ##
4
+ # Get a list of a tenants routers
5
+ #
6
+ # :call-seq:
7
+ # routers(id) => A single router with the id matching the parameter
8
+ # routers => All routers visible to the tenant making the request
9
+ ##
10
+ def routers(id = nil)
11
+ endpoint = "routers"
12
+ unless id.nil?
13
+ endpoint = endpoint + "/" + id
14
+ end
15
+ return get_request(address(endpoint), @token)
16
+ end
17
+ ##
18
+ # Create a new router with a given name.
19
+ ##
20
+ def create_router(name, admin_state_up = true)
21
+ data = {
22
+ 'router' =>{
23
+ 'name' => name,
24
+ 'admin_state_up' => admin_state_up,
25
+ }
26
+ }
27
+ return post_request(address("routers"), data, @token)
28
+ end
29
+
30
+ ##
31
+ # Delete a router given a routers id.
32
+ ##
33
+ def delete_router(router)
34
+ return delete_request(address("routers/" + router), @token)
35
+ end
36
+
37
+ ##
38
+ # Connect a router to a subnet, given router id and subnet id.
39
+ ##
40
+ def add_router_interface(router, subnet)
41
+ data = { 'subnet_id' => subnet }
42
+ return put_request(address("routers/"+router+"/add_router_interface"), data, @token)
43
+ end
44
+
45
+ ##
46
+ # Delete a connection between a subnet and router given either port
47
+ # or subnet ids.
48
+ #
49
+ # :call-seq:
50
+ # delete_router_interface(router_id, subnet_id, "subnet")
51
+ # delete_router_interface(router_id, port_id, "port")
52
+ ##
53
+ def delete_router_interface(router, id, type)
54
+ data = case type
55
+ when 'port' then { 'port_id' => id }
56
+ when 'subnet' then { 'subnet_id' => id }
57
+ else raise "Invalid Interface Type"
58
+ end
59
+ return put_request(address("routers/" + router + "/remove_router_interface"), data, @token)
60
+ end
61
+
62
+ ##
63
+ # Enable external connectivity through this router by connecting it to
64
+ # an "external network"
65
+ ##
66
+ def add_router_gateway(router, network_id)
67
+ data = { 'router' => {'external_gateway_info' => { 'network_id' => network_id }}}
68
+ return put_request(address("routers/"+router), data, @token)
69
+ end
70
+
71
+ ##
72
+ # Clear a routers external gateway information given a router id.
73
+ ##
74
+ def delete_router_gateway(router)
75
+ data = { 'router' => {'external_gateway_info' => nil}}
76
+ return put_request(address('routers/' + router), data, @token)
77
+ end
78
+
79
+ ##
80
+ # Get a full list of floating ips for the tenant
81
+ ##
82
+ def floating_ips
83
+ return get_request(address("floatingips"), @token)
84
+ end
85
+
86
+ def create_floating_ip(network, port = nil)
87
+ data = {
88
+ 'floatingip' => {
89
+ 'floating_network_id' => network
90
+ }
91
+ }
92
+ unless port.nil?
93
+ data['floatingip']['port_id'] = port
94
+ end
95
+ return post_request(address('floatingips'), data, @token)
96
+ end
97
+
98
+ def delete_floating_ip(id)
99
+ return delete_request(address("floatingips/#{id}"), @token)
100
+ end
101
+
102
+ def update_floating_ip(id, port)
103
+ data = {
104
+ 'floatingip' => {
105
+ 'port_id' => port
106
+ }
107
+ }
108
+ return put_request(address("floatingips/#{id}"), data, @token)
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,5 @@
1
+ module Ropenstack::Networking::Version2::Extensions
2
+ module LBaaS
3
+ ## TODO
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Ropenstack::Networking::Version2::Extensions
2
+ module Metering
3
+ ## TODO
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Ropenstack::Networking::Version2::Extensions
2
+ module Quotas
3
+ ## TODO
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Ropenstack::Networking::Version2::Extensions
2
+ module SecurityGroups
3
+ ## TODO
4
+ end
5
+ end
@@ -0,0 +1,60 @@
1
+ module Ropenstack
2
+ ##
3
+ # * Name: ObjectStorage
4
+ # * Description: Implementation of the Block Storage API Client in Ruby.
5
+ # * Author: Sam 'Tehsmash' Betts
6
+ # * Date: 01/15/2013
7
+ ##
8
+ class ObjectStorage < OpenstackService
9
+ ## Accounts
10
+ def account(id, head)
11
+ if head
12
+ get_request(address(id), @token)
13
+ else
14
+ head_request(address(id), @token)
15
+ end
16
+ end
17
+
18
+ def create_account()
19
+ end
20
+
21
+ ## Containers
22
+ def container(account, container, head)
23
+ if head
24
+ get_request(address(account + "/" + container), @token)
25
+ else
26
+ head_request(address(account + "/" + container), @token)
27
+ end
28
+ end
29
+
30
+ def create_container(account, container)
31
+ end
32
+
33
+ def delete_container(account, container)
34
+ end
35
+
36
+ def update_container(account, container)
37
+ end
38
+
39
+ ## Objects
40
+ def object(account, container, object)
41
+ get_request(address(account + "/" + container + "/" + object), @token)
42
+ end
43
+
44
+ def object_metadata(account, container, object)
45
+ head_request(address(account + "/" + container + "/" + object), @token)
46
+ end
47
+
48
+ def create_object(account, container, object)
49
+ end
50
+
51
+ def copy_object(account, container, object)
52
+ end
53
+
54
+ def delete_object(account, container, object)
55
+ end
56
+
57
+ def create_object_metadata(account, container, object)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,23 @@
1
+ require 'ropenstack/common/rest'
2
+
3
+ module Ropenstack
4
+ ##
5
+ # * Name: Orchestration
6
+ # * Description: Implementation of the Orchestration API Client in Ruby
7
+ # * Author: Sam 'Tehsmash' Betts, John Davidge
8
+ # * Date: 30/06/2014
9
+ ##
10
+ class Orchestration < OpenstackService
11
+ # Pull in sub-modules
12
+ require 'ropenstack/orchestration/v1'
13
+
14
+ def intialize(location, token, type)
15
+ super(location, token)
16
+ case type
17
+ when "orchestration" then extend Version1
18
+ else
19
+ raise Ropenstack::RopenstackError, "Invalid type passed to Orchestration"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,162 @@
1
+ module Ropenstack
2
+ ##
3
+ # * Name: OrchestrationVersion1
4
+ # * Description: Implementation of the Orchestration V1.0 API Client in Ruby
5
+ # * Author: Sam 'Tehsmash' Betts, John Davidge
6
+ # * Date: 30/06/2014
7
+ ##
8
+ module Orchestration::Version1
9
+ def stacks(name, id)
10
+ if name.nil?
11
+ get_request(address("/stacks"), @token)
12
+ elsif id.nil?
13
+ get_request(address("/stacks/"+name), @token)
14
+ else
15
+ get_request(address("/stacks/"+name+"/"+id), @token)
16
+ end
17
+ end
18
+
19
+ def stack_create(name, template, isURL, environmment, files, parameters, timeout, disable, adoptData, preview)
20
+ data = {
21
+ :stack_name => name,
22
+ :environment => environment,
23
+ :timeout_mins => timeout,
24
+ :files => files,
25
+ :parameters => parameters,
26
+ :disable => disable
27
+ }
28
+ if isURL
29
+ data[:template_url] = template
30
+ else
31
+ data[:template] = template
32
+ end
33
+ unless adoptData.nil?
34
+ data[:adopt_stack_data] = adoptData
35
+ end
36
+ post_request(address("/stacks"), data, @token)
37
+ end
38
+
39
+ def stack_update(name, id)
40
+ put_request(address("/stack/"+name+"/"+id+"/action"), {:resume => nil}, @token)
41
+ end
42
+
43
+ def stack_delete(name, id)
44
+ delete_request(address("/stack/"+name+"/"+id), @token)
45
+ end
46
+
47
+ def stack_adandon(name, id, preview)
48
+ if preview
49
+ get_request(address("/stack/" + name + "/"+ id + "/abandon"), @token)
50
+ else
51
+ delete_request(address("/stack/" + name + "/"+ id + "/abandon"), @token)
52
+ end
53
+ end
54
+
55
+ def stack_action(name, id, action)
56
+ case action
57
+ when "SUSPEND"
58
+ post_request(address("/stack/"+name+"/"+id+"/action"), {:suspend => nil}, @token)
59
+ when "RESUME"
60
+ post_request(address("/stack/"+name+"/"+id+"/action"), {:resume => nil}, @token)
61
+ else
62
+ raise Ropenstack::RopenstackError, "Invalid Action Passed"
63
+ end
64
+ end
65
+
66
+ def resources(stack, id = nil, name = nil, meta = false)
67
+ if id.nil?
68
+ get_request(address("/stacks/"+stack+"/resources"), @token)
69
+ elsif name.nil?
70
+ get_request(address("/stacks/"+stack+"/"+id+"/resources"), @token)
71
+ else
72
+ if meta
73
+ get_request(address("/stacks/"+stack+"/"+id+"/resources/"+name+"/metadata"), @token)
74
+ else
75
+ get_request(address("/stacks/"+stack+"/"+id+"/resources/"+name), @token)
76
+ end
77
+ end
78
+ end
79
+
80
+ def resource_types(name = nil)
81
+ if name.nil?
82
+ get_request(address("/resource_types"), @token)
83
+ else
84
+ get_request(address("/resource_types/"+name), @token)
85
+ end
86
+ end
87
+
88
+ def resource_type_template(name)
89
+ get_request(address("/resource_types/"+name+"/template"), @token)
90
+ end
91
+
92
+ def events(stack, id = nil, resource = nil, event = nil)
93
+ if id.nil?
94
+ get_request(address("/stacks/"+stack+"/events"), @token)
95
+ elsif resource.nil?
96
+ get_request(address("/stacks/"+stack+"/"+id+"/events"), @token)
97
+ elsif event.nil?
98
+ get_request(address("/stacks/"+stack+"/"+id+"/resources/"+resource+"/events"), @token)
99
+ else
100
+ get_request(address("/stacks/"+stack+"/"+id+"/resources/"+resource+"/events/"+event), @token)
101
+ end
102
+ end
103
+
104
+ def stack_template(name, id)
105
+ get_request(address("/stacks/" + name + "/" + id), @token)
106
+ end
107
+
108
+ def validate_template(template, isURL)
109
+ data = {}
110
+ if isURL
111
+ data[:template_url] = template
112
+ else
113
+ data[:template] = template
114
+ end
115
+ post_request(address("/validate"), data, @token)
116
+ end
117
+
118
+ def build_info
119
+ get_request(address("/build_info"), @token)
120
+ end
121
+
122
+ def software_configs(id)
123
+ get_request(address("/software_configs/" + id), @token)
124
+ end
125
+
126
+ # TODO
127
+ def create_software_config
128
+ end
129
+
130
+ def delete_software_config(id)
131
+ delete_request(address("/software_configs/" + id), @token)
132
+ end
133
+
134
+ def software_deployments(id = nil)
135
+ if id.nil?
136
+ get_request(address("/software_deployments"), @token)
137
+ else
138
+ get_request(address("/software_deployments/" + id), @token)
139
+ end
140
+ end
141
+
142
+ def server_software_deployment(server)
143
+ get_request(address("/software_deployments/metadata/"+server), @token)
144
+ end
145
+
146
+ # TODO
147
+ def create_software_deployment
148
+ end
149
+
150
+ # TODO
151
+ def update_software_deployment(id)
152
+ end
153
+
154
+ def delete_software_deployment(id)
155
+ delete_request(address("/software_deployments/" + id), @token)
156
+ end
157
+
158
+ def version
159
+ "V1"
160
+ end
161
+ end
162
+ end