Spectra Logic

From Lsdf
Revision as of 12:39, 17 October 2014 by Jvw (talk | contribs) (description of D3 interface)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Spectra Logic names its REST interface to Black Pearl storage D3. D3 is available in 3 API's: Java, C and .NET. An additional Java API exists to go directly from HADOOP to D3. They also have a CLI to talk D3 from the command line. I have copied the C header below for reference.

/*
* ******************************************************************************
* Copyright 2014 Spectra Logic Corporation. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use
* this file except in compliance with the License. A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the "license" file accompanying this file.
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
* ****************************************************************************
*/
#ifndef __DS3_HEADER__
#define __DS3_HEADER__
#include <stdint.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
// For windows DLL symbol exports.
#ifdef _WIN32
# ifdef LIBRARY_EXPORTS
# define LIBRARY_API __declspec(dllexport)
# else
# define LIBRARY_API __declspec(dllimport)
# endif
#else
# define LIBRARY_API
#endif
typedef enum {
False, True
}ds3_bool;
typedef enum {
HTTP_GET, HTTP_PUT, HTTP_POST, HTTP_DELETE, HTTP_HEAD
}http_verb;
typedef enum {
CRITICAL,
VERY_HIGH,
HIGH,
NORMAL,
LOW,
BACKGROUND,
MINIMIZED_DUE_TO_TOO_MANY_RETRIES
}ds3_job_priority;
typedef enum {
PUT, GET
}ds3_job_request_type;
typedef enum {
CAPACITY, PERFORMANCE
}ds3_write_optimization;
typedef enum {
IN_ORDER, NONE
}ds3_chunk_ordering;
typedef struct{
char* value;
size_t size;
}ds3_str;
ds3_str* ds3_str_init(const char* string);
char* ds3_str_value(const ds3_str* string);
size_t ds3_str_size(const ds3_str* string);
void ds3_str_free(ds3_str* string);
typedef struct {
ds3_str* access_id;
ds3_str* secret_key;
}ds3_creds;
typedef struct {
ds3_str* endpoint;
ds3_str* proxy;
uint64_t num_redirects;
ds3_creds* creds;
}ds3_client;
typedef struct _ds3_request ds3_request;
typedef struct {
ds3_str* creation_date;
ds3_str* name;
}ds3_bucket;
typedef struct {
ds3_str* name;
ds3_str* id;
}ds3_owner;
typedef struct {
ds3_str* name;
ds3_str* etag;
uint64_t size;
ds3_owner* owner;
ds3_str* last_modified;
ds3_str* storage_class;
}ds3_object;
typedef struct {
ds3_bucket* buckets;
size_t num_buckets;
ds3_owner* owner;
}ds3_get_service_response;
typedef struct {
ds3_object* objects;
size_t num_objects;
ds3_str* creation_date;
ds3_bool is_truncated;
ds3_str* marker;
ds3_str* delimiter;
uint32_t max_keys;
ds3_str* name;
ds3_str* next_marker;
ds3_str* prefix;
ds3_str** common_prefixes;
uint64_t num_common_prefixes;
}ds3_get_bucket_response;
typedef struct {
ds3_str* name;
uint64_t length;
uint64_t offset;
ds3_bool in_cache;
}ds3_bulk_object;
typedef struct {
ds3_bulk_object* list;
uint64_t size;
uint64_t chunk_number;
ds3_str* server_id;
ds3_str* chunk_id;
}ds3_bulk_object_list;
typedef struct {
ds3_str* bucket_name;
uint64_t cached_size_in_bytes;
ds3_chunk_ordering chuck_order;
uint64_t completed_size_in_bytes;
ds3_str* job_id;
uint64_t original_size_in_bytes;
ds3_job_priority priority;
ds3_job_request_type request_type;
ds3_str* start_date;
ds3_str* user_id;
ds3_str* user_name;
ds3_write_optimization write_optimization;
ds3_bulk_object_list** list;
size_t list_size;
}ds3_bulk_response;
typedef enum {
DS3_ERROR_INVALID_XML, DS3_ERROR_CURL_HANDLE, DS3_ERROR_REQUEST_FAILED, DS3_ERROR_MISSING_ARGS, DS3_ERROR_BAD_STATUS_CODE
}ds3_error_code;
typedef struct {
uint64_t status_code;
ds3_str* status_message;
ds3_str* error_body;
}ds3_error_response;
typedef struct {
ds3_error_code code;
ds3_str* message;
ds3_error_response* error;
}ds3_error;
LIBRARY_API ds3_creds* ds3_create_creds(const char* access_id, const char* secret_key);
LIBRARY_API ds3_client* ds3_create_client(const char* endpoint, ds3_creds* creds);
LIBRARY_API ds3_request* ds3_init_get_service(void);
LIBRARY_API ds3_request* ds3_init_get_bucket(const char* bucket_name);
LIBRARY_API ds3_request* ds3_init_get_object(const char* bucket_name, const char* object_name);
LIBRARY_API ds3_request* ds3_init_put_bucket(const char* bucket_name);
LIBRARY_API ds3_request* ds3_init_put_object(const char* bucket_name, const char* object_name, uint64_t size);
LIBRARY_API ds3_request* ds3_init_delete_bucket(const char* bucket_name);
LIBRARY_API ds3_request* ds3_init_delete_object(const char* bucket_name, const char* object_name);
LIBRARY_API ds3_request* ds3_init_put_bulk(const char* bucket_name, ds3_bulk_object_list* object_list);
LIBRARY_API ds3_request* ds3_init_get_bulk(const char* bucket_name, ds3_bulk_object_list* object_list);
LIBRARY_API void ds3_client_proxy(ds3_client* client, const char* proxy);
LIBRARY_API void ds3_request_set_prefix(ds3_request* request, const char* prefix);
LIBRARY_API void ds3_request_set_delimiter(ds3_request* request, const char* delimiter);
LIBRARY_API void ds3_request_set_next_marker(ds3_request* request, const char* next_marker);
LIBRARY_API ds3_error* ds3_get_service(const ds3_client* client, const ds3_request* request, ds3_get_service_response** response);
LIBRARY_API ds3_error* ds3_get_bucket(const ds3_client* client, const ds3_request* request, ds3_get_bucket_response** response);
LIBRARY_API ds3_error* ds3_bulk(const ds3_client* client, const ds3_request* request, ds3_bulk_response** response);
LIBRARY_API ds3_error* ds3_put_bucket(const ds3_client* client, const ds3_request* request);
LIBRARY_API ds3_error* ds3_delete_bucket(const ds3_client* client, const ds3_request* request);
LIBRARY_API ds3_error* ds3_get_object(const ds3_client* client, const ds3_request* request, void* user_data, size_t (* callback)(void*, size_t, size_t, void*));
LIBRARY_API ds3_error* ds3_put_object(const ds3_client* client, const ds3_request* request, void* user_data, size_t (* callback)(void*, size_t, size_t, void*));
LIBRARY_API ds3_error* ds3_delete_object(const ds3_client* client, const ds3_request* request);
LIBRARY_API void ds3_free_service_response(ds3_get_service_response* response);
LIBRARY_API void ds3_free_bucket_response(ds3_get_bucket_response* response);
LIBRARY_API void ds3_free_bulk_response(ds3_bulk_response* response);
LIBRARY_API void ds3_free_error(ds3_error* error);
LIBRARY_API void ds3_free_owner(ds3_owner* owner);
LIBRARY_API void ds3_free_creds(ds3_creds* client);
LIBRARY_API void ds3_free_client(ds3_client* client);
LIBRARY_API void ds3_free_request(ds3_request* request);
LIBRARY_API void ds3_cleanup(void);
LIBRARY_API void ds3_print_request(const ds3_request* request);
// provided helpers
LIBRARY_API size_t ds3_write_to_file(void* buffer, size_t size, size_t nmemb, void* user_data);
LIBRARY_API size_t ds3_read_from_file(void* buffer, size_t size, size_t nmemb, void* user_data);
LIBRARY_API ds3_bulk_object_list * ds3_convert_file_list(const char** file_list, uint64_t num_files);
LIBRARY_API void ds3_free_bulk_object_list(ds3_bulk_object_list* object_list);
#ifdef __cplusplus
}
#endif
#endif