deltacloud-client 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/NOTICE CHANGED
@@ -1,5 +1,5 @@
1
1
  Apache Deltacloud
2
- Copyright 2010 The Apache Software Foundation
2
+ Copyright 2010, 2011 The Apache Software Foundation
3
3
 
4
4
  This product includes software developed at The Apache Software Foundation
5
5
  (http://www.apache.org/).
data/Rakefile CHANGED
@@ -16,7 +16,7 @@
16
16
  # License for the specific language governing permissions and limitations
17
17
  # under the License.
18
18
 
19
- require 'rake/gempackagetask'
19
+ require 'rubygems/package_task'
20
20
  require 'rake/testtask'
21
21
 
22
22
  load 'deltacloud-client.gemspec'
@@ -28,11 +28,19 @@ end
28
28
 
29
29
 
30
30
  spec = Gem::Specification.load('deltacloud-client.gemspec')
31
- Rake::GemPackageTask.new(spec) do |pkg|
31
+ Gem::PackageTask.new(spec) do |pkg|
32
32
  pkg.need_tar = true
33
33
  end
34
34
 
35
- if Gem.available?('rspec')
35
+ def available?(name)
36
+ Gem::Specification.find_by_name(name)
37
+ rescue Gem::LoadError
38
+ false
39
+ rescue
40
+ Gem.available?(name)
41
+ end
42
+
43
+ if available?('rspec')
36
44
  require 'spec/rake/spectask'
37
45
  desc "Run all examples"
38
46
  Spec::Rake::SpecTask.new('spec') do |t|
data/bin/deltacloudc CHANGED
@@ -1,7 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (C) 2009 Red Hat, Inc.
4
- #
5
3
  # Licensed to the Apache Software Foundation (ASF) under one or more
6
4
  # contributor license agreements. See the NOTICE file distributed with
7
5
  # this work for additional information regarding copyright ownership. The
@@ -61,6 +59,7 @@ BANNER
61
59
  opts.on( '-i', '--id ID', 'ID for operation') { |id| options[:id] = id }
62
60
  opts.on( '-d', '--image-id ID', 'Image ID') { |id| options[:image_id] = id }
63
61
  opts.on( '-b', '--bucket-id ID', 'Bucket ID') {|id| options[:bucket_id] = id }
62
+ opts.on( '-r', '--bucket-location NAME', 'Bucket location') {|name| options[:bucket_location] = name }
64
63
  opts.on( '-a', '--arch ARCH', 'Architecture (x86, x86_64)') { |id| options[:architecture] = id }
65
64
  opts.on( '-p', '--hardware-profile HARDWARE_PROFILE', 'Hardware Profile') { |id| options[:hwp_id] = id }
66
65
  opts.on( '-n', '--name NAME', 'Name (for instance eg.)') { |name| options[:name] = name }
@@ -179,7 +178,7 @@ if options[:collection] and options[:operation]
179
178
  params.merge!('metadata'=>options[:blob_metadata]) unless options[:blob_metadata].nil?
180
179
  case options[:operation]
181
180
  when 'show' then puts format(client.send( options[:collection], params))
182
- when 'data' then puts (client.blob_data(params))
181
+ when 'data' then puts client.blob_data(params)
183
182
  when 'create' then
184
183
  invalid_usage("Specify the location of the new blob data (full local path) using -f option") unless options[:file_path]
185
184
  params.merge!('file_path'=>options[:file_path])
@@ -217,7 +216,7 @@ if options[:collection] and options[:operation]
217
216
  if options[:collection].eql?('buckets')
218
217
  if options[:operation].eql?('create')
219
218
  invalid_usage("Please specify an id for the new bucket with -i") unless options[:id]
220
- bucket = client.create_bucket('id'=>options[:id])
219
+ bucket = client.create_bucket('id'=>options[:id], 'bucket_location'=>options[:bucket_location])
221
220
  puts format(bucket)
222
221
  elsif options[:operation].eql?('destroy')
223
222
  invalid_usage("Please specify the bucket you wish to destroy with -i") unless options[:id]
data/lib/base_object.rb CHANGED
@@ -1,6 +1,3 @@
1
- #
2
- # Copyright (C) 2010 Red Hat, Inc.
3
- #
4
1
  # Licensed to the Apache Software Foundation (ASF) under one or more
5
2
  # contributor license agreements. See the NOTICE file distributed with
6
3
  # this work for additional information regarding copyright ownership. The
@@ -79,6 +76,35 @@ module DeltaCloud
79
76
  }
80
77
  end
81
78
 
