[ONOS-7262] Cfm improvements to allow RMeps and Mds and Mas to be added and deleted

Change-Id: Ibffb13d046bfb29dbe88de7b558c95fbf9db046d
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java
index 20e80a1..1f87634 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java
@@ -20,11 +20,13 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.onosproject.drivers.microsemi.yang.utils.MdNameUtil.getYangMdNameFromApiMdId;
 
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.onosproject.drivers.microsemi.yang.utils.MaNameUtil;
+import org.onosproject.drivers.microsemi.yang.utils.MdNameUtil;
 import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMepLbCreate;
 import org.onosproject.incubator.net.l2monitoring.cfm.Mep.Priority;
 import org.onosproject.incubator.net.l2monitoring.cfm.MepEntry;
@@ -38,21 +40,24 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMepProgrammable;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.MdNameAndTypeCombo;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.MaNameAndTypeCombo;
 
 import java.util.BitSet;
+import java.util.Optional;
 
 /**
  * Test of the CFM implementation on EA1000 through the incubator/net/l2monitoring interface.
  */
 public class EA1000CfmMepProgrammableTest {
-    EA1000CfmMepProgrammable cfmProgrammable;
     public static final MdId MD_ID_1 = MdIdCharStr.asMdId("md-1");
     public static final MaIdShort MA_ID_11 = MaIdCharStr.asMaId("ma-1-1");
     public static final MepId MEP_111 = MepId.valueOf((short) 1);
     public static final MepId MEP_112 = MepId.valueOf((short) 2);
 
+    private CfmMepProgrammable cfmProgrammable;
+
     @Before
     public void setUp() throws Exception {
         cfmProgrammable = new EA1000CfmMepProgrammable();
@@ -67,12 +72,6 @@
         fail("Not yet implemented");
     }
 
-    @Ignore
-    @Test
-    public void testGetAllMeps() {
-        fail("Not yet implemented");
-    }
-
     @Test
     public void testGetMep() throws CfmConfigException {
         MepEntry mepEntry = cfmProgrammable.getMep(MD_ID_1, MA_ID_11, MEP_111);
@@ -143,7 +142,107 @@
      */
     @Test
     public void testDeleteMep() throws CfmConfigException {
-        assertTrue(cfmProgrammable.deleteMep(MD_ID_1, MA_ID_11, MEP_111));
+        assertTrue(cfmProgrammable.deleteMep(MD_ID_1, MA_ID_11, MEP_111, Optional.empty()));
+    }
+
+    /**
+     * Create the MD md-1 on the device.
+     * This will retrieve the MD from the MockCfmMdService and will create it
+     * and its MA on the device
+     * Depends on sampleXmlRegexCreateMseaCfmMa
+     */
+    @Test
+    public void testCreateMaintenanceDomainOnDevice() throws CfmConfigException {
+        boolean success =
+                cfmProgrammable.createMdOnDevice(MdIdCharStr.asMdId("md-1"));
+        assertTrue(success);
+    }
+
+    /**
+     * Create the MD md-2 on the device.
+     * This will retrieve the MD from the MockCfmMdService and will create it on
+     * the device. This MD has no MA
+     * Depends on sampleXmlRegexCreateMseaCfmMa
+     */
+    @Test
+    public void testCreateMaintenanceDomainOnDevice2() throws CfmConfigException {
+        boolean success =
+                cfmProgrammable.createMdOnDevice(MdIdCharStr.asMdId("md-2"));
+        assertTrue(success);
+    }
+
+    /**
+     * Delete the MD md-1 on the device.
+     * This will retrieve the MD from the MockCfmMdService and will delete it on
+     * the device.
+     * Depends on sampleXmlRegexCreateMseaCfmMa
+     */
+    @Test
+    public void testDeleteMaintenanceDomainOnDevice() throws CfmConfigException {
+        boolean success =
+                cfmProgrammable.deleteMdOnDevice(MdIdCharStr.asMdId("md-1"), Optional.empty());
+        assertTrue(success);
+    }
+
+
+    /**
+     * Create the MA ma-1-1 on the device.
+     * This will retrieve the MA from the MockCfmMdService and will create it
+     * on the device under md-1
+     * Depends on sampleXmlRegexCreateMseaCfmMa
+     */
+    @Test
+    public void testCreateMaintenanceAssociationOnDevice() throws CfmConfigException {
+        boolean success =
+                cfmProgrammable.createMaOnDevice(
+                        MdIdCharStr.asMdId("md-1"), MaIdCharStr.asMaId("ma-1-1"));
+        assertTrue(success);
+    }
+
+    /**
+     * Delete the MD md-1 on the device.
+     * This will retrieve the MD from the MockCfmMdService and will delete it on
+     * the device.
+     * Depends on sampleXmlRegexCreateMseaCfmMa
+     */
+    @Test
+    public void testDeleteMaintenanceAssociationOnDevice() throws CfmConfigException {
+        boolean success =
+                cfmProgrammable.deleteMaOnDevice(
+                        MdIdCharStr.asMdId("md-1"),
+                        MaIdCharStr.asMaId("ma-1-1"),
+                        Optional.empty());
+        assertTrue(success);
+    }
+
+    /**
+     * Create the Remote Mep 10001 in ma-1-1 on the device.
+     * This will retrieve the MA from the MockCfmMdService and will create the
+     * new remote mep under it on the device
+     * Depends on sampleXmlRegexCreateMseaCfmMa
+     */
+    @Test
+    public void testCreateRemoteMepOnDevice() throws CfmConfigException {
+        boolean success =
+                cfmProgrammable.createMaRemoteMepOnDevice(
+                        MdIdCharStr.asMdId("md-1"), MaIdCharStr.asMaId("ma-1-1"),
+                        MepId.valueOf((short) 1001));
+        assertTrue(success);
+    }
+
+    /**
+     * Delete the Remote Mep 1002 in ma-1-1 on the device.
+     * This will retrieve the MA from the MockCfmMdService and will delete the
+     * existing remote mep under it on the device
+     * Depends on sampleXmlRegexCreateMseaCfmMa
+     */
+    @Test
+    public void testDeleteRemoteMepOnDevice() throws CfmConfigException {
+        boolean success =
+                cfmProgrammable.deleteMaRemoteMepOnDevice(
+                        MdIdCharStr.asMdId("md-1"), MaIdCharStr.asMaId("ma-1-1"),
+                        MepId.valueOf((short) 1001));
+        assertTrue(success);
     }
 
     /**
@@ -167,25 +266,21 @@
         cfmProgrammable.abortLoopback(MD_ID_1, MA_ID_11, MEP_111);
     }
 
-//    @Test
-//    public void testTransmitLinktrace() {
-//        fail("Not yet implemented");
-//    }
+    @Ignore
+    @Test
+    public void testTransmitLinktrace() {
+        fail("Not yet implemented");
+    }
 
     @Test
     public void testGetYangMdNameFromApiMdId() throws CfmConfigException {
-        MdNameAndTypeCombo name = EA1000CfmMepProgrammable
-                .getYangMdNameFromApiMdId(MdIdCharStr.asMdId("md-1"));
+        MdNameAndTypeCombo name = getYangMdNameFromApiMdId(MdIdCharStr.asMdId("md-1"));
 
         assertEquals(org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm
                 .maintenancedomain.mdnameandtypecombo
                 .DefaultNameCharacterString.class, name.getClass());
 
-//There's a problem with checkstyle for typecast on really long paths
-//        assertEquals("md-1", ((org.onosproject.yang.gen.v1.http.www.microsemi.com
-//                .microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm
-//                .maintenancedomain.mdnameandtypecombo
-//                .DefaultNameCharacterString) name).name().string());
+        assertEquals("md-1", MdNameUtil.cast(name).name().string());
     }
 
     @Test
@@ -196,11 +291,6 @@
                 .maintenancedomain.maintenanceassociation.manameandtypecombo
                 .DefaultNameCharacterString.class, name.getClass());
 
-//There's a problem with checkstyle for typecast on really long paths
-//        assertEquals("ma-1-1", ((org.onosproject.yang.gen.v1.http.www.microsemi.com
-//                .microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm
-//                .maintenancedomain.maintenanceassociation.manameandtypecombo
-//                .DefaultNameCharacterString) name).name().string());
+        assertEquals("ma-1-1", MaNameUtil.cast(name).name().string());
     }
-
 }
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
index 58a8a5b..742f8c9 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
@@ -20,6 +20,7 @@
 
 import org.onosproject.core.CoreService;
 import org.onosproject.drivers.microsemi.yang.MockCfmMdService;
+import org.onosproject.drivers.microsemi.yang.MockCfmMepService;
 import org.onosproject.drivers.microsemi.yang.MockMseaCfmManager;
 import org.onosproject.drivers.microsemi.yang.MockMseaSaFilteringManager;
 import org.onosproject.drivers.microsemi.yang.MockMseaUniEvcServiceManager;
@@ -31,6 +32,7 @@
 import org.onosproject.drivers.netconf.MockNetconfController;
 import org.onosproject.drivers.netconf.MockNetconfDevice;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMepService;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.driver.Behaviour;
 import org.onosproject.net.driver.DefaultDriver;
@@ -59,6 +61,7 @@
     private MockMseaUniEvcServiceManager mseaUniEvcService;
     private MockMseaCfmManager mseaCfmService;
     private MockCfmMdService mockMdService;
+    private MockCfmMepService mockMepService;
     private CoreService coreService;
 
     public MockEa1000DriverHandler() throws NetconfException {
@@ -92,6 +95,9 @@
         mockMdService = new MockCfmMdService();
         mockMdService.activate();
 
+        mockMepService = new MockCfmMepService();
+        mockMepService.activate();
+
         coreService = new MockCoreService();
         coreService.registerApplication(MICROSEMI_DRIVERS);
     }
@@ -131,6 +137,10 @@
 
         } else if (serviceClass.equals(CfmMdService.class)) {
             return (T) mockMdService;
+
+        } else if (serviceClass.equals(CfmMepService.class)) {
+            return (T) mockMepService;
+
         }
 
         return null;
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockCfmMdService.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockCfmMdService.java
index ba6d656..3d0fb5f 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockCfmMdService.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockCfmMdService.java
@@ -15,6 +15,8 @@
  */
 package org.onosproject.drivers.microsemi.yang;
 
+import org.onlab.packet.VlanId;
+import org.onosproject.incubator.net.l2monitoring.cfm.DefaultComponent;
 import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMaintenanceAssociation;
 import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMaintenanceDomain;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
@@ -22,6 +24,7 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
 import org.onosproject.incubator.net.l2monitoring.cfm.impl.CfmMdManager;
 import static org.easymock.EasyMock.*;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
@@ -29,6 +32,9 @@
 
 import java.util.Optional;
 
+/**
+ * Supports testing of services that reply on the CfmMdService.
+ */
 public class MockCfmMdService extends CfmMdManager {
 
     @Override
@@ -40,6 +46,11 @@
                     .builder(MaIdCharStr.asMaId("ma-1-1"), 6)
                     .maNumericId((short) 1)
                     .ccmInterval(MaintenanceAssociation.CcmInterval.INTERVAL_3MS)
+                    .addToRemoteMepIdList(MepId.valueOf((short) 10))
+                    .addToRemoteMepIdList(MepId.valueOf((short) 20))
+                    .addToComponentList(
+                            DefaultComponent.builder(1)
+                                    .addToVidList(VlanId.vlanId((short) 101)).build())
                     .build();
 
             MdId md1Name = MdIdCharStr.asMdId("md-1");
@@ -50,14 +61,25 @@
                     .addToMaList(ma)
                     .build();
 
+            MdId md2Name = MdIdCharStr.asMdId("md-2");
+            MaintenanceDomain md2 = DefaultMaintenanceDomain
+                    .builder(md1Name)
+                    .mdNumericId((short) 2)
+                    .mdLevel(MaintenanceDomain.MdLevel.LEVEL2)
+                    .build();
+
             expect(store.createUpdateMaintenanceDomain(md1))
                     .andReturn(true);
+            expect(store.createUpdateMaintenanceDomain(md2))
+                    .andReturn(true);
             expect(store.getMaintenanceDomain(md1Name))
                     .andReturn(Optional.of(md1)).anyTimes();
+            expect(store.getMaintenanceDomain(md2Name))
+                    .andReturn(Optional.of(md2)).anyTimes();
             replay(store);
 
         } catch (CfmConfigException e) {
-            throw new IllegalArgumentException("Error creating Md md-1 for test");
+            throw new IllegalArgumentException("Error creating MDs for test", e);
         }
     }
 }
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockCfmMepService.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockCfmMepService.java
new file mode 100644
index 0000000..c00fc4e
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockCfmMepService.java
@@ -0,0 +1,137 @@
+/*
+ * 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.microsemi.yang;
+
+import org.onlab.junit.TestUtils;
+import org.onlab.packet.ChassisId;
+import org.onosproject.common.event.impl.TestEventDispatcher;
+import org.onosproject.core.CoreServiceAdapter;
+import org.onosproject.core.IdGenerator;
+import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMep;
+import org.onosproject.incubator.net.l2monitoring.cfm.Mep;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepKeyId;
+import org.onosproject.incubator.net.l2monitoring.cfm.impl.CfmMdManager;
+import org.onosproject.incubator.net.l2monitoring.cfm.impl.CfmMepManager;
+import org.onosproject.incubator.net.l2monitoring.cfm.impl.TestCfmMepProgrammable;
+import org.onosproject.incubator.net.l2monitoring.cfm.impl.TestDeviceDiscoveryBehavior;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMepProgrammable;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.MepStore;
+import org.onosproject.incubator.net.l2monitoring.soam.SoamDmProgrammable;
+import org.onosproject.incubator.net.l2monitoring.soam.impl.TestSoamDmProgrammable;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DefaultDevice;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DeviceDescriptionDiscovery;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.Behaviour;
+import org.onosproject.net.driver.DefaultDriver;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.net.provider.ProviderId;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.onosproject.net.NetTestTools.injectEventDispatcher;
+
+/**
+ * Supports testing of services that reply on the CfmMepService.
+ */
+public class MockCfmMepService extends CfmMepManager {
+    private static final String TEST_MFR = "testMfr";
+    private static final String TEST_HW_VERSION = "testHwVersion";
+    private static final String TEST_SW_VERSION = "testSwVersion";
+    private static final String TEST_SN = "testSn";
+    private static final String TEST_DRIVER = "testDriver";
+    protected static final DeviceId DEVICE_ID1 = DeviceId.deviceId("netconf:1.2.3.4:830");
+
+
+    private final DriverService driverService = createMock(DriverService.class);
+
+    private Device device1;
+    private Driver testDriver;
+
+
+    @Override
+    public void activate() {
+        mepStore = createMock(MepStore.class);
+        cfmMdService = new MockCfmMdService();
+        deviceService = createMock(DeviceService.class);
+        ((CfmMdManager) cfmMdService).activate();
+
+        device1 = new DefaultDevice(
+                ProviderId.NONE, DEVICE_ID1, Device.Type.SWITCH,
+                TEST_MFR, TEST_HW_VERSION, TEST_SW_VERSION, TEST_SN,
+                new ChassisId(1),
+                DefaultAnnotations.builder().set(AnnotationKeys.DRIVER, TEST_DRIVER).build());
+
+        Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours = new HashMap<>();
+        behaviours.put(DeviceDescriptionDiscovery.class, TestDeviceDiscoveryBehavior.class);
+        behaviours.put(CfmMepProgrammable.class, TestCfmMepProgrammable.class);
+        behaviours.put(SoamDmProgrammable.class, TestSoamDmProgrammable.class);
+
+        TestUtils.setField(this, "coreService", new TestCoreService());
+        TestUtils.setField(this, "deviceService", deviceService);
+        injectEventDispatcher(this, new TestEventDispatcher());
+
+        testDriver = new DefaultDriver(
+                TEST_DRIVER, new ArrayList<Driver>(),
+                TEST_MFR, TEST_HW_VERSION, TEST_SW_VERSION,
+                behaviours, new HashMap<>());
+
+        try {
+            Mep mep1 = DefaultMep.builder(
+                        MepId.valueOf((short) 10),
+                        DEVICE_ID1,
+                        PortNumber.P0,
+                        Mep.MepDirection.UP_MEP,
+                        MdIdCharStr.asMdId("md-1"),
+                        MaIdCharStr.asMaId("ma-1-1"))
+                    .build();
+
+            expect(mepStore.getMep(new MepKeyId(mep1))).andReturn(Optional.of(mep1)).anyTimes();
+        } catch (CfmConfigException e) {
+            throw new IllegalArgumentException("Error creating MEPs for test", e);
+        }
+    }
+
+    private class TestCoreService extends CoreServiceAdapter {
+
+        @Override
+        public IdGenerator getIdGenerator(String topic) {
+            return new IdGenerator() {
+                private AtomicLong counter = new AtomicLong(0);
+
+                @Override
+                public long getNewId() {
+                    return counter.getAndIncrement();
+                }
+            };
+        }
+    }
+}
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
index b9d4342..6bf67c0 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
@@ -478,11 +478,12 @@
                     + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                     + "(<mef-cfm).*"
                     + "(<maintenance-domain>)\\R?"
