visor-image 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,32 +5,27 @@ require 'json'
5
5
  module Visor
6
6
  module Image
7
7
 
8
- # The API for the VISoR Meta Server. This class supports all image metadata manipulation operations.
8
+ # The API for the VISOR Meta System (VMS) server. This class supports all image metadata manipulation operations.
9
9
  #
10
- # This is the entry-point for the VISoR Image Server to communicate with the VISoR Meta Server,
11
- # here are processed and logged all the calls to the meta server coming from it.
10
+ # This is the API used by the VISOR Image System (VIS) to communicate with the VMS in order to accomplish
11
+ # metadata retrieving and registering operations.
12
12
  #
13
13
  class Meta
14
14
  include Visor::Common::Exception
15
15
 
16
- DEFAULT_HOST = '0.0.0.0'
17
- DEFAULT_PORT = 4567
16
+ attr_reader :host, :port
18
17
 
19
- attr_reader :host, :port, :ssl
20
-
21
- # Initializes a new new VISoR Meta Image.
18
+ # Initializes a new new VMS interface.
22
19
  #
23
- # @option opts [String] :host (DEFAULT_HOST) The host address where VISoR meta server resides.
24
- # @option opts [String] :port (DEFAULT_PORT) The host port where VISoR meta server resides.
25
- # @option opts [String] :ssl (false) If the connection should be made through HTTPS (SSL).
20
+ # @option opts [String] :host The host address where VMS server resides.
21
+ # @option opts [String] :port The host port where VMS server listens.
26
22
  #
27
23
  def initialize(opts = {})
28
- @host = opts[:host] || DEFAULT_HOST
29
- @port = opts[:port] || DEFAULT_PORT
30
- @ssl = opts[:ssl] || false
24
+ @host = opts[:host]
25
+ @port = opts[:port]
31
26
  end
32
27
 
33
- # Retrieves brief metadata of all public images.
28
+ # Retrieves all public and user’s private images brief metadata.
34
29
  # Options for filtering the returned results can be passed in.
35
30
  #
36
31
  # @option query [String] :<attribute_name> The image attribute value to filter returned results.
@@ -38,27 +33,18 @@ module Visor
38
33
  # @option query [String] :sort ("_id") The image attribute to sort returned results.
39
34
  # @option query [String] :dir ("asc") The direction to sort results ("asc"/"desc").
40
35
  #
41
- # @return [Array] All public images brief metadata.
42
- # Just {Visor::Meta::Backends::Base::BRIEF BRIEF} fields are returned.
36
+ # @return [Array] All images brief metadata.
37
+ # Just {Visor::Meta::Backends::Base::BRIEF BRIEF} attributes are returned.
43
38
  #
44
- # @raise [NotFound] If there are no public images registered on the server.
39
+ # @raise [NotFound] If there are no images registered on VMS.
45
40
  #
46
41
  def get_images(query = {}, owner=nil)
47
- http = request.get path: '/images', query: query.merge({access: 'public'}), head: get_headers
48
- pub = return_response(http)
49
- priv = []
50
- if owner
51
- http = request.get path: '/images', query: query.merge({access: 'private', owner: owner}), head: get_headers
52
- begin
53
- priv = return_response(http)
54
- rescue => e
55
- nil
56
- end
57
- end
58
- pub + priv
42
+ query.merge!(owner: owner) if owner
43
+ http = request.get path: '/images', query: query, head: get_headers
44
+ return_response(http)
59
45
  end
60
46
 
61
- # Retrieves detailed metadata of all public images.
47
+ # Retrieves all public and user’s private images detailed metadata.
62
48
  #
63
49
  # Filtering and querying works the same as with {#get_images}. The only difference is the number
64
50
  # of disclosed attributes.
@@ -71,59 +57,50 @@ module Visor
71
57
  # @return [Array] All public images detailed metadata.
