Warning |
---|
Work-in-progress. Completed page will be linked into the Tutorials and Walkthroughs page. |
Table of Contents | ||
---|---|---|
|
...
While we use a Provider in this tutorial, the procedure described here is also applicable to applications.
As in the case of other tutorials, ${ONOS_ROOT} refers to the project root directory of ONOS, and ${KARAF_ROOT} refers to the installation location of Apache Karaf.
Modifications
1. Modify the component POM file.
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
// new imports import static com.google.common.base.Strings.isNullOrEmpty; import org.osgi.service.component.ComponentContext; import org.apache.felix.scr.annotations.Modified; import java.util.Dictionary; // ...<snip>... public class NullLinkProvider extends AbstractProvider implements LinkProvider { private final Logger log = getLogger(getClass()); // Attention - we need register and unregister our Class (NullLinkProvider), // before and after we load the config file @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected ComponentConfigService componentConfigService; // The Manager serving as communication point between the ONOS core and this Provider @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected LinkProviderRegistry providerRegistry; // The interface that defines how this Provider can interact with the core private LinkProviderService providerService; public NullLinkProvider() { // ProviderId is used by the core to identify this Provider // The schema "null" and FQDN of the Null southbound comprise this ID super(new ProviderId("null", "org.onosproject.provider.nil")); } @Activate public void activate(ComponentContext context) { //Attention - register for system-wide configurations componentConfigService.registerProperties(getClass()); providerService = providerRegistry.register(this); deviceService.addListener(linkProvider); // launch exactly one LinkDriver if (!modified(context)) { log.info("Using defaults: flicker={}, eventRate={}", FLICKER, DEFAULT_RATE); linkDriver.submit(new LinkDriver()); } log.info("started"); } @Deactivate public void deactivate(ComponentContext context) { //Attention - just unregister when deactivate our Class componentConfigService.unregisterProperties(getClass(),false); // ... } // The method called when configuration changes are made @Modified public boolean modified(ComponentContext context) { return false; } // ...<snip>... } |
...
ComponentContext context
: Used to pass around information read from a configuration file@Modified
: Annotation indicating that themodified()
method should be called when configuration changes are made.
We call modified()
from activate()
so that the configuration file is read at module startup. Afterwards, the @modified
annotation causes modified()
to be called whenever the file is changed.
3. Annotate the tunable parameters.
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
// new imports
import org.apache.felix.scr.annotations.Property;
// ...<snip>...
public class NullLinkProvider extends AbstractProvider implements LinkProvider {
// ...<snip>...
// Default values for tunable parameters
private static final boolean FLICKER = false;
private static final int DEFAULT_RATE = 3000;
@Property(name = "flicker", boolValue = FLICKER,
label = "Setting to flap links")
private boolean flicker = FLICKER;
@Property(name = "eventRate", intValue = DEFAULT_RATE,
label = "Duration between Link Event")
private int eventRate = DEFAULT_RATE;
// ...<snip>... |
4. Add file-parsing code.
Next, we implement modifymodified()
to parse out the values set for these parameters.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
@Modified public boolean modified(ComponentContext context) { // if there's no file, fall back to defaults if (context == null) { log.info("No configs, using defaults: flicker={}, eventRate={}", FLICKER, DEFAULT_RATE); return false; } Dictionary<?, ?> properties = context.getProperties(); boolean flickSetting; int newRate; // try to extract values keyed on the parameters' names try { String s = (String) properties.get("flicker"); flickSetting = isNullOrEmpty(s) ? flicker : Boolean.valueOf(s.trim().equals("true"); s = (String) properties.get("eventRate"); newRate = isNullOrEmpty(s) ? eventRate : Integer.valueOfparseInt(s.trim()); } catch (Exception e) { log.warn(e.getMessage()); flickSetting = flicker; newRate = eventRate; } if (flicker != flickSetting) { flicker = flickSetting; } // launch a LinkDriver with the new values, if they were changed if (flicker) { if (eventRate != newRate) { eventRate = newRate; } linkDriver.submit(new LinkDriver()); log.info("Using settings: flicker={}, eventRate={}", flicker, eventRate); return true; } return false; } |
5
...
. Verification
We can now rebuild the Null Providers to test the configurability of this Provider.
6. Modifying the cfgdef file
Use your favorite editor to modify $ONOS_HOME/providers/null/link/target/classes/org/onosproject/provider/nil/link/impl/NullLinkProvider.cfgdefThe configurations associated with tunable components are added to ${ONOS_ROOT}/tools/package/etc/ . The files are named by the FQDN of the component. For the NullLinkProvider, this would be org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg. The contents of the file are simple, a list of parameter names and their values:
Code Block | ||
---|---|---|
| ||
# SampleThis configurationsfile foris the NullLinkProvider. # # If enabled, generates LinkDetected and LinkVanished events # to make the link appear to be flapping. # # flicker = true # # If enabled, sets the time between LinkEvent generation, # in milliseconds. # # eventRate = 2000 |
Verification
We can now rebuild the Null Providers to test the configurability of this Provider.
auto-generated by onos-maven-plugin
flicker|BOOLEAN|false|Setting to flap links
eventRate|INTEGER|3000|Duration between Link Event |
You can modify one or both parameters and watch for the impact.