qubole 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/README.md +20 -19
- data/lib/qubole.rb +1 -0
- data/lib/qubole/cluster.rb +134 -0
- data/lib/qubole/version.rb +1 -1
- data/qubole.gemspec +1 -1
- data/spec/qubole/cluster_spec.rb +218 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5dfda23489fb76ffd03f8c6ee148671132eb2453
|
4
|
+
data.tar.gz: 3cb9c779a321db0873d610732d02a9e00f7d0738
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 845c89cff18eef9c338d7088c418f9ed590eaa5d550593fbcefaae6cc8bbe351d05622766c417d97cab658431adb28926ca0123853a2998945e090f9906f579e
|
7
|
+
data.tar.gz: 73ed357a515370cdf2011938b05316945c1e8dc10a5b2ce06b6b1ddc3e17c32b0ea4f6f83af32c3a0245e41f7e9e3184bb30eb335e7edbe9d1c99bd12a39db7c
|
data/README.md
CHANGED
@@ -5,6 +5,7 @@ Qubole REST API client
|
|
5
5
|
[](https://travis-ci.org/Demandbase/qubole-ruby)
|
6
6
|
[](https://codeclimate.com/github/Demandbase/qubole)
|
7
7
|
[](https://codeclimate.com/github/Demandbase/qubole/coverage)
|
8
|
+
[](http://badge.fury.io/rb/qubole)
|
8
9
|
|
9
10
|
## Documentation
|
10
11
|
|
@@ -95,25 +96,25 @@ Or install it yourself as:
|
|
95
96
|
- [ ] All Commands Report
|
96
97
|
- [ ] Canonical Hive Commands Report
|
97
98
|
- [ ] Cluster nodes Report
|
98
|
-
- [
|
99
|
-
- [
|
100
|
-
- [
|
101
|
-
- [
|
102
|
-
- [
|
103
|
-
- [
|
104
|
-
- [
|
105
|
-
- [
|
106
|
-
- [
|
107
|
-
- [
|
108
|
-
- [
|
109
|
-
- [
|
110
|
-
- [
|
111
|
-
- [
|
112
|
-
- [
|
113
|
-
- [
|
114
|
-
- [
|
115
|
-
- [
|
116
|
-
- [
|
99
|
+
- [x] Cluster API
|
100
|
+
- [x] List All Clusters
|
101
|
+
- [x] Create a New Cluster
|
102
|
+
- [x] View Cluster Configuration
|
103
|
+
- [x] Edit Cluster Configuration
|
104
|
+
- [x] Clone a Cluster
|
105
|
+
- [x] Start or Terminate a Cluster
|
106
|
+
- [x] Check Cluster Status
|
107
|
+
- [x] Delete a Cluster
|
108
|
+
- [x] Reassign Cluster Label
|
109
|
+
- [x] Run Adhoc Scripts on a Cluster
|
110
|
+
- [x] Cluster Metrics
|
111
|
+
- [x] Add a Node to a Cluster
|
112
|
+
- [x] Replace a Node in a Cluster
|
113
|
+
- [x] Remove a Node from a Cluster
|
114
|
+
- [x] Take an HBase Snapshot
|
115
|
+
- [x] View an HBase Snapshot Schedule
|
116
|
+
- [x] Restore HBase Tables
|
117
|
+
- [x] Update an HBase Snapshot Schedule
|
117
118
|
|
118
119
|
|
119
120
|
## Contributing
|
data/lib/qubole.rb
CHANGED
@@ -0,0 +1,134 @@
|
|
1
|
+
module Qubole
|
2
|
+
|
3
|
+
# To look for what all parameters need to be passed go to http://docs.qubole.com/en/latest/rest-api/cluster_api/
|
4
|
+
# Pass the params as hash from above doc link
|
5
|
+
class Cluster
|
6
|
+
|
7
|
+
# List existing clusters present in your account.
|
8
|
+
def self.list
|
9
|
+
Qubole.get("/clusters")
|
10
|
+
end
|
11
|
+
|
12
|
+
# Show information about the cluster with id/label `cluster_id_label`.
|
13
|
+
def self.show(cluster_id_label)
|
14
|
+
Qubole.get("/clusters/#{cluster_id_label}")
|
15
|
+
end
|
16
|
+
|
17
|
+
# Create a new cluster
|
18
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/create-new-cluster.html
|
19
|
+
def self.create(params={})
|
20
|
+
Qubole.post("/clusters", params)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Update the cluster with id/label `cluster_id_label` using information provided in `cluster_info`.
|
24
|
+
# Assign id/label of cluster to id
|
25
|
+
def self.update(id, params={})
|
26
|
+
Qubole.put("/clusters/#{id}", params)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Clone the cluster with id/label `cluster_id_label` using information provided in `cluster_info`.
|
30
|
+
# Assign id/label of cluster to id
|
31
|
+
def self.clone(id, params={})
|
32
|
+
Qubole.post("/clusters/#{id}/clone", params)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Start the cluster with id/label.
|
36
|
+
def self.start(id)
|
37
|
+
params = {}
|
38
|
+
params[:state] = "start"
|
39
|
+
Qubole.put("/clusters/#{id}/state", {:state => "start"})
|
40
|
+
end
|
41
|
+
|
42
|
+
# Show the status of the cluster with id/label.
|
43
|
+
def self.status(id)
|
44
|
+
Qubole.get("/clusters/#{id}/state")
|
45
|
+
end
|
46
|
+
|
47
|
+
# Terminate the cluster with id/label `cluster_id_label`.
|
48
|
+
def self.terminate(id)
|
49
|
+
Qubole.put("/clusters/#{id}/state", {:state => "terminate"})
|
50
|
+
end
|
51
|
+
|
52
|
+
# Delete the cluster with id/label.
|
53
|
+
def self.delete(id)
|
54
|
+
Qubole.delete("/clusters/#{id}")
|
55
|
+
end
|
56
|
+
|
57
|
+
# Reassign a label from one cluster to another.
|
58
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/reassign-cluster-label.html#parameters
|
59
|
+
def self.reassign_label(params={})
|
60
|
+
Qubole.put("/clusters/reassign-label", params)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Run an adhoc script
|
64
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/run-adhoc-scripts-cluster.html
|
65
|
+
# Assign id/label of cluster to id.
|
66
|
+
def self.run_script(id, params={})
|
67
|
+
Qubole.put("/clusters/#{id}/runscript.json", params)
|
68
|
+
end
|
69
|
+
|
70
|
+
# To look for cluster metrics
|
71
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/metrics-cluster.html
|
72
|
+
# Assign id/label of cluster to id.
|
73
|
+
def self.metrics(id, params={})
|
74
|
+
Qubole.get("/clusters/#{id}/metrics", params)
|
75
|
+
end
|
76
|
+
|
77
|
+
# To change the minimum and maximum size of a running cluster
|
78
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/resize-cluster.html
|
79
|
+
# Assign id/label of cluster to id.
|
80
|
+
def self.resize(id, params={})
|
81
|
+
Qubole.put("/clusters/#{id}",params)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Add a node to an existing cluster
|
85
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/add-node.html
|
86
|
+
# Assign id/label of cluster to id.
|
87
|
+
def self.add_node(id, params={})
|
88
|
+
Qubole.post("/clusters/#{id}/nodes", params)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Replaces a slave node in a cluster
|
92
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/replace-node.html
|
93
|
+
# Assign id/label of cluster to id.
|
94
|
+
def self.replace_node(id, params={})
|
95
|
+
params["command"] = "replace"
|
96
|
+
Qubole.put("/clusters/#{id}/nodes", params)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Removes a slave node from a cluster
|
100
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/remove-node.html#parameters
|
101
|
+
# Assign id/label of cluster to id
|
102
|
+
def self.remove_node(id, params={})
|
103
|
+
Qubole.delete("/clusters/#{id}/nodes", params)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Create hbase snapshot full/incremental
|
107
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/hbase-snapshot.html#parameters
|
108
|
+
# Assign id/label of cluster to id
|
109
|
+
def self.snapshot(id, params={})
|
110
|
+
Qubole.post("/clusters/#{id}/snapshots", params)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Get details for snapshot schedule
|
114
|
+
def self.get_snapshot_schedule(id)
|
115
|
+
Qubole.get("/clusters/#{id}/snapshot_schedule")
|
116
|
+
end
|
117
|
+
|
118
|
+
# Restoring cluster from a given hbase snapshot id
|
119
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/restore-point.html#parameters
|
120
|
+
# Assign id/label of cluster to id
|
121
|
+
def self.restore_point(id, params={})
|
122
|
+
Qubole.post("/clusters/#{id}/restore_point", params)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Update for snapshot schedule
|
126
|
+
# http://docs.qubole.com/en/latest/rest-api/cluster_api/update-snapshot-schedule.html#parameters
|
127
|
+
# Assign id/label of cluster to id
|
128
|
+
def self.update_snapshot_schedule(id, params={})
|
129
|
+
Qubole.put("/clusters/#{id}/snapshot_schedule", params)
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
data/lib/qubole/version.rb
CHANGED
data/qubole.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["vladnik@demandbase.com"]
|
11
11
|
spec.summary = %q{Qubole REST API client}
|
12
12
|
spec.description = %q{Communication with Qubole REST API in a Ruby way}
|
13
|
-
spec.homepage = "https://github.com/Demandbase/qubole"
|
13
|
+
spec.homepage = "https://github.com/Demandbase/qubole-ruby"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -0,0 +1,218 @@
|
|
1
|
+
module Qubole
|
2
|
+
|
3
|
+
describe Cluster do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
Qubole.stub(:http) do |name, path, param|
|
7
|
+
@request_type = name
|
8
|
+
@url_path = path
|
9
|
+
@p = param
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "Cluster list" do
|
14
|
+
it "should return correct http arguments" do
|
15
|
+
Cluster.list
|
16
|
+
expect(@request_type).to eq("GET")
|
17
|
+
expect(@url_path).to eq("/clusters")
|
18
|
+
expect(@p).to eq({})
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "Show cluster details" do
|
23
|
+
it "should return correct http arguments" do
|
24
|
+
Cluster.show(1)
|
25
|
+
expect(@request_type).to eq("GET")
|
26
|
+
expect(@url_path).to eq("/clusters/1")
|
27
|
+
expect(@p).to eq({})
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "Create cluster" do
|
32
|
+
it "should return correct http arguments" do
|
33
|
+
Cluster.create({"cluster"=>{:label => ["my_cluster"], "node_configuration" => {"slave_request_type"=>"spot", "initial_nodes"=>1,
|
34
|
+
"spot_instance_settings"=>{"timeout_for_request"=>10, "maximum_spot_instance_percentage"=>60,
|
35
|
+
"maximum_bid_price_percentage"=>"100.0"}, "max_nodes"=>10, "master_instance_type"=>"m1.large", "slave_instance_type"=>
|
36
|
+
"m1.xlarge"}, "hadoop_settings"=>{"use_hadoop2"=>false, "max_nodes"=>10, "fairscheduler_settings"=>{"default_pool"=>nil},
|
37
|
+
"custom_config"=>nil}, "enable_ganglia_monitoring"=>false, "state"=>"DOWN", "node_bootstrap_file"=>"node_bootstrap.sh",
|
38
|
+
"use_hadoop2"=>false, "security_settings"=>{"encrypted_ephemerals"=>false}, "ec2_settings"=>{"compute_validated"=>true,
|
39
|
+
"aws_region"=>"us-west-2", "aws_preferred_availability_zone"=>"Any", "compute_secret_key"=>"xxxx",
|
40
|
+
"vpc_id"=>nil, "compute_access_key"=>"xxxx", "subnet_id"=>nil}, "presto_settings"=>
|
41
|
+
{"enable_presto"=>false, "custom_config"=>nil}, "disallow_cluster_termination"=>false}})
|
42
|
+
|
43
|
+
expect(@request_type).to eq("POST")
|
44
|
+
expect(@url_path).to eq("/clusters")
|
45
|
+
expect(@p).to eq({"cluster"=>{:label => ["my_cluster"], "node_configuration" => {"slave_request_type"=>"spot", "initial_nodes"=>1,
|
46
|
+
"spot_instance_settings"=>{"timeout_for_request"=>10, "maximum_spot_instance_percentage"=>60,
|
47
|
+
"maximum_bid_price_percentage"=>"100.0"}, "max_nodes"=>10, "master_instance_type"=>"m1.large", "slave_instance_type"=>
|
48
|
+
"m1.xlarge"}, "hadoop_settings"=>{"use_hadoop2"=>false, "max_nodes"=>10, "fairscheduler_settings"=>{"default_pool"=>nil},
|
49
|
+
"custom_config"=>nil}, "enable_ganglia_monitoring"=>false, "state"=>"DOWN", "node_bootstrap_file"=>"node_bootstrap.sh",
|
50
|
+
"use_hadoop2"=>false, "security_settings"=>{"encrypted_ephemerals"=>false}, "ec2_settings"=>{"compute_validated"=>true, "aws_region"=>"us-west-2", "aws_preferred_availability_zone"=>"Any", "compute_secret_key"=>"xxxx",
|
51
|
+
"vpc_id"=>nil, "compute_access_key"=>"xxxx", "subnet_id"=>nil}, "presto_settings"=>
|
52
|
+
{"enable_presto"=>false, "custom_config"=>nil}, "disallow_cluster_termination"=>false}})
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
describe "Update cluster" do
|
59
|
+
it "label should return correct http arguments" do
|
60
|
+
Cluster.update(1, {'cluster' => { 'label' => ['test_label']}})
|
61
|
+
expect(@request_type).to eq("PUT")
|
62
|
+
expect(@url_path).to eq("/clusters/1")
|
63
|
+
expect(@p).to eq({'cluster' => { 'label' => ['test_label']}})
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "Clone cluster" do
|
68
|
+
it "with label should return correct http arguments" do
|
69
|
+
Cluster.clone(1, {"cluster" => {"label" => ["test_label1", "test_label2"]}})
|
70
|
+
expect(@request_type).to eq("POST")
|
71
|
+
expect(@url_path).to eq("/clusters/1/clone")
|
72
|
+
expect(@p).to eq({"cluster" => {"label" => ["test_label1", "test_label2"]}})
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "Start Cluster" do
|
77
|
+
it "should return correct http arguments" do
|
78
|
+
Cluster.start(1)
|
79
|
+
expect(@request_type).to eq("PUT")
|
80
|
+
expect(@url_path).to eq("/clusters/1/state")
|
81
|
+
expect(@p).to eq({:state => "start"})
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "Status of cluster" do
|
86
|
+
it "should return correct http arguments" do
|
87
|
+
Cluster.status(1)
|
88
|
+
expect(@request_type).to eq("GET")
|
89
|
+
expect(@url_path).to eq("/clusters/1/state")
|
90
|
+
expect(@p).to eq({})
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "Terminate Cluster" do
|
95
|
+
it "should return correct http arguments" do
|
96
|
+
Cluster.terminate(1)
|
97
|
+
expect(@request_type).to eq("PUT")
|
98
|
+
expect(@url_path).to eq("/clusters/1/state")
|
99
|
+
expect(@p).to eq({:state => "terminate"})
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "Delete cluster" do
|
104
|
+
it "should return correct http arguments" do
|
105
|
+
Cluster.delete(1)
|
106
|
+
expect(@request_type).to eq("DELETE")
|
107
|
+
expect(@url_path).to eq("/clusters/1")
|
108
|
+
expect(@p).to eq({})
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "Reassign label" do
|
113
|
+
it "should return correct http arguments" do
|
114
|
+
Cluster.reassign_label({'destination_cluster' => '123', 'label' => 'test_label'})
|
115
|
+
expect(@request_type).to eq("PUT")
|
116
|
+
expect(@url_path).to eq("/clusters/reassign-label")
|
117
|
+
expect(@p).to eq({'destination_cluster' => '123', 'label' => 'test_label'})
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "Run script" do
|
122
|
+
it "using s3 path should return correct http arguments" do
|
123
|
+
Cluster.run_script(1, {"script" => "s3_path"})
|
124
|
+
expect(@request_type).to eq("PUT")
|
125
|
+
expect(@url_path).to eq("/clusters/1/runscript.json")
|
126
|
+
expect(@p).to eq({"script" => "s3_path"})
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "Cluster metrics" do
|
131
|
+
it "should return correct http arguments" do
|
132
|
+
Cluster.metrics(1, {:metric => "mapred.jobtracker.maps_launched", :hostname => "master", :interval => "hour"})
|
133
|
+
expect(@request_type).to eq("GET")
|
134
|
+
expect(@url_path).to eq("/clusters/1/metrics")
|
135
|
+
expect(@p).to eq({:metric => "mapred.jobtracker.maps_launched", :hostname => "master", :interval => "hour"})
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "Resize cluster" do
|
140
|
+
it "should return correct http arguments" do
|
141
|
+
Cluster.resize(1, {"node_configuration" => {"initial_nodes" => "3"}, "push" => "true"})
|
142
|
+
expect(@request_type).to eq("PUT")
|
143
|
+
expect(@url_path).to eq("/clusters/1")
|
144
|
+
expect(@p).to eq({"node_configuration" => {"initial_nodes" => "3"}, "push" => "true"})
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "Add node to cluster" do
|
149
|
+
it "should return correct http arguments" do
|
150
|
+
Cluster.add_node(1, {"node_count" => "2"})
|
151
|
+
expect(@request_type).to eq("POST")
|
152
|
+
expect(@url_path).to eq("/clusters/1/nodes")
|
153
|
+
expect(@p).to eq({"node_count" => "2"})
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
describe "Replace node" do
|
158
|
+
it "should return correct http arguments" do
|
159
|
+
Cluster.replace_node(1, { "private_dns" => "ip-address"})
|
160
|
+
expect(@request_type).to eq("PUT")
|
161
|
+
expect(@url_path).to eq("/clusters/1/nodes")
|
162
|
+
expect(@p).to eq({ "private_dns" => "ip-address", "command" => "replace"})
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe "Remove node" do
|
167
|
+
it "should return correct http arguments" do
|
168
|
+
Cluster.remove_node(1, {"private_dns" => "ip-address"})
|
169
|
+
expect(@request_type).to eq("DELETE")
|
170
|
+
expect(@url_path).to eq("/clusters/1/nodes")
|
171
|
+
expect(@p).to eq({"private_dns" => "ip-address"})
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe "Create Hbase Snapshot" do
|
176
|
+
it "with no back up type should return correct http arguments" do
|
177
|
+
Cluster.snapshot(1, {"s3_location" => "s3-path"})
|
178
|
+
expect(@request_type).to eq("POST")
|
179
|
+
expect(@url_path).to eq("/clusters/1/snapshots")
|
180
|
+
expect(@p).to eq({"s3_location" => "s3-path"})
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe "Get snapshot schedule" do
|
185
|
+
it "should return correct http arguments" do
|
186
|
+
Cluster.get_snapshot_schedule(1)
|
187
|
+
expect(@request_type).to eq("GET")
|
188
|
+
expect(@url_path).to eq("/clusters/1/snapshot_schedule")
|
189
|
+
expect(@p).to eq({})
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
describe "Restore point" do
|
194
|
+
it "should return correct http arguments" do
|
195
|
+
Cluster.restore_point(1, { "table_names" => "test", "backup_id" => "abcd", "automatic" => true,
|
196
|
+
"overwrite" => true, "s3_location" => "s3-path" })
|
197
|
+
expect(@request_type).to eq("POST")
|
198
|
+
expect(@url_path).to eq("/clusters/1/restore_point")
|
199
|
+
expect(@p).to eq({ "table_names" => "test", "backup_id" => "abcd", "automatic" => true,
|
200
|
+
"overwrite" => true, "s3_location" => "s3-path" })
|
201
|
+
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
describe "Update snapshot schedule" do
|
206
|
+
it "should return correct http arguments" do
|
207
|
+
Cluster.update_snapshot_schedule(1, {"snapshot-schedule" => { "frequency_unit" => "hours",
|
208
|
+
"frequency_num" => 20, "s3_location" => "s3-path"}})
|
209
|
+
expect(@request_type).to eq("PUT")
|
210
|
+
expect(@url_path).to eq("/clusters/1/snapshot_schedule")
|
211
|
+
expect(@p).to eq({"snapshot-schedule" => { "frequency_unit" => "hours",
|
212
|
+
"frequency_num" => 20, "s3_location" => "s3-path"}})
|
213
|
+
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qubole
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Volodymyr Ladnik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -39,6 +39,7 @@ files:
|
|
39
39
|
- README.md
|
40
40
|
- Rakefile
|
41
41
|
- lib/qubole.rb
|
42
|
+
- lib/qubole/cluster.rb
|
42
43
|
- lib/qubole/command.rb
|
43
44
|
- lib/qubole/commands.rb
|
44
45
|
- lib/qubole/commands/composite.rb
|
@@ -54,6 +55,7 @@ files:
|
|
54
55
|
- lib/qubole/exceptions.rb
|
55
56
|
- lib/qubole/version.rb
|
56
57
|
- qubole.gemspec
|
58
|
+
- spec/qubole/cluster_spec.rb
|
57
59
|
- spec/qubole/command_spec.rb
|
58
60
|
- spec/qubole/commands/composite_spec.rb
|
59
61
|
- spec/qubole/commands/db_export_spec.rb
|
@@ -68,7 +70,7 @@ files:
|
|
68
70
|
- spec/qubole/exceptions_spec.rb
|
69
71
|
- spec/qubole_spec.rb
|
70
72
|
- spec/spec_helper.rb
|
71
|
-
homepage: https://github.com/Demandbase/qubole
|
73
|
+
homepage: https://github.com/Demandbase/qubole-ruby
|
72
74
|
licenses:
|
73
75
|
- MIT
|
74
76
|
metadata: {}
|
@@ -93,6 +95,7 @@ signing_key:
|
|
93
95
|
specification_version: 4
|
94
96
|
summary: Qubole REST API client
|
95
97
|
test_files:
|
98
|
+
- spec/qubole/cluster_spec.rb
|
96
99
|
- spec/qubole/command_spec.rb
|
97
100
|
- spec/qubole/commands/composite_spec.rb
|
98
101
|
- spec/qubole/commands/db_export_spec.rb
|