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
Ray Milkey
2014-10-08 13:52:34 -0700
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
a058c733cfc66b76e9346a8392523848d782badf
a058c733
1 parent
3fc72ed2
Implement point to point intent compiler and cli commands to create them
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
241 additions
and
0 deletions
cli/src/main/java/org/onlab/onos/cli/net/AddPointToPointIntentCommand.java
cli/src/main/java/org/onlab/onos/cli/net/ConnectPointCompleter.java
cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
core/net/src/main/java/org/onlab/onos/net/intent/impl/PointToPointIntentCompiler.java
cli/src/main/java/org/onlab/onos/cli/net/AddPointToPointIntentCommand.java
0 → 100644
View file @
a058c73
package
org
.
onlab
.
onos
.
cli
.
net
;
import
org.apache.karaf.shell.commands.Argument
;
import
org.apache.karaf.shell.commands.Command
;
import
org.onlab.onos.cli.AbstractShellCommand
;
import
org.onlab.onos.net.ConnectPoint
;
import
org.onlab.onos.net.DeviceId
;
import
org.onlab.onos.net.PortNumber
;
import
org.onlab.onos.net.flow.DefaultTrafficSelector
;
import
org.onlab.onos.net.flow.DefaultTrafficTreatment
;
import
org.onlab.onos.net.flow.TrafficSelector
;
import
org.onlab.onos.net.flow.TrafficTreatment
;
import
org.onlab.onos.net.intent.Intent
;
import
org.onlab.onos.net.intent.IntentId
;
import
org.onlab.onos.net.intent.IntentService
;
import
org.onlab.onos.net.intent.PointToPointIntent
;
/**
* Installs point-to-point connectivity intents.
*/
@Command
(
scope
=
"onos"
,
name
=
"add-point-intent"
,
description
=
"Installs point-to-point connectivity intent"
)
public
class
AddPointToPointIntentCommand
extends
AbstractShellCommand
{
@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
;
private
static
long
id
=
1
;
@Override
protected
void
execute
()
{
IntentService
service
=
get
(
IntentService
.
class
);
DeviceId
ingressDeviceId
=
DeviceId
.
deviceId
(
getDeviceId
(
ingressDeviceString
));
PortNumber
ingressPortNumber
=
PortNumber
.
portNumber
(
getPortNumber
(
ingressDeviceString
));
ConnectPoint
ingress
=
new
ConnectPoint
(
ingressDeviceId
,
ingressPortNumber
);
DeviceId
egressDeviceId
=
DeviceId
.
deviceId
(
getDeviceId
(
egressDeviceString
));
PortNumber
egressPortNumber
=
PortNumber
.
portNumber
(
getPortNumber
(
egressDeviceString
));
ConnectPoint
egress
=
new
ConnectPoint
(
egressDeviceId
,
egressPortNumber
);
TrafficSelector
selector
=
DefaultTrafficSelector
.
builder
().
build
();
TrafficTreatment
treatment
=
DefaultTrafficTreatment
.
builder
().
build
();
Intent
intent
=
new
PointToPointIntent
(
new
IntentId
(
id
++),
selector
,
treatment
,
ingress
,
egress
);
service
.
submit
(
intent
);
}
/**
* 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
);
}
}
cli/src/main/java/org/onlab/onos/cli/net/ConnectPointCompleter.java
0 → 100644
View file @
a058c73
package
org
.
onlab
.
onos
.
cli
.
net
;
import
java.util.List
;
import
java.util.SortedSet
;
import
org.apache.karaf.shell.console.Completer
;
import
org.apache.karaf.shell.console.completer.StringsCompleter
;
import
org.onlab.onos.cli.AbstractShellCommand
;
import
org.onlab.onos.net.Device
;
import
org.onlab.onos.net.Port
;
import
org.onlab.onos.net.device.DeviceService
;
/**
* ConnectPoint completer.
*/
public
class
ConnectPointCompleter
implements
Completer
{
@Override
public
int
complete
(
String
buffer
,
int
cursor
,
List
<
String
>
candidates
)
{
// Delegate string completer
StringsCompleter
delegate
=
new
StringsCompleter
();
// Fetch our service and feed it's offerings to the string completer
DeviceService
service
=
AbstractShellCommand
.
get
(
DeviceService
.
class
);
// Generate the device ID/port number identifiers
for
(
Device
device
:
service
.
getDevices
())
{
SortedSet
<
String
>
strings
=
delegate
.
getStrings
();
for
(
Port
port
:
service
.
getPorts
(
device
.
id
()))
{
strings
.
add
(
device
.
id
().
toString
()
+
"/"
+
port
.
number
());
}
}
// Now let the completer do the work for figuring out what to offer.
return
delegate
.
complete
(
buffer
,
cursor
,
candidates
);
}
}
cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
View file @
a058c73
...
...
@@ -75,6 +75,13 @@
<ref
component-id=
"hostIdCompleter"
/>
</completers>
</command>
<command>
<action
class=
"org.onlab.onos.cli.net.AddPointToPointIntentCommand"
/>
<completers>
<ref
component-id=
"connectPointCompleter"
/>
<ref
component-id=
"connectPointCompleter"
/>
</completers>
</command>
<command>
<action
class=
"org.onlab.onos.cli.net.ClustersListCommand"
/>
...
...
@@ -116,5 +123,6 @@
<bean
id=
"hostIdCompleter"
class=
"org.onlab.onos.cli.net.HostIdCompleter"
/>
<bean
id=
"intentIdCompleter"
class=
"org.onlab.onos.cli.net.IntentIdCompleter"
/>
<bean
id=
"flowRuleStatusCompleter"
class=
"org.onlab.onos.cli.net.FlowRuleStatusCompleter"
/>
<bean
id=
"connectPointCompleter"
class=
"org.onlab.onos.cli.net.ConnectPointCompleter"
/>
</blueprint>
...
...
core/net/src/main/java/org/onlab/onos/net/intent/impl/PointToPointIntentCompiler.java
0 → 100644
View file @
a058c73
package
org
.
onlab
.
onos
.
net
.
intent
.
impl
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Set
;
import
org.apache.felix.scr.annotations.Activate
;
import
org.apache.felix.scr.annotations.Component
;
import
org.apache.felix.scr.annotations.Deactivate
;
import
org.apache.felix.scr.annotations.Reference
;
import
org.apache.felix.scr.annotations.ReferenceCardinality
;
import
org.onlab.onos.net.ConnectPoint
;
import
org.onlab.onos.net.DefaultEdgeLink
;
import
org.onlab.onos.net.DefaultPath
;
import
org.onlab.onos.net.Link
;
import
org.onlab.onos.net.Path
;
import
org.onlab.onos.net.host.HostService
;
import
org.onlab.onos.net.intent.IdGenerator
;
import
org.onlab.onos.net.intent.Intent
;
import
org.onlab.onos.net.intent.IntentCompiler
;
import
org.onlab.onos.net.intent.IntentExtensionService
;
import
org.onlab.onos.net.intent.IntentId
;
import
org.onlab.onos.net.intent.PathIntent
;
import
org.onlab.onos.net.intent.PointToPointIntent
;
import
org.onlab.onos.net.provider.ProviderId
;
import
org.onlab.onos.net.topology.PathService
;
/**
* A intent compiler for {@link org.onlab.onos.net.intent.HostToHostIntent}.
*/
@Component
(
immediate
=
true
)
public
class
PointToPointIntentCompiler
implements
IntentCompiler
<
PointToPointIntent
>
{
private
static
final
ProviderId
PID
=
new
ProviderId
(
"core"
,
"org.onlab.onos.core"
,
true
);
@Reference
(
cardinality
=
ReferenceCardinality
.
MANDATORY_UNARY
)
protected
IntentExtensionService
intentManager
;
@Reference
(
cardinality
=
ReferenceCardinality
.
MANDATORY_UNARY
)
protected
PathService
pathService
;
@Reference
(
cardinality
=
ReferenceCardinality
.
MANDATORY_UNARY
)
protected
HostService
hostService
;
private
IdGenerator
<
IntentId
>
intentIdGenerator
;
@Activate
public
void
activate
()
{
IdBlockAllocator
idBlockAllocator
=
new
DummyIdBlockAllocator
();
intentIdGenerator
=
new
IdBlockAllocatorBasedIntentIdGenerator
(
idBlockAllocator
);
intentManager
.
registerCompiler
(
PointToPointIntent
.
class
,
this
);
}
@Deactivate
public
void
deactivate
()
{
intentManager
.
unregisterCompiler
(
PointToPointIntent
.
class
);
}
@Override
public
List
<
Intent
>
compile
(
PointToPointIntent
intent
)
{
Path
path
=
getPath
(
intent
.
ingressPoint
(),
intent
.
egressPoint
());
List
<
Link
>
links
=
new
ArrayList
<>();
links
.
add
(
DefaultEdgeLink
.
createEdgeLink
(
intent
.
ingressPoint
(),
true
));
links
.
addAll
(
path
.
links
());
links
.
add
(
DefaultEdgeLink
.
createEdgeLink
(
intent
.
egressPoint
(),
false
));
return
Arrays
.
asList
(
createPathIntent
(
new
DefaultPath
(
PID
,
links
,
path
.
cost
()
+
2
,
path
.
annotations
()),
intent
));
}
/**
* Creates a path intent from the specified path and original
* connectivity intent.
*
* @param path path to create an intent for
* @param intent original intent
*/
private
Intent
createPathIntent
(
Path
path
,
PointToPointIntent
intent
)
{
return
new
PathIntent
(
intentIdGenerator
.
getNewId
(),
intent
.
selector
(),
intent
.
treatment
(),
path
.
src
(),
path
.
dst
(),
path
);
}
/**
* Computes a path between two ConnectPoints.
*
* @param one start of the path
* @param two end of the path
* @return Path between the two
* @throws PathNotFoundException if a path cannot be found
*/
private
Path
getPath
(
ConnectPoint
one
,
ConnectPoint
two
)
{
Set
<
Path
>
paths
=
pathService
.
getPaths
(
one
.
deviceId
(),
two
.
deviceId
());
if
(
paths
.
isEmpty
())
{
throw
new
PathNotFoundException
(
"No path from "
+
one
+
" to "
+
two
);
}
// TODO: let's be more intelligent about this eventually
return
paths
.
iterator
().
next
();
}
}
Please
register
or
login
to post a comment