79
+ def add_authentication!(auth_type, values=[])
80
+ value = { :key => (values/'login/keyname').text.strip } if auth_type == 'key'
81
+ if auth_type == 'password'
82
+ value = {
83
+ :username => (values/'login/username').text.strip,
84
+ :username => (values/'login/password').text.strip
85
+ }
86
+ end
87
+ @objects << {
88
+ :type => :collection,
89
+ :method_name => 'authentication',
90
+ :values => value
91
+ }
92
+ end
93
+
94
+
95
+ # This method define collection of text elements inside REST model
96
+ # XML syntax: <addresses>
97
+ # <address>127.0.0.1</address>
98
+ # <address>127.0.0.2</address>
99
+ # </addresses>
100
+ def add_addresses!(collection_name, values=[])
101
+ @objects << {
102
+ :type => :collection,
103
+ :method_name => collection_name.sanitize,
104
+ :values => values.collect { |v| { :address => v.text.strip, :type => v[:type] }}
105
+ }
106
+ end
107
+
82
108
  # This method define collection of text elements inside REST model
83
109
  # XML syntax: <addresses>
84
110
  # <address>127.0.0.1</address>
@@ -149,7 +175,7 @@ module DeltaCloud
149
175
  @actions = []
150
176
  end
151
177
 
152
- # This trigger is called right after action.
178
+ # This trigger is called right after action.
153
179
  # This method does nothing inside ActionObject
154
180
  # but it can be redifined and used in meta-programming
155
181
  def action_trigger(action)
@@ -314,14 +340,14 @@ module DeltaCloud
314
340
  DeltaCloud::API.class_eval("class #{class_name} < DeltaCloud::#{parent_class}; end")
315
341
  @defined_classes << class_name
316
342
  end
317
-
343
+
318
344
  DeltaCloud::API.const_get(parent.classify).const_get(name.classify)
319
345
  end
320
346
 
321
347
  def self.guess_model_type(response)
322
348
  response = Nokogiri::XML(response.to_s)
323
- return :action if ((response/'//actions').length == 1) and ((response/'//state').length == 0)
324
- return :stateful if ((response/'//actions').length == 1) and ((response/'//state').length == 1)
349
+ return :action if ((response/'//actions').length >= 1) and ((response/'//state').length == 0)
350
+ return :stateful if ((response/'//actions').length >= 1) and ((response/'//state').length >= 1)
325
351
  return :base
326
352
  end
327
353
 
@@ -1,8 +1,23 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with
3
+ # this work for additional information regarding copyright ownership. The
4
+ # ASF licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the
6
+ # License. You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations
14
+ # under the License.
15
+
1
16
  module ClientBucketMethods
2
17
 
3
18
  def create_bucket(params)
4
19
  obj = nil
5
- request(:post, "#{api_uri.to_s}/buckets", {:name => params['id'] }) do |response|
20
+ request(:post, "#{api_uri.to_s}/buckets", {:name => params['id'],:location=>params['bucket_location'] }) do |response|
6
21
  handle_backend_error(response) if response.code!=201
7
22
  obj = base_object(:bucket, response)
8
23
  end
@@ -51,4 +66,4 @@ module ClientBucketMethods
51
66
  end
52
67
  end
53
68
 
54
- end
69
+ end
data/lib/deltacloud.rb CHANGED
@@ -1,6 +1,3 @@
1
- #
2
- # Copyright (C) 2009 Red Hat, Inc.
3
- #
4
1
  # Licensed to the Apache Software Foundation (ASF) under one or more
5
2
  # contributor license agreements. See the NOTICE file distributed with
6
3
  # this work for additional information regarding copyright ownership. The
@@ -213,7 +210,7 @@ module DeltaCloud
213
210
  # If there are actions, add they to ActionObject/StateFullObject
214
211
  if attribute.name == 'actions'
215
212
  (attribute/'link').each do |link|
216
- (obj.add_run_action!(item['id'], link) && next) if link[:rel] == 'run'
213
+ (obj.add_run_action!(item['id'], link) && next) if link[:rel] == 'run'
217
214
  obj.add_action_link!(item['id'], link)
218
215
  end && next
219
216
  end
@@ -225,7 +222,7 @@ module DeltaCloud
225
222
  end
226
223
 
227
224
  #deal with blob metadata
228
- if(attribute.name == 'user_metadata')
225
+ if (attribute.name == 'user_metadata')
229
226
  meta = {}
230
227
  attribute.children.select {|x| x.name=="entry" }.each do |element|
231
228
  value = element.content.gsub!(/(\n) +/,'')
@@ -234,6 +231,14 @@ module DeltaCloud
234
231
  obj.add_collection!(attribute.name, meta.inspect) && next
235
232
  end
236
233
 
