Due to a ransomware attack, the wiki was reverted to a July 2022 version. . We apologize for the lack of a more recent valid backup.
| Warning |
|---|
Work-in-progress. Completed page will be linked into the Tutorials and Walkthroughs page. |
| Table of Contents | ||
|---|---|---|
|
...
| 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>...
} |
...
| 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>... |
...
| 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;
} |
...