72
58
  # The {Visor::Meta::Backends::Base::DETAIL_EXC DETAIL_EXC} fields are excluded from results.
73
59
  #
74
- # @raise [NotFound] If there are no public images registered on the server.
60
+ # @raise [NotFound] If there are no images registered on the server.
75
61
  #
76
62
  def get_images_detail(query = {}, owner=nil)
63
+ query.merge!(owner: owner) if owner
77
64
  http = request.get path: '/images/detail', query: query, head: get_headers
78
- pub = return_response(http)
79
- priv = []
80
- if owner
81
- http = request.get path: '/images/detail', query: query.merge({access: 'private', owner: owner}), head: get_headers
82
- begin
83
- priv = return_response(http)
84
- rescue => e
85
- nil
86
- end
87
- end
88
- pub + priv
65
+ return_response(http)
89
66
  end
90
67
 
91
- # Retrieves detailed image metadata of the image with the given id.
68
+ # Retrieves detailed metadata of the image with the given id.
92
69
  #
93
70
  # @param id [String] The wanted image's _id.
94
71
  #
95
- # @return [Hash] The requested image metadata.
72
+ # @return [Hash] The requested image detailed metadata.
96
73
  #
97
- # @raise [NotFound] If image not found.
74
+ # @raise [NotFound] If image metadata was not found.
98
75
  #
99
76
  def get_image(id)
100
77
  http = request.get path: "/images/#{id}", head: get_headers
101
78
  return_response(http)
102
79
  end
103
80
 
104
- # Register a new image on the server with the given metadata and returns its metadata.
81
+ # Register a new image metadata on VMS and return it.
105
82
  #
106
83
  # @param meta [Hash] The image metadata.
107
84
  #
108
- # @return [Hash] The already inserted image metadata.
85
+ # @return [Hash] The already inserted detailed image metadata.
109
86
  #
110
- # @raise [Invalid] If image meta validation fails.
87
+ # @raise [Invalid] If image metadata validation fails.
111
88
  #
112
- def post_image(meta)
89
+ def post_image(meta, address)
113
90
  body = prepare_body(meta)
114
- http = request.post path: '/images', body: body, head: post_headers
91
+ http = request.post path: '/images', body: body, head: post_headers(address)
115
92
  return_response(http)
116
93
  end
117
94
 
118
- # Updates an image record with the given metadata and returns its metadata.
95
+ # Updates an image metadata with the given metadata and returns it.
119
96
  #
120
97
  # @param id [String] The image's _id which will be updated.
121
98
  # @param meta [Hash] The image metadata.
122
99
  #
123
- # @return [Hash] The already updated image metadata.
100
+ # @return [Hash] The already updated detailed image metadata.
124
101
  #
125
102
  # @raise [Invalid] If image meta validation fails.
126
- # @raise [NotFound] If required image was not found.
103
+ # @raise [NotFound] If the target image metadata was not found.
127
104
  #
128
105
  def put_image(id, meta)
129
106
  body = prepare_body(meta)
@@ -135,9 +112,9 @@ module Visor
135
112
  #
136
113
  # @param id [String] The image's _id which will be deleted.
137
114
  #
138
- # @return [Hash] The already deleted image metadata. This is useful for recover on accidental delete.
115
+ # @return [Hash] The already deleted detailed image metadata. This is useful for recovery on accidental delete.
139
116
  #
140
- # @raise [NotFound] If required image was not found.
117
+ # @raise [NotFound] If the target image metadata was not found.
141
118
  #
142
119
  def delete_image(id)
143
120
  http = request.delete path: "/images/#{id}", head: delete_headers
@@ -160,7 +137,7 @@ module Visor
160
137
 
161
138
  # Process requests by preparing its headers, launch them and assert or raise their response.
162
139
  #
163
- # @param request [EventMachine::HttpRequest] The request which will be launched.
140
+ # @param http [EventMachine::HttpRequest] The request which will be launched.
164
141
  #
