Toggle navigation
Toggle navigation
This project
Loading...
Sign in
홍길동
/
onos
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
Brian O'Connor
2015-02-17 18:17:32 -0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
66cfbfac4d8ad97a9368db9c2044e1ef949151eb
66cfbfac
1 parent
d12267c7
intent cycle command
Change-Id: Ia461ea960e3c47cedd2b9085762b48f08346be73
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
209 additions
and
0 deletions
cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
0 → 100644
View file @
66cfbfa
/*
* Copyright 2015 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
onosproject
.
cli
.
net
;
import
com.google.common.collect.Lists
;
import
org.apache.karaf.shell.commands.Argument
;
import
org.apache.karaf.shell.commands.Command
;
import
org.onlab.packet.Ethernet
;
import
org.onlab.packet.MacAddress
;
import
org.onosproject.cli.AbstractShellCommand
;
import
org.onosproject.net.ConnectPoint
;
import
org.onosproject.net.DeviceId
;
import
org.onosproject.net.PortNumber
;
import
org.onosproject.net.flow.DefaultTrafficSelector
;
import
org.onosproject.net.flow.DefaultTrafficTreatment
;
import
org.onosproject.net.flow.TrafficSelector
;
import
org.onosproject.net.flow.TrafficTreatment
;
import
org.onosproject.net.intent.Intent
;
import
org.onosproject.net.intent.IntentEvent
;
import
org.onosproject.net.intent.IntentEvent.Type
;
import
org.onosproject.net.intent.IntentListener
;
import
org.onosproject.net.intent.IntentService
;
import
org.onosproject.net.intent.Key
;
import
org.onosproject.net.intent.PointToPointIntent
;
import
java.util.Collections
;
import
java.util.EnumSet
;
import
java.util.List
;
import
java.util.concurrent.CountDownLatch
;
import
java.util.concurrent.atomic.AtomicLong
;
import
static
org
.
onlab
.
util
.
Tools
.
delay
;
import
static
org
.
onosproject
.
net
.
DeviceId
.
deviceId
;
import
static
org
.
onosproject
.
net
.
PortNumber
.
portNumber
;
/**
* Installs point-to-point connectivity intents.
*/
@Command
(
scope
=
"onos"
,
name
=
"cycle-intents"
,
description
=
"Installs random intents to test throughput"
)
public
class
IntentCycleCommand
extends
AbstractShellCommand
implements
IntentListener
{
@Argument
(
index
=
0
,
name
=
"ingressDevice"
,
description
=
"Ingress Device/Port Description"
,
required
=
true
,
multiValued
=
false
)
String
ingressDeviceString
=
null
;
@Argument
(
index
=
1
,
name
=
"egressDevice"
,
description
=
"Egress Device/Port Description"
,
required
=
true
,
multiValued
=
false
)
String
egressDeviceString
=
null
;
@Argument
(
index
=
2
,
name
=
"numberOfIntents"
,
description
=
"Number of intents to install/withdraw"
,
required
=
true
,
multiValued
=
false
)
String
numberOfIntents
=
null
;
@Argument
(
index
=
3
,
name
=
"keyOffset"
,
description
=
"Starting point for first key (default: 1)"
,
required
=
false
,
multiValued
=
false
)
String
keyOffsetStr
=
null
;
private
IntentService
service
;
private
CountDownLatch
latch
;
private
volatile
long
start
,
end
;
private
int
count
;
private
int
keyOffset
;
private
long
submitCounter
=
0
;
private
AtomicLong
eventCounter
=
new
AtomicLong
(
0
);
private
boolean
add
;
@Override
protected
void
execute
()
{
service
=
get
(
IntentService
.
class
);
DeviceId
ingressDeviceId
=
deviceId
(
getDeviceId
(
ingressDeviceString
));
PortNumber
ingressPortNumber
=
portNumber
(
getPortNumber
(
ingressDeviceString
));
ConnectPoint
ingress
=
new
ConnectPoint
(
ingressDeviceId
,
ingressPortNumber
);
DeviceId
egressDeviceId
=
deviceId
(
getDeviceId
(
egressDeviceString
));
PortNumber
egressPortNumber
=
portNumber
(
getPortNumber
(
egressDeviceString
));
ConnectPoint
egress
=
new
ConnectPoint
(
egressDeviceId
,
egressPortNumber
);
count
=
Integer
.
parseInt
(
numberOfIntents
);
keyOffset
=
(
keyOffsetStr
!=
null
)
?
Integer
.
parseInt
(
keyOffsetStr
)
:
1
;
service
.
addListener
(
this
);
List
<
Intent
>
operations
=
generateIntents
(
ingress
,
egress
);
add
=
true
;
start
=
System
.
currentTimeMillis
();
while
(
start
+
10000
>
System
.
currentTimeMillis
())
{
submitIntents
(
operations
);
}
delay
(
5000
);
printResults
();
add
=
false
;
submitIntents
(
operations
);
service
.
removeListener
(
this
);
}
private
List
<
Intent
>
generateIntents
(
ConnectPoint
ingress
,
ConnectPoint
egress
)
{
TrafficSelector
.
Builder
selectorBldr
=
DefaultTrafficSelector
.
builder
()
.
matchEthType
(
Ethernet
.
TYPE_IPV4
);
TrafficTreatment
treatment
=
DefaultTrafficTreatment
.
builder
().
build
();
List
<
Intent
>
intents
=
Lists
.
newArrayList
();
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
TrafficSelector
selector
=
selectorBldr
.
matchEthSrc
(
MacAddress
.
valueOf
(
i
+
keyOffset
))
.
build
();
intents
.
add
(
new
PointToPointIntent
(
appId
(),
Key
.
of
(
i
+
keyOffset
,
appId
()),
selector
,
treatment
,
ingress
,
egress
,
Collections
.
emptyList
()));
}
return
intents
;
}
private
void
submitIntents
(
List
<
Intent
>
intents
)
{
for
(
Intent
intent
:
intents
)
{
if
(
add
)
{
submitCounter
++;
service
.
submit
(
intent
);
}
else
{
service
.
withdraw
(
intent
);
}
}
}
private
void
printResults
()
{
//long delta = end - start;
//String text = add ? "install" : "withdraw";
print
(
"count: %s / %s"
,
eventCounter
,
Long
.
valueOf
(
submitCounter
));
//print("Time to %s %d intents: %d ms", text, count, delta);
}
/**
* Extracts the port number portion of the ConnectPoint.
*
* @param deviceString string representing the device/port
* @return port number as a string, empty string if the port is not found
*/
private
String
getPortNumber
(
String
deviceString
)
{
int
slash
=
deviceString
.
indexOf
(
'/'
);
if
(
slash
<=
0
)
{
return
""
;
}
return
deviceString
.
substring
(
slash
+
1
,
deviceString
.
length
());
}
/**
* Extracts the device ID portion of the ConnectPoint.
*
* @param deviceString string representing the device/port
* @return device ID string
*/
private
String
getDeviceId
(
String
deviceString
)
{
int
slash
=
deviceString
.
indexOf
(
'/'
);
if
(
slash
<=
0
)
{
return
""
;
}
return
deviceString
.
substring
(
0
,
slash
);
}
private
static
final
EnumSet
<
Type
>
IGNORE_EVENT
=
EnumSet
.
of
(
Type
.
INSTALL_REQ
,
Type
.
WITHDRAW_REQ
);
@Override
public
synchronized
void
event
(
IntentEvent
event
)
{
if
(!
appId
().
equals
(
event
.
subject
().
appId
()))
{
// not my event, ignore
return
;
}
Type
expected
=
add
?
Type
.
INSTALLED
:
Type
.
WITHDRAWN
;
if
(
event
.
type
()
==
expected
)
{
eventCounter
.
getAndIncrement
();
}
else
if
(
IGNORE_EVENT
.
contains
(
event
.
type
()))
{
log
.
info
(
"Unexpected intent event: {}"
,
event
);
}
}
}
cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
View file @
66cfbfa
...
...
@@ -209,6 +209,15 @@
</completers>
</command>
<command>
<action
class=
"org.onosproject.cli.net.IntentCycleCommand"
/>
<completers>
<ref
component-id=
"connectPointCompleter"
/>
<ref
component-id=
"connectPointCompleter"
/>
<ref
component-id=
"nullCompleter"
/>
<null/>
</completers>
</command>
<command>
<action
class=
"org.onosproject.cli.net.RandomIntentCommand"
/>
<completers>
<ref
component-id=
"nullCompleter"
/>
...
...
Please
register
or
login
to post a comment