Initial import of Microsemi Driver
Change-Id: I431d5f2c18e0b66a84c36273c3d9f0b84f223841
Added in BUCK files for building driver
Change-Id: I70681327f5b89f67e904c45d5974ab393652d51f
Corrected some syntax errors
Change-Id: I11150cc499c212005f80619e3900e747f1c23d96
Updated pom file to clean build
Change-Id: I6613ddc9e6802aa882e716cf04df210249870835
Added in utility functions for EA1000 Init
Change-Id: I51ffe0cf0daf9ffcea0e2479ee9982fcd1755440
Added YMS code to Microsemi Driver
Change-Id: I6f2a14e454c6909bf9e9f6025321c74c98c13c72
Updated driver to work with YMS and YCH
Change-Id: If7dbe3cd5bd1b6f902d09d6b2dc3895605d70f70
Implemented IetfSystemManager as a service and call on YMS as a service
Change-Id: If1c5e8482b1f53f578a3b0b770accd50024111cf
Moved YMS calls over in to Yang Service implementation
Change-Id: I044aad06f1ef7452bc48e88987787a683666cd72
improved unit test for IetfSystemManager
Change-Id: I48fbf831e7e5ca0e1ef3de8288e56da1b5ebb7a4
Major changes to IetfSystemManager to work in live system
Change-Id: I6e3aa118ba422151f314b9a666860d90905c9929
Added in retry mechanism for DeviceDescription to wait for YCH
Change-Id: If8e0f2c2f315ffd6db15627a11382a00217dd262
Added in implementation of MseaSaFiltering and unit tests
Change-Id: I34bf888e0e732bd4664d1fb8ef5abb679b1506fe
Updated driver with unit tests for MseaSaFiltering
Change-Id: I7ea2407a546622ff55d1ab21610c45697546d632
Modified removeFlowRules of Ea1000FlowRuleProgrammable
Change-Id: Ibb4a555f61887a8e6e42af588bb42f7b70f58efb
Added in manager for MseaUniEvc service with unit tests
Change-Id: Idc5853f46051548973f52a0659f7f88982ff960c
Implemented getFlowEntries() for EVCs from EA1000
Change-Id: Ie85dadfa7760f0b30a9bdf6ccd09cca9f097fff9
Added in translation of FlowRules in to EVC on EA1000
Change-Id: Icfb65171c3300c96b3ca4e18cbd327f0ed2190be
Added in handling of FlowRule deletion including complex ceVlanMaps
Change-Id: I7fd0bb0ef04d1b40e4b7d6a6db7f7ee662329780
Updated Service entries for new onos-yang-tools
Change-Id: I44e655202f3a45073e1e16f83737caed6e01afa8
Revert "Updated Service entries for new onos-yang-tools"
This reverts commit 642b550ef1de12ed59bad2eaa3a2da414d2e5e59.
Improved timeout mechanism for YANG model loading
Change-Id: If744ecd206372e822edf2b736c83226321a12256
Minor edits of EVC creation
Change-Id: Ib0a4763deaf6dce37625ba77f5095b39cd98272d
Added in CustomEvc and supporting classes
Change-Id: Iad60eb1bcd48d2aec55b894b2d419b51852c3b2f
Created CeVlanUtils to resolve loading problem
Change-Id: I0d63931ad2c5ad2725861ebc7dccc4d5fe7b9298
Modified startup check
Change-Id: I6e6bcfa7e615044cb08fe7ee2f8a6c8b89aabb21
Modified handlin of flow rules
Change-Id: I965a79c23298866122aeb94c6d9d584aafee3bd5
Fixed problem with ceVlanMap
Change-Id: If1458c35d0b95b5b25b6636f098292f9e91c06c6
Minor Pom edits
Change-Id: I5cefb18674aa04b1f50bd7e2306260c1c3ad3814
Commented out extension references in YANG files to avoid onos-yang-tools problems
Change-Id: I32fdb34c4f476f495fe28e75d0f410aaf14e2ec1
Corrected error in removing 0 in CeVlanMapUtils
Change-Id: I8cd1fd02788b81c2613364d5639ef6e090057f80
Changes in YMS to accomodate EA1000 driver
Change-Id: I6ae2b9bd2be49eae8d4ad2f929dfe3214c514550
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
new file mode 100644
index 0000000..2ecc70f
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.microsemi;
+
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.core.CoreService;
+import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.meter.Band;
+import org.onosproject.net.meter.Meter.Unit;
+import org.onosproject.net.meter.MeterOperation;
+import org.onosproject.net.meter.MeterOperations;
+import org.onosproject.net.meter.MeterProvider;
+import org.onosproject.net.meter.MeterProviderRegistry;
+import org.onosproject.net.meter.MeterProviderService;
+import org.onosproject.net.provider.AbstractProvider;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.CosColorType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.PriorityType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.coscolortype.CosColorTypeEnum;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcService.OnosYangOpType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.DefaultMefServices;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.MefServices;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.DefaultProfiles;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.DefaultProfiles.ProfilesBuilder;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.BwpGroup;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.Cos;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.DefaultBwpGroup;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.DefaultCos;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.Bwp;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.DefaultBwp;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.cos.costypechoice.DefaultEvcCosTypeEvcColorId;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.cos.costypechoice.evccostypeevccolorid.DefaultEvcCosTypeAll8PrioTo1EvcColor;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.cos.costypechoice.evccostypeevccolorid.EvcCosTypeAll8PrioTo1EvcColor;
+import org.slf4j.Logger;
+
+/**
+ * Provider which uses an NETCONF controller to handle meters.
+ */
+@Component(immediate = true, enabled = true)
+public class EA1000MeterProvider extends AbstractProvider implements MeterProvider {
+
+ private final Logger log = getLogger(getClass());
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected NetconfController controller;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected MeterProviderRegistry providerRegistry;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected CoreService coreService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected MseaUniEvcServiceNetconfService mseaUniEvcServiceSvc;
+
+ private MeterProviderService providerService;
+
+ private static final int COS_INDEX_1 = 1;
+ private static final short DEFAULT_OUTGOING_PRIO = 3;
+
+ /**
+ * Creates a OpenFlow meter provider.
+ */
+ public EA1000MeterProvider() {
+ super(new ProviderId("netconf", "org.onosproject.provider.meter.microsemi"));
+ }
+
+ @Activate
+ public void activate() {
+ providerService = providerRegistry.register(this);
+
+ }
+
+ @Deactivate
+ public void deactivate() {
+ providerRegistry.unregister(this);
+
+ providerService = null;
+ }
+
+ @Override
+ public void performMeterOperation(DeviceId deviceId, MeterOperations meterOps) {
+ log.debug("Adding meterOps to Microsemi Meter Store");
+ }
+
+ @Override
+ public void performMeterOperation(DeviceId deviceId, MeterOperation meterOp) {
+ if (meterOp == null || deviceId == null) {
+ log.warn("Missing argument for performMeterOperation()");
+ return;
+ }
+ log.debug("{} meterOp {} to Microsemi Meter Store", meterOp.type(), meterOp);
+
+ long meterId = meterOp.meter().id().id();
+ String deviceName = deviceId.uri().getSchemeSpecificPart();
+ Unit unit = meterOp.meter().unit();
+
+ ProfilesBuilder profilesBuilder = DefaultProfiles.builder();
+ if (meterOp.type() == MeterOperation.Type.ADD || meterOp.type() == MeterOperation.Type.MODIFY) {
+ Bwp.BwpBuilder bwpBuilder = DefaultBwp.builder()
+ .cosIndex(COS_INDEX_1)
+ .name("BWP-" + String.valueOf(meterId) + "-" + deviceName);
+
+ long cirRateKbps = 0L;
+ long cbsRateKbps = 0L;
+ long eirRateKbps = 0L;
+ long ebsRateKbps = 0L;
+ for (Band band:meterOp.meter().bands()) {
+ if (band.type() == Band.Type.REMARK) {
+ //This relates to CIR/CBS
+ cirRateKbps = toBitsPerSec(band.rate(), unit);
+ cbsRateKbps = band.burst(); //Already in kbps
+ } else if (band.type() == Band.Type.DROP) {
+ //This relates to EIR/EBS
+ eirRateKbps = toBitsPerSec(band.rate(), unit);
+ ebsRateKbps = band.burst(); //Already in kbps
+ }
+ }
+ bwpBuilder.committedInformationRate(cirRateKbps).excessInformationRate(eirRateKbps - cirRateKbps);
+ if (meterOp.meter().isBurst()) {
+ bwpBuilder.committedBurstSize(cbsRateKbps).excessBurstSize(ebsRateKbps - cbsRateKbps);
+ }
+
+ BwpGroup.BwpGroupBuilder bwpgBuilder =
+ DefaultBwpGroup.builder()
+ .groupIndex((short) meterId)
+ .addToBwp(bwpBuilder.build());
+
+ //Create cos-1 as referenced above - we only support 1 at the moment
+ Cos.CosBuilder cosBuilder = DefaultCos.builder()
+ .cosIndex(COS_INDEX_1)
+ .name("COS-1")
+ .outgoingCosValue(PriorityType.of(DEFAULT_OUTGOING_PRIO))
+ .colorAware(true)
+ .colorForward(true);
+ EvcCosTypeAll8PrioTo1EvcColor ect =
+ DefaultEvcCosTypeAll8PrioTo1EvcColor.builder()
+ .evcAll8ColorTo(CosColorType.of(CosColorTypeEnum.GREEN)).build();
+ profilesBuilder
+ .addToBwpGroup(bwpgBuilder.build())
+ .addToCos(cosBuilder.cosTypeChoice(
+ DefaultEvcCosTypeEvcColorId.builder()
+ .evcCosTypeAll8PrioTo1EvcColor(ect).build()).build())
+ .build();
+ } else if (meterOp.type() == MeterOperation.Type.REMOVE) {
+ BwpGroup.BwpGroupBuilder bwpgBuilder =
+ DefaultBwpGroup.builder()
+ .groupIndex((short) meterId)
+ .yangBwpGroupOpType(OnosYangOpType.DELETE);
+
+ profilesBuilder.addToBwpGroup(bwpgBuilder.build()).build();
+ }
+
+ MefServices mefServices = DefaultMefServices.builder().profiles(profilesBuilder.build()).build();
+
+ MseaUniEvcService.MseaUniEvcServiceBuilder evcUniBuilder =
+ new MseaUniEvcServiceOpParam.MseaUniEvcServiceBuilder();
+
+ MseaUniEvcServiceOpParam mseaUniEvcServiceFilter =
+ (MseaUniEvcServiceOpParam) evcUniBuilder.mefServices(mefServices).build();
+ NetconfSession session = controller.getDevicesMap().get(deviceId).getSession();
+ try {
+ mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter, session, TargetConfig.RUNNING);
+ } catch (NetconfException e) {
+ //This can fail if the BWP Group is deleted before the EVC that is dependent on it
+ //The delete of the EVC will be called on a separate thread to that should proceed
+ //within a few seconds after which we should try again
+ AtomicInteger retry = new AtomicInteger(4);
+ if (meterOp.type() == MeterOperation.Type.REMOVE &&
+ e.getMessage().startsWith("Failed to run edit-config through NETCONF")) {
+ while (retry.getAndDecrement() > 0) {
+ try {
+ Thread.sleep(1000L);
+ log.debug("Retrying deletion of Bandwith Profile Group {}", String.valueOf(meterId));
+ mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter,
+ session, TargetConfig.RUNNING);
+ return; //If it did not throw an exception
+ } catch (InterruptedException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ } catch (NetconfException e1) {
+ log.debug("NETCONF failed to delete profile - trying again in 1 sec");
+ e1.printStackTrace();
+ }
+ }
+ log.error("Error deleting BWPGroup {} from {} after 4 tries: {}", meterId, deviceId, e.getMessage());
+ } else {
+ log.error("Error adding BWPGroup {} from {}: {}", meterId, deviceId, e.getMessage());
+ throw new UnsupportedOperationException(e);
+ }
+ e.printStackTrace();
+ }
+ }
+
+ private static long toBitsPerSec(long rate, Unit unit) {
+ if (unit == Unit.KB_PER_SEC) {
+ return rate * 8;
+ } else {
+ return -1;
+ }
+ }
+}