165
142
  # @return [String, Hash] If an error is raised, then it parses and returns its message,
166
143
  # otherwise it properly parse and return the response body.
@@ -171,30 +148,36 @@ module Visor
171
148
  def return_response(http)
172
149
  body = http.response
173
150
  status = http.response_header.status.to_i
174
- parsed = JSON.parse(body, symbolize_names: true)
175
151
 
176
152
  case status
153
+ when 0 then
154
+ raise InternalError, "VISOR Meta System server not found. Is it running?"
177
155
  when 404 then
178
- raise NotFound, parsed[:message]
156
+ raise NotFound, parse(body)
179
157
  when 400 then
180
- raise Invalid, parsed[:message]
158
+ raise Invalid, parse(body)
181
159
  when 500 then
182
- raise InternalError, parsed[:message]
160
+ raise InternalError, parse(body)
183
161
  else
184
- parsed[:image] || parsed[:images]
162
+ parse(body)
185
163
  end
186
164
  end
187
165
 
166
+ def parse(body)
167
+ parsed = JSON.parse(body, symbolize_names: true)
168
+ parsed[:image] || parsed[:images] || parsed[:message]
169
+ end
170
+
188
171
  # Generate a new HTTP or HTTPS connection based on initialization parameters.
189
172
  #
190
173
  # @return [EventMachine::HttpRequest] A HTTP or HTTPS (not done yet) connection ready to use.
191
174
  #
192
175
  def request
193
- if @ssl
176
+ #if @ssl
194
177
  #TODO: ssl connection
195
- else
178
+ #else
196
179
  EventMachine::HttpRequest.new("http://#{@host}:#{@port}")
197
- end
180
+ #end
198
181
  end
199
182
 
200
183
  # Fill common header keys before each request. This sets the 'User-Agent' and 'Accept'
@@ -202,18 +185,23 @@ module Visor
202
185
  # for POST and PUT requests.
203
186
  #
204
187
  def get_headers
