trema 0.4.8 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 48a0af62c781422b77ef3f758b26a3e4b34b2d99
4
- data.tar.gz: f58f34df8927027a444dcc26a8f9ead5daa37555
3
+ metadata.gz: cd254b79f9c14fa501bbd579c616b4a387f2d832
4
+ data.tar.gz: fbf648fbf79f72498a28fa45d93095042c93a074
5
5
  SHA512:
6
- metadata.gz: f05fd27d3a5a1f0e78780e32f720d8d17374dc6aa6e5047da2d1af174b66e266a9a2a28f396f60c2821657694a558e8b515455c88651634ca35396e21fb6dd34
7
- data.tar.gz: 75c19a12a5dd974a95fe3845b41a0428e8935808bd4cf6937c2deb540a203c284729fde6e4a3665cbd06fccf69a9637effb0a70261a04527eef5db0cc623ebce
6
+ metadata.gz: 960bf892ff737db25a541bd8b20929d76b4e6103a541fc16fc6c0fb0c7e92f85ffc4ede76bb5ce9558bff7d567b20e6a65cff7eadc8e944bafc407e03ded2af6
7
+ data.tar.gz: 7d2229720caa81f7f3a9a36b1a4b326e024c724bdea82745d0896fb93205abee59d382f7370c202c133c20b98b42b5e65c4dac7a0876e5a3b4e8c052ebbe23cd
data/CHANGELOG.md CHANGED
@@ -3,6 +3,11 @@
3
3
  ## develop (unreleased)
4
4
 
5
5
 
