| /* |
| * Copyright 2017-present Open Networking Foundation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.onosproject.drivers.netconf; |
| |
| import static org.junit.Assert.fail; |
| |
| import java.io.InputStream; |
| import java.nio.charset.StandardCharsets; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| import javax.xml.xpath.XPath; |
| import javax.xml.xpath.XPathConstants; |
| import javax.xml.xpath.XPathFactory; |
| |
| import org.apache.commons.io.IOUtils; |
| import org.onosproject.core.CoreService; |
| import org.onosproject.mastership.MastershipService; |
| import org.onosproject.net.DeviceId; |
| import org.onosproject.net.device.DeviceService; |
| import org.onosproject.net.driver.AbstractDriverLoader; |
| import org.onosproject.net.driver.Behaviour; |
| import org.onosproject.net.driver.DefaultDriver; |
| import org.onosproject.net.driver.DefaultDriverData; |
| import org.onosproject.net.driver.Driver; |
| import org.onosproject.net.driver.DriverData; |
| import org.onosproject.net.driver.DriverHandler; |
| import org.onosproject.net.flow.FlowRuleProgrammable; |
| import org.onosproject.netconf.NetconfController; |
| import org.onosproject.netconf.NetconfException; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.NamedNodeMap; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.NodeList; |
| |
| import com.google.common.io.Resources; |
| |
| public class MockDriverHandler implements DriverHandler { |
| |
| private DriverData mockDriverData; |
| private NetconfController ncc; |
| private CoreService coreService; |
| private DeviceService deviceService; |
| private MastershipService mastershipService; |
| |
| // Centralize some initialization. |
| private void init(Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours, DeviceId mockDeviceId, |
| CoreService mockCoreService, DeviceService mockDeviceService) throws NetconfException { |
| Map<String, String> properties = new HashMap<String, String>(); |
| |
| Driver mockDriver = new DefaultDriver("mockDriver", null, "ONOSProject", "1.0.0", "1.0.0", behaviours, |
| properties); |
| mockDriverData = new DefaultDriverData(mockDriver, mockDeviceId); |
| |
| ncc = new MockNetconfController(); |
| ncc.connectDevice(mockDeviceId); |
| coreService = mockCoreService; |
| mastershipService = new MockMastershipService(); |
| deviceService = mockDeviceService; |
| } |
| |
| @SuppressWarnings("unchecked") |
| public MockDriverHandler(Class<? extends AbstractDriverLoader> loaderClass, String behaviorSpec, |
| DeviceId mockDeviceId, CoreService mockCoreService, DeviceService mockDeviceService) { |
| |
| // Had to split into declaration and initialization to make stylecheck happy |
| // else line was considered too long |
| // and auto format couldn't be tweak to make it correct |
| Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours; |
| behaviours = new HashMap<Class<? extends Behaviour>, Class<? extends Behaviour>>(); |
| |
| try { |
| String data = Resources.toString(Resources.getResource(loaderClass, behaviorSpec), StandardCharsets.UTF_8); |
| InputStream resp = IOUtils.toInputStream(data, StandardCharsets.UTF_8); |
| DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); |
| DocumentBuilder builder = builderFactory.newDocumentBuilder(); |
| Document document = builder.parse(resp); |
| |
| XPath xp = XPathFactory.newInstance().newXPath(); |
| NodeList list = (NodeList) xp.evaluate("//behaviour", document, XPathConstants.NODESET); |
| for (int i = 0; i < list.getLength(); i += 1) { |
| Node node = list.item(i); |
| NamedNodeMap attrs = node.getAttributes(); |
| Class<? extends Behaviour> api = (Class<? extends Behaviour>) Class |
| .forName(attrs.getNamedItem("api").getNodeValue()); |
| Class<? extends Behaviour> impl = (Class<? extends Behaviour>) Class |
| .forName(attrs.getNamedItem("impl").getNodeValue()); |
| behaviours.put(api, impl); |
| } |
| init(behaviours, mockDeviceId, mockCoreService, mockDeviceService); |
| } catch (Exception e) { |
| fail(e.toString()); |
| } |
| } |
| |
| public MockDriverHandler() throws NetconfException { |
| Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours; |
| behaviours = new HashMap<Class<? extends Behaviour>, Class<? extends Behaviour>>(); |
| behaviours.put(FlowRuleProgrammable.class, FlowRuleProgrammable.class); |
| DeviceId mockDeviceId = DeviceId.deviceId("netconf:1.2.3.4:830"); |
| coreService = new MockCoreService(); |
| init(behaviours, mockDeviceId, coreService, null); |
| } |
| |
| @Override |
| public Driver driver() { |
| return mockDriverData.driver(); |
| } |
| |
| @Override |
| public DriverData data() { |
| return mockDriverData; |
| } |
| |
| @Override |
| public <T extends Behaviour> T behaviour(Class<T> behaviourClass) { |
| // TODO Auto-generated method stub |
| return null; |
| } |
| |
| @SuppressWarnings("unchecked") |
| @Override |
| public <T> T get(Class<T> serviceClass) { |
| if (serviceClass.equals(NetconfController.class)) { |
| return (T) ncc; |
| } else if (serviceClass.equals(CoreService.class)) { |
| return (T) coreService; |
| } else if (serviceClass.equals(MastershipService.class)) { |
| return (T) mastershipService; |
| } else if (serviceClass.equals(DeviceService.class)) { |
| return (T) deviceService; |
| } |
| |
| return null; |
| } |
| |
| } |