-                    + "(<id/>)?\\R?"
-                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
+                    + "(<id>[0-9]{1,5}</id>)?\\R?"
+                    + "((<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>))?\\R?"
                     + "(<maintenance-association>)\\R?"
-                    + "(<id/>)?\\R?"
-                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
+                    + "(<id>[0-9]{1,5}</id>)?\\R?"
+                    + "((<name>[a-zA-Z0-9\\-:\\.]{1,48}</name>)|"
+                    + "(<name-primary-vid>[0-9]{1,4}</name-primary-vid>))?\\R?"
                     + "(<maintenance-association-end-point nc:operation=\"delete\">)\\R?"
                     + "(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)\\R?"
                     + "(</maintenance-association-end-point>)\\R?"
@@ -492,6 +493,85 @@
                     + "(</config>)\\R?"
                     + "(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
 
+    //For testGetConfigMseaCfmEssentials
+    private Pattern sampleXmlRegexCreateMseaCfmMa =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
+                    + "(<target>\\R?<running/>\\R?</target>)\\R?"
+                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
+                    + "(<mef-cfm).*"
+                    + "(<maintenance-domain>)\\R?"
+                    + "(<id>)([0-9]){1,4}(</id>)\\R?"
+                    + "((<md-level>)([0-9]){1}(</md-level>))?\\R?"
+                    + "((<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>))?\\R?"
+                    + "((<maintenance-association>)\\R?"
+                    + "(<id>)([0-9]){1,4}(</id>)\\R?"
+                    + "((<ccm-interval>)(3.3ms)(</ccm-interval>))?\\R?"
+                    + "((<remote-meps>)([0-9]){1,4}(</remote-meps>))*\\R?"
+                    + "(((<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>))|"
+                    + "((<name-primary-vid>)([0-9]){1,4}(</name-primary-vid>)))?\\R?"
+                    + "((<component-list>)\\R?"
+                    + "(<vid>)([0-9]){1,4}(</vid>)\\R?"
+                    + "(</component-list>))?\\R?"
+                    + "(</maintenance-association>))*\\R?"
+                    + "(</maintenance-domain>)\\R?"
+                    + "(</mef-cfm>)\\R?"
+                    + "(</config>)\\R?"
+                    + "(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    //For testGetConfigMseaCfmEssentials
+    private Pattern sampleXmlRegexDeleteMseaCfmMa =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
+                    + "(<target>\\R?<running/>\\R?</target>)\\R?"
+                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
+                    + "(<mef-cfm).*"
+                    + "(<maintenance-domain>)\\R?"
+                    + "((<id/>)|((<id>)([0-9]){1,4}(</id>)))?\\R?"
+                    + "((<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>))?\\R?"
+                    + "(<maintenance-association nc:operation=\"delete\">)\\R?"
+                    + "((<id/>)|((<id>)([0-9]){1,4}(</id>)))?\\R?"
+                    + "(((<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>))|"
+                    + "((<name-primary-vid>)([0-9]){1,4}(</name-primary-vid>)))?\\R?"
+                    + "(</maintenance-association>)\\R?"
+                    + "(</maintenance-domain>)\\R?"
+                    + "(</mef-cfm>)\\R?"
+                    + "(</config>)\\R?"
+                    + "(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    //For testDeleteMseaMepRemoteMep
+    private Pattern sampleXmlRegexDeleteMseaCfmRmep =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
+                    + "(<target>\\R?<running/>\\R?</target>)\\R?"
+                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
+                    + "(<mef-cfm).*"
+                    + "(<maintenance-domain>)\\R?"
+                    + "((<id>)[0-9]{1,4}(</id>))?\\R?"
+                    + "((<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>))?\\R?"
+                    + "(<maintenance-association>)\\R?"
+                    + "((<id>)[0-9]{1,4}(</id>))?\\R?"
+                    + "((<remote-meps nc:operation=\"delete\">)([0-9]){1,4}(</remote-meps>))*\\R?"
+                    + "(((<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>))|"
+                    + "((<name-primary-vid>)([0-9]){1,4}(</name-primary-vid>)))?\\R?"
+                    + "(</maintenance-association>)\\R?"
+                    + "(</maintenance-domain>)\\R?"
+                    + "(</mef-cfm>)\\R?"
+                    + "(</config>)\\R?"
+                    + "(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    //For testDeleteMseaMd
+    private Pattern sampleXmlRegexDeleteMseaCfmMd =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
+                    + "(<target>\\R?<running/>\\R?</target>)\\R?"
+                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
+                    + "(<mef-cfm).*"
+                    + "(<maintenance-domain nc:operation=\"delete\">)\\R?"
+                    + "((<id/>)|(<id>([0-9]){1,4}(</id>)))?\\R?"
+                    + "(((<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>))|\\R?"
+                    + "((<name-domain-name>)([a-zA-Z0-9\\-\\.]){1,48}(</name-domain-name>)))?\\R?"
+                    + "(</maintenance-domain>)\\R?"
+                    + "(</mef-cfm>)\\R?"
+                    + "(</config>)\\R?"
+                    + "(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
 
     private Pattern sampleXmlRegexTransmitLoopback =
             Pattern.compile("(<\\?xml).*(<rpc).*\\R?"
@@ -1310,6 +1390,18 @@
         } else if (sampleXmlRegexDeleteMseaCfmMep.matcher(request).matches()) {
             return SAMPLE_REPLY_OK;
 
+        } else if (sampleXmlRegexCreateMseaCfmMa.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexDeleteMseaCfmMa.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexDeleteMseaCfmRmep.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexDeleteMseaCfmMd.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
         } else if (sampleXmlRegexGetMseaDelay.matcher(request).matches()) {
             return SAMPLE_MSEACFM_DELAY_MEASUREMENT_FULL_REPLY;
 
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
index fe99bf3..bb65a4d 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
@@ -36,20 +36,31 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
 import org.onosproject.incubator.net.l2monitoring.soam.SoamId;
+import org.onosproject.netconf.DatastoreId;
 import org.onosproject.netconf.NetconfDeviceInfo;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
 import org.onosproject.yang.gen.v1.ietfyangtypes.rev20130715.ietfyangtypes.MacAddress;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfm;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfmOpParam;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.DefaultMefCfm;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.MefCfm;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.AbortLoopbackInput;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.DefaultAbortLoopbackInput;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.DefaultMaintenanceDomain;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.MaintenanceDomain;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.DefaultMaintenanceAssociation;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.MaintenanceAssociation;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.DefaultMaintenanceAssociationEndPoint;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.MaintenanceAssociationEndPoint;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.manameandtypecombo.DefaultNamePrimaryVid;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.manameandtypecombo.NamePrimaryVid;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.manameandtypecombo.nameprimaryvid.NamePrimaryVidUnion;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.DefaultNameCharacterString;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.DefaultNameDomainName;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.NameCharacterString;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.NameDomainName;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.namedomainname.NameDomainNameUnion;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.AddressType;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.addresstype.DefaultMacAddress;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.addresstype.DefaultMepId;
@@ -194,10 +205,173 @@
 //        mseaCfmService.setMseaCfm(mseaCfmOpParam, session, NcDsType.running);
     }
 
