ampel_extase 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 022ff48198a22a7cfe5cc1420e65700947e0172f
4
+ data.tar.gz: 2f3be2fc324ec1db920c33eec571df7b0f017e99
5
+ SHA512:
6
+ metadata.gz: 609b536235aa262677b606e148e05beb87594fbe356181391bad36a3265ba13ab0f160e9fdc9ab053f79917930c1ddf9d7f225aa375a51e9b3a3889d945ea3ba
7
+ data.tar.gz: 3e8b6f53050e98aa865f977c5c6a410f351bbe5b566780621d667f35d283318f54e5520f3f0fac5db8b4ac155b12c4afe1cd9c9acec6117bce9a6d366587f916
@@ -0,0 +1,9 @@
1
+ .*.sw[pon]
2
+ .DS_Store
3
+ .build
4
+ .bundle
5
+ .rvmrc
6
+ Gemfile.lock
7
+ coverage
8
+ pkg
9
+ tags
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # vim: set filetype=ruby et sw=2 ts=2:
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
File without changes
@@ -0,0 +1,27 @@
1
+ # vim: set filetype=ruby et sw=2 ts=2:
2
+
3
+ require 'gem_hadar'
4
+
5
+ GemHadar do
6
+ name 'ampel_extase'
7
+ author 'Florian Frank'
8
+ email 'flori@ping.de'
9
+ homepage "http://github.com/flori/#{name}"
10
+ summary 'Library to control the build traffic light'
11
+ description "#{summary}. Yes, we can…"
12
+ licenses << 'GPL-2'
13
+ test_dir 'spec'
14
+ ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', '.rvmrc', 'coverage',
15
+ 'tags', '.bundle', '.DS_Store', '.build'
16
+
17
+ readme 'README.md'
18
+ executables.merge Dir['bin/*'].map { |x| File.basename(x) }
19
+
20
+ dependency 'tins', '~>1.0'
21
+ dependency 'socket_switcher'
22
+ development_dependency 'simplecov', '~>0.9'
23
+ development_dependency 'rspec', '~>3.0'
24
+ development_dependency 'byebug'
25
+
26
+ default_task_dependencies :spec
27
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,50 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # stub: ampel_extase 0.0.0 ruby lib
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "ampel_extase"
6
+ s.version = "0.0.0"
7
+
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
+ s.require_paths = ["lib"]
10
+ s.authors = ["Florian Frank"]
11
+ s.date = "2015-01-02"
12
+ s.description = "Library to control the build traffic light. Yes, we can\u{2026}"
13
+ s.email = "flori@ping.de"
14
+ s.executables = ["ampel_control"]
15
+ s.extra_rdoc_files = ["README.md", "lib/ampel_extase.rb", "lib/ampel_extase/build_state.rb", "lib/ampel_extase/controller.rb", "lib/ampel_extase/jenkins_client.rb", "lib/ampel_extase/light_switcher.rb", "lib/ampel_extase/version.rb"]
16
+ s.files = [".gitignore", "Gemfile", "README.md", "Rakefile", "VERSION", "ampel_extase.gemspec", "bin/ampel_control", "lib/ampel_extase.rb", "lib/ampel_extase/build_state.rb", "lib/ampel_extase/controller.rb", "lib/ampel_extase/jenkins_client.rb", "lib/ampel_extase/light_switcher.rb", "lib/ampel_extase/version.rb", "spec/ampel_extase/jenkins_client_spec.rb", "spec/ampel_extase/light_switcher_spec.rb", "spec/spec_helper.rb"]
17
+ s.homepage = "http://github.com/flori/ampel_extase"
18
+ s.licenses = ["GPL-2"]
19
+ s.rdoc_options = ["--title", "AmpelExtase - Library to control the build traffic light", "--main", "README.md"]
20
+ s.rubygems_version = "2.2.2"
21
+ s.summary = "Library to control the build traffic light"
22
+ s.test_files = ["spec/ampel_extase/jenkins_client_spec.rb", "spec/ampel_extase/light_switcher_spec.rb", "spec/spec_helper.rb"]
23
+
24
+ if s.respond_to? :specification_version then
25
+ s.specification_version = 4
26
+
27
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
28
+ s.add_development_dependency(%q<gem_hadar>, ["~> 1.0.0"])
29
+ s.add_development_dependency(%q<simplecov>, ["~> 0.9"])
30
+ s.add_development_dependency(%q<rspec>, ["~> 3.0"])
31
+ s.add_development_dependency(%q<byebug>, [">= 0"])
32
+ s.add_runtime_dependency(%q<tins>, ["~> 1.0"])
33
+ s.add_runtime_dependency(%q<socket_switcher>, [">= 0"])
34
+ else
35
+ s.add_dependency(%q<gem_hadar>, ["~> 1.0.0"])
36
+ s.add_dependency(%q<simplecov>, ["~> 0.9"])
37
+ s.add_dependency(%q<rspec>, ["~> 3.0"])
38
+ s.add_dependency(%q<byebug>, [">= 0"])
39
+ s.add_dependency(%q<tins>, ["~> 1.0"])
40
+ s.add_dependency(%q<socket_switcher>, [">= 0"])
41
+ end
42
+ else
43
+ s.add_dependency(%q<gem_hadar>, ["~> 1.0.0"])
44
+ s.add_dependency(%q<simplecov>, ["~> 0.9"])
45
+ s.add_dependency(%q<rspec>, ["~> 3.0"])
46
+ s.add_dependency(%q<byebug>, [">= 0"])
47
+ s.add_dependency(%q<tins>, ["~> 1.0"])
48
+ s.add_dependency(%q<socket_switcher>, [">= 0"])
49
+ end
50
+ end
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ampel_extase'
4
+
5
+ serial = ENV['SERIAL'] or
6
+ fail 'need env var SERIAL for path to serial port'
7
+ jenkins_url = ENV['JENKINS_URL'] or
8
+ fail 'need env var JENKINS_URL of the form http://test2.local:8080/job/foo'
9
+ sleep_duration = (ENV['SLEEP'] || 10).to_i
10
+
11
+ AmpelExtase::Controller.new(
12
+ serial,
13
+ jenkins_url,
14
+ debug: true,
15
+ sleep: sleep_duration,
16
+ ).start
@@ -0,0 +1,6 @@
1
+ module AmpelExtase
2
+ end
3
+
4
+ require 'tins/xt'
5
+ require 'ampel_extase/version'
6
+ require 'ampel_extase/controller'
@@ -0,0 +1,32 @@
1
+ class AmpelExtase::BuildState
2
+ def self.for(a = nil)
3
+ a ||= [ "N/A", nil ]
4
+ new(*a)
5
+ end
6
+
7
+ def initialize(last_result, is_building)
8
+ @last_result, @is_building = last_result, is_building
9
+ end
10
+
11
+ attr_reader :last_result
12
+
13
+ def building?
14
+ !!@is_building
15
+ end
16
+
17
+ def to_a
18
+ return @last_result, @is_building
19
+ end
20
+
21
+ def ==(other)
22
+ to_a == other.to_a
23
+ end
24
+
25
+ def to_s
26
+ if building?
27
+ "#{@last_result} (building)"
28
+ else
29
+ @last_result.to_s
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ampel_extase/jenkins_client'
4
+ require 'ampel_extase/light_switcher'
5
+ require 'ampel_extase/build_state'
6
+
7
+ class AmpelExtase::Controller
8
+ def initialize(serial, jenkins_url, debug: false, sleep: 10)
9
+ @jenkins = AmpelExtase::JenkinsClient.new(jenkins_url, debug: debug)
10
+ check_jenkins
11
+ @lights = AmpelExtase::LightSwitcher.new(serial, debug: debug)
12
+ check_lights
13
+ @sleep = sleep
14
+ @build_state = AmpelExtase::BuildState.for
15
+ end
16
+
17
+ def start
18
+ puts "starting controller loop"
19
+ loop do
20
+ begin
21
+ perform
22
+ rescue => e
23
+ warn "Caught: #{e.class}: #{e}\n#{e.backtrace * ?\n}"
24
+ crashed
25
+ end
26
+ sleep_duration
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def sleep_duration
33
+ puts "sleep for #@sleep seconds"
34
+ sleep @sleep
35
+ end
36
+
37
+ def perform
38
+ @crashed = false
39
+ on_state_change do |state|
40
+ perform_switch state
41
+ end
42
+ end
43
+
44
+ def perform_switch(state)
45
+ case state.last_result
46
+ when 'SUCCESS'
47
+ @lights.green.on
48
+ @lights.red.off
49
+ when 'FAILURE', 'ABORTED'
50
+ @lights.red.on
51
+ if state.building?
52
+ @lights.green.on
53
+ else
54
+ @lights.green.off
55
+ end
56
+ end
57
+ end
58
+
59
+ def on_state_change
60
+ new_state = AmpelExtase::BuildState.for [ last_result, building? ]
61
+ if new_state == @build_state
62
+ puts "state did not change, is still #@build_state => do nothing"
63
+ else
64
+ puts "state changed from #@build_state to #{new_state} => taking action"
65
+ yield new_state
66
+ end
67
+ ensure
68
+ @build_state = new_state
69
+ end
70
+
71
+ def last_result
72
+ @jenkins.fetch_build(:last_completed_build)['result']
73
+ end
74
+
75
+ def building?
76
+ @jenkins.fetch_build(:last_build)['building']
77
+ end
78
+
79
+ def crashed
80
+ return if @crashed
81
+ for light in @lights
82
+ light.off
83
+ end
84
+ rescue
85
+ ensure
86
+ @crashed = true
87
+ end
88
+
89
+ def check_lights
90
+ puts "checking lights configuration"
91
+ for light in @lights
92
+ light.on
93
+ end
94
+ sleep 1
95
+ for light in @lights
96
+ light.off
97
+ end
98
+ sleep 1
99
+ puts "OK"
100
+ end
101
+
102
+ def check_jenkins
103
+ puts "checking jenkins configuration"
104
+ @jenkins.fetch and puts "OK"
105
+ end
106
+ end
@@ -0,0 +1,52 @@
1
+ require 'open-uri'
2
+ require 'tins/xt'
3
+ require 'json'
4
+ require 'uri'
5
+
6
+ module AmpelExtase
7
+ class JenkinsClient
8
+ def initialize(url, debug: false)
9
+ url = URI.parse(url.to_s) unless URI::HTTP === url
10
+ @url, @debug = url, debug
11
+ end
12
+
13
+ def api_url(*path)
14
+ [ @url, *path, 'api', 'json' ].compact * '/'
15
+ end
16
+
17
+ def console_url(number)
18
+ [ @url, number, 'consoleText' ] * '/'
19
+ end
20
+
21
+ def fetch(url = api_url)
22
+ @debug and STDERR.puts "Fetching #{url.to_s.inspect}."
23
+ JSON open(url).read
24
+ rescue => e
25
+ e.message << " for #{url.inspect}"
26
+ raise
27
+ end
28
+
29
+ def fetch_build(type)
30
+ url = if sym = type.ask_and_send(:to_sym)
31
+ key = sym.to_s.camelize(:lower)
32
+ key[0, 1] = key[0, 1].downcase
33
+ api_url(key)
34
+ else
35
+ api_url(type)
36
+ end
37
+ fetch url
38
+ end
39
+
40
+ def fetch_build_revision(type)
41
+ data = fetch_build(type)
42
+ data['actions'].find { |x| x.keys.include?('lastBuiltRevision') }['lastBuiltRevision']['SHA1']
43
+ rescue
44
+ nil
45
+ end
46
+
47
+ def fetch_console_text(type)
48
+ build = fetch_build(type)
49
+ open(console_url(build['number'])).read
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,32 @@
1
+ require 'socket_switcher'
2
+
3
+ module AmpelExtase
4
+ class LightSwitcher
5
+ def initialize(serial, debug: false)
6
+ @port = SocketSwitcher::Port.new(serial, debug: debug)
7
+ end
8
+
9
+ attr_reader :port
10
+
11
+ def green
12
+ @port.device(0)
13
+ end
14
+
15
+ def red
16
+ @port.device(1)
17
+ end
18
+
19
+ def aux
20
+ @port.device(2)
21
+ end
22
+
23
+ def each(&block)
24
+ [
25
+ :green,
26
+ :red,
27
+ # not in use for now :aux,
28
+ ].map { |color| __send__(color) }.each(&block)
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,8 @@
1
+ module AmpelExtase
2
+ # AmpelExtase version
3
+ VERSION = '0.0.0'
4
+ VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
+ VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
+ VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
7
+ VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
8
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe AmpelExtase::JenkinsClient do
4
+ pending
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe AmpelExtase::LightSwitcher do
4
+ pending
5
+ end
@@ -0,0 +1,9 @@
1
+ require 'simplecov'
2
+ if ENV['START_SIMPLECOV'].to_i == 1
3
+ SimpleCov.start do
4
+ add_filter "#{File.basename(File.dirname(__FILE__))}/"
5
+ end
6
+ end
7
+ require 'rspec'
8
+ require 'byebug'
9
+ require 'ampel_extase'
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ampel_extase
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Florian Frank
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gem_hadar
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: simplecov
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.9'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tins
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: socket_switcher
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Library to control the build traffic light. Yes, we can…
98
+ email: flori@ping.de
99
+ executables:
100
+ - ampel_control
101
+ extensions: []
102
+ extra_rdoc_files:
103
+ - README.md
104
+ - lib/ampel_extase.rb
105
+ - lib/ampel_extase/build_state.rb
106
+ - lib/ampel_extase/controller.rb
107
+ - lib/ampel_extase/jenkins_client.rb
108
+ - lib/ampel_extase/light_switcher.rb
109
+ - lib/ampel_extase/version.rb
110
+ files:
111
+ - ".gitignore"
112
+ - Gemfile
113
+ - README.md
114
+ - Rakefile
115
+ - VERSION
116
+ - ampel_extase.gemspec
117
+ - bin/ampel_control
118
+ - lib/ampel_extase.rb
119
+ - lib/ampel_extase/build_state.rb
120
+ - lib/ampel_extase/controller.rb
121
+ - lib/ampel_extase/jenkins_client.rb
122
+ - lib/ampel_extase/light_switcher.rb
123
+ - lib/ampel_extase/version.rb
124
+ - spec/ampel_extase/jenkins_client_spec.rb
125
+ - spec/ampel_extase/light_switcher_spec.rb
126
+ - spec/spec_helper.rb
127
+ homepage: http://github.com/flori/ampel_extase
128
+ licenses:
129
+ - GPL-2
130
+ metadata: {}
131
+ post_install_message:
132
+ rdoc_options:
133
+ - "--title"
134
+ - AmpelExtase - Library to control the build traffic light
135
+ - "--main"
136
+ - README.md
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubyforge_project:
151
+ rubygems_version: 2.2.2
152
+ signing_key:
153
+ specification_version: 4
154
+ summary: Library to control the build traffic light
155
+ test_files:
156
+ - spec/ampel_extase/jenkins_client_spec.rb
157
+ - spec/ampel_extase/light_switcher_spec.rb
158
+ - spec/spec_helper.rb