buzz 0.0.5 → 0.1.0
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/.travis.yml +7 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/README.md +2 -0
- data/VERSION +1 -1
- data/bin/buzz +1 -1
- data/buzz +1 -1
- data/buzz.gemspec +19 -5
- data/features/channel_api.feature +16 -0
- data/features/fixtures/vcr_cassettes/delete_system.yml +85 -0
- data/features/fixtures/vcr_cassettes/list_systems.yml +177 -0
- data/features/fixtures/vcr_cassettes/list_systems_by_regex.yml +117 -0
- data/features/fixtures/vcr_cassettes/refresh_channel.yml +85 -0
- data/features/step_definitions/buzz_steps.rb +15 -0
- data/features/step_definitions/spacewalk_steps.rb +30 -0
- data/features/support/env.rb +36 -1
- data/features/support/vcr.rb +18 -0
- data/features/system_api.feature +29 -0
- data/lib/buzz.rb +4 -2
- data/lib/buzz/api_base.rb +46 -0
- data/lib/buzz/channel_api.rb +21 -0
- data/lib/buzz/system_api.rb +45 -0
- data/lib/buzz_api.rb +0 -0
- data/lib/buzz_main.rb +14 -0
- data/lib/channel.rb +9 -17
- data/lib/sif.rb +63 -0
- data/lib/system.rb +14 -9
- data/sample_config/complete.yaml +3 -0
- data/spec/channel_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -16
- metadata +20 -6
- data/features/exit.feature +0 -13
- data/features/help.feature +0 -18
- data/features/step_definitions/terminal_steps.rb +0 -16
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -17,6 +17,7 @@ GEM
|
|
17
17
|
multi_json (~> 1.3)
|
18
18
|
diff-lcs (1.2.1)
|
19
19
|
extensions (0.6.0)
|
20
|
+
fakeweb (1.3.0)
|
20
21
|
ffi (1.7.0)
|
21
22
|
gherkin (2.11.8)
|
22
23
|
multi_json (~> 1.3)
|
@@ -53,6 +54,7 @@ DEPENDENCIES
|
|
53
54
|
aruba
|
54
55
|
bundler
|
55
56
|
extensions
|
57
|
+
fakeweb
|
56
58
|
jeweler (~> 1.8.4)
|
57
59
|
rake
|
58
60
|
rspec
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# buzz
|
2
2
|
|
3
|
+
[](https://travis-ci.org/georgecodes/buzz)
|
4
|
+
|
3
5
|
Buzz is a command-line interface into Spacewalk/RHN Satellite, written in Ruby. It will work with Ruby 1.8, which is the default Ruby on a lot of systems.
|
4
6
|
|
5
7
|
## Introduction
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/bin/buzz
CHANGED
data/buzz
CHANGED
data/buzz.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "buzz"
|
8
|
-
s.version = "0.0
|
8
|
+
s.version = "0.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["George McIntosh"]
|
12
|
-
s.date = "2013-
|
12
|
+
s.date = "2013-05-07"
|
13
13
|
s.description = "A growing suite of tools for doing handy admin tasks etc with Spacewalk"
|
14
14
|
s.email = "george@georgemcintosh.com"
|
15
15
|
s.executables = ["buzz"]
|
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
]
|
20
20
|
s.files = [
|
21
21
|
".document",
|
22
|
+
".travis.yml",
|
22
23
|
"Gemfile",
|
23
24
|
"Gemfile.lock",
|
24
25
|
"LICENSE.txt",
|
@@ -29,13 +30,26 @@ Gem::Specification.new do |s|
|
|
29
30
|
"buzz",
|
30
31
|
"buzz.gemspec",
|
31
32
|
"conf/.buzz",
|
32
|
-
"features/
|
33
|
-
"features/
|
34
|
-
"features/
|
33
|
+
"features/channel_api.feature",
|
34
|
+
"features/fixtures/vcr_cassettes/delete_system.yml",
|
35
|
+
"features/fixtures/vcr_cassettes/list_systems.yml",
|
36
|
+
"features/fixtures/vcr_cassettes/list_systems_by_regex.yml",
|
37
|
+
"features/fixtures/vcr_cassettes/refresh_channel.yml",
|
38
|
+
"features/step_definitions/buzz_steps.rb",
|
39
|
+
"features/step_definitions/spacewalk_steps.rb",
|
35
40
|
"features/support/env.rb",
|
41
|
+
"features/support/vcr.rb",
|
42
|
+
"features/system_api.feature",
|
36
43
|
"lib/buzz.rb",
|
44
|
+
"lib/buzz/api_base.rb",
|
45
|
+
"lib/buzz/channel_api.rb",
|
46
|
+
"lib/buzz/system_api.rb",
|
47
|
+
"lib/buzz_api.rb",
|
48
|
+
"lib/buzz_main.rb",
|
37
49
|
"lib/channel.rb",
|
50
|
+
"lib/sif.rb",
|
38
51
|
"lib/system.rb",
|
52
|
+
"sample_config/complete.yaml",
|
39
53
|
"spec/channel_spec.rb",
|
40
54
|
"spec/spec_helper.rb",
|
41
55
|
"test/helper.rb",
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Feature: A set of API calls relating to Spacewalk channels
|
2
|
+
As a user of Spacewalk
|
3
|
+
In order to manage channels
|
4
|
+
I want to use the buzz API
|
5
|
+
|
6
|
+
Background: Use the "Channel" API
|
7
|
+
Given I have provided username "admin" password "admin" and server "spacewalk.elevenware.com"
|
8
|
+
And want to use the "Channel" API
|
9
|
+
|
10
|
+
Scenario: Refresh a channel
|
11
|
+
When I call the "refresh_channel" method with the arguments "my-awesome-channel" and the cassette "refresh_channel" is in place
|
12
|
+
Then the result contains:
|
13
|
+
"""
|
14
|
+
1
|
15
|
+
"""
|
16
|
+
|
@@ -0,0 +1,85 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://spacewalk.elevenware.com/rpc/api
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ! '<?xml version="1.0" ?><methodCall><methodName>auth.login</methodName><params><param><value><string>admin</string></value></param><param><value><string>admin</string></value></param></params></methodCall>
|
9
|
+
|
10
|
+
'
|
11
|
+
headers:
|
12
|
+
user-agent:
|
13
|
+
- XMLRPC::Client (Ruby 1.9.3)
|
14
|
+
content-type:
|
15
|
+
- text/xml; charset=utf-8
|
16
|
+
content-length:
|
17
|
+
- '217'
|
18
|
+
connection:
|
19
|
+
- keep-alive
|
20
|
+
accept:
|
21
|
+
- ! '*/*'
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
date:
|
28
|
+
- Wed, 01 May 2013 11:32:42 GMT
|
29
|
+
content-type:
|
30
|
+
- text/xml;charset=ISO-8859-1
|
31
|
+
content-length:
|
32
|
+
- '175'
|
33
|
+
set-cookie:
|
34
|
+
- JSESSIONID=577FB4B22072EABD07B9F608B5D7CA8A; Path=/rhn
|
35
|
+
keep-alive:
|
36
|
+
- timeout=15, max=400
|
37
|
+
connection:
|
38
|
+
- Keep-Alive
|
39
|
+
body:
|
40
|
+
encoding: US-ASCII
|
41
|
+
string: <?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><string>1664321x77235c35e15b4c025afdcd959914a5c3</string></value></param></params></methodResponse>
|
42
|
+
http_version: '1.1'
|
43
|
+
recorded_at: Wed, 01 May 2013 11:32:45 GMT
|
44
|
+
- request:
|
45
|
+
method: post
|
46
|
+
uri: http://spacewalk.elevenware.com/rpc/api
|
47
|
+
body:
|
48
|
+
encoding: US-ASCII
|
49
|
+
string: ! '<?xml version="1.0" ?><methodCall><methodName>system.deleteSystems</methodName><params><param><value><string>1664321x77235c35e15b4c025afdcd959914a5c3</string></value></param><param><value><array><data><value><i4>1000021466</i4></value></data></array></value></param></params></methodCall>
|
50
|
+
|
51
|
+
'
|
52
|
+
headers:
|
53
|
+
user-agent:
|
54
|
+
- XMLRPC::Client (Ruby 1.9.3)
|
55
|
+
content-type:
|
56
|
+
- text/xml; charset=utf-8
|
57
|
+
content-length:
|
58
|
+
- '289'
|
59
|
+
connection:
|
60
|
+
- keep-alive
|
61
|
+
cookie:
|
62
|
+
- JSESSIONID=577FB4B22072EABD07B9F608B5D7CA8A
|
63
|
+
accept:
|
64
|
+
- ! '*/*'
|
65
|
+
response:
|
66
|
+
status:
|
67
|
+
code: 200
|
68
|
+
message: OK
|
69
|
+
headers:
|
70
|
+
date:
|
71
|
+
- Wed, 01 May 2013 11:32:42 GMT
|
72
|
+
content-type:
|
73
|
+
- text/xml;charset=ISO-8859-1
|
74
|
+
content-length:
|
75
|
+
- '128'
|
76
|
+
keep-alive:
|
77
|
+
- timeout=15, max=400
|
78
|
+
connection:
|
79
|
+
- Keep-Alive
|
80
|
+
body:
|
81
|
+
encoding: US-ASCII
|
82
|
+
string: <?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><i4>1</i4></value></param></params></methodResponse>
|
83
|
+
http_version: '1.1'
|
84
|
+
recorded_at: Wed, 01 May 2013 11:32:45 GMT
|
85
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,177 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://spacewalk.elevenware.com/rpc/api
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ! '<?xml version="1.0" ?><methodCall><methodName>auth.login</methodName><params><param><value><string>admin</string></value></param><param><value><string>admin</string></value></param></params></methodCall>
|
9
|
+
|
10
|
+
'
|
11
|
+
headers:
|
12
|
+
user-agent:
|
13
|
+
- XMLRPC::Client (Ruby 1.9.3)
|
14
|
+
content-type:
|
15
|
+
- text/xml; charset=utf-8
|
16
|
+
content-length:
|
17
|
+
- '204'
|
18
|
+
connection:
|
19
|
+
- keep-alive
|
20
|
+
accept:
|
21
|
+
- ! '*/*'
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
date:
|
28
|
+
- Tue, 23 Apr 2013 01:14:39 GMT
|
29
|
+
content-type:
|
30
|
+
- text/xml
|
31
|
+
content-length:
|
32
|
+
- '171'
|
33
|
+
keep-alive:
|
34
|
+
- timeout=15, max=400
|
35
|
+
connection:
|
36
|
+
- Keep-Alive
|
37
|
+
body:
|
38
|
+
encoding: US-ASCII
|
39
|
+
string: <?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><string>291x4fced64491ef2c8e34032e797bb6c9bc</string></value></param></params></methodResponse>
|
40
|
+
http_version: '1.1'
|
41
|
+
recorded_at: Wed, 24 Apr 2013 09:05:10 GMT
|
42
|
+
- request:
|
43
|
+
method: post
|
44
|
+
uri: http://spacewalk.elevenware.com/rpc/api
|
45
|
+
body:
|
46
|
+
encoding: US-ASCII
|
47
|
+
string: ! '<?xml version="1.0" ?><methodCall><methodName>system.listSystems</methodName><params><param><value><string>291x4fced64491ef2c8e34032e797bb6c9bc</string></value></param></params></methodCall>
|
48
|
+
|
49
|
+
'
|
50
|
+
headers:
|
51
|
+
user-agent:
|
52
|
+
- XMLRPC::Client (Ruby 1.9.3)
|
53
|
+
content-type:
|
54
|
+
- text/xml; charset=utf-8
|
55
|
+
content-length:
|
56
|
+
- '191'
|
57
|
+
connection:
|
58
|
+
- keep-alive
|
59
|
+
accept:
|
60
|
+
- ! '*/*'
|
61
|
+
response:
|
62
|
+
status:
|
63
|
+
code: 200
|
64
|
+
message: OK
|
65
|
+
headers:
|
66
|
+
date:
|
67
|
+
- Tue, 23 Apr 2013 01:14:39 GMT
|
68
|
+
content-type:
|
69
|
+
- text/xml
|
70
|
+
content-length:
|
71
|
+
- '3752'
|
72
|
+
keep-alive:
|
73
|
+
- timeout=15, max=400
|
74
|
+
connection:
|
75
|
+
- Keep-Alive
|
76
|
+
body:
|
77
|
+
encoding: US-ASCII
|
78
|
+
string: ! '<?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><array><data><value><struct><member><name>id</name><value><i4>1000010010</i4></value></member>
|
79
|
+
|
80
|
+
<member><name>name</name><value><string>localhost.localdomain</string></value></member>
|
81
|
+
|
82
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130423T01:11:36</dateTime.iso8601></value></member>
|
83
|
+
|
84
|
+
</struct>
|
85
|
+
|
86
|
+
</value><value><struct><member><name>id</name><value><i4>1000010011</i4></value></member>
|
87
|
+
|
88
|
+
<member><name>name</name><value><string>localhost.localdomain</string></value></member>
|
89
|
+
|
90
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130423T01:11:39</dateTime.iso8601></value></member>
|
91
|
+
|
92
|
+
</struct>
|
93
|
+
|
94
|
+
</value><value><struct><member><name>id</name><value><i4>1000010012</i4></value></member>
|
95
|
+
|
96
|
+
<member><name>name</name><value><string>localhost.localdomain</string></value></member>
|
97
|
+
|
98
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130423T01:11:42</dateTime.iso8601></value></member>
|
99
|
+
|
100
|
+
</struct>
|
101
|
+
|
102
|
+
</value><value><struct><member><name>id</name><value><i4>1000010013</i4></value></member>
|
103
|
+
|
104
|
+
<member><name>name</name><value><string>localhost.localdomain</string></value></member>
|
105
|
+
|
106
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130423T01:11:44</dateTime.iso8601></value></member>
|
107
|
+
|
108
|
+
</struct>
|
109
|
+
|
110
|
+
</value><value><struct><member><name>id</name><value><i4>1000010014</i4></value></member>
|
111
|
+
|
112
|
+
<member><name>name</name><value><string>localhost.localdomain</string></value></member>
|
113
|
+
|
114
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130423T01:11:46</dateTime.iso8601></value></member>
|
115
|
+
|
116
|
+
</struct>
|
117
|
+
|
118
|
+
</value><value><struct><member><name>id</name><value><i4>1000010015</i4></value></member>
|
119
|
+
|
120
|
+
<member><name>name</name><value><string>localhost.localdomain</string></value></member>
|
121
|
+
|
122
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130423T01:11:48</dateTime.iso8601></value></member>
|
123
|
+
|
124
|
+
</struct>
|
125
|
+
|
126
|
+
</value><value><struct><member><name>id</name><value><i4>1000010016</i4></value></member>
|
127
|
+
|
128
|
+
<member><name>name</name><value><string>localhost.localdomain</string></value></member>
|
129
|
+
|
130
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130423T01:11:50</dateTime.iso8601></value></member>
|
131
|
+
|
132
|
+
</struct>
|
133
|
+
|
134
|
+
</value><value><struct><member><name>id</name><value><i4>1000010017</i4></value></member>
|
135
|
+
|
136
|
+
<member><name>name</name><value><string>localhost.localdomain</string></value></member>
|
137
|
+
|
138
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130423T01:11:51</dateTime.iso8601></value></member>
|
139
|
+
|
140
|
+
</struct>
|
141
|
+
|
142
|
+
</value><value><struct><member><name>id</name><value><i4>1000010018</i4></value></member>
|
143
|
+
|
144
|
+
<member><name>name</name><value><string>localhost.localdomain</string></value></member>
|
145
|
+
|
146
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130423T01:11:53</dateTime.iso8601></value></member>
|
147
|
+
|
148
|
+
</struct>
|
149
|
+
|
150
|
+
</value><value><struct><member><name>id</name><value><i4>1000010019</i4></value></member>
|
151
|
+
|
152
|
+
<member><name>name</name><value><string>localhost.localdomain</string></value></member>
|
153
|
+
|
154
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130423T01:11:55</dateTime.iso8601></value></member>
|
155
|
+
|
156
|
+
</struct>
|
157
|
+
|
158
|
+
</value><value><struct><member><name>id</name><value><i4>1000010001</i4></value></member>
|
159
|
+
|
160
|
+
<member><name>name</name><value><string>spacewalk.elevenware.com</string></value></member>
|
161
|
+
|
162
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130317T21:25:39</dateTime.iso8601></value></member>
|
163
|
+
|
164
|
+
</struct>
|
165
|
+
|
166
|
+
</value><value><struct><member><name>id</name><value><i4>1000010002</i4></value></member>
|
167
|
+
|
168
|
+
<member><name>name</name><value><string>spacewalk.elevenware.com</string></value></member>
|
169
|
+
|
170
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130420T16:04:37</dateTime.iso8601></value></member>
|
171
|
+
|
172
|
+
</struct>
|
173
|
+
|
174
|
+
</value></data></array></value></param></params></methodResponse>'
|
175
|
+
http_version: '1.1'
|
176
|
+
recorded_at: Wed, 24 Apr 2013 09:05:10 GMT
|
177
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,117 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://spacewalk.elevenware.com/rpc/api
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ! '<?xml version="1.0" ?><methodCall><methodName>auth.login</methodName><params><param><value><string>admin</string></value></param><param><value><string>admin</string></value></param></params></methodCall>
|
9
|
+
|
10
|
+
'
|
11
|
+
headers:
|
12
|
+
user-agent:
|
13
|
+
- XMLRPC::Client (Ruby 1.9.3)
|
14
|
+
content-type:
|
15
|
+
- text/xml; charset=utf-8
|
16
|
+
content-length:
|
17
|
+
- '217'
|
18
|
+
connection:
|
19
|
+
- keep-alive
|
20
|
+
accept:
|
21
|
+
- ! '*/*'
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
date:
|
28
|
+
- Wed, 01 May 2013 13:14:55 GMT
|
29
|
+
content-type:
|
30
|
+
- text/xml;charset=ISO-8859-1
|
31
|
+
content-length:
|
32
|
+
- '175'
|
33
|
+
set-cookie:
|
34
|
+
- JSESSIONID=78C404894E5A8D8F249F1D905952D2F1; Path=/rhn
|
35
|
+
keep-alive:
|
36
|
+
- timeout=15, max=400
|
37
|
+
connection:
|
38
|
+
- Keep-Alive
|
39
|
+
body:
|
40
|
+
encoding: US-ASCII
|
41
|
+
string: <?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><string>1664343x4b4779ffcf1b0d827290fe801d6e2182</string></value></param></params></methodResponse>
|
42
|
+
http_version: '1.1'
|
43
|
+
recorded_at: Wed, 01 May 2013 13:14:56 GMT
|
44
|
+
- request:
|
45
|
+
method: post
|
46
|
+
uri: http://spacewalk.elevenware.com/rpc/api
|
47
|
+
body:
|
48
|
+
encoding: US-ASCII
|
49
|
+
string: ! '<?xml version="1.0" ?><methodCall><methodName>system.searchByName</methodName><params><param><value><string>1664343x4b4779ffcf1b0d827290fe801d6e2182</string></value></param><param><value><string>^store3</string></value></param></params></methodCall>
|
50
|
+
|
51
|
+
'
|
52
|
+
headers:
|
53
|
+
user-agent:
|
54
|
+
- XMLRPC::Client (Ruby 1.9.3)
|
55
|
+
content-type:
|
56
|
+
- text/xml; charset=utf-8
|
57
|
+
content-length:
|
58
|
+
- '250'
|
59
|
+
connection:
|
60
|
+
- keep-alive
|
61
|
+
cookie:
|
62
|
+
- JSESSIONID=78C404894E5A8D8F249F1D905952D2F1
|
63
|
+
accept:
|
64
|
+
- ! '*/*'
|
65
|
+
response:
|
66
|
+
status:
|
67
|
+
code: 200
|
68
|
+
message: OK
|
69
|
+
headers:
|
70
|
+
date:
|
71
|
+
- Wed, 01 May 2013 13:14:55 GMT
|
72
|
+
content-type:
|
73
|
+
- text/xml;charset=ISO-8859-1
|
74
|
+
content-length:
|
75
|
+
- '1374'
|
76
|
+
keep-alive:
|
77
|
+
- timeout=15, max=400
|
78
|
+
connection:
|
79
|
+
- Keep-Alive
|
80
|
+
body:
|
81
|
+
encoding: US-ASCII
|
82
|
+
string: ! '<?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><array><data><value><struct><member><name>id</name><value><i4>1000021430</i4></value></member>
|
83
|
+
|
84
|
+
<member><name>name</name><value><string>store3.eng.uk.specsavers.com</string></value></member>
|
85
|
+
|
86
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130422T12:57:58</dateTime.iso8601></value></member>
|
87
|
+
|
88
|
+
</struct>
|
89
|
+
|
90
|
+
</value><value><struct><member><name>id</name><value><i4>1000021494</i4></value></member>
|
91
|
+
|
92
|
+
<member><name>name</name><value><string>store3.eng.uk.specsavers.com</string></value></member>
|
93
|
+
|
94
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130424T13:15:09</dateTime.iso8601></value></member>
|
95
|
+
|
96
|
+
</struct>
|
97
|
+
|
98
|
+
</value><value><struct><member><name>id</name><value><i4>1000021418</i4></value></member>
|
99
|
+
|
100
|
+
<member><name>name</name><value><string>store3.eng.uk.specsavers.com</string></value></member>
|
101
|
+
|
102
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130419T16:46:16</dateTime.iso8601></value></member>
|
103
|
+
|
104
|
+
</struct>
|
105
|
+
|
106
|
+
</value><value><struct><member><name>id</name><value><i4>1000021563</i4></value></member>
|
107
|
+
|
108
|
+
<member><name>name</name><value><string>store3.eng.uk.specsavers.com</string></value></member>
|
109
|
+
|
110
|
+
<member><name>last_checkin</name><value><dateTime.iso8601>20130501T12:59:36</dateTime.iso8601></value></member>
|
111
|
+
|
112
|
+
</struct>
|
113
|
+
|
114
|
+
</value></data></array></value></param></params></methodResponse>'
|
115
|
+
http_version: '1.1'
|
116
|
+
recorded_at: Wed, 01 May 2013 13:15:00 GMT
|
117
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,85 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://spacewalk.elevenware.com/rpc/api
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ! '<?xml version="1.0" ?><methodCall><methodName>auth.login</methodName><params><param><value><string>admin</string></value></param><param><value><string>admin</string></value></param></params></methodCall>
|
9
|
+
|
10
|
+
'
|
11
|
+
headers:
|
12
|
+
user-agent:
|
13
|
+
- XMLRPC::Client (Ruby 1.9.3)
|
14
|
+
content-type:
|
15
|
+
- text/xml; charset=utf-8
|
16
|
+
content-length:
|
17
|
+
- '217'
|
18
|
+
connection:
|
19
|
+
- keep-alive
|
20
|
+
accept:
|
21
|
+
- ! '*/*'
|
22
|
+
response:
|
23
|
+
status:
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
date:
|
28
|
+
- Wed, 01 May 2013 14:53:54 GMT
|
29
|
+
content-type:
|
30
|
+
- text/xml;charset=ISO-8859-1
|
31
|
+
content-length:
|
32
|
+
- '175'
|
33
|
+
set-cookie:
|
34
|
+
- JSESSIONID=9265DFB1EC362ADB452377614A7364AD; Path=/rhn
|
35
|
+
keep-alive:
|
36
|
+
- timeout=15, max=400
|
37
|
+
connection:
|
38
|
+
- Keep-Alive
|
39
|
+
body:
|
40
|
+
encoding: US-ASCII
|
41
|
+
string: <?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><string>1665209xa54c21fd8581ddc7a326f9664944c323</string></value></param></params></methodResponse>
|
42
|
+
http_version: '1.1'
|
43
|
+
recorded_at: Wed, 01 May 2013 14:53:58 GMT
|
44
|
+
- request:
|
45
|
+
method: post
|
46
|
+
uri: http://spacewalk.elevenware.com/rpc/api
|
47
|
+
body:
|
48
|
+
encoding: US-ASCII
|
49
|
+
string: ! '<?xml version="1.0" ?><methodCall><methodName>channel.software.regenerateYumCache</methodName><params><param><value><string>1665209xa54c21fd8581ddc7a326f9664944c323</string></value></param><param><value><string>my-awesome-channel</string></value></param></params></methodCall>
|
50
|
+
|
51
|
+
'
|
52
|
+
headers:
|
53
|
+
user-agent:
|
54
|
+
- XMLRPC::Client (Ruby 1.9.3)
|
55
|
+
content-type:
|
56
|
+
- text/xml; charset=utf-8
|
57
|
+
content-length:
|
58
|
+
- '301'
|
59
|
+
connection:
|
60
|
+
- keep-alive
|
61
|
+
cookie:
|
62
|
+
- JSESSIONID=9265DFB1EC362ADB452377614A7364AD
|
63
|
+
accept:
|
64
|
+
- ! '*/*'
|
65
|
+
response:
|
66
|
+
status:
|
67
|
+
code: 200
|
68
|
+
message: OK
|
69
|
+
headers:
|
70
|
+
date:
|
71
|
+
- Wed, 01 May 2013 14:53:54 GMT
|
72
|
+
content-type:
|
73
|
+
- text/xml;charset=ISO-8859-1
|
74
|
+
content-length:
|
75
|
+
- '128'
|
76
|
+
keep-alive:
|
77
|
+
- timeout=15, max=400
|
78
|
+
connection:
|
79
|
+
- Keep-Alive
|
80
|
+
body:
|
81
|
+
encoding: US-ASCII
|
82
|
+
string: <?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><i4>1</i4></value></param></params></methodResponse>
|
83
|
+
http_version: '1.1'
|
84
|
+
recorded_at: Wed, 01 May 2013 14:53:58 GMT
|
85
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Given /^I have buzz installed$/ do
|
2
|
+
add_to_lib_path(BUZZ_LIB_PATH)
|
3
|
+
end
|
4
|
+
|
5
|
+
Given(/^the config is "(.*?)"$/) do |config_file|
|
6
|
+
put_config_in_place config_file
|
7
|
+
end
|
8
|
+
|
9
|
+
When(/^the cassette "(.*?)" is in place$/) do |cassette_name|
|
10
|
+
VCR.use_cassette(cassette_name)
|
11
|
+
end
|
12
|
+
|
13
|
+
When(/^I run `([^`]*)` using the cassette "(.*?)"$/) do |command, cassette_name|
|
14
|
+
VCR.use_cassette(cassette_name) { run_simple(unescape(command), false) }
|
15
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Given(/^I have provided username "(.*?)" password "(.*?)" and server "(.*?)"$/) do |username, password, server|
|
2
|
+
@username = username
|
3
|
+
@password = password
|
4
|
+
@server = server
|
5
|
+
end
|
6
|
+
|
7
|
+
Given(/^want to use the "(.*?)" API$/) do |api_name|
|
8
|
+
clazz = eval("Buzz::Api::#{api_name}")
|
9
|
+
@api = clazz.new(@server, @username, @password)
|
10
|
+
end
|
11
|
+
|
12
|
+
When(/^I call the "(.*?)" method and the cassette "(.*?)" is in place$/) do |method_name, cassette_name|
|
13
|
+
VCR.use_cassette(cassette_name) { @result = @api.send( method_name ) }
|
14
|
+
end
|
15
|
+
|
16
|
+
When(/^I call the "(.*?)" method with the arguments "(.*?)" and the cassette "(.*?)" is in place$/) do |method_name, args, cassette_name|
|
17
|
+
split_args = args.split(/ /)
|
18
|
+
args = split_args.length <= 1 ? args : split_args
|
19
|
+
VCR.use_cassette(cassette_name) { @result = @api.send( method_name, args ) }
|
20
|
+
end
|
21
|
+
|
22
|
+
Then(/^the result contains:$/) do |expected_result|
|
23
|
+
@result.to_s.should eq(expected_result)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
Then(/^the result contains the array:$/) do |string|
|
28
|
+
expected_result = eval(string).to_json
|
29
|
+
@result.to_json.should eq(expected_result)
|
30
|
+
end
|
data/features/support/env.rb
CHANGED
@@ -1,2 +1,37 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
2
|
require 'aruba/cucumber'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'rspec/expectations'
|
5
|
+
require 'buzz/system_api'
|
6
|
+
require 'buzz/channel_api'
|
7
|
+
require 'aruba/in_process'
|
8
|
+
|
9
|
+
BUZZ_LIB_PATH = File.expand_path(File.join(File.dirname(__FILE__),'..','..','lib'))
|
10
|
+
|
11
|
+
Before do
|
12
|
+
@aruba_timeout_seconds = 5
|
13
|
+
@original_path = ENV['PATH'].split(File::PATH_SEPARATOR)
|
14
|
+
@original_home = ENV['HOME']
|
15
|
+
new_home = "/tmp/fakehome"
|
16
|
+
FileUtils.rm_rf new_home
|
17
|
+
FileUtils.mkdir new_home
|
18
|
+
ENV['HOME'] = new_home
|
19
|
+
end
|
20
|
+
|
21
|
+
After do |scenario|
|
22
|
+
ENV['RUBYLIB'] = ''
|
23
|
+
ENV['PATH'] = @original_path.join(File::PATH_SEPARATOR)
|
24
|
+
ENV['HOME'] = @original_home
|
25
|
+
end
|
26
|
+
|
27
|
+
def put_config_in_place(config_file)
|
28
|
+
FileUtils.cp config_file, "#{ENV['HOME']}/.buzz"
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_to_lib_path(path)
|
32
|
+
ENV["RUBYLIB"] = (String(ENV["RUBYLIB"]).split(File::PATH_SEPARATOR) + [path]).join(File::PATH_SEPARATOR)
|
33
|
+
end
|
34
|
+
|
35
|
+
def remove_from_lib_path(path)
|
36
|
+
ENV["RUBYLIB"] = (String(ENV["RUBYLIB"]).split(File::PATH_SEPARATOR) - [path]).join(File::PATH_SEPARATOR)
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'vcr'
|
2
|
+
|
3
|
+
VCR.configure do |c|
|
4
|
+
# INFO: This is relative to the Rails.root
|
5
|
+
c.cassette_library_dir = 'features/fixtures/vcr_cassettes'
|
6
|
+
c.hook_into :fakeweb
|
7
|
+
c.ignore_localhost = true
|
8
|
+
c.default_cassette_options = { :record => :new_episodes }
|
9
|
+
end
|
10
|
+
|
11
|
+
#VCR.cucumber_tags do |t|
|
12
|
+
# t.tag '@tag1'
|
13
|
+
# t.tags '@tag2', '@tag3'
|
14
|
+
|
15
|
+
# t.tag '@tag3', :cassette => :options
|
16
|
+
# puts "OPTONS #{t}"
|
17
|
+
# t.tags '@tag4', '@tag5'
|
18
|
+
#end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Feature: A set of API calls relating to Spacewalk systems
|
2
|
+
As a user of Spacewalk
|
3
|
+
In order to manage registered systems
|
4
|
+
I want to use the buzz API
|
5
|
+
|
6
|
+
Background: I configure the library
|
7
|
+
Given I have provided username "admin" password "admin" and server "spacewalk.elevenware.com"
|
8
|
+
And want to use the "System" API
|
9
|
+
|
10
|
+
Scenario: Listing systems
|
11
|
+
When I call the "list" method and the cassette "list_systems" is in place
|
12
|
+
Then the result contains the array:
|
13
|
+
"""
|
14
|
+
[{:id=>"1000010010", :name=>"localhost.localdomain", :last_checkin=>"Tue Apr 23 01:11:36 2013"}, {:id=>"1000010011", :name=>"localhost.localdomain", :last_checkin=>"Tue Apr 23 01:11:39 2013"}, {:id=>"1000010012", :name=>"localhost.localdomain", :last_checkin=>"Tue Apr 23 01:11:42 2013"}, {:id=>"1000010013", :name=>"localhost.localdomain", :last_checkin=>"Tue Apr 23 01:11:44 2013"}, {:id=>"1000010014", :name=>"localhost.localdomain", :last_checkin=>"Tue Apr 23 01:11:46 2013"}, {:id=>"1000010015", :name=>"localhost.localdomain", :last_checkin=>"Tue Apr 23 01:11:48 2013"}, {:id=>"1000010016", :name=>"localhost.localdomain", :last_checkin=>"Tue Apr 23 01:11:50 2013"}, {:id=>"1000010017", :name=>"localhost.localdomain", :last_checkin=>"Tue Apr 23 01:11:51 2013"}, {:id=>"1000010018", :name=>"localhost.localdomain", :last_checkin=>"Tue Apr 23 01:11:53 2013"}, {:id=>"1000010019", :name=>"localhost.localdomain", :last_checkin=>"Tue Apr 23 01:11:55 2013"}, {:id=>"1000010001", :name=>"spacewalk.elevenware.com", :last_checkin=>"Sun Mar 17 21:25:39 2013"}, {:id=>"1000010002", :name=>"spacewalk.elevenware.com", :last_checkin=>"Sat Apr 20 16:04:37 2013"}]
|
15
|
+
"""
|
16
|
+
|
17
|
+
Scenario: Deleting a system by ID
|
18
|
+
When I call the "delete_systems" method with the arguments "1000021466" and the cassette "delete_system" is in place
|
19
|
+
Then the result contains:
|
20
|
+
"""
|
21
|
+
1
|
22
|
+
"""
|
23
|
+
|
24
|
+
Scenario: Listing systems by regex
|
25
|
+
When I call the "list_by_regex" method with the arguments "^store3" and the cassette "list_systems_by_regex" is in place
|
26
|
+
Then the result contains the array:
|
27
|
+
"""
|
28
|
+
[{:id=>"1000021430", :name=>"store3.eng.uk.specsavers.com", :last_checkin=>"Mon Apr 22 12:57:58 2013"}, {:id=>"1000021494", :name=>"store3.eng.uk.specsavers.com", :last_checkin=>"Wed Apr 24 13:15:09 2013"}, {:id=>"1000021418", :name=>"store3.eng.uk.specsavers.com", :last_checkin=>"Fri Apr 19 16:46:16 2013"}, {:id=>"1000021563", :name=>"store3.eng.uk.specsavers.com", :last_checkin=>"Wed May 1 12:59:36 2013"}]
|
29
|
+
"""
|
data/lib/buzz.rb
CHANGED
@@ -4,11 +4,12 @@ require 'thor'
|
|
4
4
|
require 'extensions/kernel' unless Kernel.respond_to? 'require_relative'
|
5
5
|
require_relative 'channel'
|
6
6
|
require_relative 'system'
|
7
|
-
|
7
|
+
require_relative 'sif'
|
8
8
|
|
9
|
-
class
|
9
|
+
class BuzzLoader < Sif::Loader
|
10
10
|
|
11
11
|
config_file '.buzz'
|
12
|
+
gem_name 'buzz'
|
12
13
|
|
13
14
|
class_option :host, :aliases => ['-h']
|
14
15
|
class_option :username, :aliases => ['-u']
|
@@ -26,3 +27,4 @@ class Buzz < Sif::Loader
|
|
26
27
|
x.instance_variable_set "@password", x.options[:password] unless x.options[:password].nil?
|
27
28
|
end
|
28
29
|
end
|
30
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "xmlrpc/client"
|
2
|
+
require 'extensions/kernel' unless Kernel.respond_to? 'require_relative'
|
3
|
+
|
4
|
+
module Buzz
|
5
|
+
module Api
|
6
|
+
class ApiBase
|
7
|
+
|
8
|
+
def initialize(server, username, password)
|
9
|
+
@server = server
|
10
|
+
@username = username
|
11
|
+
@password = password
|
12
|
+
@spacewalk = XMLRPC::Client.new(@server, "/rpc/api", 80)
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_key
|
16
|
+
@key = @spacewalk.call("auth.login", @username, @password) unless @key
|
17
|
+
@key
|
18
|
+
end
|
19
|
+
|
20
|
+
def make_call(method_name, *args)
|
21
|
+
|
22
|
+
begin
|
23
|
+
if ( args.length == 0 )
|
24
|
+
|
25
|
+
response = @spacewalk.call(method_name,
|
26
|
+
get_key
|
27
|
+
)
|
28
|
+
else
|
29
|
+
args.unshift(get_key)
|
30
|
+
|
31
|
+
response = @spacewalk.call(method_name,
|
32
|
+
|
33
|
+
*args
|
34
|
+
)
|
35
|
+
end
|
36
|
+
response
|
37
|
+
rescue XMLRPC::FaultException => e
|
38
|
+
puts "Error:"
|
39
|
+
puts e.faultCode
|
40
|
+
puts e.faultString
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
require 'rexml/xpath'
|
3
|
+
require 'extensions/kernel' unless Kernel.respond_to? 'require_relative'
|
4
|
+
require 'buzz/api_base'
|
5
|
+
|
6
|
+
module Buzz
|
7
|
+
module Api
|
8
|
+
class Channel < ApiBase
|
9
|
+
|
10
|
+
def initialize(server, username, password)
|
11
|
+
super(server, username, password)
|
12
|
+
end
|
13
|
+
|
14
|
+
def refresh_channel(channel_label)
|
15
|
+
out = make_call("channel.software.regenerateYumCache", channel_label)
|
16
|
+
out
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
require 'rexml/xpath'
|
3
|
+
require 'extensions/kernel' unless Kernel.respond_to? 'require_relative'
|
4
|
+
require 'buzz/api_base'
|
5
|
+
|
6
|
+
module Buzz
|
7
|
+
module Api
|
8
|
+
class System < ApiBase
|
9
|
+
|
10
|
+
def initialize(server, username, password)
|
11
|
+
super(server, username, password)
|
12
|
+
end
|
13
|
+
|
14
|
+
def list
|
15
|
+
response = make_call("system.listSystems")
|
16
|
+
parse_system_list(response)
|
17
|
+
end
|
18
|
+
|
19
|
+
def list_by_regex(regex)
|
20
|
+
response = make_call("system.searchByName", regex)
|
21
|
+
parse_system_list(response)
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete_systems(system_ids)
|
26
|
+
system_ids = system_ids.respond_to?('collect') ? system_ids.collect { |id| id.to_i} : system_ids.to_i
|
27
|
+
out = make_call("system.deleteSystems", system_ids)
|
28
|
+
out
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def parse_system_list(response)
|
33
|
+
systems = []
|
34
|
+
response.each do |system|
|
35
|
+
id = system['id']
|
36
|
+
name = system['name']
|
37
|
+
last_checkin = system['last_checkin'].to_time.ctime
|
38
|
+
systems << { :id => "#{id}", :name => "#{name}", :last_checkin => "#{last_checkin}" }
|
39
|
+
end
|
40
|
+
systems
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/buzz_api.rb
ADDED
File without changes
|
data/lib/buzz_main.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative 'buzz'
|
2
|
+
|
3
|
+
class BuzzMain
|
4
|
+
def initialize(argv, stdin=STDIN, stdout=STDOUT, stderr=STDERR, kernel=Kernel)
|
5
|
+
@argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
|
6
|
+
end
|
7
|
+
|
8
|
+
def execute!
|
9
|
+
# your code here, assign a value to exitstatus
|
10
|
+
Buzz.start @argv
|
11
|
+
puts "SHIT #{@argv}"
|
12
|
+
@kernel.exit(0)
|
13
|
+
end
|
14
|
+
end
|
data/lib/channel.rb
CHANGED
@@ -2,27 +2,19 @@
|
|
2
2
|
require 'sif'
|
3
3
|
|
4
4
|
require "xmlrpc/client"
|
5
|
+
require 'extensions/kernel' unless Kernel.respond_to? 'require_relative'
|
6
|
+
require 'buzz/channel_api'
|
5
7
|
|
6
8
|
class Channel < Sif::Loader
|
7
9
|
|
8
|
-
desc "
|
10
|
+
desc "refresh CHANNEL_LABEL", "This call allows you to force the re-generation of the YUM cache for the specified channel"
|
9
11
|
def refresh(channel_label)
|
10
|
-
|
12
|
+
|
11
13
|
puts "Regenerating YUM cache for #{channel_label}"
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
out = server.call("channel.software.regenerateYumCache",
|
17
|
-
key,
|
18
|
-
channel_label
|
19
|
-
)
|
20
|
-
puts out
|
21
|
-
rescue XMLRPC::FaultException => e
|
22
|
-
puts "Error:"
|
23
|
-
puts e.faultCode
|
24
|
-
puts e.faultString
|
25
|
-
end
|
14
|
+
channel_api = Buzz::Api::Channel.new(@spacewalk_server, @username, @password)
|
15
|
+
response = channel_api.refresh_channel(channel_label)
|
16
|
+
puts "RES #{response}"
|
17
|
+
|
26
18
|
end
|
27
19
|
|
28
20
|
option :name, :aliases => ['-n']
|
@@ -30,7 +22,7 @@ class Channel < Sif::Loader
|
|
30
22
|
option :arch, :aliases => ['-a']
|
31
23
|
option :parent, :default => '', :aliases => ['-p']
|
32
24
|
option :checksum, :default => 'sha256'
|
33
|
-
desc "
|
25
|
+
desc "create CHANNELNAME [options]", "Creates a new channel"
|
34
26
|
def create(channel_label)
|
35
27
|
server = XMLRPC::Client.new(@spacewalk_server, "/rpc/api", 80)
|
36
28
|
puts "Creating #{channel_label}"
|
data/lib/sif.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Sif
|
5
|
+
class Loader < Thor
|
6
|
+
|
7
|
+
def initialize(args=[], options={}, config={})
|
8
|
+
super
|
9
|
+
if (options[0] == '--version')
|
10
|
+
version = Gem.loaded_specs[@@gem_name].version
|
11
|
+
rel_date = Gem.loaded_specs[@@gem_name].date.strftime("%A %d %B %Y")
|
12
|
+
puts "#{@@gem_name } version #{version} (released #{rel_date})"
|
13
|
+
exit 0
|
14
|
+
end
|
15
|
+
load_configuration
|
16
|
+
end
|
17
|
+
|
18
|
+
class_option :version
|
19
|
+
|
20
|
+
class_option :config, :aliases => ['-c']
|
21
|
+
@@config_file = '.config'
|
22
|
+
|
23
|
+
@@post_config = nil
|
24
|
+
|
25
|
+
no_tasks do
|
26
|
+
def load_configuration
|
27
|
+
|
28
|
+
config_file = options[:config] || "#{ENV['HOME']}/#{@@config_file}"
|
29
|
+
|
30
|
+
if (!File.exists?(config_file) )
|
31
|
+
puts "Unable to find config file #{config_file} - can't continue"
|
32
|
+
exit
|
33
|
+
end
|
34
|
+
|
35
|
+
config = YAML::load_file config_file
|
36
|
+
|
37
|
+
config.each do |k,v|
|
38
|
+
instance_variable_set "@#{k}",v
|
39
|
+
end
|
40
|
+
|
41
|
+
if ( @@post_config )
|
42
|
+
@@post_config.call self
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.gem_name(gem_name)
|
48
|
+
@@gem_name = gem_name
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.config_file(filename)
|
52
|
+
@@config_file = filename
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.further_config(&block)
|
56
|
+
@@post_config = block
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
data/lib/system.rb
CHANGED
@@ -3,10 +3,12 @@ require 'sif'
|
|
3
3
|
require 'rexml/document'
|
4
4
|
require 'rexml/xpath'
|
5
5
|
require "xmlrpc/client"
|
6
|
+
require 'extensions/kernel' unless Kernel.respond_to? 'require_relative'
|
7
|
+
require 'buzz/system_api'
|
6
8
|
|
7
9
|
class System < Sif::Loader
|
8
10
|
|
9
|
-
desc "
|
11
|
+
desc "deleteself", "Delete this system from Spacewalk"
|
10
12
|
def deleteself
|
11
13
|
server = XMLRPC::Client.new(@spacewalk_server, "/rpc/api", 80)
|
12
14
|
systemid_file_path = '/etc/sysconfig/rhn/systemid'
|
@@ -23,11 +25,13 @@ class System < Sif::Loader
|
|
23
25
|
|
24
26
|
end
|
25
27
|
|
26
|
-
desc "
|
27
|
-
def delete(systemid)
|
28
|
+
desc "delete SYSTEM_ID", "Delete the specified system from Spacewalk"
|
29
|
+
def delete(*systemid)
|
28
30
|
|
29
31
|
puts "Delete this system from spacewalk - ID #{systemid}"
|
30
|
-
|
32
|
+
system_api = Buzz::Api::System.new(@spacewalk_server, @username, @password)
|
33
|
+
response = system_api.delete_systems(systemid)
|
34
|
+
puts "RESP #{response}"
|
31
35
|
|
32
36
|
end
|
33
37
|
|
@@ -37,7 +41,7 @@ class System < Sif::Loader
|
|
37
41
|
puts "HOST #{@spacewalk_server} #{parent_options} #{@lol}"
|
38
42
|
end
|
39
43
|
|
40
|
-
desc "
|
44
|
+
desc "list", "List all subscribed systems"
|
41
45
|
def list
|
42
46
|
server = XMLRPC::Client.new(@spacewalk_server, "/rpc/api", 80)
|
43
47
|
begin
|
@@ -47,6 +51,7 @@ class System < Sif::Loader
|
|
47
51
|
key
|
48
52
|
)
|
49
53
|
systems = []
|
54
|
+
puts "REP #{response}"
|
50
55
|
response.each do |system|
|
51
56
|
id = system['id']
|
52
57
|
name = system['name']
|
@@ -60,20 +65,20 @@ class System < Sif::Loader
|
|
60
65
|
end
|
61
66
|
end
|
62
67
|
|
63
|
-
desc "
|
68
|
+
desc "list_by_regex", "list"
|
64
69
|
def list_by_regex(regex)
|
65
70
|
|
66
71
|
systems = find_systems_by_regex(regex)
|
67
72
|
systems.each do |system|
|
68
73
|
id = system['id']
|
69
74
|
name = system['name']
|
70
|
-
last_checkin = system['last_checkin'].to_time
|
75
|
+
last_checkin = system['last_checkin'].to_time.ctime
|
71
76
|
puts "System: ID: #{id} name: #{name} last checked in: #{last_checkin}"
|
72
77
|
end
|
73
78
|
|
74
79
|
end
|
75
80
|
|
76
|
-
desc "
|
81
|
+
desc "delete_by_regex", "Delete all systems whose name matches the regex supplied"
|
77
82
|
def delete_by_regex(regex)
|
78
83
|
systems_to_delete = find_systems_by_regex regex
|
79
84
|
system_ids = systems_to_delete.collect { |system| system['id']}
|
@@ -122,4 +127,4 @@ class System < Sif::Loader
|
|
122
127
|
|
123
128
|
end
|
124
129
|
|
125
|
-
end
|
130
|
+
end
|
data/spec/channel_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,16 +1 @@
|
|
1
|
-
|
2
|
-
ARGV.clear
|
3
|
-
|
4
|
-
def capture(stream)
|
5
|
-
begin
|
6
|
-
stream = stream.to_s
|
7
|
-
eval "$#{stream} = StringIO.new"
|
8
|
-
yield
|
9
|
-
result = eval("$#{stream}").string
|
10
|
-
ensure
|
11
|
-
eval("$#{stream} = $#{stream.upcase}")
|
12
|
-
end
|
13
|
-
|
14
|
-
result
|
15
|
-
end
|
16
|
-
|
1
|
+
require 'vcr'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: buzz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: webmock
|
@@ -149,6 +149,7 @@ extra_rdoc_files:
|
|
149
149
|
- README.md
|
150
150
|
files:
|
151
151
|
- .document
|
152
|
+
- .travis.yml
|
152
153
|
- Gemfile
|
153
154
|
- Gemfile.lock
|
154
155
|
- LICENSE.txt
|
@@ -159,13 +160,26 @@ files:
|
|
159
160
|
- buzz
|
160
161
|
- buzz.gemspec
|
161
162
|
- conf/.buzz
|
162
|
-
- features/
|
163
|
-
- features/
|
164
|
-
- features/
|
163
|
+
- features/channel_api.feature
|
164
|
+
- features/fixtures/vcr_cassettes/delete_system.yml
|
165
|
+
- features/fixtures/vcr_cassettes/list_systems.yml
|
166
|
+
- features/fixtures/vcr_cassettes/list_systems_by_regex.yml
|
167
|
+
- features/fixtures/vcr_cassettes/refresh_channel.yml
|
168
|
+
- features/step_definitions/buzz_steps.rb
|
169
|
+
- features/step_definitions/spacewalk_steps.rb
|
165
170
|
- features/support/env.rb
|
171
|
+
- features/support/vcr.rb
|
172
|
+
- features/system_api.feature
|
166
173
|
- lib/buzz.rb
|
174
|
+
- lib/buzz/api_base.rb
|
175
|
+
- lib/buzz/channel_api.rb
|
176
|
+
- lib/buzz/system_api.rb
|
177
|
+
- lib/buzz_api.rb
|
178
|
+
- lib/buzz_main.rb
|
167
179
|
- lib/channel.rb
|
180
|
+
- lib/sif.rb
|
168
181
|
- lib/system.rb
|
182
|
+
- sample_config/complete.yaml
|
169
183
|
- spec/channel_spec.rb
|
170
184
|
- spec/spec_helper.rb
|
171
185
|
- test/helper.rb
|
@@ -185,7 +199,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
185
199
|
version: '0'
|
186
200
|
segments:
|
187
201
|
- 0
|
188
|
-
hash:
|
202
|
+
hash: -244473495629815018
|
189
203
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
204
|
none: false
|
191
205
|
requirements:
|
data/features/exit.feature
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
Feature: exit statuses
|
2
|
-
|
3
|
-
In order to specify expected exit statuws
|
4
|
-
As a developer using Cucumber
|
5
|
-
I want to use the "the exit status should be" step
|
6
|
-
|
7
|
-
Scenario: exit status of 0
|
8
|
-
When I run "ruby -h"
|
9
|
-
Then the exit status should be 0
|
10
|
-
|
11
|
-
Scenario: non-zero exit status
|
12
|
-
When I run "ruby -e 'exit 55'"
|
13
|
-
Then the exit status should be 55
|
data/features/help.feature
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
Feature: Get help
|
2
|
-
|
3
|
-
|
4
|
-
Scenario: Help
|
5
|
-
Given I provide no options
|
6
|
-
Then I should see
|
7
|
-
"""
|
8
|
-
Commands:
|
9
|
-
buzz channel # Manipulate Spacewalk channels
|
10
|
-
buzz help [COMMAND] # Describe available commands or one specific command
|
11
|
-
buzz system # Manipulate Spacewalk systems
|
12
|
-
|
13
|
-
Options:
|
14
|
-
-c, [--config=CONFIG]
|
15
|
-
-h, [--host=HOST]
|
16
|
-
-u, [--username=USERNAME]
|
17
|
-
-p, [--password=PASSWORD]
|
18
|
-
"""
|
@@ -1,16 +0,0 @@
|
|
1
|
-
Given /^I start the app with "([^\"]*)"$/ do |command|
|
2
|
-
@io = StringIO.new
|
3
|
-
@app = Buzz.start(command.split(/\s+/), @io)
|
4
|
-
end
|
5
|
-
|
6
|
-
Given(/^I provide no options$/) do
|
7
|
-
@app = Buzz.start([])
|
8
|
-
end
|
9
|
-
|
10
|
-
Then(/^I should see$/) do |string|
|
11
|
-
pending # express the regexp above with the code you wish you had
|
12
|
-
end
|
13
|
-
|
14
|
-
Then /^the exit status should be (\d+)$/ do |exit_status|
|
15
|
-
@last_exit_status.should == exit_status.to_i
|
16
|
-
end
|