nailed 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c61db81e9588903795209716ac504caa4fa7df0
4
- data.tar.gz: 0125349b98cc888829ec79dc9cf02a1eadcf5efa
3
+ metadata.gz: c558f13601ace2b9d76d18bea2f96e2cb8f731cd
4
+ data.tar.gz: e7f14b357926f916503a6b92f2f688dfcd8cf694
5
5
  SHA512:
6
- metadata.gz: aa3b37beae82df9904e92b6d41dc81aafe0b14d8931162d0ac222fb820ac4a0c11c486af9eae24967002f0ef374223491eb0900c491ebb01f9a66208f7853d18
7
- data.tar.gz: 3313f9300db5e555f6dac533695086e9622137099335d5bf3acd22a1d9dbbb51e0d9dfaa0c183bb35a0ebdfe320f69e0ea01c54fe27d0070206fd3f568e9fdfc
6
+ metadata.gz: 9cf648116e6b619c9824142f484da4c640e07508063d0a19f79c586fd922a3e9297ea855afc2f3c6a008b875f62a6646445dfc5f8cefbb41f6b040d8d05b3862
7
+ data.tar.gz: 90f90c6cfaa4728a023870586b0d043ecf401993aa1ece8debba37a4f8ffb0f980956cf74a9ef1164fc3fcd430f07d8a6ef364f6d7e4a1cf74015205917df7b0
data/README.md CHANGED
@@ -1,3 +1,4 @@
1
+ [![Code Climate](https://codeclimate.com/github/MaximilianMeister/nailed/badges/gpa.svg)](https://codeclimate.com/github/MaximilianMeister/nailed)
1
2
  ## What is nailed?
2
3
 
3
4
  `nailed` consists of a back-end CLI for data collection and a sinatra based web front-end for visualization of relevant development data of Products that have their bugtracker on Bugzilla and (optionally) their codebase on GitHub.
@@ -53,6 +54,7 @@ All configuration is read from `config/config.yml`
53
54
 
54
55
  ``` yaml
55
56
  ---
57
+ debug: # true for debugging
56
58
  title: # Give me a name, or (default) call me Dashboard
57
59
  port: # Specify a port where you can reach the webinterface, or (default) 4567
58
60
  bugzilla:
data/README.rdoc CHANGED
@@ -1,3 +1,4 @@
1
+ {<img src="https://codeclimate.com/github/MaximilianMeister/nailed/badges/gpa.svg" />}[https://codeclimate.com/github/MaximilianMeister/nailed]
1
2
  = nailed
2
3
  == What is nailed?
3
4
 
@@ -47,6 +48,7 @@ You can use nailed directly from a git checkout as well. Make sure to fetch the
47
48
  All configuration is read from +config/products.yml+
48
49
 
49
50
  ---
51
+ debug: # true for debugging
50
52
  title: # Give me a name, or (default) call me Dashboard
51
53
  port: # Specify a port where you can reach the webinterface, or (default) 4567
52
54
  bugzilla:
data/bin/nailed CHANGED
@@ -77,7 +77,6 @@ opts.each_pair do |key,val|
77
77
  end
78
78
  when :github
79
79
  if val
80
- github_client.update_pull_states
81
80
  github_client.get_open_pulls
82
81
  end
83
82
  when :list
data/config/config.yml CHANGED
@@ -1,15 +1,93 @@
1
1
  ---
2
- title: # Give me a name, or (default) call me Dashboard
3
- port: # Specify a port where you can reach the webinterface, or (default) 4567
2
+ debug: true
3
+ title: SUSE Cloud Team
4
+ port: 8080
4
5
  bugzilla:
5
- url: # Url of your Bugzilla instance
6
+ url: https://bugzilla.novell.com
6
7
  products:
7
- example_product: # Just a a short key/name for the product (can be arbitrary)
8
+ cloud:
8
9
  versions:
9
- # Array of Bugzilla products (typically different versions of one product)
10
- # Exact names have to be given, as they appear in Bugzilla (can not be arbitrary)
11
- organization: # here goes the organization name (under which your repos are hosted) as it appears in GitHub
10
+ - SUSE Cloud 3
11
+ - SUSE Cloud 4
12
+ - SUSE Cloud 5
13
+ - SUSE OpenStack Cloud 6
14
+ organization: crowbar
12
15
  repos:
13
- # Array of GitHub repository names, as they appear in GitHub
14
- # query available repos with nailed -l <organization>
15
- # continue adding more products here
16
+ - crowbar
17
+ - barclamp-crowbar
18
+ - barclamp-deployer
19
+ - barclamp-dns
20
+ - barclamp-ganglia
21
+ - barclamp-ipmi
22
+ - barclamp-logging
23
+ - barclamp-nagios
24
+ - barclamp-network
25
+ - barclamp-ntp
26
+ - barclamp-provisioner
27
+ - barclamp-redhat-install
28
+ - barclamp-test
29
+ - barclamp-ubuntu-install
30
+ - barclamp-glance
31
+ - barclamp-nova
32
+ - barclamp-swift
33
+ - barclamp-keystone
34
+ - barclamp-mysql
35
+ - barclamp-kong
36
+ - barclamp-nova_dashboard
37
+ - barclamp-openstack
38
+ - barclamp-hadoop
39
+ - barclamp-hive
40
+ - barclamp-pig
41
+ - barclamp-zookeeper
42
+ - barclamp-sqoop
43
+ - barclamp-quantum
44
+ - barclamp-clouderamanager
45
+ - barclamp-ApacheHadoop
46
+ - barclamp-postgresql
47
+ - barclamp-tempest
48
+ - barclamp-database
49
+ - barclamp-git
50
+ - barclamp-cinder
51
+ - barclamp-dell_bios
52
+ - barclamp-dell_raid
53
+ - barclamp-chef
54
+ - crowbar.github.com
55
+ - crowbar-utils
56
+ - ci-tracking
57
+ - barclamp-example
58
+ - travis-ci-crowbar
59
+ - barclamp-loadbalancer
60
+ - barclamp-ceilometer
61
+ - barclamp-rabbitmq
62
+ - raw.crowbar.github.com
63
+ - barclamp-inteltxt
64
+ - barclamp-cisco-ucs
65
+ - barclamp-heat
66
+ - barclamp-openstack-titanium-block-storage
67
+ - barclamp-openstack-titanium-compute
68
+ - barclamp-openstack-titanium-identity
69
+ - barclamp-openstack-titanium-object-storage
70
+ - barclamp-openstack-titanium-dashboard
71
+ - barclamp-openstack-titanium-image
72
+ - barclamp-openstack-titanium-network
73
+ - barclamp-openstack-titanium-database
74
+ - barclamp-openstack-titanium-messaging
75
+ - barclamp-openstack-titanium-loadbalancer
76
+ - barclamp-openstack-titanium-base
77
+ - barclamp-neutron
78
+ - barclamp-hadoop_infrastructure
79
+ - barclamp-ceph
80
+ - barclamp-pacemaker
81
+ - barclamp-trove
82
+ - barclamp-messaging
83
+ - barclamp-hyperv-compute
84
+ - barclamp-updater
85
+ - barclamp-suse-manager-client
86
+ - barclamp-nfs_client
87
+ - barclamp-raid
88
+ - barclamp-bios
89
+ - wsman
90
+ cloud-tools:
91
+ organization: SUSE-Cloud
92
+ repos:
93
+ - automation
data/lib/nailed.rb CHANGED
@@ -2,143 +2,19 @@ require 'logger'
2
2
  require 'yaml'
3
3
  require "octokit"
4
4
  require "bicho"
5
+ require_relative "nailed/bugzilla"
6
+ require_relative "nailed/github"
7
+ require_relative "nailed/version"
5
8
  require File.join(File.expand_path("..", File.dirname(__FILE__)),"db","database")
6
9
 
7
10
  module Nailed
8
11
  LOGGER = Logger.new(File.join(File.expand_path("..", File.dirname(__FILE__)),"log","nailed.log"))
9
12
 
10
- class Bugzilla
11
- def initialize
12
- Bicho.client = Bicho::Client.new(Nailed.get_config["bugzilla"]["url"])
13
- end
14
-
15
- def get_bugs
16
- Nailed.get_config["products"].each do |product,values|
17
- values["versions"].each do |version|
18
- begin
19
- Bicho::Bug.where(:product => version).each do |bug|
20
- attributes = {
21
- :bug_id => bug.id,
22
- :summary => bug.summary,
23
- :status => bug.status,
24
- :is_open => bug.is_open,
25
- :product_name => bug.product,
26
- :component => bug.component,
27
- :severity => bug.severity,
28
- :priority => bug.priority,
29
- :whiteboard => bug.whiteboard,
30
- :assigned_to => bug.assigned_to,
31
- :creation_time => "#{bug.creation_time.to_date}T#{bug.creation_time.hour}:#{bug.creation_time.min}:#{bug.creation_time.sec}+00:00",
32
- :last_change_time => "#{bug.last_change_time.to_date}T#{bug.last_change_time.hour}:#{bug.last_change_time.min}:#{bug.last_change_time.sec}+00:00",
33
- :url => bug.url.gsub(/novell.com\//,'suse.com/show_bug.cgi?id=')
34
- }
35
-
36
- db_handler = (Bugreport.get(bug.id) || Bugreport.new).update(attributes)
37
- end
38
- rescue
39
- Nailed.log("error","Could not fetch Bugs for #{version}.")
40
- end
41
- end unless values["versions"].nil?
42
- end
43
- end
44
-
45
- def write_bug_trends
46
- Nailed.get_config["products"].each do |product,values|
47
- values["versions"].each do |version|
48
- open = Bugreport.count(:is_open => true, :product_name => version)
49
- fixed = Bugreport.count(:status => "VERIFIED", :product_name => version) + \
50
- Bugreport.count(:status => "RESOLVED", :product_name => version)
51
- db_handler = Bugtrend.first_or_create(
52
- :time => Time.new.strftime("%Y-%m-%d %H:%M:%S"),
53
- :open => open,
54
- :fixed => fixed,
55
- :product_name => version
56
- )
57
-
58
- Nailed.save_state(db_handler)
59
- end unless values["versions"].nil?
60
- end
61
- end
62
-
63
- def write_l3_trends
64
- open = 0
65
- Nailed.get_config["products"].each do |product,values|
66
- values["versions"].each do |version|
67
- open += Bugreport.count(:product_name => version, :whiteboard.like => "%openL3%", :is_open => true)
68
- end unless values["versions"].nil?
69
- end
70
- db_handler = L3Trend.first_or_create(
71
- :time => Time.new.strftime("%Y-%m-%d %H:%M:%S"),
72
- :open => open
73
- )
74
-
75
- Nailed.save_state(db_handler)
76
- end
77
- end
78
-
79
- class Github
80
- attr_reader :client
81
-
82
- def initialize
83
- Octokit.auto_paginate = true
84
- @client = Octokit::Client.new(:netrc => true)
85
- end
86
-
87
- def get_open_pulls
88
- Nailed.get_config["products"].each do |product,values|
89
- organization = values["organization"]
90
- repos = values["repos"]
91
- repos.each do |repo|
92
- pulls = @client.pull_requests("#{organization}/#{repo}")
93
- pulls.each do |pr|
94
- db_handler = Pullrequest.first_or_create(
95
- :pr_number => pr.number,
96
- :title => pr.title,
97
- :state => pr.state,
98
- :url => pr.html_url,
99
- :created_at => pr.created_at,
100
- :repository_rname => repo
101
- )
102
-
103
- Nailed.save_state(db_handler)
104
- end unless pulls.empty?
105
- write_pull_trends(repo)
106
- end unless repos.nil?
107
- end
108
- end
109
-
110
- def update_pull_states
111
- pulls = Pullrequest.all
112
- pulls.each do |db_pull|
113
- number = db_pull.pr_number
114
- repo = db_pull.repository_rname
115
- org = Repository.get(repo).organization_oname
116
- github_pull = @client.pull_request("#{org}/#{repo}", number)
117
- if github_pull.state == "closed"
118
- db_pull.destroy
119
- end
120
- end
121
- end
122
-
123
- def write_pull_trends(repo)
124
- open = Pullrequest.count(:repository_rname => repo)
125
- db_handler = Pulltrend.first_or_create(
126
- :time => Time.new.strftime("%Y-%m-%d %H:%M:%S"),
127
- :open => open,
128
- :repository_rname => repo
129
- )
130
-
131
- Nailed.save_state(db_handler)
132
- end
133
- end
134
-
135
13
  extend self
136
- # Generic methods
137
14
  def log(level,msg)
138
- if level == "error"
139
- LOGGER.error(msg)
140
- else
141
- LOGGER.info(msg)
15
+ if get_config["debug"]
16
+ LOGGER.error(msg) if level == "error"
17
+ LOGGER.info(msg) if level == "info"
142
18
  end
143
19
  end
144
20
 
@@ -181,8 +57,8 @@ module Nailed
181
57
 
182
58
  def save_state(db_handler)
183
59
  unless db_handler.save
184
- puts("ERROR: see logfile")
185
- log("error", db_handler.errors.inspect)
60
+ puts("ERROR: #{__method__}: see logfile")
61
+ log("error", "#{__method__}: #{db_handler.errors.inspect}")
186
62
  end
187
63
  end
188
64
  end
@@ -0,0 +1,76 @@
1
+ module Nailed
2
+ class Bugzilla
3
+ def initialize
4
+ Bicho.client = Bicho::Client.new(Nailed.get_config["bugzilla"]["url"])
5
+ end
6
+
7
+ def get_bugs
8
+ Nailed.get_config["products"].each do |product,values|
9
+ values["versions"].each do |version|
10
+ Nailed.log("info", "#{__method__}: Fetching bugs for #{version}")
11
+ begin
12
+ Bicho::Bug.where(:product => version).each do |bug|
13
+ attributes = {
14
+ :bug_id => bug.id,
15
+ :summary => bug.summary,
16
+ :status => bug.status,
17
+ :is_open => bug.is_open,
18
+ :product_name => bug.product,
19
+ :component => bug.component,
20
+ :severity => bug.severity,
21
+ :priority => bug.priority,
22
+ :whiteboard => bug.whiteboard,
23
+ :assigned_to => bug.assigned_to,
24
+ :creation_time => "#{bug.creation_time.to_date}T#{bug.creation_time.hour}:#{bug.creation_time.min}:#{bug.creation_time.sec}+00:00",
25
+ :last_change_time => "#{bug.last_change_time.to_date}T#{bug.last_change_time.hour}:#{bug.last_change_time.min}:#{bug.last_change_time.sec}+00:00",
26
+ :url => bug.url.gsub(/novell.com\//,'suse.com/show_bug.cgi?id=')
27
+ }
28
+
29
+ db_handler = (Bugreport.get(bug.id) || Bugreport.new).update(attributes)
30
+ Nailed.log("info", "#{__method__}: Saved #{attributes.inspect}")
31
+ end
32
+ rescue
33
+ Nailed.log("error","Could not fetch Bugs for #{version}.")
34
+ end
35
+ end unless values["versions"].nil?
36
+ end
37
+ end
38
+
39
+ def write_bug_trends
40
+ Nailed.get_config["products"].each do |product,values|
41
+ values["versions"].each do |version|
42
+ Nailed.log("info", "#{__method__}: Writing bug trends for #{version}")
43
+ open = Bugreport.count(:is_open => true, :product_name => version)
44
+ fixed = Bugreport.count(:status => "VERIFIED", :product_name => version) + \
45
+ Bugreport.count(:status => "RESOLVED", :product_name => version)
46
+ attributes = {:time => Time.new.strftime("%Y-%m-%d %H:%M:%S"),
47
+ :open => open,
48
+ :fixed => fixed,
49
+ :product_name => version}
50
+
51
+ db_handler = Bugtrend.first_or_create(attributes)
52
+
53
+ Nailed.save_state(db_handler)
54
+ Nailed.log("info", "#{__method__}: Saved #{attributes.inspect}")
55
+ end unless values["versions"].nil?
56
+ end
57
+ end
58
+
59
+ def write_l3_trends
60
+ open = 0
61
+ Nailed.get_config["products"].each do |product,values|
62
+ values["versions"].each do |version|
63
+ Nailed.log("info", "#{__method__}: Aggregating l3 trends for #{version}")
64
+ open += Bugreport.count(:product_name => version, :whiteboard.like => "%openL3%", :is_open => true)
65
+ end unless values["versions"].nil?
66
+ end
67
+ attributes = {:time => Time.new.strftime("%Y-%m-%d %H:%M:%S"),
68
+ :open => open}
69
+
70
+ db_handler = L3Trend.first_or_create(attributes)
71
+
72
+ Nailed.save_state(db_handler)
73
+ Nailed.log("info", "#{__method__}: Saved #{attributes.inspect}")
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,64 @@
1
+ module Nailed
2
+ class Github
3
+ attr_reader :client
4
+
5
+ def initialize
6
+ Octokit.auto_paginate = true
7
+ @client = Octokit::Client.new(:netrc => true)
8
+ end
9
+
10
+ def get_open_pulls
11
+ Nailed.get_config["products"].each do |product,values|
12
+ organization = values["organization"]
13
+ repos = values["repos"]
14
+ repos.each do |repo|
15
+ Nailed.log("info", "#{__method__}: Getting open pullrequests for #{organization}/#{repo}")
16
+ pulls = @client.pull_requests("#{organization}/#{repo}")
17
+ pulls.each do |pr|
18
+ attributes = {:pr_number => pr.number,
19
+ :title => pr.title,
20
+ :state => pr.state,
21
+ :url => pr.html_url,
22
+ :created_at => pr.created_at,
23
+ :repository_rname => repo}
24
+
25
+ # if pr exists dont create a new record
26
+ pull_to_update = Pullrequest.all(:pr_number => pr.number, :repository_rname => repo)
27
+ if pull_to_update
28
+ if pr.state == "closed"
29
+ # delete record if pr.state changed to "closed"
30
+ pull_to_update.destroy
31
+ Nailed.log("info", "#{__method__}: Destroyed closed pullrequest #{pr.repo} ##{pr.number}")
32
+ else
33
+ # update saves the state, so we dont need a db_handler
34
+ # TODO check return code for true if saved correctly
35
+ pull_to_update.update(attributes)
36
+ Nailed.log("info", "#{__method__}: Updated #{pr.repo} ##{pr.number} with #{attributes.inspect}")
37
+ end
38
+ else
39
+ db_handler = Pullrequest.first_or_create(attributes)
40
+ Nailed.log("info", "#{__method__}: Created new pullrequest #{pr.repo} ##{pr.number} with #{attributes.inspect}")
41
+ end
42
+
43
+ Nailed.save_state(db_handler) unless defined? db_handler
44
+ Nailed.log("info", "#{__method__}: Saved #{attributes.inspect}")
45
+ end unless pulls.empty?
46
+ write_pull_trends(repo)
47
+ end unless repos.nil?
48
+ end
49
+ end
50
+
51
+ def write_pull_trends(repo)
52
+ Nailed.log("info", "#{__method__}: Writing pull trends for #{repo}")
53
+ open = Pullrequest.count(:repository_rname => repo)
54
+ attributes = {:time => Time.new.strftime("%Y-%m-%d %H:%M:%S"),
55
+ :open => open,
56
+ :repository_rname => repo}
57
+
58
+ db_handler = Pulltrend.first_or_create(attributes)
59
+
60
+ Nailed.save_state(db_handler)
61
+ Nailed.log("info", "#{__method__}: Saved #{attributes.inspect}")
62
+ end
63
+ end
64
+ end