6
+ ## 0.5.0 (8/2/2015)
7
+ ### Changes
8
+ * [#392](https://github.com/trema/trema/pull/392): Allow packet_in, etc during startup.
9
+
10
+
6
11
  ## 0.4.8 (6/29/2015)
7
12
  ### Changes
8
13
  * [#384](https://github.com/trema/trema/pull/384): Add trema run --port (-p) option to override the default OpenFlow channel listen port.
data/bin/trema CHANGED
@@ -4,6 +4,7 @@ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
4
  require 'drb/drb'
5
5
  require 'gli'
6
6
  require 'phut'
7
+ require 'pio'
7
8
  require 'rake'
8
9
  require 'trema'
9
10
 
@@ -47,7 +48,7 @@ module Trema
47
48
  Phut.pid_dir = options[:pid_dir]
48
49
  Phut.log_dir = options[:log_dir]
49
50
  Phut.socket_dir = options[:socket_dir]
50
- require 'pio/open_flow13' if options[:openflow13]
51
+ Pio::OpenFlow.switch_version 'OpenFlow13' if options[:openflow13]
51
52
  require 'trema/switch'
52
53
  Trema::Command.new.run(args, global_options.merge(options))
53
54
  end
@@ -0,0 +1,29 @@
1
+ Feature: Trema::Controller#echo_reply handler
2
+ Background:
3
+ Given I set the environment variables to:
4
+ | variable | value |
5
+ | TREMA_LOG_DIR | . |
6
+ | TREMA_PID_DIR | . |
7
+ | TREMA_SOCKET_DIR | . |
8
+
9
+ @sudo
10
+ Scenario: the default port
11
+ Given a file named "echo_reply.rb" with:
12
+ """
13
+ class EchoReply < Trema::Controller
14
+ def switch_ready(dpid)
15
+ send_message dpid, Echo::Request.new
16
+ end
17
+
18
+ def echo_reply(dpid, message)
19
+ logger.info 'echo_reply handler is invoked'
20
+ end
21
+ end
22
+ """
23
+ And a file named "trema.conf" with:
24
+ """
25
+ vswitch { datapath_id 0xabc }
26
+ """
27
+ When I successfully run `trema -v run echo_reply.rb -c trema.conf -d`
28
+ And I run `sleep 5`
29
+ Then the file "EchoReply.log" should contain "echo_reply handler is invoked"
@@ -19,3 +19,32 @@ Feature: OpenFlow1.3
19
19
  When I successfully run `trema -v run null_controller.rb --openflow13 -c trema.conf -d`
20
20
  And I run `sleep 5`
21
21
  Then the output should contain "protocols=OpenFlow13"
22
+
23
+ @sudo
24
+ Scenario: send_flow_mod_add
25
+ Given a file named "flow_mod_controller.rb" with:
26
+ """
27
+ class FlowModController < Trema::Controller
28
+ def switch_ready(datapath_id)
29
+ logger.info 'Sending a FlowMod with OpenFlow 1.3 options'
30
+ send_flow_mod_add(
31
+ datapath_id,
32
+ table_id: 0,
33
+ idle_timeout: 180,
34
+ flags: [],
35
+ priority: 1,
36
+ match: Match.new({}),
37
+ instructions: []
38
+ )
39
+ logger.info 'Sent a FlowMod successfully'
40
+ end
41
+ end
42
+ """
43
+ And a file named "trema.conf" with:
44
+ """
45
+ vswitch { datapath_id 0xabc }
46
+ """
47
+ When I successfully run `trema run flow_mod_controller.rb --openflow13 -c trema.conf -d`
48
+ And I run `sleep 5`
49
+ Then the file "FlowModController.log" should contain "Sent a FlowMod successfully"
50
+
@@ -45,3 +45,14 @@ Feature: trema run command
45
45
  And I run `sleep 5`
46
46
  Then the file "SwitchReady.log" should contain "Hello 0xabc!"
47
47
 
48
+ @sudo
49
+ Scenario: trema run empty file and error
50
+ Given a file named "empty.rb" with:
51
+ """
52
+ """
53
+ When I run `trema -v run empty.rb`
54
+ Then the exit status should not be 0
55
+ And the stderr should contain:
56
+ """
57
+ No controller class is defined.
58
+ """
@@ -21,7 +21,9 @@ module Trema
21
21
  def to_hash
22
22
  {
23
23
  command: :add,
24
+ priority: @user_options[:priority] || 0,
24
25
  transaction_id: rand(0xffffffff),
26
+ idle_timeout: @user_options[:idle_timeout] || 0,
25
27
  hard_timeout: @user_options[:hard_timeout] || 0,
26
28
  buffer_id: @user_options[:buffer_id] || 0xffffffff,
27
29
  match: @user_options.fetch(:match),
@@ -30,6 +32,35 @@ module Trema
30
32
  end
31
33
  end
32
34
 
35
+ # Pio::FlowMod.new argument (OpenFlow 1.3)
36
+ class FlowModAdd13Option
37
+ def initialize(user_options)
38
+ @user_options = user_options
39
+ end
40
+
41
+ # rubocop:disable MethodLength
42
+ # rubocop:disable CyclomaticComplexity
43
+ # rubocop:disable PerceivedComplexity
44
+ def to_hash
45
+ {
46
+ command: :add,
47
+ priority: @user_options[:priority] || 0,
48
+ transaction_id: rand(0xffffffff),
49
+ idle_timeout: @user_options[:idle_timeout] || 0,
50
+ hard_timeout: @user_options[:hard_timeout] || 0,
51
+ buffer_id: @user_options[:buffer_id] || 0xffffffff,
52
+ match: @user_options.fetch(:match),
53
+ table_id: @user_options[:table_id] || 0,
54
+ flags: @user_options[:flags] || [],
55
+ instructions: @user_options[:instructions] || [],
56
+ actions: @user_options[:actions] || []
57
+ }
58
+ end
59
+ # rubocop:enable MethodLength
60
+ # rubocop:enable CyclomaticComplexity
61
+ # rubocop:enable PerceivedComplexity
62
+ end
63
+
33
64
  # Pio::FlowMod.new argument
34
65
  class FlowModDeleteOption
35
66
  def initialize(user_options)
@@ -103,6 +134,7 @@ module Trema
103
134
 
104
135
  # @private
105
136
  def self.create(port_number = DEFAULT_TCP_PORT)
137
+ fail 'No controller class is defined.' unless @controller_klass
106
138
  @controller_klass.new(port_number)
107
139
  end
108
140
 
@@ -140,7 +172,15 @@ module Trema
140
172
  # @!group OpenFlow Message
141
173
 
142
174
  def send_flow_mod_add(datapath_id, options)
143
- flow_mod = FlowMod.new(FlowModAddOption.new(options).to_hash)
175
+ flow_mod =
176
+ case Pio::OpenFlow.version
177
+ when 'OpenFlow10'
178
+ FlowMod.new(FlowModAddOption.new(options).to_hash)
179
+ when 'OpenFlow13'
180
+ FlowMod.new(FlowModAdd13Option.new(options).to_hash)
181
+ else
182
+ fail "Unsupported OpenFlow version: #{Pio::OpenFlow.version}"
183
+ end
144
184
  send_message datapath_id, flow_mod
145
185
  end
146
186
 
@@ -250,6 +290,8 @@ module Trema
250
290
  case message
251
291
  when Echo::Request
252
292
  maybe_send_handler :echo_request, datapath_id, message
293
+ when Echo::Reply
294
+ maybe_send_handler :echo_reply, datapath_id, message
253
295
  when Features::Reply
254
296
  maybe_send_handler :features_reply, datapath_id, message
255
297
  when PacketIn
data/lib/trema/switch.rb CHANGED
@@ -7,15 +7,6 @@ module Trema
7
7
 
8
8
  OPENFLOW_HEADER_LENGTH = 8
9
9
 
10
- OPENFLOW_MESSAGE_PARSER = {
11
- OpenFlow::HELLO => Hello,
12
- OpenFlow::ECHO_REQUEST => Echo::Request,
13
- OpenFlow::ECHO_REPLY => Echo::Reply,
14
- OpenFlow::FEATURES_REPLY => Features::Reply,
15
- OpenFlow::PACKET_IN => PacketIn,
16
- OpenFlow::PORT_STATUS => PortStatus
17
- }
18
-
19
10
  def initialize(socket)
20
11
  @socket = socket
21
12
  end
@@ -38,10 +29,7 @@ module Trema
38
29
  end
39
30
 
40
31
  def read
41
- message_type, binary = read_openflow_binary
42
- OPENFLOW_MESSAGE_PARSER.fetch(message_type).read(binary)
43
- rescue KeyError
44
- raise "Unknown OpenFlow message (message_type = #{message_type})."
32
+ OpenFlow.read read_openflow_binary
45
33
  end
46
34
 
47
35
  private
@@ -53,14 +41,38 @@ module Trema
53
41
 
54
42
  def exchange_echo_messages
55
43
  write Echo::Request.new
56
- fail 'Failed to exchange Echo messages' unless read.is_a?(Echo::Reply)
44
+ loop do
45
+ message = read
46
+ if message.is_a?(Echo::Reply)
47
+ break
48
+ else
49
+ handle_early message 'Failed to exchange Echo messages'
50
+ end
51
+ end
57
52
  end
58
53
 
59
54
  def exchange_features_messages
60
55
  write Features::Request.new
61
- @features_reply = read
62
- return if @features_reply.is_a?(Features::Reply)
63
- fail 'Failed to exchange Features messages'
56
+ loop do
57
+ message = read
58
+ if message.is_a?(Features::Reply)
59
+ @features_reply = message
60
+ break
61
+ else
62
+ handle_early message 'Failed to exchange Features messages'
63
+ end
64
+ end
65
+ end
66
+
67
+ def handle_early(message, fail_message)
68
+ case message
69
+ when Echo::Request
70
+ write Echo::Reply.new xid: message.xid
71
+ when PacketIn, FlowRemoved, PortStatus
72
+ return
73
+ else
74
+ fail fail_message
75
+ end
64
76
  end
65
77
 
66
78
  def read_openflow_binary
@@ -68,7 +80,7 @@ module Trema
68
80
  header = OpenFlowHeaderParser.read(header_binary)
69
81
  body_binary = drain(header.message_length - OPENFLOW_HEADER_LENGTH)
70
82
  fail if (header_binary + body_binary).length != header.message_length
71
- [header.message_type, header_binary + body_binary]
83
+ header_binary + body_binary
72
84
  end
73
85
 
74
86
  def drain(length)
data/lib/trema/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # Base module.
2
2
  module Trema
3
3
  # gem version.
4
- VERSION = '0.4.8'.freeze
4
+ VERSION = '0.5.0'.freeze
5
5
  end
data/trema.gemspec CHANGED
@@ -21,22 +21,22 @@ Gem::Specification.new do |gem|
21
21
 
22
22
  gem.test_files = `git ls-files -- {spec,features}/*`.split("\n")
23
23
 
24
- gem.add_dependency 'bundler', '~> 1.10.5'
24
+ gem.add_dependency 'bundler', '~> 1.10.6'
25
25
  gem.add_dependency 'gli', '~> 2.13.1'
26
- gem.add_dependency 'phut', '~> 0.6.5'
27
- gem.add_dependency 'pio', '~> 0.23.0'
26
+ gem.add_dependency 'phut', '~> 0.6.6'
27
+ gem.add_dependency 'pio', '~> 0.24.0'
28
28
  gem.add_dependency 'rake'
29
29
 
30
30
  # Docs
31
31
  gem.add_development_dependency 'yard', '~> 0.8.7.6'
32
32
 
33
33
  # Test
34
- gem.add_development_dependency 'aruba', '~> 0.6.2'
34
+ gem.add_development_dependency 'aruba', '~> 0.8.1'
35
35
  gem.add_development_dependency 'codeclimate-test-reporter', '~> 0.4.7'
36
36
  gem.add_development_dependency 'coveralls', '~> 0.8.2'
37
- gem.add_development_dependency 'cucumber', '~> 2.0.0'
38
- gem.add_development_dependency 'reek', '~> 2.2.1'
37
+ gem.add_development_dependency 'cucumber', '~> 2.0.2'
38
+ gem.add_development_dependency 'reek', '~> 3.1'
39
39
  gem.add_development_dependency 'rspec', '~> 3.3.0'
40
- gem.add_development_dependency 'rspec-given', '~> 3.7.0'
40
+ gem.add_development_dependency 'rspec-given', '~> 3.7.1'
41
41
  gem.add_development_dependency 'rubocop', '~> 0.32.1'
42
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.8
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yasuhito Takamiya
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-29 00:00:00.000000000 Z
11
+ date: 2015-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: 1.10.5
19
+ version: 1.10.6
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: 1.10.5
26
+ version: 1.10.6
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: gli
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,28 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: 0.6.5
47
+ version: 0.6.6
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 0.6.5
54
+ version: 0.6.6
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pio
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 0.23.0
61
+ version: 0.24.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: 0.23.0
68
+ version: 0.24.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - ~>
102
102
  - !ruby/object:Gem::Version
103
- version: 0.6.2
103
+ version: 0.8.1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ~>
109
109
  - !ruby/object:Gem::Version
110
- version: 0.6.2
110
+ version: 0.8.1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: codeclimate-test-reporter
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -142,28 +142,28 @@ dependencies:
142
142
  requirements:
143
143
  - - ~>
144
144
  - !ruby/object:Gem::Version
145
- version: 2.0.0
145
+ version: 2.0.2
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - ~>
151
151
  - !ruby/object:Gem::Version
152
- version: 2.0.0
152
+ version: 2.0.2
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: reek
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - ~>
158
158
  - !ruby/object:Gem::Version
159
- version: 2.2.1
159
+ version: '3.1'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - ~>
165
165
  - !ruby/object:Gem::Version
166
- version: 2.2.1
166
+ version: '3.1'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: rspec
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -184,14 +184,14 @@ dependencies:
184
184
  requirements:
185
185
  - - ~>
186
186
  - !ruby/object:Gem::Version
187
- version: 3.7.0
187
+ version: 3.7.1
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - ~>
193
193
  - !ruby/object:Gem::Version
194
- version: 3.7.0
194
+ version: 3.7.1
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: rubocop
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -229,6 +229,7 @@ files:
229
229
  - bin/.gitignore
230
230
  - bin/trema
231
231
  - features/cleanup_on_failure.feature
232
+ - features/echo_reply_handler.feature
232
233
  - features/logging.feature
233
234
  - features/open_flow13.feature
234
235
  - features/step_definitions/.gitignore