studio_api 3.1.0 → 3.1.1
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 +6 -0
- data/Gemfile +8 -0
- data/Rakefile +3 -43
- data/VERSION +1 -1
- data/lib/studio_api/generic_request.rb +4 -4
- data/lib/studio_api/running_build.rb +19 -0
- data/rubygem-studio_api.changes +98 -0
- data/rubygem-studio_api.spec.template +89 -0
- data/test/appliance_test.rb +198 -204
- data/test/build_test.rb +25 -28
- data/test/connection_test.rb +10 -10
- data/test/file_test.rb +28 -31
- data/test/gallery_test.rb +16 -26
- data/test/generic_request_test.rb +28 -32
- data/test/repository_test.rb +23 -27
- data/test/resource_test.rb +1 -9
- data/test/responses/api_version.xml +1 -0
- data/test/responses/running_build_image_already_exists.xml +4 -0
- data/test/responses/software_fake_response.xml +9 -0
- data/test/rpm_test.rb +30 -36
- data/test/running_build_test.rb +38 -30
- data/test/template_set_test.rb +9 -20
- data/test/test_helper.rb +25 -0
- data/test/testdrive_test.rb +12 -25
- metadata +49 -21
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/rdoctask'
|
3
3
|
require 'rake/testtask'
|
4
|
+
require 'bundler'
|
5
|
+
|
6
|
+
Bundler::GemHelper.install_tasks
|
4
7
|
|
5
8
|
task :default => "test"
|
6
9
|
|
@@ -20,46 +23,3 @@ rescue LoadError
|
|
20
23
|
puts "Yard not available. To generate documentation install it with: gem install yard"
|
21
24
|
end
|
22
25
|
|
23
|
-
|
24
|
-
begin
|
25
|
-
require 'jeweler'
|
26
|
-
Jeweler::Tasks.new do |s|
|
27
|
-
s.name = %q{studio_api}
|
28
|
-
s.summary = %q{Intuitive ruby bindings to Studio Api Interface.}
|
29
|
-
s.description = %q{Studio Api makes it easier to use SuSE Studio (http://susestudio.com) via API.
|
30
|
-
Instead of adapting each ActiveResource to its behavior and
|
31
|
-
manually adding multipart file upload it wrapp in in Active
|
32
|
-
Resource like interface. It is possible to define credentials
|
33
|
-
for whole api, or use it per partes, so it allow using it for
|
34
|
-
different studio users together.}
|
35
|
-
|
36
|
-
s.files = FileList['[A-Z]*', 'lib/studio_api/*.rb','lib/studio_api.rb', 'test/**/*.rb']
|
37
|
-
s.require_path = 'lib'
|
38
|
-
s.test_files = Dir[*['test/*_test.rb','test/responses/*.xml']]
|
39
|
-
s.has_rdoc = true
|
40
|
-
s.extra_rdoc_files = ["README.rdoc"]
|
41
|
-
s.rdoc_options = ['--line-numbers', "--main", "README.rdoc"]
|
42
|
-
s.authors = ["Josef Reidinger"]
|
43
|
-
s.email = %q{jreidinger@suse.cz}
|
44
|
-
s.homepage = "http://github.com/jreidinger/studio_api"
|
45
|
-
s.license = ["GPLv2","The Ruby License"]
|
46
|
-
s.add_dependency "activeresource", ">= 2.3.8"
|
47
|
-
s.add_dependency "xml-simple", ">= 1.0.0"
|
48
|
-
s.platform = Gem::Platform::RUBY
|
49
|
-
end
|
50
|
-
Jeweler::GemcutterTasks.new
|
51
|
-
|
52
|
-
desc "Create package directory containing all things to build RPM"
|
53
|
-
task :package => [:build] do
|
54
|
-
pkg_name = "rubygem-studio_api"
|
55
|
-
include FileUtils::Verbose
|
56
|
-
rm_rf "package"
|
57
|
-
mkdir "package"
|
58
|
-
cp "#{pkg_name}.changes","package/"
|
59
|
-
cp "#{pkg_name}.spec.template","package/#{pkg_name}.spec"
|
60
|
-
sh 'cp pkg/*.gem package/'
|
61
|
-
sh "sed -i \"s:<VERSION>:`cat VERSION`:\" package/#{pkg_name}.spec"
|
62
|
-
end
|
63
|
-
rescue LoadError
|
64
|
-
puts "Jeweler not available. To generate gem install it with: gem install jeweler"
|
65
|
-
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.
|
1
|
+
3.1.1
|
@@ -63,7 +63,7 @@ module StudioApi
|
|
63
63
|
# @return (String) response body from studio
|
64
64
|
# @raise [ActiveResource::ConnectionError] when problem occur during connection
|
65
65
|
def get(path)
|
66
|
-
do_request
|
66
|
+
do_request(Net::HTTP::Get.new(Util.join_relative_url(@connection.uri.request_uri,path)))
|
67
67
|
end
|
68
68
|
|
69
69
|
# sends delete request
|
@@ -72,7 +72,7 @@ module StudioApi
|
|
72
72
|
# @raise [ActiveResource::ConnectionError] when problem occur during connection
|
73
73
|
def delete(path)
|
74
74
|
#Even it is not dry I want to avoid meta programming with dynamic code evaluation so code is clear
|
75
|
-
do_request
|
75
|
+
do_request(Net::HTTP::Delete.new(Util.join_relative_url(@connection.uri.request_uri,path)))
|
76
76
|
end
|
77
77
|
|
78
78
|
# sends post request
|
@@ -81,7 +81,7 @@ module StudioApi
|
|
81
81
|
# @return (String) response body from studio
|
82
82
|
# @raise [ActiveResource::ConnectionError] when problem occur during connection
|
83
83
|
def post(path,data={})
|
84
|
-
request = Net::HTTP::Post.new
|
84
|
+
request = Net::HTTP::Post.new(Util.join_relative_url(@connection.uri.request_uri,path))
|
85
85
|
set_data(request,data) unless data.empty?
|
86
86
|
do_request request
|
87
87
|
end
|
@@ -92,7 +92,7 @@ module StudioApi
|
|
92
92
|
# @return (String) response body from studio
|
93
93
|
# @raise [ActiveResource::ConnectionError] when problem occur during connection
|
94
94
|
def put(path,data={})
|
95
|
-
request = Net::HTTP::Put.new
|
95
|
+
request = Net::HTTP::Put.new(Util.join_relative_url(@connection.uri.request_uri,path))
|
96
96
|
set_data(request,data) unless data.empty?
|
97
97
|
do_request request
|
98
98
|
end
|
@@ -12,6 +12,9 @@ module StudioApi
|
|
12
12
|
# rb.save!
|
13
13
|
# sleep 5
|
14
14
|
# rb.cancel
|
15
|
+
#
|
16
|
+
# An ImageAlreadyExists exception is raised when force parameter is not
|
17
|
+
# specified and there's already a build with the same version.
|
15
18
|
class RunningBuild < ActiveResource::Base
|
16
19
|
extend StudioResource
|
17
20
|
|
@@ -19,6 +22,19 @@ module StudioApi
|
|
19
22
|
|
20
23
|
alias_method :cancel, :destroy
|
21
24
|
|
25
|
+
def save
|
26
|
+
response = super
|
27
|
+
rescue ActiveResource::BadRequest => e
|
28
|
+
tree = XmlSimple.xml_in(e.response.body)
|
29
|
+
code = tree["code"][0]
|
30
|
+
if code == "image_already_exists"
|
31
|
+
message = tree["message"][0]
|
32
|
+
raise ImageAlreadyExists.new message
|
33
|
+
else
|
34
|
+
raise e
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
22
38
|
private
|
23
39
|
#overwrite create as studio doesn't interact well with enclosed parameters
|
24
40
|
def create
|
@@ -32,4 +48,7 @@ private
|
|
32
48
|
end
|
33
49
|
end
|
34
50
|
end
|
51
|
+
|
52
|
+
class ImageAlreadyExists < StandardError
|
53
|
+
end
|
35
54
|
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
Fri May 14:30:55 CEST 2011 Flavio Castelli <flavio@castelli.name>
|
2
|
+
|
3
|
+
- code refactorying of the unit tests
|
4
|
+
- better handling of errors raised during image building
|
5
|
+
- created 3.1.1
|
6
|
+
|
7
|
+
-------------------------------------------------------------------
|
8
|
+
Wed Apr 6 06:43:08 UTC 2011 - jreidinger@novell.com
|
9
|
+
|
10
|
+
- add support for test drive and fixed test( contributed by
|
11
|
+
bjorn.maeland@gmail.com https://github.com/bmaland)
|
12
|
+
- 3.1.0
|
13
|
+
|
14
|
+
-------------------------------------------------------------------
|
15
|
+
Mon Feb 14 14:48:15 UTC 2011 - jreidinger@novell.com
|
16
|
+
|
17
|
+
- split doc and tests from rest of rpms packages to save space
|
18
|
+
- fix dependency in gem for active_resource
|
19
|
+
- improve summary
|
20
|
+
- 3.0.2
|
21
|
+
|
22
|
+
-------------------------------------------------------------------
|
23
|
+
Mon Feb 14 13:57:24 UTC 2011 - jreidinger@novell.com
|
24
|
+
|
25
|
+
- note in gem description link to suse studio public instance
|
26
|
+
(thanks to flavio)
|
27
|
+
- relicense to GPLv2 or The Ruby License
|
28
|
+
- 3.0.1
|
29
|
+
|
30
|
+
-------------------------------------------------------------------
|
31
|
+
Wed Feb 2 15:14:03 UTC 2011 - jreidinger@novell.com
|
32
|
+
|
33
|
+
- allow to use studio API v2
|
34
|
+
- 3.0.0
|
35
|
+
|
36
|
+
-------------------------------------------------------------------
|
37
|
+
Wed Jan 26 14:19:44 UTC 2011 - jreidinger@novell.com
|
38
|
+
|
39
|
+
- fix crash if software map is empty
|
40
|
+
- 2.4.0
|
41
|
+
|
42
|
+
-------------------------------------------------------------------
|
43
|
+
Thu Dec 16 12:04:43 UTC 2010 - jreidinger@novell.com
|
44
|
+
|
45
|
+
- fix compatibility with rails 3.0
|
46
|
+
- 2.3.0
|
47
|
+
|
48
|
+
-------------------------------------------------------------------
|
49
|
+
Thu Dec 9 12:15:22 UTC 2010 - jreidinger@novell.com
|
50
|
+
|
51
|
+
- fix uploading gpg key with File object
|
52
|
+
- fix studio status in studio maintenance mode
|
53
|
+
- add to documentation example of mocking
|
54
|
+
- 2.2.0
|
55
|
+
|
56
|
+
-------------------------------------------------------------------
|
57
|
+
Tue Nov 30 13:43:58 UTC 2010 - jreidinger@novell.com
|
58
|
+
|
59
|
+
- fix passing options to installed software
|
60
|
+
- 2.1.0
|
61
|
+
|
62
|
+
-------------------------------------------------------------------
|
63
|
+
Mon Nov 29 16:50:21 UTC 2010 - jreidinger@novell.com
|
64
|
+
|
65
|
+
- add ability too pass more parameters to installed software
|
66
|
+
- 2.0.0
|
67
|
+
|
68
|
+
-------------------------------------------------------------------
|
69
|
+
Mon Nov 29 15:09:19 UTC 2010 - jreidinger@novell.com
|
70
|
+
|
71
|
+
- improve escaping of parameters
|
72
|
+
- fix uploading gpg_key as file
|
73
|
+
- 1.2.0
|
74
|
+
|
75
|
+
-------------------------------------------------------------------
|
76
|
+
Fri Nov 19 14:12:18 UTC 2010 - jreidinger@novell.com
|
77
|
+
|
78
|
+
- fix issue with empty body of post and put
|
79
|
+
- 1.0.1
|
80
|
+
|
81
|
+
-------------------------------------------------------------------
|
82
|
+
Fri Nov 19 09:53:38 UTC 2010 - jreidinger@novell.com
|
83
|
+
|
84
|
+
- consistent behavior for uploading/downloading
|
85
|
+
- 1.0.0
|
86
|
+
|
87
|
+
-------------------------------------------------------------------
|
88
|
+
Mon Nov 15 13:11:38 UTC 2010 - jreidinger@novell.com
|
89
|
+
|
90
|
+
- improve documentation and return better return values when using
|
91
|
+
direct requests
|
92
|
+
- 0.2.0
|
93
|
+
|
94
|
+
-------------------------------------------------------------------
|
95
|
+
Fri Nov 12 15:40:23 UTC 2010 - jreidinger@novell.com
|
96
|
+
|
97
|
+
- initial submit
|
98
|
+
|
@@ -0,0 +1,89 @@
|
|
1
|
+
#
|
2
|
+
# spec file for package rubygem-studio_api
|
3
|
+
#
|
4
|
+
# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
5
|
+
#
|
6
|
+
# All modifications and additions to the file contributed by third parties
|
7
|
+
# remain the property of their copyright owners, unless otherwise agreed
|
8
|
+
# upon. The license for this file, and modifications and additions to the
|
9
|
+
# file, is the same license as for the pristine package itself (unless the
|
10
|
+
# license for the pristine package is not an Open Source License, in which
|
11
|
+
# case the license is the MIT License). An "Open Source License" is a
|
12
|
+
# license that conforms to the Open Source Definition (Version 1.9)
|
13
|
+
# published by the Open Source Initiative.
|
14
|
+
|
15
|
+
# Please submit bugfixes or comments via http://bugs.opensuse.org/
|
16
|
+
#
|
17
|
+
|
18
|
+
# norootforbuild
|
19
|
+
Name: rubygem-studio_api
|
20
|
+
Version: <VERSION>
|
21
|
+
Release: 0
|
22
|
+
%define mod_name studio_api
|
23
|
+
#
|
24
|
+
Group: Development/Languages/Ruby
|
25
|
+
License: GPLv2 or The Ruby License
|
26
|
+
#
|
27
|
+
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
28
|
+
BuildRequires: rubygems_with_buildroot_patch
|
29
|
+
%rubygems_requires
|
30
|
+
BuildRequires: rubygem-activeresource >= 1.3.8
|
31
|
+
Requires: rubygem-activeresource >= 1.3.8
|
32
|
+
BuildRequires: rubygem-xml-simple >= 1.0.0
|
33
|
+
Requires: rubygem-xml-simple >= 1.0.0
|
34
|
+
#
|
35
|
+
Url: http://github.com/jreidinger/studio_api
|
36
|
+
Source: %{mod_name}-%{version}.gem
|
37
|
+
#
|
38
|
+
Summary: Intuitive ruby bindings to Studio Api Interface
|
39
|
+
%description
|
40
|
+
Studio Api makes it easier to use SuSE Studio (http://susestudio.com) via API.
|
41
|
+
Instead of adapting each ActiveResource to its behavior and
|
42
|
+
manually adding multipart file upload it wrapp in in Active
|
43
|
+
Resource like interface. It is possible to define credentials
|
44
|
+
for whole api, or use it per partes, so it allow using it for
|
45
|
+
different studio users together.
|
46
|
+
|
47
|
+
%package doc
|
48
|
+
Summary: RDoc documentation for %{mod_name}
|
49
|
+
Group: Development/Languages/Ruby
|
50
|
+
License: GPLv2 or The Ruby License
|
51
|
+
Requires: %{name} = %{version}
|
52
|
+
%description doc
|
53
|
+
Documentation generated at gem installation time.
|
54
|
+
Usually in RDoc and RI formats.
|
55
|
+
|
56
|
+
|
57
|
+
%package testsuite
|
58
|
+
Summary: Test suite for %{mod_name}
|
59
|
+
Group: Development/Languages/Ruby
|
60
|
+
License: GPLv2 or The Ruby License
|
61
|
+
Requires: %{name} = %{version}
|
62
|
+
%description testsuite
|
63
|
+
Test::Unit or RSpec files, useful for developers.
|
64
|
+
|
65
|
+
|
66
|
+
%prep
|
67
|
+
%build
|
68
|
+
%install
|
69
|
+
%gem_install %{S:0}
|
70
|
+
|
71
|
+
%clean
|
72
|
+
%{__rm} -rf %{buildroot}
|
73
|
+
|
74
|
+
%files
|
75
|
+
%defattr(-,root,root,-)
|
76
|
+
%{_libdir}/ruby/gems/%{rb_ver}/cache/%{mod_name}-%{version}.gem
|
77
|
+
%{_libdir}/ruby/gems/%{rb_ver}/gems/%{mod_name}-%{version}/
|
78
|
+
%exclude %{_libdir}/ruby/gems/%{rb_ver}/gems/%{mod_name}-%{version}/test
|
79
|
+
%{_libdir}/ruby/gems/%{rb_ver}/specifications/%{mod_name}-%{version}.gemspec
|
80
|
+
|
81
|
+
%files doc
|
82
|
+
%defattr(-,root,root,-)
|
83
|
+
%doc %{_libdir}/ruby/gems/%{rb_ver}/doc/%{mod_name}-%{version}/
|
84
|
+
|
85
|
+
%files testsuite
|
86
|
+
%defattr(-,root,root,-)
|
87
|
+
%{_libdir}/ruby/gems/%{rb_ver}/gems/%{mod_name}-%{version}/test
|
88
|
+
|
89
|
+
%changelog
|
data/test/appliance_test.rb
CHANGED
@@ -1,219 +1,213 @@
|
|
1
|
-
require '
|
2
|
-
require 'active_support'
|
3
|
-
$:.unshift File.join( File.dirname(__FILE__),'..','lib')
|
4
|
-
require 'studio_api/appliance'
|
5
|
-
require 'studio_api/connection'
|
6
|
-
require 'studio_api/generic_request'
|
7
|
-
require 'studio_api/util'
|
8
|
-
require 'active_resource/http_mock'
|
9
|
-
require 'mocha'
|
10
|
-
require 'test/unit'
|
1
|
+
require 'test_helper'
|
11
2
|
|
12
3
|
class ApplianceTest < Test::Unit::TestCase
|
13
|
-
|
14
|
-
REPO_ID = 6345
|
15
|
-
def respond_load name
|
16
|
-
IO.read(File.join(File.dirname(__FILE__),"responses",name))
|
17
|
-
end
|
18
|
-
|
4
|
+
|
19
5
|
def setup
|
20
|
-
@
|
6
|
+
@appliance_id = 266657
|
7
|
+
@repo_id = 6345
|
8
|
+
|
9
|
+
FakeWeb.clean_registry
|
10
|
+
FakeWeb.allow_net_connect = false
|
11
|
+
@connection = StudioApi::Connection.new(@@username, @@password,"http://localhost/api/")
|
21
12
|
StudioApi::Util.configure_studio_connection @connection
|
22
|
-
appliances_out = respond_load "appliances.xml"
|
23
|
-
appliance_out = respond_load "appliance.xml"
|
24
|
-
status_out = respond_load "status.xml"
|
25
|
-
repositories_out = respond_load "repositories.xml"
|
26
|
-
gpg_keys_out = respond_load "gpg_keys.xml"
|
27
|
-
gpg_key_out = respond_load "gpg_key.xml"
|
28
|
-
conf_out = respond_load "configuration.xml"
|
29
|
-
ActiveResource::HttpMock.respond_to do |mock|
|
30
|
-
mock.get "/api/appliances", {"Authorization"=>"Basic dGVzdDp0ZXN0"},appliances_out,200
|
31
|
-
mock.get "/api/appliances/#{APPLIANCE_ID}", {"Authorization"=>"Basic dGVzdDp0ZXN0"},appliance_out,200
|
32
|
-
mock.get "/api/appliances/#{APPLIANCE_ID}/status", {"Authorization"=>"Basic dGVzdDp0ZXN0"},status_out,200
|
33
|
-
mock.delete "/api/appliances/#{APPLIANCE_ID}", {"Authorization"=>"Basic dGVzdDp0ZXN0"},appliance_out,200
|
34
|
-
mock.get "/api/appliances/#{APPLIANCE_ID}/repositories", {"Authorization"=>"Basic dGVzdDp0ZXN0"},repositories_out,200
|
35
|
-
mock.post "/api/appliances/#{APPLIANCE_ID}/cmd/add_repository?repo_id=#{REPO_ID}",{"Authorization"=>"Basic dGVzdDp0ZXN0"},repositories_out,200
|
36
|
-
mock.post "/api/appliances/#{APPLIANCE_ID}/cmd/add_user_repository",{"Authorization"=>"Basic dGVzdDp0ZXN0"},repositories_out,200
|
37
|
-
mock.get "/api/appliances/#{APPLIANCE_ID}/gpg_keys", {"Authorization"=>"Basic dGVzdDp0ZXN0"},gpg_keys_out,200
|
38
|
-
mock.get "/api/appliances/#{APPLIANCE_ID}/gpg_keys/1976", {"Authorization"=>"Basic dGVzdDp0ZXN0"},gpg_key_out,200
|
39
|
-
mock.delete "/api/appliances/#{APPLIANCE_ID}/gpg_keys/1976", {"Authorization"=>"Basic dGVzdDp0ZXN0"},gpg_key_out,200
|
40
|
-
mock.get "/api/appliances/#{APPLIANCE_ID}/configuration", {"Authorization"=>"Basic dGVzdDp0ZXN0"},conf_out,200
|
41
|
-
end
|
42
13
|
end
|
43
14
|
|
44
15
|
def teardown
|
45
|
-
|
16
|
+
FakeWeb.allow_net_connect = false
|
46
17
|
end
|
47
18
|
|
48
19
|
def test_find_all
|
20
|
+
register_fake_response_from_file :get, '/api/appliances', 'appliances.xml'
|
49
21
|
res = StudioApi::Appliance.find :all
|
50
22
|
assert_equal 7,res.size
|
51
23
|
end
|
52
24
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
25
|
+
def test_find_one
|
26
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}",
|
27
|
+
'appliance.xml'
|
28
|
+
res = StudioApi::Appliance.find @appliance_id
|
29
|
+
assert_equal @appliance_id.to_s, res.id
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_status
|
33
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}",
|
34
|
+
'appliance.xml'
|
35
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/status",
|
36
|
+
'status.xml'
|
37
|
+
res = StudioApi::Appliance.find @appliance_id
|
38
|
+
assert_equal "ok", res.status.state
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_maintenance_status
|
42
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/status",
|
43
|
+
'status-broken.xml'
|
44
|
+
res = StudioApi::Appliance.new(:id => @appliance_id)
|
45
|
+
assert_equal "error", res.status.state
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_clone
|
49
|
+
register_fake_response_from_file :post, "/api/appliances?clone_from=#{@appliance_id}",
|
50
|
+
'appliance.xml'
|
51
|
+
assert StudioApi::Appliance.clone(@appliance_id)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_manifest
|
55
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/software/manifest/vmx",
|
56
|
+
'manifest.xml'
|
57
|
+
assert StudioApi::Appliance.new(:id => @appliance_id).manifest_file("vmx")
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_delete
|
61
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}",
|
62
|
+
'appliance.xml'
|
63
|
+
register_fake_response_from_file :delete, "/api/appliances/#{@appliance_id}",
|
64
|
+
'appliance.xml'
|
65
|
+
assert StudioApi::Appliance.delete(@appliance_id)
|
66
|
+
assert StudioApi::Appliance.find(@appliance_id).destroy #same but different way
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_repositories
|
70
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/repositories",
|
71
|
+
'repositories.xml'
|
72
|
+
res = StudioApi::Appliance.new(:id => @appliance_id).repositories
|
73
|
+
assert_equal 5,res.size
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_repository_remove
|
77
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/repositories",
|
78
|
+
'repositories.xml'
|
79
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/cmd/remove_repository?repo_id=#{@repo_id}",
|
80
|
+
'repositories.xml'
|
81
|
+
appliance = StudioApi::Appliance.new(:id => @appliance_id)
|
82
|
+
assert appliance.remove_repository(@repo_id)
|
83
|
+
repo = appliance.repositories.detect { |r| r.id == @repo_id.to_s}
|
84
|
+
assert repo.destroy #another way to delete repository
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_repository_add
|
88
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/cmd/add_repository?repo_id=#{@repo_id}",
|
89
|
+
'repositories.xml'
|
90
|
+
assert StudioApi::Appliance.new(:id => @appliance_id).add_repository(@repo_id)
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_user_repository_add
|
94
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/cmd/add_user_repository",
|
95
|
+
'repositories.xml'
|
96
|
+
assert StudioApi::Appliance.new(:id => @appliance_id).add_user_repository
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_configuration
|
100
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/configuration",
|
101
|
+
'configuration.xml'
|
102
|
+
conf= StudioApi::Appliance.new(:id => @appliance_id).configuration
|
103
|
+
assert conf.to_xml
|
104
|
+
assert conf
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_user_repository_add
|
108
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/sharing/test1",
|
109
|
+
'users_2.xml'
|
110
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/sharing",
|
111
|
+
'users_1.xml'
|
112
|
+
register_fake_response_from_file :delete, "/api/appliances/#{@appliance_id}/sharing/test1",
|
113
|
+
'users_1.xml'
|
114
|
+
assert_equal 1, StudioApi::Appliance.new(:id => @appliance_id).users.size
|
115
|
+
assert_equal 2, StudioApi::Appliance.new(:id => @appliance_id).add_user("test1").size
|
116
|
+
assert_equal 1, StudioApi::Appliance.new(:id => @appliance_id).remove_user("test1").size
|
117
|
+
|
118
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/sharing",
|
119
|
+
'users_0.xml'
|
120
|
+
assert_equal 0, StudioApi::Appliance.new(:id => @appliance_id).users.size
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_selected_software
|
124
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/software",
|
125
|
+
'software.xml'
|
126
|
+
res = StudioApi::Appliance.new(:id => @appliance_id).selected_software
|
127
|
+
assert_equal 48,res.size
|
128
|
+
assert res.any? {|r| r.is_a? StudioApi::Pattern }, "Pattern is not loaded"
|
129
|
+
assert res.any? {|r| r.name = "sysvinit" && r.version == "2.86-200.1" }, "package with specified version not found"
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_installed_software
|
133
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/software/installed?build_id=1",
|
134
|
+
'software_installed.xml'
|
135
|
+
res = StudioApi::Appliance.new(:id => @appliance_id).installed_software :build_id => 1
|
136
|
+
assert_equal 608,res.size
|
137
|
+
assert res.any? {|r| r.is_a? StudioApi::Pattern }, "Pattern is not loaded"
|
138
|
+
diag = res.find { |p| p.name == "3ddiag"}
|
139
|
+
assert_equal "0.742-32.25",diag.version
|
140
|
+
assert_equal 6347,diag.repository_id
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_search_software
|
144
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/software/search?q=qt",
|
145
|
+
'software_search.xml'
|
146
|
+
|
147
|
+
res = StudioApi::Appliance.new(:id => @appliance_id).search_software "qt"
|
148
|
+
assert_equal 54,res.size
|
149
|
+
assert res.any? {|r| r.is_a? StudioApi::Pattern }, "Pattern is not loaded"
|
150
|
+
apport = res.find { |p| p.name == "apport-qt"}
|
151
|
+
assert_equal "0.114-12.7.10",apport.version
|
152
|
+
assert_equal 6347,apport.repository_id
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_manipulate_with_packages_and_pattern
|
156
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/cmd/add_package?name=3ddiag",
|
157
|
+
'software_fake_response.xml'
|
158
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/cmd/remove_package?name=3ddiag",
|
159
|
+
'software_fake_response.xml'
|
160
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/cmd/add_pattern?name=kde4",
|
161
|
+
'software_fake_response.xml'
|
162
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/cmd/remove_pattern?name=kde4",
|
163
|
+
'software_fake_response.xml'
|
164
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/cmd/ban_package?name=3ddiag",
|
165
|
+
'software_fake_response.xml'
|
166
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/cmd/unban_package?name=3ddiag",
|
167
|
+
'software_fake_response.xml'
|
168
|
+
|
169
|
+
appliance = StudioApi::Appliance.new(:id => @appliance_id)
|
170
|
+
assert appliance.add_package("3ddiag")
|
171
|
+
assert appliance.remove_package("3ddiag")
|
172
|
+
assert appliance.add_pattern("kde4")
|
173
|
+
assert appliance.remove_pattern("kde4")
|
174
|
+
assert appliance.ban_package("3ddiag")
|
175
|
+
assert appliance.unban_package("3ddiag")
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_gpg_keys
|
179
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/gpg_keys",
|
180
|
+
'gpg_keys.xml'
|
181
|
+
res = StudioApi::Appliance.new(:id => @appliance_id).gpg_keys
|
182
|
+
assert_equal 3,res.size
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_gpg_key
|
186
|
+
gpg_key_id = 1976
|
187
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/gpg_keys/#{gpg_key_id}",
|
188
|
+
'gpg_key.xml'
|
189
|
+
res = StudioApi::Appliance.new(:id => @appliance_id).gpg_key(gpg_key_id)
|
190
|
+
assert_equal gpg_key_id, res.id.to_i
|
191
|
+
assert_equal "rpm", res.target
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_delete_gpg_key
|
195
|
+
gpg_key_id = 1976
|
196
|
+
register_fake_response_from_file :get, "/api/appliances/#{@appliance_id}/gpg_keys/#{gpg_key_id}",
|
197
|
+
'gpg_key.xml'
|
198
|
+
register_fake_response_from_file :delete, "/api/appliances/#{@appliance_id}/gpg_keys/#{gpg_key_id}",
|
199
|
+
'gpg_key.xml'
|
200
|
+
assert StudioApi::Appliance::GpgKey.delete(gpg_key_id, :appliance_id => @appliance_id)
|
201
|
+
res = StudioApi::Appliance.new(:id => @appliance_id).gpg_key gpg_key_id
|
202
|
+
assert res.destroy
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_add_gpg_key
|
206
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/gpg_keys?name=test&target=rpm&key=test",
|
207
|
+
'gpg_key.xml'
|
208
|
+
register_fake_response_from_file :post, "/api/appliances/#{@appliance_id}/gpg_keys?name=test&key=test&target=rpm",
|
209
|
+
'gpg_key.xml'
|
210
|
+
assert StudioApi::Appliance::GpgKey.create(@appliance_id, "test", "test")
|
211
|
+
assert StudioApi::Appliance.new(:id => @appliance_id).add_gpg_key("test", "test")
|
212
|
+
end
|
219
213
|
end
|