Committed by
Gerrit Code Review
Enhancing the driver subsystem to allow retrieving originating data/handler cont…
…exts from the behaviours. Change-Id: I973888190d569e7e147376b5ae4da9d2f2d9c620
Showing
12 changed files
with
105 additions
and
42 deletions
| ... | @@ -15,6 +15,8 @@ | ... | @@ -15,6 +15,8 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.net.driver; | 16 | package org.onosproject.net.driver; |
| 17 | 17 | ||
| 18 | +import static com.google.common.base.Preconditions.checkState; | ||
| 19 | + | ||
| 18 | /** | 20 | /** |
| 19 | * Base implementation of device driver behaviour. | 21 | * Base implementation of device driver behaviour. |
| 20 | */ | 22 | */ |
| ... | @@ -23,12 +25,13 @@ public class AbstractBehaviour implements Behaviour { | ... | @@ -23,12 +25,13 @@ public class AbstractBehaviour implements Behaviour { |
| 23 | private DriverData data; | 25 | private DriverData data; |
| 24 | 26 | ||
| 25 | @Override | 27 | @Override |
| 26 | - public void setData(DriverData data) { | 28 | + public DriverData data() { |
| 27 | - this.data = data; | 29 | + return data; |
| 28 | } | 30 | } |
| 29 | 31 | ||
| 30 | @Override | 32 | @Override |
| 31 | - public DriverData data() { | 33 | + public void setData(DriverData data) { |
| 32 | - return data; | 34 | + checkState(this.data == null, "Driver data already set"); |
| 35 | + this.data = data; | ||
| 33 | } | 36 | } |
| 34 | } | 37 | } | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2015 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | +package org.onosproject.net.driver; | ||
| 17 | + | ||
| 18 | +import static com.google.common.base.Preconditions.checkState; | ||
| 19 | + | ||
| 20 | +/** | ||
| 21 | + * Base implementation of device driver handler behaviour. | ||
| 22 | + */ | ||
| 23 | +public class AbstractHandlerBehaviour | ||
| 24 | + extends AbstractBehaviour implements HandlerBehaviour { | ||
| 25 | + | ||
| 26 | + private DriverHandler handler; | ||
| 27 | + | ||
| 28 | + @Override | ||
| 29 | + public DriverHandler handler() { | ||
| 30 | + return handler; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + @Override | ||
| 34 | + public void setHandler(DriverHandler handler) { | ||
| 35 | + checkState(this.handler == null, "Driver handler already set"); | ||
| 36 | + this.handler = handler; | ||
| 37 | + } | ||
| 38 | +} |
| ... | @@ -23,17 +23,17 @@ package org.onosproject.net.driver; | ... | @@ -23,17 +23,17 @@ package org.onosproject.net.driver; |
| 23 | public interface Behaviour { | 23 | public interface Behaviour { |
| 24 | 24 | ||
| 25 | /** | 25 | /** |
| 26 | - * Sets the driver data context on this this behaviour should operate. | 26 | + * Returns the driver data context. |
| 27 | * | 27 | * |
| 28 | - * @param data driver data | 28 | + * @return driver data |
| 29 | */ | 29 | */ |
| 30 | - void setData(DriverData data); | 30 | + DriverData data(); |
| 31 | 31 | ||
| 32 | /** | 32 | /** |
| 33 | - * Obtains the driver data. | 33 | + * Sets the driver data context on this this behaviour should operate. |
| 34 | * | 34 | * |
| 35 | - * @return driver data | 35 | + * @param data driver data |
| 36 | */ | 36 | */ |
| 37 | - DriverData data(); | 37 | + void setData(DriverData data); |
| 38 | 38 | ||
| 39 | } | 39 | } | ... | ... |
| ... | @@ -63,13 +63,6 @@ public class DefaultDriver implements Driver { | ... | @@ -63,13 +63,6 @@ public class DefaultDriver implements Driver { |
| 63 | this.properties = copyOf(checkNotNull(properties, "Properties cannot be null")); | 63 | this.properties = copyOf(checkNotNull(properties, "Properties cannot be null")); |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | - /** | ||
| 67 | - * Merges the two drivers while giving preference to this driver when | ||
| 68 | - * dealing with conflicts. | ||
| 69 | - * | ||
| 70 | - * @param other other driver | ||
| 71 | - * @return new driver | ||
| 72 | - */ | ||
| 73 | @Override | 66 | @Override |
| 74 | public Driver merge(Driver other) { | 67 | public Driver merge(Driver other) { |
| 75 | // Merge the behaviours. | 68 | // Merge the behaviours. |
| ... | @@ -121,19 +114,22 @@ public class DefaultDriver implements Driver { | ... | @@ -121,19 +114,22 @@ public class DefaultDriver implements Driver { |
| 121 | return behaviours.containsKey(behaviourClass); | 114 | return behaviours.containsKey(behaviourClass); |
| 122 | } | 115 | } |
| 123 | 116 | ||
| 124 | - /** | 117 | + @Override |
| 125 | - * Creates an instance of behaviour primed with the specified driver data. | ||
| 126 | - * | ||
| 127 | - * @param data driver data context | ||
| 128 | - * @param behaviourClass driver behaviour class | ||
| 129 | - * @param handler indicates behaviour is intended for handler context | ||
| 130 | - * @param <T> type of behaviour | ||
| 131 | - * @return behaviour instance | ||
| 132 | - */ | ||
| 133 | public <T extends Behaviour> T createBehaviour(DriverData data, | 118 | public <T extends Behaviour> T createBehaviour(DriverData data, |
| 134 | - Class<T> behaviourClass, | 119 | + Class<T> behaviourClass) { |
| 135 | - boolean handler) { | 120 | + return createBehaviour(data, null, behaviourClass); |
| 136 | - checkArgument(handler || !HandlerBehaviour.class.isAssignableFrom(behaviourClass), | 121 | + } |
| 122 | + | ||
| 123 | + @Override | ||
| 124 | + public <T extends Behaviour> T createBehaviour(DriverHandler handler, | ||
| 125 | + Class<T> behaviourClass) { | ||
| 126 | + return createBehaviour(handler.data(), handler, behaviourClass); | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + // Creates an instance of behaviour primed with the specified driver data. | ||
| 130 | + private <T extends Behaviour> T createBehaviour(DriverData data, DriverHandler handler, | ||
| 131 | + Class<T> behaviourClass) { | ||
| 132 | + checkArgument(handler != null || !HandlerBehaviour.class.isAssignableFrom(behaviourClass), | ||
| 137 | "{} is applicable only to handler context", behaviourClass.getName()); | 133 | "{} is applicable only to handler context", behaviourClass.getName()); |
| 138 | 134 | ||
| 139 | // Locate the implementation of the requested behaviour. | 135 | // Locate the implementation of the requested behaviour. |
| ... | @@ -143,6 +139,11 @@ public class DefaultDriver implements Driver { | ... | @@ -143,6 +139,11 @@ public class DefaultDriver implements Driver { |
| 143 | // Create an instance of the behaviour and apply data as its context. | 139 | // Create an instance of the behaviour and apply data as its context. |
| 144 | T behaviour = createBehaviour(behaviourClass, implementation); | 140 | T behaviour = createBehaviour(behaviourClass, implementation); |
| 145 | behaviour.setData(data); | 141 | behaviour.setData(data); |
| 142 | + | ||
| 143 | + // If this is a handler behaviour, also apply handler as its context. | ||
| 144 | + if (handler != null) { | ||
| 145 | + ((HandlerBehaviour) behaviour).setHandler(handler); | ||
| 146 | + } | ||
| 146 | return behaviour; | 147 | return behaviour; |
| 147 | } | 148 | } |
| 148 | 149 | ... | ... |
| ... | @@ -49,7 +49,7 @@ public class DefaultDriverData implements DriverData { | ... | @@ -49,7 +49,7 @@ public class DefaultDriverData implements DriverData { |
| 49 | 49 | ||
| 50 | @Override | 50 | @Override |
| 51 | public <T extends Behaviour> T behaviour(Class<T> behaviourClass) { | 51 | public <T extends Behaviour> T behaviour(Class<T> behaviourClass) { |
| 52 | - return driver.createBehaviour(this, behaviourClass, false); | 52 | + return driver.createBehaviour(this, behaviourClass); |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | @Override | 55 | @Override | ... | ... |
| ... | @@ -45,7 +45,7 @@ public class DefaultDriverHandler implements DriverHandler { | ... | @@ -45,7 +45,7 @@ public class DefaultDriverHandler implements DriverHandler { |
| 45 | 45 | ||
| 46 | @Override | 46 | @Override |
| 47 | public <T extends Behaviour> T behaviour(Class<T> behaviourClass) { | 47 | public <T extends Behaviour> T behaviour(Class<T> behaviourClass) { |
| 48 | - return data.driver().createBehaviour(this.data, behaviourClass, true); | 48 | + return data.driver().createBehaviour(this, behaviourClass); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | @Override | 51 | @Override | ... | ... |
| ... | @@ -84,12 +84,20 @@ public interface Driver extends Annotations { | ... | @@ -84,12 +84,20 @@ public interface Driver extends Annotations { |
| 84 | * | 84 | * |
| 85 | * @param data driver data context | 85 | * @param data driver data context |
| 86 | * @param behaviourClass driver behaviour class | 86 | * @param behaviourClass driver behaviour class |
| 87 | - * @param handler indicates behaviour is intended for handler context | ||
| 88 | * @param <T> type of behaviour | 87 | * @param <T> type of behaviour |
| 89 | * @return behaviour instance | 88 | * @return behaviour instance |
| 90 | */ | 89 | */ |
| 91 | - <T extends Behaviour> T createBehaviour(DriverData data, Class<T> behaviourClass, | 90 | + <T extends Behaviour> T createBehaviour(DriverData data, Class<T> behaviourClass); |
| 92 | - boolean handler); | 91 | + |
| 92 | + /** | ||
| 93 | + * Creates an instance of behaviour primed with the specified driver data. | ||
| 94 | + * | ||
| 95 | + * @param handler driver handler context | ||
| 96 | + * @param behaviourClass driver behaviour class | ||
| 97 | + * @param <T> type of behaviour | ||
| 98 | + * @return behaviour instance | ||
| 99 | + */ | ||
| 100 | + <T extends Behaviour> T createBehaviour(DriverHandler handler, Class<T> behaviourClass); | ||
| 93 | 101 | ||
| 94 | /** | 102 | /** |
| 95 | * Returns the set of annotations as map of key/value properties. | 103 | * Returns the set of annotations as map of key/value properties. | ... | ... |
| ... | @@ -20,4 +20,19 @@ package org.onosproject.net.driver; | ... | @@ -20,4 +20,19 @@ package org.onosproject.net.driver; |
| 20 | * with a device (in context of {@link org.onosproject.net.driver.DriverHandler}). | 20 | * with a device (in context of {@link org.onosproject.net.driver.DriverHandler}). |
| 21 | */ | 21 | */ |
| 22 | public interface HandlerBehaviour extends Behaviour { | 22 | public interface HandlerBehaviour extends Behaviour { |
| 23 | + | ||
| 24 | + /** | ||
| 25 | + * Returns the driver handler context on which this behaviour operates. | ||
| 26 | + * | ||
| 27 | + * @return driver handler context | ||
| 28 | + */ | ||
| 29 | + DriverHandler handler(); | ||
| 30 | + | ||
| 31 | + /** | ||
| 32 | + * Sets the driver handler context for this behaviour. | ||
| 33 | + * | ||
| 34 | + * @param handler driver handler | ||
| 35 | + */ | ||
| 36 | + void setHandler(DriverHandler handler); | ||
| 37 | + | ||
| 23 | } | 38 | } | ... | ... |
| ... | @@ -18,5 +18,5 @@ package org.onosproject.net.driver; | ... | @@ -18,5 +18,5 @@ package org.onosproject.net.driver; |
| 18 | /** | 18 | /** |
| 19 | * Test behaviour. | 19 | * Test behaviour. |
| 20 | */ | 20 | */ |
| 21 | -public class TestBehaviourTwoImpl extends AbstractBehaviour implements TestBehaviourTwo { | 21 | +public class TestBehaviourTwoImpl extends AbstractHandlerBehaviour implements TestBehaviourTwo { |
| 22 | } | 22 | } | ... | ... |
| ... | @@ -67,7 +67,7 @@ public class XmlDriverLoaderTest { | ... | @@ -67,7 +67,7 @@ public class XmlDriverLoaderTest { |
| 67 | InputStream stream = getClass().getResourceAsStream("drivers.noconstructor.xml"); | 67 | InputStream stream = getClass().getResourceAsStream("drivers.noconstructor.xml"); |
| 68 | DriverProvider provider = loader.loadDrivers(stream); | 68 | DriverProvider provider = loader.loadDrivers(stream); |
| 69 | Driver driver = provider.getDrivers().iterator().next(); | 69 | Driver driver = provider.getDrivers().iterator().next(); |
| 70 | - driver.createBehaviour(new DefaultDriverData(driver), TestBehaviour.class, false); | 70 | + driver.createBehaviour(new DefaultDriverData(driver), TestBehaviour.class); |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | } | 73 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -21,7 +21,7 @@ import org.onosproject.core.DefaultGroupId; | ... | @@ -21,7 +21,7 @@ import org.onosproject.core.DefaultGroupId; |
| 21 | import org.onosproject.net.DeviceId; | 21 | import org.onosproject.net.DeviceId; |
| 22 | import org.onosproject.net.behaviour.Pipeliner; | 22 | import org.onosproject.net.behaviour.Pipeliner; |
| 23 | import org.onosproject.net.behaviour.PipelinerContext; | 23 | import org.onosproject.net.behaviour.PipelinerContext; |
| 24 | -import org.onosproject.net.driver.AbstractBehaviour; | 24 | +import org.onosproject.net.driver.AbstractHandlerBehaviour; |
| 25 | import org.onosproject.net.flow.DefaultFlowRule; | 25 | import org.onosproject.net.flow.DefaultFlowRule; |
| 26 | import org.onosproject.net.flow.FlowRule; | 26 | import org.onosproject.net.flow.FlowRule; |
| 27 | import org.onosproject.net.flow.FlowRuleOperations; | 27 | import org.onosproject.net.flow.FlowRuleOperations; |
| ... | @@ -41,7 +41,7 @@ import static org.slf4j.LoggerFactory.getLogger; | ... | @@ -41,7 +41,7 @@ import static org.slf4j.LoggerFactory.getLogger; |
| 41 | /** | 41 | /** |
| 42 | * Simple single table pipeline abstraction. | 42 | * Simple single table pipeline abstraction. |
| 43 | */ | 43 | */ |
| 44 | -public class DefaultSingleTablePipeline extends AbstractBehaviour implements Pipeliner { | 44 | +public class DefaultSingleTablePipeline extends AbstractHandlerBehaviour implements Pipeliner { |
| 45 | 45 | ||
| 46 | private final Logger log = getLogger(getClass()); | 46 | private final Logger log = getLogger(getClass()); |
| 47 | 47 | ||
| ... | @@ -55,7 +55,6 @@ public class DefaultSingleTablePipeline extends AbstractBehaviour implements Pip | ... | @@ -55,7 +55,6 @@ public class DefaultSingleTablePipeline extends AbstractBehaviour implements Pip |
| 55 | this.deviceId = deviceId; | 55 | this.deviceId = deviceId; |
| 56 | 56 | ||
| 57 | flowRuleService = serviceDirectory.get(FlowRuleService.class); | 57 | flowRuleService = serviceDirectory.get(FlowRuleService.class); |
| 58 | - | ||
| 59 | } | 58 | } |
| 60 | 59 | ||
| 61 | @Override | 60 | @Override | ... | ... |
| ... | @@ -26,7 +26,7 @@ import org.onosproject.core.CoreService; | ... | @@ -26,7 +26,7 @@ import org.onosproject.core.CoreService; |
| 26 | import org.onosproject.net.DeviceId; | 26 | import org.onosproject.net.DeviceId; |
| 27 | import org.onosproject.net.behaviour.Pipeliner; | 27 | import org.onosproject.net.behaviour.Pipeliner; |
| 28 | import org.onosproject.net.behaviour.PipelinerContext; | 28 | import org.onosproject.net.behaviour.PipelinerContext; |
| 29 | -import org.onosproject.net.driver.AbstractBehaviour; | 29 | +import org.onosproject.net.driver.AbstractHandlerBehaviour; |
| 30 | import org.onosproject.net.flow.DefaultFlowRule; | 30 | import org.onosproject.net.flow.DefaultFlowRule; |
| 31 | import org.onosproject.net.flow.DefaultTrafficSelector; | 31 | import org.onosproject.net.flow.DefaultTrafficSelector; |
| 32 | import org.onosproject.net.flow.DefaultTrafficTreatment; | 32 | import org.onosproject.net.flow.DefaultTrafficTreatment; |
| ... | @@ -52,7 +52,7 @@ import static org.slf4j.LoggerFactory.getLogger; | ... | @@ -52,7 +52,7 @@ import static org.slf4j.LoggerFactory.getLogger; |
| 52 | /** | 52 | /** |
| 53 | * Corsa pipeline handler. | 53 | * Corsa pipeline handler. |
| 54 | */ | 54 | */ |
| 55 | -public class OVSCorsaPipeline extends AbstractBehaviour implements Pipeliner { | 55 | +public class OVSCorsaPipeline extends AbstractHandlerBehaviour implements Pipeliner { |
| 56 | 56 | ||
| 57 | private static final int CONTROLLER_PRIORITY = 255; | 57 | private static final int CONTROLLER_PRIORITY = 255; |
| 58 | private static final int DROP_PRIORITY = 0; | 58 | private static final int DROP_PRIORITY = 0; |
| ... | @@ -79,7 +79,6 @@ public class OVSCorsaPipeline extends AbstractBehaviour implements Pipeliner { | ... | @@ -79,7 +79,6 @@ public class OVSCorsaPipeline extends AbstractBehaviour implements Pipeliner { |
| 79 | "org.onosproject.driver.OVSCorsaPipeline"); | 79 | "org.onosproject.driver.OVSCorsaPipeline"); |
| 80 | 80 | ||
| 81 | pushDefaultRules(); | 81 | pushDefaultRules(); |
| 82 | - | ||
| 83 | } | 82 | } |
| 84 | 83 | ||
| 85 | @Override | 84 | @Override | ... | ... |
-
Please register or login to post a comment