Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Warning

Work-in-progress. Completed page will be linked into the Tutorials and Walkthroughs page.

Table of Contents
maxLevel3

...

Code Block
languagejava
titleNullLinkProvider.java
collapsetrue
// 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
languagejava
titleNullLinkProvider.java
collapsetrue
// 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
languagejava
titleNullLinkProvider.java - modified()
collapsetrue
    @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.cfgdef

Code Block
languagebash
# This file is 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.

The configurations associated with tunable components are named by the FQDN of the component. For example, the NullLinkProvider, this would be org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg. The files are added to different locations, depending on where you want to run ONOS:

  • ${ONOS_ROOT}/tools/package/etc/ , if you wan to package and deploy ONOS instances on remote machines or VMs
  • ${KARAF_ROOT}/etc/ , if you wish to launch ONOS locally on your machine

The contents of the file are simple, a list of parameter names and their values:

Code Block
languagetext
# Sample configurations for 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.