234
+ if (['public_addresses', 'private_addresses'].include? attribute.name)
235
+ obj.add_addresses!(attribute.name, (attribute/'*')) && next
236
+ end
237
+
238
+ if ('authentication'.include? attribute.name)
239
+ obj.add_authentication!(attribute[:type], (attribute/'*')) && next
240
+ end
241
+
237
242
  # Deal with collections like public-addresses, private-addresses
238
243
  if (attribute/'./*').length > 0
239
244
  obj.add_collection!(attribute.name, (attribute/'*').collect { |value| value.text }) && next
data/lib/documentation.rb CHANGED
@@ -1,6 +1,3 @@
1
- #
2
- # Copyright (C) 2010 Red Hat, Inc.
3
- #
4
1
  # Licensed to the Apache Software Foundation (ASF) under one or more
5
2
  # contributor license agreements. See the NOTICE file distributed with
6
3
  # this work for additional information regarding copyright ownership. The
@@ -1,6 +1,3 @@
1
- #
2
- # Copyright (C) 2009 Red Hat, Inc.
3
- #
4
1
  # Licensed to the Apache Software Foundation (ASF) under one or more
5
2
  # contributor license agreements. See the NOTICE file distributed with
6
3
  # this work for additional information regarding copyright ownership. The
@@ -1,5 +1,3 @@
1
- # Copyright (C) 2009, 2010 Red Hat, Inc.
2
- #
3
1
  # Licensed to the Apache Software Foundation (ASF) under one or more
4
2
  # contributor license agreements. See the NOTICE file distributed with
5
3
  # this work for additional information regarding copyright ownership. The
@@ -1,5 +1,3 @@
1
- # Copyright (C) 2009, 2010 Red Hat, Inc.
2
- #
3
1
  # Licensed to the Apache Software Foundation (ASF) under one or more
4
2
  # contributor license agreements. See the NOTICE file distributed with
5
3
  # this work for additional information regarding copyright ownership. The
@@ -65,8 +63,8 @@ module DeltaCloud
65
63
  @obj.name ? @obj.name[0,15] : 'unknown',
66
64
  @obj.image.name ? @obj.image.name[0,15] : 'unknown',
67
65
  @obj.state ? @obj.state.to_s[0,10] : 'unknown',
68
- @obj.public_addresses.join(',')[0,32],
69
- @obj.private_addresses.join(',')[0,32]
66
+ @obj.public_addresses.collect { |a| a[:address] }.join(',')[0,32],
67
+ @obj.private_addresses.collect { |a| a[:address] }.join(',')[0,32]
70
68
  )
71
69
  end
72
70
  end
@@ -100,7 +98,7 @@ module DeltaCloud
100
98
  @obj.id,
101
99
  @obj.name,
102
100
  @obj.size ? @obj.size : "0",
103
- @obj.blob_list ? @obj.blob_list : ""
101
+ @obj.instance_variables.include?("@blob_list") ? @obj.blob_list : ""
104
102
  )
105
103
  end
106
104
  end
data/lib/string.rb CHANGED
@@ -1,6 +1,3 @@
1
- #
2
- # Copyright (C) 2010 Red Hat, Inc.
3
- #
4
1
  # Licensed to the Apache Software Foundation (ASF) under one or more
5
2
  # contributor license agreements. See the NOTICE file distributed with
6
3
  # this work for additional information regarding copyright ownership. The