205
- {'User-Agent' => 'VISoR Image Server',
188
+ {'User-Agent' => 'VISOR Image System',
206
189
  'Accept' => 'application/json'}
207
190
  end
208
191
 
209
- def post_headers
210
- {'User-Agent' => 'VISoR Image Server',
192
+ def put_headers
193
+ {'User-Agent' => "VISOR Image System",
194
+ 'Accept' => 'application/json',
195
+ 'content-type' => 'application/json'}
196
+ end
197
+
198
+ def post_headers(address)
199
+ {'User-Agent' => "VISOR Image System - #{address}",
211
200
  'Accept' => 'application/json',
212
201
  'content-type' => 'application/json'}
213
202
  end
214
203
 
215
204
  alias :delete_headers :get_headers
216
- alias :put_headers :post_headers
217
205
  end
218
206
  end
219
207
  end
@@ -28,6 +28,8 @@ module Visor
28
28
  exit_error(403, e.message)
29
29
  rescue NotFound => e
30
30
  exit_error(404, e.message)
31
+ rescue InternalError => e
32
+ exit_error(503, e.message)
31
33
  end
32
34
 
33
35
  def exit_error(code, message)
@@ -41,6 +41,8 @@ module Visor
41
41
  exit_error(403, e.message)
42
42
  rescue NotFound => e
43
43
  exit_error(404, e.message)
44
+ rescue InternalError => e
45
+ exit_error(503, e.message)
44
46
  else
45
47
  [200, {}, {image: meta}]
46
48
  end
@@ -38,6 +38,8 @@ module Visor
38
38
  return exit_error(403, e.message)
39
39
  rescue NotFound => e
40
40
  return exit_error(404, e.message)
41
+ rescue InternalError => e
42
+ exit_error(503, e.message)
41
43
  end
42
44
 
43
45
  custom = {'Content-Type' => 'application/octet-stream', 'X-Stream' => 'Goliath'}
@@ -30,11 +30,14 @@ module Visor
30
30
  def response(env)
31
31
  access_key = authorize(env, vas)
32
32
  meta = vms.get_images(params, access_key)
33
+ env.params.delete('format')
33
34
  [200, {}, {images: meta}]
34
35
  rescue Forbidden => e
35
36
  exit_error(403, e.message)
36
37
  rescue NotFound => e
37
38
  exit_error(404, e.message)
39
+ rescue InternalError => e
40
+ exit_error(503, e.message)
38
41
  end
39
42
 
40
43
  # Produce an HTTP response with an error code and message.
@@ -30,11 +30,14 @@ module Visor
30
30
  def response(env)
31
31
  access_key = authorize(env, vas)
32
32
  meta = vms.get_images_detail(params, access_key)
33
+ env.params.delete('format')
33
34
  [200, {}, {images: meta}]
34
35
  rescue Forbidden => e
35
36
  exit_error(403, e.message)
36
37
  rescue NotFound => e
37
38
  exit_error(404, e.message)
39
+ rescue InternalError => e
40
+ exit_error(503, e.message)
38
41
  end
39
42
 
40
43
  # Produce an HTTP response with an error code and message.
@@ -32,6 +32,8 @@ module Visor
32
32
  exit_error(403, e.message)
33
33
  rescue NotFound => e
34
34
  exit_error(404, e.message)
35
+ rescue InternalError => e
36
+ exit_error(503, e.message)
35
37
  end
36
38
 
37
39
  # Produce an HTTP response with an error code and message.
@@ -74,7 +74,7 @@ module Visor
74
74
  rescue InternalError => e
75
75
  body.close if body
76
76
  body.unlink if body
77
- return exit_error(500, e.message)
77
+ return exit_error(503, e.message)
78
78
  end
79
79
 
80
80
  # if has body(image file), upload file and update meta or raise on error
@@ -86,6 +86,8 @@ module Visor
86
86
  return exit_error(404, e.message, true)
87
87
  rescue Duplicated => e
88
88
  return exit_error(409, e.message, true)
89
+ rescue InternalError => e
90
+ return exit_error(503, e.message, true)
89
91
  ensure
90
92
  body.close
91
93
  body.unlink
@@ -127,7 +129,7 @@ module Visor
127
129
  # @return [Hash] The already inserted image metadata.
128
130
  #
129
131
  def insert_meta(meta)
130
- image = vms.post_image(meta)
132
+ image = vms.post_image(meta, address)
131
133
  env['id'] = image[:_id]
132
134
 
133
135
  if image[:location]
@@ -82,7 +82,7 @@ module Visor
82
82
  rescue InternalError => e
83
83
  body.close if body
84
84
  body.unlink if body
85
- return exit_error(500, e.message)
85
+ return exit_error(503, e.message)
86
86
  end unless meta.empty?
87
87
 
88
88
  # if has body(image file), upload file and update meta or raise on error
@@ -96,6 +96,8 @@ module Visor
96
96
  return exit_error(409, e.message)
97
97
  rescue Duplicated => e
98
98
  return exit_error(409, e.message, true)
99
+ rescue InternalError => e
100
+ return exit_error(503, e.message, true)
99
101
  ensure
100
102
  body.close
101
103
  body.unlink
@@ -5,33 +5,35 @@ require 'json'
5
5
  module Visor
6
6
  module Image
7
7
 
8
- # The VISoR Image Server. This supports all image metadata manipulation
9
- # operations, dispatched to the VISoR Meta Server and the image files storage operations.
8
+ # The VISOR Image System (VIS) server. This server is the VISOR front-end and supports all image metadata manipulation
9
+ # operations (dispatched to the VISOR Meta System) and the image files management too.
10
10
  #
11
- # *The Server API is a RESTful web service for image meta as follows:*
11
+ # **The Server is a RESTful Web service with the following API:**
12
12
  #
13
- # HEAD /images/<id> - Returns metadata about the image with the given id
14
- # GET /images - Returns a set of brief metadata about all public images
15
- # GET /images/detail - Returns a set of detailed metadata about all public images
16
- # GET /images/<id> - Returns image data and metadata for the image with the given id
17
- # POST /images - Stores a new image data and metadata and returns the registered metadata
18
- # PUT /images/<id> - Update image metadata and/or data for the image with the given id
19
- # DELETE /images/<id> - Delete the metadata and data of the image with the given id
13
+ # HEAD /images/<id> - Return detailed metadata of a given image.
14
+ # GET /images - Return brief metadata of all public and user’s private images.
15
+ # GET /images/detail - Return detailed metadata of all public and user’s private images.
16
+ # GET /images/<id> - Return the metadata and file of a given image.
17
+ # POST /images - Add new metadata and optionally upload a file.
18
+ # PUT /images/<id> - Update the metadata and/or file of a given image.
19
+ # DELETE /images/<id> - Remove the metadata and file of a given image.
20
20
  #
21
- # The Image is multi-format, most properly it supports response encoding in JSON and XML formats.
21
+ # The VIS API is multi-format, most properly it supports response encoding in JSON and XML formats.
22
22
  # It will auto negotiate and encode the response metadata and error messages in the proper format,
23
23
  # based on the request *Accept* header, being it 'application/json' or 'application/xml'.
24
24
  # If no Accept header is provided, Image will encode and render it as JSON by default.
25
25
  #
26
- # This server routes all metadata operations to the {Visor::Meta::Server Visor Meta Server}.
26
+ # This server routes all metadata operations to the {Visor::Meta::Server Visor Meta System server}.
27
27
  #
28
28
  # The server will interact with the multiple supported backend store to manage the image files.
29
29
  #
30
- # *Currently we support the following store backend and operations:*
30
+ # **Currently we support the following store backend and operations:**
31
31
  #
32
32
  # Amazon Simple Storage (s3) - GET, POST, PUT, DELETE
33
+ # Lunacloud Storage (lcs) - GET, POST, PUT, DELETE
33
34
  # Nimbus Cumulus (cumulus) - GET, POST, PUT, DELETE
34
35
  # Eucalyptus Walrus (walrus) - GET, POST, PUT, DELETE
36
+ # Hadoop HDFS (hdfs) - GET, POST, PUT, DELETE
35
37
  # Local Filesystem (file) - GET, POST, PUT, DELETE
36
38
  # Remote HTTP (http) - GET
37
39
  #
@@ -57,26 +59,34 @@ module Visor
57
59
  #
58
60
  # The image metadata is promptly passed as a set of HTTP headers, as the following example:
59
61
  #
60
- # x-image-meta-_id: <id>
61
- # x-image-meta-uri: <uri>
62
- # x-image-meta-name: <name>
63
- # x-image-meta-architecture: <architecture>
64
- # x-image-meta-access: <access>
65
- # x-image-meta-status: <status>
66
- # x-image-meta-created_at: <timestamp>
62
+ # x-image-meta-_id: <id>
63
+ # x-image-meta-uri: <uri>
64
+ # x-image-meta-name: <name>
65
+ # x-image-meta-architecture: <architecture>
66
+ # x-image-meta-access: <access>
67
+ # x-image-meta-status: <status>
68
+ # x-image-meta-size: <size>
69
+ # x-image-meta-format: <format>
70
+ # x-image-meta-store: <store>
71
+ # x-image-meta-location: <location>
72
+ # x-image-meta-created_at: <timestamp>
73
+ # x-image-meta-updated_at: <timestamp>
74
+ # x-image-meta-checksum: <checksum>
75
+ # x-image-meta-owner: <owner>
67
76
  #
68
- # @note Undefined attributes are ignored and not included into response's header. Also
69
- # any raised error will be passed through HTTP headers as expected.
77
+ # @note Undefined attributes are ignored and not included into response's header.
78
+ # Any raised error will be passed through HTTP headers too.
70
79
  #
71
80
  # @param [String] id The wanted image _id.
72
81
  #
73
82
  # @example Retrieve the image metadata with id '19b39ed6-6c43-41cc-8d59-d1a1ed24ac9d':
74
83
  # 'HEAD /images/19b39ed6-6c43-41cc-8d59-d1a1ed24ac9d'
75
84
  #
76
- # @return [HTTP Headers] The image data file.
85
+ # @return [HTTP Headers] The image metadata.
77
86
  #
78
- # @raise [HTTP Error 404] If image not found.
79
- # @raise [HTTP Error 500] On internal server error.
87
+ # @raise [HTTP Error 403] If user authentication has failed.
88
+ # @raise [HTTP Error 404] If image metadata was not found.
89
+ # @raise [HTTP Error 503] If VIS or VAS servers were not found.
80
90
  #
81
91
  head '/images/:id', HeadImage
82
92
 
@@ -84,20 +94,18 @@ module Visor
84
94
  # @method get_all_brief
85
95
  # @overload get '/images'
86
96
  #
87
- # Get brief information about all public images, see {Visor::Image::GetImages}.
97
+ # Get brief metadata of all public and user’s private images, see {Visor::Image::GetImages}.
88
98
  #
89
99
  # { "images":
90
100
  # [
91
101
  # {
92
102
  # "_id":<_id>,
93
- # "uri":<uri>,
94
103
  # "name":<name>,
95
104
  # "architecture":<architecture>,
96
- # "type":<type>,
105
+ # "access":<access>
97
106
  # "format":<format>,
98
- # "store":<type>,
99
107
  # "size":<size>,
100
- # "created_at":<timestamp>
108
+ # "store":<store>
101
109
  # },
102
110
  # ...
103
111
  # ]
@@ -110,19 +118,20 @@ module Visor
110
118
  # @param [String] sort ("_id") The image attribute to sort results.
111
119
  # @param [String] dir ("asc") The sorting order ("asc"/"desc").
112
120
  #
113
- # @example Retrieve all public images brief metadata:
121
+ # @example Retrieve all images brief metadata:
114
122
  # 'GET /images'
115
123
  #
116
- # @example Retrieve all public `x86_64` images brief metadata:
124
+ # @example Retrieve all `x86_64` images brief metadata:
117
125
  # 'GET /images?architecture=x86_64'
118
126
  #
119
- # @example Retrieve all public `.iso` images brief metadata, descending sorted by `size`:
127
+ # @example Retrieve all `.iso` images brief metadata, descending sorted by `size`:
120
128
  # 'GET /images?format=iso&sort=size&dir=desc'
121
129
  #
122
- # @return [JSON, XML] The public images brief metadata.
130
+ # @return [JSON, XML] Images brief metadata.
123
131
  #
124
- # @raise [HTTP Error 404] If there is no public images.
125
- # @raise [HTTP Error 500] On internal server error.
132
+ # @raise [HTTP Error 403] If user authentication has failed.
133
+ # @raise [HTTP Error 404] If no images were found.
134
+ # @raise [HTTP Error 503] If VIS or VAS servers were not found.
126
135
  #
127
136
  get '/images', GetImages
128
137
 
@@ -130,7 +139,7 @@ module Visor
130
139
  # @method get_all_detail
131
140
  # @overload get '/images/detail'
132
141
  #
133
- # Get detailed information about all public images, see {Visor::Image::GetImagesDetail}.
142
+ # Get detailed metadata of all public and user’s private images, see {Visor::Image::GetImagesDetail}.
134
143
  #
135
144
  # { "images":
136
145
  # [
@@ -147,8 +156,8 @@ module Visor
147
156
  # "store":<store>,
148
157
  # "created_at":<timestamp>
149
158
  # "updated_at":<timestamp>,
150
- # "kernel":<associated kernel>,
151
- # "ramdisk":<associated ramdisk>,
159
+ # "checksum":<checksum>,
160
+ # "owner":<owner>,
152
161
  # },
153
162
  # ...
154
163
  # ]
@@ -161,15 +170,16 @@ module Visor
161
170
  # @param [String] sort ("_id") The image attribute to sort results.
162
171
  # @param [String] dir ("asc") The sorting order ("asc"/"desc").
163
172
  #
164
- # @example Retrieve all public images detailed metadata:
173
+ # @example Retrieve all images detailed metadata:
165
174
  # 'GET /images/detail'
166
175
  #
167
- # @note Querying and ordering results are made as with #get_all_detail
176
+ # @note Querying and results sorting is made as with #get_all_brief
168
177
  #
169
- # @return [JSON, XML] The public images detailed metadata.
178
+ # @return [JSON, XML] Images detailed metadata.
170
179
  #
171
- # @raise [HTTP Error 404] If there is no public images.
172
- # @raise [HTTP Error 500] On internal server error.
180
+ # @raise [HTTP Error 403] If user authentication has failed.
181
+ # @raise [HTTP Error 404] If no images were found.
182
+ # @raise [HTTP Error 503] If VIS or VAS servers were not found.
173
183
  #
174
184
  get '/images/detail', GetImagesDetail
175
185
 
@@ -177,21 +187,28 @@ module Visor
177
187
  # @method get_image
178
188
  # @overload get '/images/:id'
179
189
  #
180
- # Get image data and detailed metadata for the given id, see {Visor::Image::GetImage}.
190
+ # Get detailed metadata and file for the image with given id, see {Visor::Image::GetImage}.
181
191
  #
182
- # The image data file is streamed as response's body. The server will return a 200 status code,
192
+ # The image data file is streamed through the response body. The server will return a 200 status code,
183
193
  # with a special HTTP header, indicating that the response body will be streamed in chunks
184
194
  # and connection shouldn't be closed until the transfer is complete.
185
195
  #
186
196
  # Also, the image metadata is promptly passed as a set of HTTP headers, as the following example:
187
197
  #
188
- # x-image-meta-_id: <id>
189
- # x-image-meta-uri: <uri>
190
- # x-image-meta-name: <name>
191
- # x-image-meta-architecture: <architecture>
192
- # x-image-meta-access: <access>
193
- # x-image-meta-status: <status>
194
- # x-image-meta-created_at: <timestamp>
198
+ # x-image-meta-_id: <id>
199
+ # x-image-meta-uri: <uri>
200
+ # x-image-meta-name: <name>
201
+ # x-image-meta-architecture: <architecture>
202
+ # x-image-meta-access: <access>
203
+ # x-image-meta-status: <status>
204
+ # x-image-meta-size: <size>
205
+ # x-image-meta-format: <format>
206
+ # x-image-meta-store: <store>
207
+ # x-image-meta-location: <location>
208
+ # x-image-meta-created_at: <timestamp>
209
+ # x-image-meta-updated_at: <timestamp>
210
+ # x-image-meta-checksum: <checksum>
211
+ # x-image-meta-owner: <owner>
195
212
  #
196
213
  # @note Undefined attributes are ignored and not included into response's header.
197
214
  #
@@ -200,11 +217,13 @@ module Visor
200
217
  # @example Retrieve the image with id '19b39ed6-6c43-41cc-8d59-d1a1ed24ac9d':
201
218
  # 'GET /images/19b39ed6-6c43-41cc-8d59-d1a1ed24ac9d'
202
219
  #
203
- # @return [HTTP Headers] The image data file.
204
- # @return [HTTP Body] The image data file.
220
+ # @return [HTTP Headers] The image metadata.
221
+ # @return [HTTP Body] The image file.
205
222
  #
206
- # @raise [HTTP Error 404] If image not found.
207
- # @raise [HTTP Error 500] On internal server error.
223
+ # @raise [HTTP Error 403] If user authentication has failed.
224
+ # @raise [HTTP Error 404] If the image metadata was not found.
225
+ # @raise [HTTP Error 404] If the image file was not found.
226
+ # @raise [HTTP Error 503] If VIS or VAS servers were not found.
208
227
  #
209
228
  get '/images/:id', GetImage
210
229
 
@@ -222,8 +241,8 @@ module Visor
222
241
  #
223
242
  # If wanted, the image data file should be streamed through the request body.
224
243
  # The server will receive that data in chunks, buffering them to a properly secured temporary
225
- # file, avoiding buffering all the data into memory. Server will then handle the upload of that
226
- # data to the definitive store location, cleaning then the generated temporary file.
244
+ # file, avoiding buffering all the data into memory. The server will then handle the upload of that
245
+ # file to the definitive store location, cleaning then the generated temporary file.
227
246
  #
228
247
  # Alternatively, a *x-image-meta-location* header can be passed, if the file is already stored in some
229
248
  # provided location. If this header is present, no body content can be passed in the request.
@@ -234,9 +253,10 @@ module Visor
234
253
  # @raise [HTTP Error 400] If the location header is present no file content can be provided.
235
254
  # @raise [HTTP Error 400] If trying to post an image file to a HTTP backend.
236
255
  # @raise [HTTP Error 400] If provided store is an unsupported store backend.
237
- # @raise [HTTP Error 404] If no image data is found at the provided location.
256
+ # @raise [HTTP Error 403] If user authentication has failed.
257
+ # @raise [HTTP Error 404] If no image file is found at the provided location.
238
258
  # @raise [HTTP Error 409] If the provided image file already exists in the backend store.
239
- # @raise [HTTP Error 500] On internal server error.
259
+ # @raise [HTTP Error 503] If VIS or VAS servers were not found.
240
260
  #
241
261
  post '/images', PostImage
242
262
 
@@ -269,10 +289,11 @@ module Visor
269
289
  # @raise [HTTP Error 400] If the location header is present no file content can be provided.
270
290
  # @raise [HTTP Error 400] If trying to post an image file to a HTTP backend.
271
291
  # @raise [HTTP Error 400] If provided store is an unsupported store backend.
292
+ # @raise [HTTP Error 403] If user authentication has failed.
272
293
  # @raise [HTTP Error 404] If no image data is found at the provided location.
273
294
  # @raise [HTTP Error 409] If trying to assign image file to a locked or uploading image.
274
295
  # @raise [HTTP Error 409] If the provided image file already exists in the backend store.
275
- # @raise [HTTP Error 500] On internal server error.
296
+ # @raise [HTTP Error 503] If VIS or VAS servers were not found.
276
297
  #
277
298
  put '/images/:id', PutImage
278
299
 
@@ -280,7 +301,7 @@ module Visor
280
301
  # @method delete
281
302
  # @overload delete '/images/:id'
282
303
  #
283
- # Delete the metadata and data of the image with the given id, see {Visor::Image::DeleteImage}.
304
+ # Delete the metadata and file of the image with the given id, see {Visor::Image::DeleteImage}.
284
305
  #
285
306
  # @param [String] id The image _id to delete.
286
307
  #
@@ -289,9 +310,10 @@ module Visor
289
310
  #
290
311
  # @return [JSON, XML] The already deleted image detailed metadata.
291
312
  #
292
- # @raise [HTTP Error 404] If image meta or data not found.
313
+ # @raise [HTTP Error 403] If user authentication has failed.
293
314
  # @raise [HTTP Error 403] If user does not have permission to manipulate the image file.
294
- # @raise [HTTP Error 500] On internal server error.
315
+ # @raise [HTTP Error 404] If image metadata was not found.
316
+ # @raise [HTTP Error 503] If VIS or VAS servers were not found.
295
317
  #
296
318
  delete '/images/:id', DeleteImage
297
319