bellows 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ * Thu Dec 3 2011 Dan Prince <dan.prince@rackspace.com> - 1.0.5
2
+ - Add 'fire' task to run jobs for reviews without results.
3
+ - Add --quiet option to all tasks.
4
+
1
5
  * Thu Nov 17 2011 Dan Prince <dan.prince@rackspace.com> - 1.0.4
2
6
  - Explicitly set config templates and tests on sync.
3
7
  - All --all option to sync command. Remove 'reconfig' task.
data/Gemfile CHANGED
@@ -10,4 +10,5 @@ group :development do
10
10
  gem "jeweler", "~> 1.6.4"
11
11
  gem "thor", "~> 0.14.6"
12
12
  gem "json", "~> 1.4.6"
13
+ gem "mocha", "~> 0.9.9"
13
14
  end
data/README.md CHANGED
@@ -34,6 +34,7 @@ Examples
34
34
  Available bellows tasks:
35
35
 
36
36
  Tasks:
37
+ bellows fire PROJECT # Run jobs for reviews without results.
37
38
  bellows help [TASK] # Describe available tasks or one specific task
38
39
  bellows purge PROJECT # Purge merged reviews from SmokeStack
39
40
  bellows sync PROJECT # Create tests & update refspecs for active reviews.
@@ -50,6 +51,10 @@ Sync test suite choices for active reviews in SmokeStack (based on the selection
50
51
 
51
52
  bellows sync nova --all
52
53
 
54
+ Fire tests for reviews without results (3 at a time):
55
+
56
+ bellows fire nova --limit=3
57
+
53
58
  All commands support creating and maintaining test configs for nova, glance, and keystone.
54
59
 
55
60
  License
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.4
1
+ 1.0.5
@@ -3,9 +3,13 @@ require 'json'
3
3
  module Bellows
4
4
  class Gerrit
5
5
 
6
+ def self.run_cmd(command)
7
+ return %x{ssh review gerrit #{command}}
8
+ end
9
+
6
10
  def self.reviews(project, status="open", branch="master")
7
11
  reviews = []
8
- out=%x{ssh review gerrit query "status: #{status}" --current-patch-set --format JSON}
12
+ out=Gerrit.run_cmd(%{query "status: #{status}" --current-patch-set --format JSON})
9
13
  out.each_line do |line|
10
14
  data = JSON.parse(line)
11
15
  if data['project'] and data['project'] == "openstack/#{project}" and data['branch'] and data['branch'] == branch
@@ -5,16 +5,20 @@ require 'bellows/util'
5
5
  module Bellows
6
6
  class SmokeStack
7
7
 
8
- def self.get_smoke_tests(project)
9
- smoke_tests = {}
8
+ def self.jobs()
9
+ JSON.parse(Bellows::HTTP.get("/jobs.json?limit=10000"))
10
+ end
11
+
12
+ def self.smoke_tests(project)
13
+ tests = {}
10
14
  data = JSON.parse(Bellows::HTTP.get("/smoke_tests.json"))
11
15
  data.each do |item|
12
16
  branch = item['smoke_test']["#{project}_package_builder"]['branch']
13
17
  if branch and not branch.empty? then
14
- smoke_tests.store(Bellows::Util.short_spec(branch), item['smoke_test'])
18
+ tests.store(Bellows::Util.short_spec(branch), item['smoke_test'])
15
19
  end
16
20
  end
17
- smoke_tests
21
+ tests
18
22
  end
19
23
 
20
24
  def self.format_request(smoke_test)
@@ -36,7 +40,7 @@ module Bellows
36
40
  end
37
41
 
38
42
  def self.update_smoke_test(id, updates={})
39
-
43
+
40
44
  data = JSON.parse(Bellows::HTTP.get("/smoke_tests/#{id}.json"))
41
45
  ['nova', 'glance', 'keystone'].each do |proj|
42
46
  if updates["#{proj}_package_builder"]
data/lib/bellows/tasks.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'set'
2
3
  require 'bellows/http'
3
4
  require 'bellows/util'
4
5
  require 'bellows/gerrit'
@@ -10,14 +11,12 @@ module Bellows
10
11
  desc "sync PROJECT", "Create tests & update refspecs for active reviews."
11
12
  method_options :test => :boolean
12
13
  method_options :all => :boolean
13
- def sync(project)
14
- if not ['nova', 'glance', 'keystone'].include?(project) then
15
- puts "ERROR: Please specify a valid project name."
16
- exit 1
17
- end
14
+ method_options :quiet => :boolean
15
+ def sync(project, options=(options or {}))
16
+ Util.validate_project(project)
18
17
  test = options[:test]
19
18
  all = options[:all]
20
- smoke_tests = Bellows::SmokeStack.get_smoke_tests(project)
19
+ smoke_tests = Bellows::SmokeStack.smoke_tests(project)
21
20
  configs=Util.load_configs
22
21
  test_suite_ids = configs['test_suite_ids'].collect {|x| x.to_s }
23
22
  config_template_ids = configs['config_template_ids'].collect {|x| x.to_s }
@@ -33,11 +32,11 @@ module Bellows
33
32
  Bellows::SmokeStack.create_smoke_test(project, desc, refspec, config_template_ids, test_suite_ids) if not test
34
33
  else
35
34
  if smoke_test["#{project}_package_builder"]['branch'] != refspec then
36
- puts "Updating... " + desc
37
- puts "refspec: " + refspec
35
+ puts "Updating... " + desc if not options[:quiet]
36
+ puts "refspec: " + refspec if not options[:quiet]
38
37
  Bellows::SmokeStack.update_smoke_test(smoke_test['id'], {"#{project}_package_builder" => { "branch" => refspec}, "description" => desc, "status" => "Updated", "test_suite_ids" => test_suite_ids, "config_template_ids" => config_template_ids}) if not test
39
38
  elsif all then
40
- puts "Updating (all)... " + desc
39
+ puts "Updating (all)... " + desc if not options[:quiet]
41
40
  Bellows::SmokeStack.update_smoke_test(smoke_test['id'], {"#{project}_package_builder" => { "branch" => refspec}, "description" => desc, "test_suite_ids" => test_suite_ids, "config_template_ids" => config_template_ids}) if not test
42
41
  end
43
42
  end
@@ -46,13 +45,11 @@ module Bellows
46
45
 
47
46
  desc "purge PROJECT", "Purge merged reviews from SmokeStack"
48
47
  method_options :test => :boolean
49
- def purge(project)
50
- if not ['nova', 'glance', 'keystone'].include?(project) then
51
- puts "ERROR: Please specify a valid project name."
52
- exit 1
53
- end
48
+ method_options :quiet => :boolean
49
+ def purge(project, options=(options or {}))
50
+ Util.validate_project(project)
54
51
  test = options[:test]
55
- smoke_tests = Bellows::SmokeStack.get_smoke_tests(project)
52
+ smoke_tests = Bellows::SmokeStack.smoke_tests(project)
56
53
  reviews = Bellows::Gerrit.reviews(project, "merged")
57
54
  reviews += Bellows::Gerrit.reviews(project, "abandoned")
58
55
  reviews.each do |review|
@@ -61,11 +58,54 @@ module Bellows
61
58
  smoke_test = smoke_tests[review_id]
62
59
  desc = review['owner']['name'] + ": " +review['subject']
63
60
  if smoke_test
64
- puts "Deleting... " + desc
61
+ puts "Deleting... " + desc if not options[:quiet]
65
62
  Bellows::HTTP.delete("/smoke_tests/#{smoke_test['id']}") if not test
66
63
  end
67
64
  end
68
65
  end
69
66
 
67
+ desc "fire PROJECT", "Run jobs for reviews without results."
68
+ method_options :test => :boolean
69
+ method_options :quiet => :boolean
70
+ method_options :limit => :integer
71
+ def fire(project, options=(options or {}))
72
+ Util.validate_project(project)
73
+ test = options[:test]
74
+ limit = options[:limit] || 5
75
+ # jobs indexed by revision
76
+ jobs = Set.new
77
+ Bellows::SmokeStack.jobs.each do |job|
78
+ data = job.values[0]
79
+ if data
80
+ revision = data["#{project}_revision"]
81
+ if revision and not revision.empty?
82
+ jobs.add(revision)
83
+ end
84
+ end
85
+ end
86
+ smoke_tests = Bellows::SmokeStack.smoke_tests(project)
87
+
88
+ count=0
89
+ Bellows::Gerrit.reviews(project) do |review|
90
+ revision = review['currentPatchSet']['revision'][0,7]
91
+ desc = review['owner']['name'] + ": " +review['subject']
92
+ if not jobs.include? revision
93
+ puts "Running ... " + desc if not options[:quiet]
94
+ refspec = review['currentPatchSet']['ref']
95
+ review_id = Bellows::Util.short_spec(refspec)
96
+ smoke_test = smoke_tests[review_id]
97
+ if smoke_test then
98
+ count += 1
99
+ Bellows::HTTP.post("/smoke_tests/#{smoke_test['id']}/run_jobs", {}) if not test
100
+ else
101
+ puts "WARNING: no smoke test exists for: #{refspec}" if not options[:quiet]
102
+ end
103
+ if count >= limit.to_i then
104
+ break
105
+ end
106
+ end
107
+ end
108
+ end
109
+
70
110
  end
71
111
  end
data/lib/bellows/util.rb CHANGED
@@ -43,5 +43,13 @@ module Bellows
43
43
  refspec.sub(/\/[^\/]*$/, "")
44
44
  end
45
45
 
46
+ VALID_PROJECTS = ['nova', 'glance', 'keystone']
47
+ def self.validate_project(project)
48
+ if not VALID_PROJECTS.include?(project) then
49
+ puts "ERROR: Please specify a valid project name."
50
+ exit 1
51
+ end
52
+ end
53
+
46
54
  end
47
55
  end
@@ -0,0 +1,2 @@
1
+ {"project":"openstack/nova","branch":"master","id":"I111111185925d2bab882a34c237819b51838dfae","number":"1234","subject":"Test branch 1","owner":{"name":"Dan Prince","email":"dan.prince@rackspace.com","username":"dprince"},"url":"https://review.openstack.org/1234","lastUpdated":1321970185,"sortKey":"001937240000072e","open":true,"status":"NEW","currentPatchSet":{"number":"1","revision":"1234567b2f935a0626b8de75360ce5d15f01758c","ref":"refs/changes/38/1234/1","uploader":{"name":"Dan Prince","email":"dan.prince@rackspace.com","username":"dprince"},"approvals":[{"type":"CRVW","description":"Code Review","value":"2","grantedOn":1321970185,"by":{"name":"Jimmy Barnes","email":"jimmy.barnes@openstack.com","username":"jbarnes"}},{"type":"CRVW","description":"Code Review","value":"1","grantedOn":1321942411,"by":{"name":"John Smith","email":"john.smith@openstack.org","username":"jsmity"}}]}}
2
+ {"project":"openstack/nova","branch":"master","id":"I222222285925d2bab882a34c237819b51838dfae","number":"5678","subject":"Test branch 2","owner":{"name":"Dan Prince","email":"dan.prince@rackspace.com","username":"dprince"},"url":"https://review.openstack.org/5678","lastUpdated":1321970185,"sortKey":"001937240000072e","open":true,"status":"NEW","currentPatchSet":{"number":"1","revision":"zzzzzzzb2f935a0626b8de75360ce5d15f01758c","ref":"refs/changes/38/5678/1","uploader":{"name":"Dan Prince","email":"dan.prince@rackspace.com","username":"dprince"},"approvals":[{"type":"CRVW","description":"Code Review","value":"2","grantedOn":1321970185,"by":{"name":"Jimmy Barnes","email":"jimmy.barnes@openstack.com","username":"jbarnes"}},{"type":"CRVW","description":"Code Review","value":"1","grantedOn":1321942411,"by":{"name":"John Smith","email":"john.smith@openstack.org","username":"jsmity"}}]}}
@@ -0,0 +1,44 @@
1
+ [
2
+ {
3
+ "job_unit_tester": {
4
+ "config_template_id": null,
5
+ "created_at": "2011-11-28T16:40:43-05:00",
6
+ "id": 4182,
7
+ "job_group_id": 2601,
8
+ "msg": null,
9
+ "nova_revision": "1234567",
10
+ "glance_revision": "1a2b3c4",
11
+ "keystone_revision": "4a5b7c7",
12
+ "status": "Success",
13
+ "updated_at": "2011-11-28T16:40:15-05:00"
14
+ }
15
+ },
16
+ {
17
+ "job_xen_hybrid": {
18
+ "config_template_id": 4,
19
+ "created_at": "2011-11-28T16:40:43-05:00",
20
+ "id": 4181,
21
+ "job_group_id": 2601,
22
+ "msg": null,
23
+ "nova_revision": "1234567",
24
+ "glance_revision": "1a2b3c4",
25
+ "keystone_revision": "4a5b7c7",
26
+ "status": "Success",
27
+ "updated_at": "2011-11-28T16:40:43-05:00"
28
+ }
29
+ },
30
+ {
31
+ "job_vpc": {
32
+ "config_template_id": 1,
33
+ "created_at": "2011-11-28T16:40:42-05:00",
34
+ "id": 4180,
35
+ "job_group_id": 2601,
36
+ "msg": null,
37
+ "nova_revision": "1234567",
38
+ "glance_revision": "1a2b3c4",
39
+ "keystone_revision": "4a5b7c7",
40
+ "status": "Success",
41
+ "updated_at": "2011-11-28T16:40:46-05:00"
42
+ }
43
+ }
44
+ ]
@@ -0,0 +1,3 @@
1
+ [{"smoke_test":{"cookbook_url":"","created_at":"2011-09-27T14:51:35-04:00","description":"Nova trunk","id":331,"status":"Success","unit_tests":false,"updated_at":"2011-12-03T15:09:01-05:00","nova_package_builder":{"branch":"master","created_at":"2011-09-27T14:51:35-04:00","id":681,"merge_trunk":false,"packager_url":"","revision_hash":"","smoke_test_id":331,"updated_at":"2011-09-27T14:51:35-04:00","url":"git://github.com/openstack/nova.git"},"glance_package_builder":{"branch":"master","created_at":"2011-09-27T14:51:35-04:00","id":682,"merge_trunk":false,"packager_url":"","revision_hash":"","smoke_test_id":331,"updated_at":"2011-10-26T13:07:10-04:00","url":"git://github.com/openstack/glance.git"},"keystone_package_builder":{"branch":"master","created_at":"2011-09-27T14:51:35-04:00","id":683,"merge_trunk":false,"packager_url":"","revision_hash":"","smoke_test_id":331,"updated_at":"2011-09-27T14:51:35-04:00","url":"git://github.com/openstack/keystone.git"}}},
2
+ {"smoke_test":{"cookbook_url":"","created_at":"2011-09-27T14:51:35-04:00","description":"Test 1","id":331,"status":"Pending","unit_tests":false,"updated_at":"2011-12-03T15:09:01-05:00","nova_package_builder":{"branch":"refs/changes/38/5678/1","created_at":"2011-09-27T14:51:35-04:00","id":681,"merge_trunk":false,"packager_url":"","revision_hash":"","smoke_test_id":331,"updated_at":"2011-09-27T14:51:35-04:00","url":"git://github.com/openstack/nova.git"},"glance_package_builder":{"branch":"master","created_at":"2011-09-27T14:51:35-04:00","id":682,"merge_trunk":false,"packager_url":"","revision_hash":"","smoke_test_id":331,"updated_at":"2011-10-26T13:07:10-04:00","url":"git://github.com/openstack/glance.git"},"keystone_package_builder":{"branch":"master","created_at":"2011-09-27T14:51:35-04:00","id":683,"merge_trunk":false,"packager_url":"","revision_hash":"","smoke_test_id":331,"updated_at":"2011-09-27T14:51:35-04:00","url":"git://github.com/openstack/keystone.git"}}}
3
+ ]
data/test/helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'bundler'
3
3
  require 'thor'
4
+
4
5
  begin
5
6
  Bundler.setup(:default, :development)
6
7
  rescue Bundler::BundlerError => e
@@ -13,6 +14,12 @@ require 'test/unit'
13
14
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
15
  $LOAD_PATH.unshift(File.dirname(__FILE__))
15
16
  require 'bellows'
17
+ require 'mocha'
18
+
19
+ def fixture_path
20
+ File.expand_path("../fixtures", __FILE__)
21
+ end
16
22
 
17
- class Test::Unit::TestCase
23
+ def fixture(file)
24
+ File.read(fixture_path + '/' + file)
18
25
  end
data/test/test_task.rb ADDED
@@ -0,0 +1,24 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+ require 'helper'
3
+
4
+ class TaskTest < Test::Unit::TestCase
5
+
6
+ def test_fire
7
+
8
+ jobs_data = fixture('jobs.json')
9
+ Bellows::SmokeStack.stubs(:jobs).returns(JSON.parse(jobs_data))
10
+
11
+ smoke_tests_data = fixture('nova_smoke_tests.json')
12
+ Bellows::HTTP.stubs(:get).returns(smoke_tests_data)
13
+
14
+ gerrit_data = fixture('gerrit.json')
15
+ Bellows::Gerrit.stubs(:run_cmd).returns(gerrit_data)
16
+
17
+ response = mock()
18
+ Bellows::HTTP.stubs(:post).returns(response)
19
+ tasks = Bellows::Tasks.new
20
+ tasks.fire('nova', options={:quiet => true})
21
+
22
+ end
23
+
24
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bellows
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 4
10
- version: 1.0.4
9
+ - 5
10
+ version: 1.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Dan Prince
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-11-17 00:00:00 -05:00
18
+ date: 2011-12-03 00:00:00 -05:00
19
19
  default_executable: bellows
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -84,8 +84,24 @@ dependencies:
84
84
  type: :development
85
85
  - !ruby/object:Gem::Dependency
86
86
  prerelease: false
87
- name: json
87
+ name: mocha
88
88
  version_requirements: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ hash: 41
94
+ segments:
95
+ - 0
96
+ - 9
97
+ - 9
98
+ version: 0.9.9
99
+ requirement: *id005
100
+ type: :development
101
+ - !ruby/object:Gem::Dependency
102
+ prerelease: false
103
+ name: json
104
+ version_requirements: &id006 !ruby/object:Gem::Requirement
89
105
  none: false
90
106
  requirements:
91
107
  - - ">="
@@ -94,12 +110,12 @@ dependencies:
94
110
  segments:
95
111
  - 0
96
112
  version: "0"
97
- requirement: *id005
113
+ requirement: *id006
98
114
  type: :runtime
99
115
  - !ruby/object:Gem::Dependency
100
116
  prerelease: false
101
117
  name: thor
102
- version_requirements: &id006 !ruby/object:Gem::Requirement
118
+ version_requirements: &id007 !ruby/object:Gem::Requirement
103
119
  none: false
104
120
  requirements:
105
121
  - - ">="
@@ -108,7 +124,7 @@ dependencies:
108
124
  segments:
109
125
  - 0
110
126
  version: "0"
111
- requirement: *id006
127
+ requirement: *id007
112
128
  type: :runtime
113
129
  description: CLI to drive SmokeStack test creation and maintenance based on Gerrit reviews.
114
130
  email: dan.prince@rackspace.com
@@ -135,7 +151,11 @@ files:
135
151
  - lib/bellows/smoke_stack.rb
136
152
  - lib/bellows/tasks.rb
137
153
  - lib/bellows/util.rb
154
+ - test/fixtures/gerrit.json
155
+ - test/fixtures/jobs.json
156
+ - test/fixtures/nova_smoke_tests.json
138
157
  - test/helper.rb
158
+ - test/test_task.rb
139
159
  - test/test_util.rb
140
160
  has_rdoc: true
141
161
  homepage: http://github.com/dprince/bellows