+    /**
+     * Using mep Id 10.
+     */
     @Test
+    public void testDeleteMseaMep() {
+        MaintenanceAssociationEndPoint mep10 = new DefaultMaintenanceAssociationEndPoint();
+        mep10.mepIdentifier(MepIdType.of(10));
+
+        MaintenanceAssociation ma1100 = new DefaultMaintenanceAssociation();
+        NamePrimaryVid pvid1100Name = new DefaultNamePrimaryVid();
+        pvid1100Name.namePrimaryVid(NamePrimaryVidUnion.fromString("1100"));
+        ma1100.maNameAndTypeCombo(pvid1100Name);
+        ma1100.id((short) 1100);
+        ma1100.addToMaintenanceAssociationEndPoint(mep10);
+
+        MaintenanceDomain md = new DefaultMaintenanceDomain();
+        NameCharacterString mdName = new DefaultNameCharacterString();
+        mdName.name(new Identifier45("md-1"));
+        md.mdNameAndTypeCombo(mdName);
+        md.id((short) 1);
+        md.addToMaintenanceAssociation(ma1100);
+
+        MefCfm mefCfm = new DefaultMefCfm();
+        mefCfm.addToMaintenanceDomain(md);
+        MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
+        mseaCfm.mefCfm(mefCfm);
+
+        try {
+            boolean deleted = mseaCfmService.deleteMseaMep(mseaCfm, session, DatastoreId.RUNNING);
+            assertTrue(deleted);
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail();
+        } catch (CfmConfigException e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * Using mep Id 10.
+     */
+    @Test
+    public void testDeleteMseaMa() {
+        MaintenanceAssociation ma1300 = new DefaultMaintenanceAssociation();
+        NamePrimaryVid pvid1300Name = new DefaultNamePrimaryVid();
+        pvid1300Name.namePrimaryVid(NamePrimaryVidUnion.fromString("1300"));
+        ma1300.id((short) 1300);
+        ma1300.maNameAndTypeCombo(pvid1300Name);
+
+        MaintenanceDomain md = new DefaultMaintenanceDomain();
+        NameCharacterString mdName = new DefaultNameCharacterString();
+        mdName.name(new Identifier45("md-13"));
+        md.mdNameAndTypeCombo(mdName);
+        md.id((short) 13);
+        md.addToMaintenanceAssociation(ma1300);
+
+        MefCfm mefCfm = new DefaultMefCfm();
+        mefCfm.addToMaintenanceDomain(md);
+        MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
+        mseaCfm.mefCfm(mefCfm);
+
+        try {
+            boolean deleted = mseaCfmService.deleteMseaMa(mseaCfm, session, DatastoreId.RUNNING);
+            assertTrue(deleted);
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail();
+        } catch (CfmConfigException e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+
+    @Test
+    public void testDeleteMseaRemoteMep() {
+        MaintenanceAssociation ma1100 = new DefaultMaintenanceAssociation();
+        NamePrimaryVid pvid1100Name = new DefaultNamePrimaryVid();
+        pvid1100Name.namePrimaryVid(NamePrimaryVidUnion.fromString("1100"));
+        ma1100.maNameAndTypeCombo(pvid1100Name);
+        ma1100.id((short) 1100);
+        ma1100.addToRemoteMeps(MepIdType.of(100));
+        ma1100.addToRemoteMeps(MepIdType.of(101));
+
+        MaintenanceDomain md = new DefaultMaintenanceDomain();
+        NameCharacterString mdName = new DefaultNameCharacterString();
+        mdName.name(new Identifier45("md-1"));
+        md.mdNameAndTypeCombo(mdName);
+        md.id((short) 1);
+        md.addToMaintenanceAssociation(ma1100);
+
+        MefCfm mefCfm = new DefaultMefCfm();
+        mefCfm.addToMaintenanceDomain(md);
+        MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
+        mseaCfm.mefCfm(mefCfm);
+
+        try {
+            boolean deleted = mseaCfmService.deleteMseaMaRMep(mseaCfm, session, DatastoreId.RUNNING);
+            assertTrue(deleted);
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail();
+        } catch (CfmConfigException e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * Using mep Id 10.
+     */
+    @Test
+    public void testDeleteMseaMdById() {
+
+        MaintenanceDomain md = new DefaultMaintenanceDomain();
+        NameDomainName mdName = new DefaultNameDomainName();
+        mdName.nameDomainName(NameDomainNameUnion.fromString("www.opennetworking.org"));
+        md.mdNameAndTypeCombo(mdName);
+        md.id((short) 10);
+
+        MefCfm mefCfm = new DefaultMefCfm();
+        mefCfm.addToMaintenanceDomain(md);
+        MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
+        mseaCfm.mefCfm(mefCfm);
+
+        try {
+            boolean deleted = mseaCfmService.deleteMseaMd(mseaCfm, session, DatastoreId.RUNNING);
+            assertTrue(deleted);
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail();
+        } catch (CfmConfigException e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    /**
+     * Using mep Id 10.
+     */
+    @Test
+    public void testDeleteMseaMdByName() {
+
+        MaintenanceDomain md = new DefaultMaintenanceDomain();
+        NameDomainName mdName = new DefaultNameDomainName();
+        mdName.nameDomainName(NameDomainNameUnion.fromString("www.opennetworking.org"));
+        md.mdNameAndTypeCombo(mdName);
+
+        MefCfm mefCfm = new DefaultMefCfm();
+        mefCfm.addToMaintenanceDomain(md);
+        MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
+        mseaCfm.mefCfm(mefCfm);
+
+        try {
+            mseaCfmService.deleteMseaMd(mseaCfm, session, DatastoreId.RUNNING);
+            fail("Should not have succeeded as no numeric id was given");
+        } catch (NetconfException | CfmConfigException e) {
+            assertEquals("An MD numeric ID must be given", e.getMessage());
+        }
+    }
+
+
     /**
      * Using Remote remote MEP ID and all arguments.
      */
+    @Test
     public void testTransmitLoopback1() {
         TransmitLoopbackInput lbTr1 = new DefaultTransmitLoopbackInput();
         lbTr1.maintenanceDomain(Short.valueOf((short) 1));
@@ -221,10 +395,10 @@
         }
     }
 
-    @Test
     /**
      * Using Remote Mac address in place of remote MEP ID and fewer arguments.
      */
+    @Test
     public void testTransmitLoopback2() {
         TransmitLoopbackInput lbTr2 = new DefaultTransmitLoopbackInput();