Initial import of CFM and SOAM api

Change-Id: Icf5cc2d5fb34b75460e80e8cced0d70265bcd33b
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/Component.java b/incubator/api/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/Component.java
new file mode 100644
index 0000000..9c3e726
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/Component.java
@@ -0,0 +1,177 @@
+/*
+ * 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.incubator.net.l2monitoring.cfm;
+
+import com.google.common.annotations.Beta;
+import org.onlab.packet.EthType;
+import org.onlab.packet.VlanId;
+
+import java.util.Collection;
+
+/**
+ * Components which can be managed in a manner equivalent to an 802.1Q bridge.
+ *
+ * Direct child of the {@link org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation}.
+ */
+public interface Component {
+
+    int componentId();
+
+    /**
+     * The VID(s) monitored by this MA, or 0, if the MA is not attached to any VID.
+     *
+     * The first VID returned is the MA's Primary VID
+     * @return A collection of VIDs
+     */
+    Collection<VlanId> vidList();
+
+    /**
+     * Defines how the MA can create MHFs (MIP Half Function) for this VID at this MA.
+     * @return An enumerated value
+     */
+    MhfCreationType mhfCreationType();
+
+    /**
+     * indicates what, if anything, is to be included in the Sender ID TLV.
+     * The Sender ID TLV is transmitted by MPs configured in this MA.
+     * @return An enumerated value
+     */
+    IdPermissionType idPermission();
+
+    /**
+     * Indicates the tag type for this component.
+     * @return The type of Tag active on this VLAN
+     */
+    @Beta
+    TagType tagType();
+
+    /**
+     * Builder for {@link org.onosproject.incubator.net.l2monitoring.cfm.Component}.
+     */
+    interface ComponentBuilder {
+
+        ComponentBuilder addToVidList(VlanId vid);
+
+        ComponentBuilder mhfCreationType(MhfCreationType mhfCreationType);
+
+        ComponentBuilder idPermission(IdPermissionType idPermission);
+
+        ComponentBuilder tagType(TagType tagType);
+
+        Component build();
+    }
+
+    /**
+     * An enumerated type defining how MHFs (MIP Half Function) can be created.
+     */
+    public enum MhfCreationType {
+        /**
+         * No MHFs can be created for this VID(s).
+         */
+        NONE,
+
+        /**
+         * MHFs can be created for this VID(s) on any Bridge Port through which the.
+         * VID(s) can pass where:
+         * - There are no lower active MD levels; or
+         * - There is a MEP at the next lower active MD-level on the port
+         */
+        DEFAULT,
+
+        /**
+         * MHFs can be created for this VID(s) only on Bridge Ports through which.
+         * this VID(s) can pass, and only if there is a MEP at the next
+         * lower active MD-level on the port.
+         */
+        EXPLICIT,
+
+        /**
+         * In the Maintenance Association managed object only, the control of MHF.
+         * creation is deferred to the corresponding variable in the
+         * enclosing Maintenance Domain
+         */
+        DEFER
+    }
+
+    /**
+     * An enumerated value indicating what, if anything, is to be included in.
+     * the Sender ID TLV transmitted by maintenance-points configured in the
+     * default Maintenance Domain
+     * reference
+     * [802.1q] 21.5.3, 12.14.3.1.3:e";
+     */
+    public enum IdPermissionType {
+        /**
+         * The Sender ID TLV is not to be sent.
+         */
+        NONE,
+
+        /**
+         * The Chassis ID Length, Chassis ID Subtype, and Chassis ID fields of the.
+         * Sender ID TLV are to be sent, but not the Management Address
+         * Length or Management Address fields.
+         */
+        CHASSIS,
+
+        /**
+         * The Management Address Length and Management Address of the Sender ID.
+         * TLV are to be sent, but the Chassis ID Length is to be
+         * transmitted with a 0 value, and the Chassis ID Subtype and
+         * Chassis ID fields not sent
+         */
+        MANAGE,
+
+        /**
+         * The Chassis ID Length, Chassis ID Subtype, Chassis ID, Management.
+         * Address Length, and Management Address fields are all to be sent
+         */
+        CHASSIS_MANAGE,
+
+        /**
+         * The contents of the Sender ID TLV are determined by the Maintenance.
+         * Domain managed object
+         */
+        DEFER
+    }
+
+    /**
+     * A choice of VLan tag type.
+     */
+    public enum TagType {
+        VLAN_NONE(EthType.EtherType.IPV4),
+        VLAN_CTAG(EthType.EtherType.VLAN),
+        VLAN_STAG(EthType.EtherType.QINQ);
+
+        private EthType.EtherType type = EthType.EtherType.IPV4;
+
+        TagType(EthType.EtherType type) {
+            this.type = type;
+        }
+
+        public EthType.EtherType getType() {
+            return type;
+        }
+
+        public static TagType fromEtherType(EthType.EtherType type) {
+            for (TagType tt:values()) {
+                if (tt.type.equals(type)) {
+                    return tt;
+                }
+            }
+            throw new IllegalArgumentException("Unsupported EtherType: " + type);
+        }
+    }
+}