ONOS-3165. Make MAC not mandatory. Fixing IP (constructor was still doing checkNotNull)

Change-Id: I6663504f63df25260aa62c28337cdadb83dfd361
diff --git a/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
index eefb711..4fd9b0d 100644
--- a/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
@@ -43,7 +43,7 @@
 
     @Option(name = "-m", aliases = "--mac",
             description = "MAC address of the interface",
-            required = true, multiValued = false)
+            required = false, multiValued = false)
     private String mac = null;
 
     @Option(name = "-i", aliases = "--ip",
@@ -68,10 +68,12 @@
             }
         }
 
+        MacAddress macAddr = mac == null ? null : MacAddress.valueOf(mac);
+
         VlanId vlanId = vlan == null ? VlanId.NONE : VlanId.vlanId(Short.parseShort(vlan));
 
         Interface intf = new Interface(ConnectPoint.deviceConnectPoint(connectPoint),
-                ipAddresses, MacAddress.valueOf(mac), vlanId);
+                ipAddresses, macAddr, vlanId);
 
         interfaceService.add(intf);
     }
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/InterfaceConfig.java b/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/InterfaceConfig.java
index 592336c..9f2d410 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/InterfaceConfig.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/InterfaceConfig.java
@@ -39,7 +39,6 @@
     public static final String MAC = "mac";
     public static final String VLAN = "vlan";
 
-    public static final String MAC_MISSING_ERROR = "Must have a MAC address for each interface";
     public static final String CONFIG_VALUE_ERROR = "Error parsing config value";
 
     /**
@@ -55,15 +54,12 @@
             for (JsonNode intfNode : array) {
                 Set<InterfaceIpAddress> ips = getIps(intfNode);
 
-                if (intfNode.path(MAC).isMissingNode()) {
-                    throw new ConfigException(MAC_MISSING_ERROR);
-                }
-
-                MacAddress mac = MacAddress.valueOf(intfNode.path(MAC).asText());
+                String mac = intfNode.path(MAC).asText();
+                MacAddress macAddr = mac.isEmpty() ? null : MacAddress.valueOf(mac);
 
                 VlanId vlan = getVlan(intfNode);
 
-                interfaces.add(new Interface(subject, ips, mac, vlan));
+                interfaces.add(new Interface(subject, ips, macAddr, vlan));
             }
         } catch (IllegalArgumentException e) {
             throw new ConfigException(CONFIG_VALUE_ERROR, e);
@@ -79,7 +75,10 @@
      */
     public void addInterface(Interface intf) {
         ObjectNode intfNode = array.addObject();
-        intfNode.put(MAC, intf.mac().toString());
+
+        if (intf.mac() != null) {
+            intfNode.put(MAC, intf.mac().toString());
+        }
 
         if (!intf.ipAddresses().isEmpty()) {
             intfNode.set(IPS, putIps(intf.ipAddresses()));
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/Interface.java b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/Interface.java
index 69d14bc..b9d3ead 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/Interface.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/Interface.java
@@ -30,7 +30,8 @@
 
 /**
  * An Interface maps network configuration information (such as addresses and
- * vlans) to a port in the network.
+ * vlans) to a port in the network. This is considered a L2/L3 network
+ * interface.
  */
 @Beta
 public class Interface {
@@ -51,9 +52,9 @@
                      Set<InterfaceIpAddress> ipAddresses,
                      MacAddress macAddress, VlanId vlan) {
         this.connectPoint = checkNotNull(connectPoint);
-        this.ipAddresses = Sets.newHashSet(checkNotNull(ipAddresses));
-        this.macAddress = checkNotNull(macAddress);
-        this.vlan = checkNotNull(vlan);
+        this.ipAddresses = ipAddresses == null ? Sets.newHashSet() : ipAddresses;
+        this.macAddress = macAddress == null ? MacAddress.NONE : macAddress;
+        this.vlan = vlan == null ? VlanId.NONE : vlan;
     }
 
     /**
diff --git a/utils/misc/src/main/java/org/onlab/packet/MacAddress.java b/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
index 89cddba..cb7f201 100644
--- a/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
+++ b/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
@@ -22,6 +22,7 @@
  */
 public class MacAddress {
 
+    public static final MacAddress NONE = valueOf("a4:23:05:00:00:00");
     public static final MacAddress ZERO = valueOf("00:00:00:00:00:00");
     public static final MacAddress BROADCAST = valueOf("ff:ff:ff:ff:ff:ff");