@@ -0,0 +1,147 @@
1
+ #
2
+ # Copyright (C) 2009-2011 Red Hat, Inc.
3
+ #
4
+ # Licensed to the Apache Software Foundation (ASF) under one or more
5
+ # contributor license agreements. See the NOTICE file distributed with
6
+ # this work for additional information regarding copyright ownership. The
7
+ # ASF licenses this file to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance with the
9
+ # License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
+ # License for the specific language governing permissions and limitations
17
+ # under the License.
18
+
19
+ require 'specs/spec_helper'
20
+
21
+ describe "buckets" do
22
+
23
+ it_should_behave_like "all resources"
24
+
25
+ it "should allow retrieval of all buckets" do
26
+ [API_URL, API_URL_REDIRECT].each do |entry_point|
27
+ DeltaCloud.new( API_NAME, API_PASSWORD, entry_point ) do |client|
28
+ buckets = client.buckets
29
+ buckets.should_not be_empty
30
+ buckets.each do |bucket|
31
+ bucket.uri.should_not be_nil
32
+ bucket.uri.should be_a( String )
33
+ bucket.name.should_not be_nil
34
+ bucket.name.should be_a(String)
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ it "should allow retrieval of a named bucket" do
41
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
42
+ bucket = client.bucket("bucket1")
43
+ bucket.should_not be_nil
44
+ bucket.uri.should eql(API_URL + "/buckets/bucket1")
45
+ bucket.size.should eql(3.0)
46
+ bucket.name.should_not be_nil
47
+ bucket.name.should be_a(String)
48
+ blob_list = bucket.blob_list.split(", ")
49
+ blob_list.size.should eql(bucket.size.to_i)
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+ describe "Operations on buckets" do
56
+
57
+ it "should allow creation of a new bucket" do
58
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
59
+ new_bucket = client.create_bucket({'id' => "my_new_bucket"})
60
+ new_bucket.should_not be_nil
61
+ new_bucket.uri.should eql(API_URL + "/buckets/my_new_bucket")
62
+ new_bucket.name.should_not be_nil
63
+ new_bucket.name.should be_a(String)
64
+ new_bucket.name.should eql("my_new_bucket")
65
+ end
66
+ end
67
+
68
+ it "should allow deletion of an existing bucket" do
69
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
70
+ new_bucket = client.bucket("my_new_bucket")
71
+ new_bucket.should_not be_nil
72
+ new_bucket.name.should eql("my_new_bucket")
73
+ lambda{
74
+ client.destroy_bucket({'id' => "my_new_bucket"})
75
+ }.should_not raise_error
76
+ end
77
+ end
78
+
79
+ it "should throw error if you delete a non existing bucket" do
80
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
81
+ lambda{
82
+ client.destroy_bucket({'id' => "i_dont_exist"})
83
+ }.should raise_error
84
+ end
85
+ end
86
+
87
+ end
88
+
89
+ describe "Blobs" do
90
+
91
+ it "should allow retrieval of a bucket's blobs" do
92
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
93
+ bucket = client.bucket("bucket1")
94
+ bucket.should_not be_nil
95
+ blob_list = bucket.blob_list.split(", ")
96
+ blob_list.size.should eql(bucket.size.to_i)
97
+ blob_list.each do |b_id|
98
+ blob = client.blob({"bucket" => bucket.name, :id => b_id})
99
+ blob.bucket.should_not be_nil
100
+ blob.bucket.should be_a(String)
101
+ blob.bucket.should eql(bucket.name)
102
+ blob.content_length.should_not be_nil
103
+ blob.content_length.should be_a(Float)
104
+ blob.content_length.should >= 0
105
+ blob_data = client.blob_data({"bucket" => bucket.name, :id => b_id})
106
+ blob_data.size.to_f.should == blob.content_length
107
+ blob.last_modified.should_not be_nil
108
+ end
109
+ end
110
+ end
111
+
112
+ end
113
+
114
+ describe "Operations on blobs" do
115
+
116
+ it "should successfully create a new blob" do
117
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
118
+ blob_data = File.new("./blob_data_file", "w+")
119
+
120
+ blob_data.write("this is some blob data \n")
121
+ blob_data.rewind
122
+ some_new_blob = client.create_blob({:id => "some_new_blob",
123
+ 'bucket' => "bucket1",
124
+ 'file_path' => blob_data.path})
125
+ some_new_blob.should_not be_nil
126
+ some_new_blob.content_length.should_not be_nil
127
+ some_new_blob.content_length.should eql(24.0)
128
+ File.delete(blob_data.path)
129
+ end
130
+ end
131
+
132
+ it "should allow deletion of an existing blob" do
133
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
134
+ lambda{
135
+ client.destroy_blob({:id=>"some_new_blob", 'bucket'=>"bucket1"})
136
+ }.should_not raise_error
137
+ end
138
+ end
139
+
140
+ it "should throw error if you delete a non existing blob" do
141
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
142
+ lambda{
143
+ client.destroy_blob({:id=>"no_such_blob", 'bucket'=>"bucket1"})
144
+ }.should raise_error
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,155 @@
1
+ #
2
+ # Copyright (C) 2009-2011 Red Hat, Inc.
3
+ #
4
+ # Licensed to the Apache Software Foundation (ASF) under one or more
5
+ # contributor license agreements. See the NOTICE file distributed with
6
+ # this work for additional information regarding copyright ownership. The
7
+ # ASF licenses this file to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance with the
9
+ # License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
+ # License for the specific language governing permissions and limitations
17
+ # under the License.
18
+
19
+ require 'specs/spec_helper'
20
+
21
+ def client
22
+ RestClient::Resource.new(API_URL)
23
+ end
24
+
25
+ def headers(header)
26
+ encoded_credentials = ["#{API_NAME}:#{API_PASSWORD}"].pack("m0").gsub(/\n/,'')
27
+ { :authorization => "Basic " + encoded_credentials }.merge(header)
28
+ end
29
+
30
+ describe "return JSON" do
31
+
32
+ it 'should return JSON when using application/json, */*' do
33
+ header_hash = {
34
+ 'Accept' => "application/json, */*"
35
+ }
36
+ client.get(header_hash) do |response, request, &block|
37
+ response.code.should == 200
38
+ response.headers[:content_type].should =~ /^application\/json/
39
+ end
40
+ end
41
+
42
+ it 'should return JSON when using just application/json' do
43
+ header_hash = {
44
+ 'Accept' => "application/json"
45
+ }
46
+ client.get(header_hash) do |response, request, &block|
47
+ response.code.should == 200
48
+ response.headers[:content_type].should =~ /^application\/json/
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ describe "return HTML in different browsers" do
55
+
56
+ it "wants XML using format parameter" do
57
+ client['?format=xml'].get('Accept' => 'application/xhtml+xml') do |response, request, &block|
58
+ response.code.should == 200
59
+ response.headers[:content_type].should =~ /^application\/xml/
60
+ end
61
+ end
62
+
63
+ it "raise 406 error on wrong accept" do
64
+ client['hardware_profiles'].get('Accept' => 'image/png;q=1') do |response, request, &block|
65
+ response.code.should == 406
66
+ end
67
+ end
68
+
69
+ it "wants HTML using format parameter and accept set to XML" do
70
+ client['?format=html'].get('Accept' => 'application/xml') do |response, request, &block|
71
+ response.code.should == 200
72
+ response.headers[:content_type].should =~ /^text\/html/
73
+ end
74
+ end
75
+
76
+ # FIXME: This return 406 for some reason on GIT sinatra
77
+ # it "wants a PNG image" do
78
+ # client['instance_states'].get('Accept' => 'image/png') do |response, request, &block|
79
+ # response.code.should == 200
80
+ # response.headers[:content_type].should =~ /^image\/png/
81
+ # end
82
+ # end
83
+
84
+ it "doesn't have accept header" do
85
+ client.get('Accept' => '') do |response, request, &block|
86
+ response.code.should == 200
87
+ response.headers[:content_type].should =~ /^application\/xml/
88
+ end
89
+ end
90
+
91
+ it "can handle unknown formats" do
92
+ client.get('Accept' => 'format/unknown') do |response, request, &block|
93
+ response.code.should == 406
94
+ end
95
+ end
96
+
97
+ it "wants explicitly XML" do
98
+ client.get('Accept' => 'application/xml') do |response, request, &block|
99
+ response.code.should == 200
100
+ response.headers[:content_type].should =~ /^application\/xml/
101
+ end
102
+ end
103
+
104
+ it "Internet Explorer" do
105
+ header_hash = {
106
+ 'Accept' => "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*",
107
+ 'User-agent' => "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)"
108
+ }
109
+ client.get(header_hash) do |response, request, &block|
110
+ response.code.should == 200
111
+ response.headers[:content_type].should =~ /^text\/html/
112
+ end
113
+ end
114
+
115
+ it "Mozilla Firefox" do
116
+ client.get('Accept' => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") do |response, request, &block|
117
+ response.code.should == 200
118
+ response.headers[:content_type].should =~ /^text\/html/
119
+ end
120
+ end
121
+
122
+ it "Chrome" do
123
+ header_hash = {
124
+ 'Accept' => "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
125
+ 'User-agent' => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.790.0 Safari/535.1"
126
+ }
127
+ client.get(header_hash) do |response, request, &block|
128
+ response.code.should == 200
129
+ response.headers[:content_type].should =~ /^text\/html/
130
+ end
131
+ end
132
+
133
+ it "Safari" do
134
+ header_hash = {
135
+ 'Accept' => "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
136
+ 'User-agent' => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1"
137
+ }
138
+ client.get(header_hash) do |response, request, &block|
139
+ response.code.should == 200
140
+ response.headers[:content_type].should =~ /^text\/html/
141
+ end
142
+ end
143
+
144
+ it "Opera" do
145
+ header_hash = {
146
+ 'Accept' => "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1",
147
+ 'User-agent' => "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11"
148
+ }
149
+ client.get(header_hash) do |response, request, &block|
150
+ response.code.should == 200
151
+ response.headers[:content_type].should =~ /^text\/html/
152
+ end
153
+ end
154
+
155
+ end
@@ -38,8 +38,8 @@ describe "hardware_profiles" do
38
38
  hardware_profiles.each do |hwp|
39
39
  hwp.uri.should_not be_nil
40
40
  hwp.uri.should be_a(String)
41
- prop_check(hwp.architecture, String) if hwp.architecture
42
- end
41
+ prop_check(hwp.architecture, String) unless hwp.name.eql?("opaque")
42
+ end
43
43
  end
44
44
  end
45
45
  end
@@ -35,6 +35,8 @@ describe "initializing the client" do
35
35
  client.entry_points[:instances].should eql( "#{API_URL}/instances" )
36
36
  client.entry_points[:storage_volumes].should eql( "#{API_URL}/storage_volumes" )
37
37
  client.entry_points[:storage_snapshots].should eql( "#{API_URL}/storage_snapshots" )
38
+ client.entry_points[:buckets].should eql( "#{API_URL}/buckets")
39
+ client.entry_points[:keys].should eql( "#{API_URL}/keys")
38
40
  end
39
41
  end
40
42
  end
@@ -34,7 +34,7 @@ describe "instances" do
34
34
  instance.owner_id.should_not be_nil
35
35
  instance.owner_id.should be_a( String )
36
36
  instance.image.should_not be_nil
37
- instance.image.should be_a( DeltaCloud::API::Base::Image )
37
+ instance.image.to_s.should match(/DeltaCloud::API::.*::Image/)
38
38
  instance.hardware_profile.should_not be_nil
39
39
  instance.hardware_profile.should be_a( DeltaCloud::API::Base::HardwareProfile )
40
40
  instance.state.should_not be_nil
@@ -70,7 +70,9 @@ describe "instances" do
70
70
  instance.uri.should_not be_nil
71
71
  instance.uri.should be_a( String )
72
72
  instance.owner_id.should eql( "mockuser" )
73
- instance.public_addresses.first.should eql( "img1.inst0.public.com" )
73
+ instance.public_addresses.first.class.should eql(Hash)
74
+ instance.public_addresses.first[:type].should eql('hostname')
75
+ instance.public_addresses.first[:address].should eql('img1.inst0.public.com')
74
76
  instance.image.should_not be_nil
75
77
  instance.image.uri.should eql( API_URL + "/images/img1" )
76
78
  instance.hardware_profile.should_not be_nil
@@ -185,9 +187,11 @@ describe "instances" do
185
187
  DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
186
188
  instance = client.instance( 'inst1' )
187
189
  instance.should_not be_nil
190
+ unless instance.state.eql?("RUNNING")
191
+ instance.start!
192
+ end
188
193
  instance.state.should eql( "RUNNING" )
189
- instance.start!
190
- instance.state.should eql( "RUNNING" )
194
+ lambda{instance.start!}.should raise_error
191
195
  end
192
196
  end
193
197
 
@@ -0,0 +1,97 @@
1
+ #
2
+ # Copyright (C) 2009-2011 Red Hat, Inc.
3
+ #
4
+ # Licensed to the Apache Software Foundation (ASF) under one or more
5
+ # contributor license agreements. See the NOTICE file distributed with
6
+ # this work for additional information regarding copyright ownership. The
7
+ # ASF licenses this file to you under the Apache License, Version 2.0 (the
8
+ # "License"); you may not use this file except in compliance with the
9
+ # License. You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
+ # License for the specific language governing permissions and limitations
17
+ # under the License.
18
+
19
+ require 'specs/spec_helper'
20
+
21
+ def check_key(the_key, key_name = "")
22
+ the_key.should_not be_nil
23
+ the_key.id.should be_a(String)
24
+ the_key.id.should eql(key_name)
25
+ the_key.actions.should_not be_nil
26
+ the_key.actions.size.should eql(1)
27
+ the_key.actions.first[0].should eql("destroy")
28
+ the_key.actions.first[1].should eql("#{API_URL}/keys/#{key_name}")
29
+ the_key.fingerprint.should_not be_nil
30
+ the_key.fingerprint.should be_a(String)
31
+ the_key.pem.should_not be_nil
32
+ the_key.pem.first.should be_a(String)
33
+ end
34
+
35
+ def create_key_if_necessary(client, key_name)
36
+ the_key = client.key(key_name)
37
+ unless the_key
38
+ client.create_key()
39
+ end
40
+ end
41
+
42
+
43
+ describe "keys" do
44
+
45
+ it_should_behave_like "all resources"
46
+
47
+ it "should allow retrieval of all keys" do
48
+ [API_URL, API_URL_REDIRECT].each do |entry_point|
49
+ DeltaCloud.new( API_NAME, API_PASSWORD, entry_point ) do |client|
50
+ lambda{
51
+ client.keys
52
+ }.should_not raise_error
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "operations on keys" do
59
+
60
+ it "should allow successful creation of a new key" do
61
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
62
+ new_key = client.create_key({:name => "my_new_key"})
63
+ check_key(new_key, "my_new_key")
64
+ end
65
+ end
66
+
67
+ it "should allow retrieval of an existing named key" do
68
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
69
+ key_name = "my_new_key"
70
+ create_key_if_necessary(client, key_name)
71
+ the_key = client.key(key_name)
72
+ check_key(the_key, key_name)
73
+ end
74
+ end
75
+
76
+ it "should raise error if you create a key with the same name as an existing key" do
77
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
78
+ name = "my_new_key"
79
+ create_key_if_necessary(client, name)
80
+ lambda{
81
+ client.create_key({:name => name})
82
+ }.should raise_error
83
+ end
84
+ end
85
+
86
+ it "should allow successful destruction of an existing key" do
87
+ DeltaCloud.new( API_NAME, API_PASSWORD, API_URL ) do |client|
88
+ name = "my_new_key"
89
+ create_key_if_necessary(client, name)
90
+ the_key = client.key(name)
91
+ lambda{
92
+ the_key.destroy!
93
+ }.should_not raise_error
94
+ end
95
+ end
96
+
97
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deltacloud-client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 3
9
- - 1
10
- version: 0.3.1
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Red Hat, Inc.
@@ -15,8 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-16 00:00:00 +02:00
19
- default_executable: deltacloudc
18
+ date: 2011-08-23 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: rest-client
@@ -80,52 +79,53 @@ files:
80
79
  - Rakefile
81
80
  - lib/base_object.rb
82
81
  - lib/client_bucket_methods.rb
83
- - lib/deltacloud.rb
84
- - lib/documentation.rb
85
- - lib/hwp_properties.rb
86
82
  - lib/instance_state.rb
83
+ - lib/deltacloud.rb
87
84
  - lib/plain_formatter.rb
85
+ - lib/hwp_properties.rb
88
86
  - lib/string.rb
89
- - init.rb
87
+ - lib/documentation.rb
90
88
  - bin/deltacloudc
91
- - LICENSE
92
- - NOTICE
93
- - DISCLAIMER
94
- - specs/data/images/img1.yml
95
- - specs/data/images/img2.yml
96
- - specs/data/images/img3.yml
89
+ - specs/images_spec.rb
90
+ - specs/initialization_spec.rb
91
+ - specs/hardware_profiles_spec.rb
92
+ - specs/instance_states_spec.rb
93
+ - specs/instances_spec.rb
94
+ - specs/data/storage_snapshots/snap3.yml
95
+ - specs/data/storage_snapshots/snap1.yml
96
+ - specs/data/storage_snapshots/snap2.yml
97
97
  - specs/data/instances/inst0.yml
98
98
  - specs/data/instances/inst1.yml
99
99
  - specs/data/instances/inst2.yml
100
- - specs/data/storage_snapshots/snap1.yml
101
- - specs/data/storage_snapshots/snap2.yml
102
- - specs/data/storage_snapshots/snap3.yml
103
- - specs/data/storage_volumes/vol1.yml
104
- - specs/data/storage_volumes/vol2.yml
100
+ - specs/data/images/img3.yml
101
+ - specs/data/images/img2.yml
102
+ - specs/data/images/img1.yml
105
103
  - specs/data/storage_volumes/vol3.yml
106
- - specs/fixtures/images/img1.yml
107
- - specs/fixtures/images/img2.yml
108
- - specs/fixtures/images/img3.yml
104
+ - specs/data/storage_volumes/vol2.yml
105
+ - specs/data/storage_volumes/vol1.yml
106
+ - specs/keys_spec.rb
107
+ - specs/content_spec.rb
108
+ - specs/buckets_spec.rb
109
+ - specs/fixtures/storage_snapshots/snap3.yml
110
+ - specs/fixtures/storage_snapshots/snap1.yml
111
+ - specs/fixtures/storage_snapshots/snap2.yml
109
112
  - specs/fixtures/instances/inst0.yml
110
113
  - specs/fixtures/instances/inst1.yml
111
114
  - specs/fixtures/instances/inst2.yml
112
- - specs/fixtures/storage_snapshots/snap1.yml
113
- - specs/fixtures/storage_snapshots/snap2.yml
114
- - specs/fixtures/storage_snapshots/snap3.yml
115
- - specs/fixtures/storage_volumes/vol1.yml
116
- - specs/fixtures/storage_volumes/vol2.yml
115
+ - specs/fixtures/images/img3.yml
116
+ - specs/fixtures/images/img2.yml
117
+ - specs/fixtures/images/img1.yml
117
118
  - specs/fixtures/storage_volumes/vol3.yml
118
- - specs/hardware_profiles_spec.rb
119
- - specs/images_spec.rb
120
- - specs/initialization_spec.rb
121
- - specs/instance_states_spec.rb
122
- - specs/instances_spec.rb
123
- - specs/realms_spec.rb
119
+ - specs/fixtures/storage_volumes/vol2.yml
120
+ - specs/fixtures/storage_volumes/vol1.yml
124
121
  - specs/shared/resources.rb
125
- - specs/spec_helper.rb
126
- - specs/storage_snapshot_spec.rb
127
122
  - specs/storage_volume_spec.rb
128
- has_rdoc: true
123
+ - specs/realms_spec.rb
124
+ - specs/storage_snapshot_spec.rb
125
+ - specs/spec_helper.rb
126
+ - LICENSE
127
+ - NOTICE
128
+ - DISCLAIMER
129
129
  homepage: http://www.deltacloud.org
130
130
  licenses: []
131
131
 
@@ -155,42 +155,45 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
155
  requirements: []
156
156
 
157
157
  rubyforge_project:
158
- rubygems_version: 1.6.2
158
+ rubygems_version: 1.7.2
159
159
  signing_key:
160
160
  specification_version: 3
161
161
  summary: Deltacloud REST Client
162
162
  test_files:
163
- - specs/data/images/img1.yml
164
- - specs/data/images/img2.yml
165
- - specs/data/images/img3.yml
163
+ - specs/images_spec.rb
164
+ - specs/initialization_spec.rb
165
+ - specs/hardware_profiles_spec.rb
166
+ - specs/instance_states_spec.rb
167
+ - specs/instances_spec.rb
168
+ - specs/data/storage_snapshots/snap3.yml
169
+ - specs/data/storage_snapshots/snap1.yml
170
+ - specs/data/storage_snapshots/snap2.yml
166
171
  - specs/data/instances/inst0.yml
167
172
  - specs/data/instances/inst1.yml
168
173
  - specs/data/instances/inst2.yml
169
- - specs/data/storage_snapshots/snap1.yml
170
- - specs/data/storage_snapshots/snap2.yml
171
- - specs/data/storage_snapshots/snap3.yml
172
- - specs/data/storage_volumes/vol1.yml
173
- - specs/data/storage_volumes/vol2.yml
174
+ - specs/data/images/img3.yml
175
+ - specs/data/images/img2.yml
176
+ - specs/data/images/img1.yml
174
177
  - specs/data/storage_volumes/vol3.yml
175
- - specs/fixtures/images/img1.yml
176
- - specs/fixtures/images/img2.yml
177
- - specs/fixtures/images/img3.yml
178
+ - specs/data/storage_volumes/vol2.yml
179
+ - specs/data/storage_volumes/vol1.yml
180
+ - specs/keys_spec.rb
181
+ - specs/content_spec.rb
182
+ - specs/buckets_spec.rb
183
+ - specs/fixtures/storage_snapshots/snap3.yml
184
+ - specs/fixtures/storage_snapshots/snap1.yml
185
+ - specs/fixtures/storage_snapshots/snap2.yml
178
186
  - specs/fixtures/instances/inst0.yml
179
187
  - specs/fixtures/instances/inst1.yml
180
188
  - specs/fixtures/instances/inst2.yml
181
- - specs/fixtures/storage_snapshots/snap1.yml
182
- - specs/fixtures/storage_snapshots/snap2.yml
183
- - specs/fixtures/storage_snapshots/snap3.yml
184
- - specs/fixtures/storage_volumes/vol1.yml
185
- - specs/fixtures/storage_volumes/vol2.yml
189
+ - specs/fixtures/images/img3.yml
190
+ - specs/fixtures/images/img2.yml
191
+ - specs/fixtures/images/img1.yml
186
192
  - specs/fixtures/storage_volumes/vol3.yml
187
- - specs/hardware_profiles_spec.rb
188
- - specs/images_spec.rb
189
- - specs/initialization_spec.rb
190
- - specs/instance_states_spec.rb
191
- - specs/instances_spec.rb
192
- - specs/realms_spec.rb
193
+ - specs/fixtures/storage_volumes/vol2.yml
194
+ - specs/fixtures/storage_volumes/vol1.yml
193
195
  - specs/shared/resources.rb
194
- - specs/spec_helper.rb
195
- - specs/storage_snapshot_spec.rb
196
196
  - specs/storage_volume_spec.rb
197
+ - specs/realms_spec.rb
198
+ - specs/storage_snapshot_spec.rb
199
+ - specs/spec_helper.rb
data/init.rb DELETED
@@ -1,20 +0,0 @@
1
- #
2
- # Copyright (C) 2009 Red Hat, Inc.
3
- #
4
- # Licensed to the Apache Software Foundation (ASF) under one or more
5
- # contributor license agreements. See the NOTICE file distributed with
6
- # this work for additional information regarding copyright ownership. The
7
- # ASF licenses this file to you under the Apache License, Version 2.0 (the
8
- # "License"); you may not use this file except in compliance with the
9
- # License. You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
- # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
- # License for the specific language governing permissions and limitations
17
- # under the License.
18
-
19
-
20
- require 'deltacloud'