ropenstack 1.2.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/README.md +2 -1
- data/doc/Ropenstack.html +151 -0
- data/doc/Ropenstack/Cinder.html +197 -0
- data/doc/Ropenstack/Glance.html +292 -0
- data/doc/Ropenstack/Keystone.html +737 -0
- data/doc/Ropenstack/MalformedRequestError.html +142 -0
- data/doc/Ropenstack/NotFoundError.html +142 -0
- data/doc/Ropenstack/Nova.html +562 -0
- data/doc/Ropenstack/OpenstackService.html +199 -0
- data/doc/Ropenstack/Quantum.html +830 -0
- data/doc/Ropenstack/Rest.html +483 -0
- data/doc/Ropenstack/RopenstackError.html +143 -0
- data/doc/Ropenstack/TimeoutError.html +142 -0
- data/doc/Ropenstack/UnauthorisedError.html +142 -0
- data/doc/created.rid +10 -0
- data/doc/images/add.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +93 -0
- data/doc/js/darkfish.js +153 -0
- data/doc/js/jquery.js +18 -0
- data/doc/js/navigation.js +142 -0
- data/doc/js/search.js +94 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/searcher.js +228 -0
- data/doc/rdoc.css +543 -0
- data/doc/table_of_contents.html +200 -0
- data/lib/ropenstack.rb +18 -0
- data/lib/ropenstack/blockStorage.rb +25 -0
- data/lib/ropenstack/blockStorage/v1.rb +67 -0
- data/lib/ropenstack/blockStorage/v2.rb +11 -0
- data/lib/ropenstack/common/error.rb +12 -0
- data/lib/ropenstack/common/openstackservice.rb +28 -0
- data/lib/ropenstack/common/rest.rb +138 -0
- data/lib/ropenstack/compute.rb +164 -0
- data/lib/ropenstack/compute/v2.rb +11 -0
- data/lib/ropenstack/compute/v2/extensions.rb +14 -0
- data/lib/ropenstack/compute/v2/extensions/admin.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/agents.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/aggregates.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/certificates.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/cloudpipe.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/console.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/coverage.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/defaultsecuritygroup.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/diagnostics.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/extraspecs.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/fixedips.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/flavors.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/hosts.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/hypervisors.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/images.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/instanceactions.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/interfaces.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/keypairs.rb +20 -0
- data/lib/ropenstack/compute/v2/extensions/limits.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/migrations.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/networks.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/quotasets.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/securitygroups.rb +40 -0
- data/lib/ropenstack/compute/v2/extensions/servergroups.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/serverpassword.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/services.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/shelvedservers.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/usage.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/virtualinterfaces.rb +0 -0
- data/lib/ropenstack/compute/v2/extensions/volumes.rb +20 -0
- data/lib/ropenstack/compute/v3.rb +5 -0
- data/lib/ropenstack/database.rb +24 -0
- data/lib/ropenstack/database/v1.rb +113 -0
- data/lib/ropenstack/identity.rb +28 -0
- data/lib/ropenstack/identity/v2.rb +178 -0
- data/lib/ropenstack/identity/v3.rb +13 -0
- data/lib/ropenstack/image.rb +25 -0
- data/lib/ropenstack/image/v1.rb +107 -0
- data/lib/ropenstack/image/v2.rb +134 -0
- data/lib/ropenstack/networking.rb +160 -0
- data/lib/ropenstack/networking/v2.rb +5 -0
- data/lib/ropenstack/networking/v2/extensions.rb +9 -0
- data/lib/ropenstack/networking/v2/extensions/l3.rb +111 -0
- data/lib/ropenstack/networking/v2/extensions/lbaas.rb +5 -0
- data/lib/ropenstack/networking/v2/extensions/metering.rb +5 -0
- data/lib/ropenstack/networking/v2/extensions/quotas.rb +5 -0
- data/lib/ropenstack/networking/v2/extensions/securitygroups.rb +5 -0
- data/lib/ropenstack/objectStorage.rb +60 -0
- data/lib/ropenstack/orchestration.rb +23 -0
- data/lib/ropenstack/orchestration/v1.rb +162 -0
- data/lib/ropenstack/telemetry.rb +23 -0
- data/lib/ropenstack/telemetry/v2.rb +68 -0
- data/ropenstack.gemspec +13 -0
- metadata +112 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'ropenstack/common/rest'
|
|
2
|
+
|
|
3
|
+
module Ropenstack
|
|
4
|
+
##
|
|
5
|
+
# * Name: Identity
|
|
6
|
+
# * Description: An implementation of the Identity API Client in Ruby
|
|
7
|
+
# * Author: Sam 'Tehsmash' Betts, John Davidge
|
|
8
|
+
# * Date: 30/16/2014
|
|
9
|
+
##
|
|
10
|
+
class Identity < OpenstackService
|
|
11
|
+
# Pull in sub-modules.
|
|
12
|
+
require 'ropenstack/identity/v2'
|
|
13
|
+
require 'ropenstack/identity/v3'
|
|
14
|
+
|
|
15
|
+
def initialize(location, port, token, type)
|
|
16
|
+
super(location + ":" + port.to_s, token)
|
|
17
|
+
case type
|
|
18
|
+
when "identityv2" then extend Version2
|
|
19
|
+
when "identityv3" then extend Version3
|
|
20
|
+
else
|
|
21
|
+
raise Ropenstack::RopenstackError, "Invalid Type Passed to Identity"
|
|
22
|
+
end
|
|
23
|
+
unless token.nil?
|
|
24
|
+
@data = { "access" => { "token" => { "id" => token } } }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
module Ropenstack
|
|
2
|
+
##
|
|
3
|
+
# * Name: IdentityVersion2
|
|
4
|
+
# * Description: An implementation of the V2.0 Identity API Client in Ruby
|
|
5
|
+
# * Author: Sam 'Tehsmash' Betts, John Davidge
|
|
6
|
+
# * Date: 30/06/2014
|
|
7
|
+
##
|
|
8
|
+
module Identity::Version2
|
|
9
|
+
##
|
|
10
|
+
# Authenticate via keystone, unless a token and tenant are defined then a unscoped
|
|
11
|
+
# token is returned with all associated data and stored in the @data variable.
|
|
12
|
+
# Does not return anything, but all data is accessible through accessor methods.
|
|
13
|
+
##
|
|
14
|
+
def authenticate(username, password, tenant = nil)
|
|
15
|
+
data = {
|
|
16
|
+
"auth" => {
|
|
17
|
+
"passwordCredentials" => {
|
|
18
|
+
"username" => username,
|
|
19
|
+
"password" => password
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
unless tenant.nil?
|
|
24
|
+
data["auth"]["tenantName"] = tenant
|
|
25
|
+
end
|
|
26
|
+
@data = post_request(address("/tokens"), data, @token)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
##
|
|
30
|
+
# Scope token provides two ways to call it:
|
|
31
|
+
# scope_token(tenantName) => Just using the current token and a tenantName it
|
|
32
|
+
# scopes in the token. Token stays the same.
|
|
33
|
+
# scope_token(username, password, tenantName) => This uses the username and
|
|
34
|
+
# password to reauthenticate with a tenant. The
|
|
35
|
+
# token changes.
|
|
36
|
+
##
|
|
37
|
+
def scope_token(para1, para2 = nil, para3 = nil)
|
|
38
|
+
if ( para2.nil? )
|
|
39
|
+
data = { "auth" => { "tenantName" => para1, "token" => { "id" => token() } } }
|
|
40
|
+
@data = post_request(address("/tokens"), data, token())
|
|
41
|
+
else
|
|
42
|
+
authenticate(para1, para2, token(), para3)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# Return the raw @data hash with all the data from authentication.
|
|
48
|
+
##
|
|
49
|
+
def raw()
|
|
50
|
+
return @data
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
##
|
|
54
|
+
# Gets the authentication token from the hash and returns it as a string.
|
|
55
|
+
##
|
|
56
|
+
def token(token = nil)
|
|
57
|
+
if token.nil?
|
|
58
|
+
return @data["access"]["token"]["id"]
|
|
59
|
+
else
|
|
60
|
+
get_request(address("/tokens/#{token}"), token())
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
##
|
|
65
|
+
# TODO Add head version of tokens call
|
|
66
|
+
##
|
|
67
|
+
def token?(token)
|
|
68
|
+
return false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
##
|
|
72
|
+
# This returns the token and all metadata associated with the token,
|
|
73
|
+
# including the tenant information.
|
|
74
|
+
##
|
|
75
|
+
def token_metadata()
|
|
76
|
+
return @data["access"]["token"]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
##
|
|
80
|
+
# Return the user hash from the authentication data
|
|
81
|
+
##
|
|
82
|
+
def user()
|
|
83
|
+
return @data["access"]["user"]
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
##
|
|
87
|
+
# Returns true if a user is admin.
|
|
88
|
+
##
|
|
89
|
+
def admin()
|
|
90
|
+
@data["access"]["user"]["roles"].each do |role|
|
|
91
|
+
if role["name"].eql?("admin")
|
|
92
|
+
return true
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
return false
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
##
|
|
99
|
+
# Get the service catalog returned by Identity on authentication.
|
|
100
|
+
##
|
|
101
|
+
def services()
|
|
102
|
+
return @data["access"]["serviceCatalog"]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
##
|
|
106
|
+
# Get the tenant id from the @data
|
|
107
|
+
##
|
|
108
|
+
def tenant_id()
|
|
109
|
+
return @data["access"]["token"]["tenant"]["id"]
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def tenant_name()
|
|
113
|
+
return @data["access"]["token"]["tenant"]["name"]
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Separate Identity Calls
|
|
117
|
+
|
|
118
|
+
def tenant_list()
|
|
119
|
+
return get_request(address('/tenants'), token())
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
##
|
|
123
|
+
# Add a service to the keystone services directory
|
|
124
|
+
##
|
|
125
|
+
def add_to_services(name, type, description)
|
|
126
|
+
data = {
|
|
127
|
+
'OS-KSADM:service' => {
|
|
128
|
+
'name' => name,
|
|
129
|
+
'type' => type,
|
|
130
|
+
'description' => description
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return post_request(address("/OS-KSADM/services"), data, token())
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
##
|
|
137
|
+
# Get list of services
|
|
138
|
+
##
|
|
139
|
+
def get_services()
|
|
140
|
+
return get_request(address("/OS-KSADM/services"), token())
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
##
|
|
144
|
+
# Add an endpoint list
|
|
145
|
+
##
|
|
146
|
+
def add_endpoint(region, service_id, publicurl, adminurl, internalurl)
|
|
147
|
+
data = {
|
|
148
|
+
'endpoint' => {
|
|
149
|
+
'region' => region,
|
|
150
|
+
'service_id' => service_id,
|
|
151
|
+
'publicurl' => publicurl,
|
|
152
|
+
'adminurl' => adminurl,
|
|
153
|
+
'internalurl' => internalurl
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return post_request(address("/endpoints"), data, token())
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
##
|
|
160
|
+
# Get the endpoint list
|
|
161
|
+
##
|
|
162
|
+
def get_endpoints(token = nil)
|
|
163
|
+
if token.nil?
|
|
164
|
+
return get_request(address("/endpoints"), token())
|
|
165
|
+
else
|
|
166
|
+
return get_request(address("/tokens/#{token}/endpoints"), token())
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def address(endpoint)
|
|
171
|
+
super("/v2.0/" + endpoint)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def version
|
|
175
|
+
"V2"
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Ropenstack
|
|
2
|
+
##
|
|
3
|
+
# * Name: IdentityVersion3
|
|
4
|
+
# * Description: An implementation of the V3.0 Identity API Client in Ruby
|
|
5
|
+
# * Author: Sam 'Tehsmash' Betts, John Davidge
|
|
6
|
+
# * Date: 30/06/2014
|
|
7
|
+
##
|
|
8
|
+
module Identity::Version3
|
|
9
|
+
def version
|
|
10
|
+
"V3"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'ropenstack/common/rest'
|
|
2
|
+
|
|
3
|
+
module Ropenstack
|
|
4
|
+
##
|
|
5
|
+
# * Name: Image
|
|
6
|
+
# * Description: Implementation of the Glance API Client in Ruby
|
|
7
|
+
# * Author: Sam 'Tehsmash' Betts, John Davidge
|
|
8
|
+
# * Date: 30/06/2014
|
|
9
|
+
##
|
|
10
|
+
class Image < OpenstackService
|
|
11
|
+
# Pull in sub-modules
|
|
12
|
+
require 'ropenstack/image/v1'
|
|
13
|
+
require 'ropenstack/image/v2'
|
|
14
|
+
|
|
15
|
+
def initialize(location, token, type)
|
|
16
|
+
super(location, token)
|
|
17
|
+
case type
|
|
18
|
+
when "image" then extend Version1
|
|
19
|
+
when "imagev2" then extend Version2
|
|
20
|
+
else
|
|
21
|
+
raise Ropenstack::RopenstackError, "Invalid type passed to Image"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
module Ropenstack
|
|
2
|
+
##
|
|
3
|
+
# * Name: ImageVersion1
|
|
4
|
+
# * Description: Implementation of the Glance V1.0 API Client in Ruby
|
|
5
|
+
# * Author: Sam 'Tehsmash' Betts, John Davidge
|
|
6
|
+
# * Date: 30/06/2014
|
|
7
|
+
##
|
|
8
|
+
module Image::Version1
|
|
9
|
+
|
|
10
|
+
##
|
|
11
|
+
# No ID provided - Lists details for available images.
|
|
12
|
+
# ID provided - Shows the image details as headers and the image binary in the body.
|
|
13
|
+
##
|
|
14
|
+
def images(id, tenant_id)
|
|
15
|
+
if id.nil?
|
|
16
|
+
return get_request(address(tenant_id, "images/detail"), @token)
|
|
17
|
+
else
|
|
18
|
+
return get_request(address(tenant_id, "images/" + id), @token)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
# Registers a virtual machine image.
|
|
24
|
+
##
|
|
25
|
+
def image_create(name, disk_format, container_format, create_image, tenant_id)
|
|
26
|
+
data = {
|
|
27
|
+
:name => name,
|
|
28
|
+
:disk_format => disk_format,
|
|
29
|
+
:container_format => container_format
|
|
30
|
+
}
|
|
31
|
+
unless create_image.nil?
|
|
32
|
+
data[:create_image] = create_image
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
post_request(address(tenant_id, "images"), data, @token)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
##
|
|
39
|
+
# Updates an image, uploads an image file, or updates metadata for an image.
|
|
40
|
+
# NOT IMPLEMENTED
|
|
41
|
+
##
|
|
42
|
+
def image_update(id, tenant_id)
|
|
43
|
+
raise Ropenstack::RopenstackError, "Update Method Not Implemented."
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# Deletes the specified image.
|
|
48
|
+
##
|
|
49
|
+
def image_delete(id, tenant_id)
|
|
50
|
+
delete_request(address(tenant_id, "images/" + id), @token)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
##
|
|
54
|
+
# Replaces the membership list for an image.
|
|
55
|
+
# @param memberships List of memberships in format [{'member_id': 'tenant1', 'can_share': 'false'}]
|
|
56
|
+
##
|
|
57
|
+
def replace_memberships(id, memberships, tenant_id)
|
|
58
|
+
data = {
|
|
59
|
+
:memberships => memberships
|
|
60
|
+
}
|
|
61
|
+
put_request(address(tenant_id, "images/" + id + "/members"), data, @token)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
##
|
|
65
|
+
# Adds a member to an image.
|
|
66
|
+
# @param member_id The member to be added
|
|
67
|
+
# @param can_share Optional boolean specifiying can_share value. Will default to false.
|
|
68
|
+
##
|
|
69
|
+
def add_member(id, member_id, can_share, tenant_id)
|
|
70
|
+
if can_share.nil?
|
|
71
|
+
data = {
|
|
72
|
+
:member => {:can_share => false}
|
|
73
|
+
}
|
|
74
|
+
else
|
|
75
|
+
data = {
|
|
76
|
+
:member => {:can_share => can_share}
|
|
77
|
+
}
|
|
78
|
+
end
|
|
79
|
+
put_request(address(tenant_id, "images/" + id + "/members/" + member_id), data, @token)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
##
|
|
83
|
+
# Removes a member from an image
|
|
84
|
+
##
|
|
85
|
+
def delete_member(id, member_id, tenant_id)
|
|
86
|
+
delete_request(address(tenant_id, "images/" + id + "/members/" + member_id), @token)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
##
|
|
90
|
+
# Lists the images shared with a specified owner.
|
|
91
|
+
##
|
|
92
|
+
def shared_images(id, owner_id, tenant_id)
|
|
93
|
+
get_request(address(tenant_id, "shared-images/" + owner_id), @token)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
##
|
|
97
|
+
# Returns the v1 address location of an endpoint.
|
|
98
|
+
##
|
|
99
|
+
def address(tenant_id, endpoint)
|
|
100
|
+
address("/v1/#{tenant_id}/#{endpoint}")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def version
|
|
104
|
+
"V1"
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
module Ropenstack
|
|
2
|
+
##
|
|
3
|
+
# * Name: ImageVersion2
|
|
4
|
+
# * Description: Implementation of the Glance V2.0 API Client in Ruby
|
|
5
|
+
# * Author: Sam 'Tehsmash' Betts, John Davidge
|
|
6
|
+
# * Date: 30/06/2014
|
|
7
|
+
##
|
|
8
|
+
module Image::Version2
|
|
9
|
+
##
|
|
10
|
+
# Returns a list of images with all associated meta-data in
|
|
11
|
+
# hash format.
|
|
12
|
+
##
|
|
13
|
+
def images(id)
|
|
14
|
+
if id.nil?
|
|
15
|
+
return get_request(address("images"), @token)["images"]
|
|
16
|
+
else
|
|
17
|
+
return get_request(address("images/" + id), @token)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def image_create(name, id, visibilty, tags)
|
|
22
|
+
data = {
|
|
23
|
+
:name => name
|
|
24
|
+
}
|
|
25
|
+
unless id.nil?
|
|
26
|
+
data[:id] = id
|
|
27
|
+
end
|
|
28
|
+
unless visibility.nil?
|
|
29
|
+
data[:visibility] = visibility
|
|
30
|
+
end
|
|
31
|
+
unless tags.nil?
|
|
32
|
+
data[:tags] = tags
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
post_request(address("images"), data, @token)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def image_delete(id)
|
|
39
|
+
delete_request(address("images/" + id), @token)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# TODO Ruby HTTP Binary Download to FILE
|
|
43
|
+
def image_download(id)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def image_add_tag(id, tag)
|
|
47
|
+
put_request(address("images/"+id+"/tags/"+tag), @token)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def image_delete_tag(id)
|
|
51
|
+
delete_request(address("images/"+id+"/tags/"+tag), @token)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
## Members
|
|
55
|
+
def members(id)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def member_add()
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def member_delete()
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def member_update()
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
## Schemas
|
|
68
|
+
def schemas(type)
|
|
69
|
+
return get_request(address("schemas/" + type), @token)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
## BELOW HERE IS OLD CODE THAT MAY OR MAYNOT WORK, THAR BE DRAGONS
|
|
74
|
+
|
|
75
|
+
##
|
|
76
|
+
# Upload an image to the Image Service from a file, takes in a ruby file object.
|
|
77
|
+
# More convoluted than it should be because for a bug in Quantum
|
|
78
|
+
# which just returns an error no matter the outcome.
|
|
79
|
+
##
|
|
80
|
+
def upload_image_from_file(name, disk_format, container_format, minDisk, minRam, is_public, file)
|
|
81
|
+
data = {
|
|
82
|
+
"name" => name,
|
|
83
|
+
"disk_format" => disk_format,
|
|
84
|
+
"container_format" => container_format,
|
|
85
|
+
"minDisk" => minDisk,
|
|
86
|
+
"minRam" => minRam,
|
|
87
|
+
"public" => is_public
|
|
88
|
+
}
|
|
89
|
+
imagesBefore = images()
|
|
90
|
+
post_request(address("images"), data, @token, false)
|
|
91
|
+
imagesAfter = images()
|
|
92
|
+
foundNewImage = true
|
|
93
|
+
image = nil
|
|
94
|
+
imagesAfter.each do |imageA|
|
|
95
|
+
imagesBefore.each do |imageB|
|
|
96
|
+
if(imageA == imageB)
|
|
97
|
+
foundNewImage = false
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
if(foundNewImage)
|
|
101
|
+
image = imageA
|
|
102
|
+
break
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
return put_octect(address(image["file"]), file.read, false)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
##
|
|
109
|
+
# Special rest call for sending a file stream using an octet-stream
|
|
110
|
+
# main change is just custom headers.
|
|
111
|
+
# Still implemented using do_request function.
|
|
112
|
+
##
|
|
113
|
+
def put_octect(uri, data, manage_errors)
|
|
114
|
+
headers = build_headers(@token)
|
|
115
|
+
headers["Content-Type"] = 'application/octet-stream'
|
|
116
|
+
req = Net::HTTP::Put.new(uri.request_uri, initheader = headers)
|
|
117
|
+
req.body = data
|
|
118
|
+
return do_request(uri, req, manage_errors, 0)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
private
|
|
122
|
+
|
|
123
|
+
##
|
|
124
|
+
# Function to get the v2 address location of an endpoint.
|
|
125
|
+
##
|
|
126
|
+
def address(endpoint)
|
|
127
|
+
address("/v2/#{endpoint}")
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def version
|
|
131
|
+
"V2"
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|