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
Yuta HIGUCHI
2014-10-16 19:59:35 -0700
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
4d187952db0aca2a7259caf573004438f658234c
4d187952
1 parent
33b5e766
basic test for ReplicaInfoManager
Change-Id: I604b8b24b9ac0896e6dd2a0650092af76f37968d
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
198 additions
and
1 deletions
core/store/dist/pom.xml
core/store/dist/src/main/java/org/onlab/onos/store/flow/ReplicaInfoService.java
core/store/dist/src/main/java/org/onlab/onos/store/flow/impl/ReplicaInfoManager.java
core/store/dist/src/test/java/org/onlab/onos/store/flow/impl/ReplicaInfoManagerTest.java
core/store/dist/pom.xml
View file @
4d18795
...
...
@@ -52,6 +52,12 @@
<artifactId>
easymock
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
org.onlab.onos
</groupId>
<artifactId>
onos-api
</artifactId>
<classifier>
tests
</classifier>
<scope>
test
</scope>
</dependency>
</dependencies>
</project>
...
...
core/store/dist/src/main/java/org/onlab/onos/store/flow/ReplicaInfoService.java
View file @
4d18795
...
...
@@ -3,7 +3,7 @@ package org.onlab.onos.store.flow;
import
org.onlab.onos.net.DeviceId
;
/**
* Service to return where the
R
eplica should be placed.
* Service to return where the
r
eplica should be placed.
*/
public
interface
ReplicaInfoService
{
...
...
@@ -15,4 +15,19 @@ public interface ReplicaInfoService {
* @return placement information
*/
ReplicaInfo
getReplicaInfoFor
(
DeviceId
deviceId
);
/**
* Adds the specified replica placement info change listener.
*
* @param listener the replica placement info change listener
*/
void
addListener
(
ReplicaInfoEventListener
listener
);
/**
* Removes the specified replica placement info change listener.
*
* @param listener the replica placement info change listener
*/
void
removeListener
(
ReplicaInfoEventListener
listener
);
}
...
...
core/store/dist/src/main/java/org/onlab/onos/store/flow/impl/ReplicaInfoManager.java
View file @
4d18795
package
org
.
onlab
.
onos
.
store
.
flow
.
impl
;
import
static
com
.
google
.
common
.
base
.
Preconditions
.
checkNotNull
;
import
static
org
.
slf4j
.
LoggerFactory
.
getLogger
;
import
static
org
.
onlab
.
onos
.
store
.
flow
.
ReplicaInfoEvent
.
Type
.
MASTER_CHANGED
;
...
...
@@ -66,6 +67,16 @@ public class ReplicaInfoManager implements ReplicaInfoService {
Collections
.<
NodeId
>
emptyList
());
}
@Override
public
void
addListener
(
ReplicaInfoEventListener
listener
)
{
listenerRegistry
.
addListener
(
checkNotNull
(
listener
));
}
@Override
public
void
removeListener
(
ReplicaInfoEventListener
listener
)
{
listenerRegistry
.
removeListener
(
checkNotNull
(
listener
));
}
final
class
InternalMastershipListener
implements
MastershipListener
{
@Override
...
...
core/store/dist/src/test/java/org/onlab/onos/store/flow/impl/ReplicaInfoManagerTest.java
0 → 100644
View file @
4d18795
package
org
.
onlab
.
onos
.
store
.
flow
.
impl
;
import
static
com
.
google
.
common
.
base
.
Preconditions
.
checkState
;
import
static
org
.
junit
.
Assert
.*;
import
java.util.Collections
;
import
java.util.Map
;
import
java.util.concurrent.CountDownLatch
;
import
java.util.concurrent.TimeUnit
;
import
org.junit.After
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.onlab.onos.cluster.NodeId
;
import
org.onlab.onos.event.AbstractListenerRegistry
;
import
org.onlab.onos.event.DefaultEventSinkRegistry
;
import
org.onlab.onos.event.Event
;
import
org.onlab.onos.event.EventDeliveryService
;
import
org.onlab.onos.event.EventSink
;
import
org.onlab.onos.mastership.MastershipEvent
;
import
org.onlab.onos.mastership.MastershipEvent.Type
;
import
org.onlab.onos.mastership.MastershipListener
;
import
org.onlab.onos.mastership.MastershipService
;
import
org.onlab.onos.mastership.MastershipServiceAdapter
;
import
org.onlab.onos.net.DeviceId
;
import
org.onlab.onos.store.flow.ReplicaInfo
;
import
org.onlab.onos.store.flow.ReplicaInfoEvent
;
import
org.onlab.onos.store.flow.ReplicaInfoEventListener
;
import
org.onlab.onos.store.flow.ReplicaInfoService
;
import
com.google.common.base.Optional
;
import
com.google.common.collect.Maps
;
public
class
ReplicaInfoManagerTest
{
private
static
final
DeviceId
DID1
=
DeviceId
.
deviceId
(
"of:1"
);
private
static
final
DeviceId
DID2
=
DeviceId
.
deviceId
(
"of:2"
);
private
static
final
NodeId
NID1
=
new
NodeId
(
"foo"
);
private
ReplicaInfoManager
mgr
;
private
ReplicaInfoService
service
;
private
AbstractListenerRegistry
<
MastershipEvent
,
MastershipListener
>
mastershipListenerRegistry
;
private
TestEventDispatcher
eventDispatcher
;
@Before
public
void
setUp
()
throws
Exception
{
mastershipListenerRegistry
=
new
AbstractListenerRegistry
<>();
mgr
=
new
ReplicaInfoManager
();
service
=
mgr
;
eventDispatcher
=
new
TestEventDispatcher
();
mgr
.
eventDispatcher
=
eventDispatcher
;
mgr
.
mastershipService
=
new
TestMastershipService
();
// register dummy mastership event source
mgr
.
eventDispatcher
.
addSink
(
MastershipEvent
.
class
,
mastershipListenerRegistry
);
mgr
.
activate
();
}
@After
public
void
tearDown
()
throws
Exception
{
mgr
.
deactivate
();
}
@Test
public
void
testGetReplicaInfoFor
()
{
ReplicaInfo
info1
=
service
.
getReplicaInfoFor
(
DID1
);
assertEquals
(
Optional
.
of
(
NID1
),
info1
.
master
());
// backups are always empty for now
assertEquals
(
Collections
.
emptyList
(),
info1
.
backups
());
ReplicaInfo
info2
=
service
.
getReplicaInfoFor
(
DID2
);
assertEquals
(
"There's no master"
,
Optional
.
absent
(),
info2
.
master
());
// backups are always empty for now
assertEquals
(
Collections
.
emptyList
(),
info2
.
backups
());
}
@Test
public
void
testReplicaInfoEvent
()
throws
InterruptedException
{
final
CountDownLatch
latch
=
new
CountDownLatch
(
1
);
service
.
addListener
(
new
MasterNodeCheck
(
latch
,
DID1
,
NID1
));
// fake MastershipEvent
eventDispatcher
.
post
(
new
MastershipEvent
(
Type
.
MASTER_CHANGED
,
DID1
,
NID1
));
assertTrue
(
latch
.
await
(
1
,
TimeUnit
.
SECONDS
));
}
private
final
class
MasterNodeCheck
implements
ReplicaInfoEventListener
{
private
final
CountDownLatch
latch
;
private
Optional
<
NodeId
>
expectedMaster
;
private
DeviceId
expectedDevice
;
MasterNodeCheck
(
CountDownLatch
latch
,
DeviceId
did
,
NodeId
nid
)
{
this
.
latch
=
latch
;
this
.
expectedMaster
=
Optional
.
fromNullable
(
nid
);
this
.
expectedDevice
=
did
;
}
@Override
public
void
event
(
ReplicaInfoEvent
event
)
{
assertEquals
(
expectedDevice
,
event
.
subject
());
assertEquals
(
expectedMaster
,
event
.
replicaInfo
().
master
());
// backups are always empty for now
assertEquals
(
Collections
.
emptyList
(),
event
.
replicaInfo
().
backups
());
latch
.
countDown
();
}
}
private
final
class
TestMastershipService
extends
MastershipServiceAdapter
implements
MastershipService
{
private
Map
<
DeviceId
,
NodeId
>
masters
;
TestMastershipService
()
{
masters
=
Maps
.
newHashMap
();
masters
.
put
(
DID1
,
NID1
);
// DID2 has no master
}
@Override
public
NodeId
getMasterFor
(
DeviceId
deviceId
)
{
return
masters
.
get
(
deviceId
);
}
@Override
public
void
addListener
(
MastershipListener
listener
)
{
mastershipListenerRegistry
.
addListener
(
listener
);
}
@Override
public
void
removeListener
(
MastershipListener
listener
)
{
mastershipListenerRegistry
.
removeListener
(
listener
);
}
}
// code clone
/**
* Implements event delivery system that delivers events synchronously, or
* in-line with the post method invocation.
*/
private
static
class
TestEventDispatcher
extends
DefaultEventSinkRegistry
implements
EventDeliveryService
{
@SuppressWarnings
({
"rawtypes"
,
"unchecked"
})
@Override
public
void
post
(
Event
event
)
{
EventSink
sink
=
getSink
(
event
.
getClass
());
checkState
(
sink
!=
null
,
"No sink for event %s"
,
event
);
sink
.
process
(
event
);
}
}
}
Please
register
or
login
to post a comment