This commit consists of:
1) Dockerizing the netconf server
2) Update proto2yang to support module imports
3) Provide a set of yang modules derived from the proto files in voltha.
   These files as well as the slight mmodifications to the proto files are
   provided in the experiments/netconf/proto2yang directory
4) Code to automatically pull proto files from voltha into the netconf server,
   compiles them and produce the yang equivalent files.
5) Add a getvoltha netconf API to provide voltha state information (basic at
   this time).  There is potential to make this generic once we experiment
   with additional APIs

Change-Id: I94f3a1f871b8025ad675d5f9b9b626d1be8b8d36
diff --git a/experiments/netconf/proto2yang/ietf-device.yang b/experiments/netconf/proto2yang/ietf-device.yang
new file mode 100644
index 0000000..0a37cf3
--- /dev/null
+++ b/experiments/netconf/proto2yang/ietf-device.yang
@@ -0,0 +1,349 @@
+
+module ietf-device {
+
+
+    namespace "urn:opencord:params:xml:ns:voltha:ietf-device";
+    prefix device;
+
+    import ietf-openflow_13 { prefix openflow_13 ; }
+    import ietf-common { prefix common ; }
+    import ietf-any { prefix any ; }
+
+    organization "CORD";
+    contact
+        " Any name";
+
+    description
+        "";
+
+    revision "2016-11-15" {
+        description "Initial revision.";
+        reference "reference";
+    }
+
+
+    grouping DeviceType {
+        description
+            "A Device Type";
+        leaf id {
+            type  string; 
+            description
+                "Unique name for the device type";
+        }
+
+        leaf adapter {
+            type  string; 
+            description
+                "Name of the adapter that handles device type";
+        }
+
+        leaf accepts_bulk_flow_update {
+            type  boolean; 
+            description
+                "Capabilitities";
+        }
+
+        leaf accepts_add_remove_flow_updates {
+            type  boolean; 
+            description
+                "";
+        }
+
+    }
+
+    grouping DeviceTypes {
+        description
+            "A plurality of device types";
+        list items {
+            key "id";
+            uses  DeviceType;
+
+            description
+                "";
+        }
+
+    }
+
+    grouping Port {
+        description
+            "";
+        leaf port_no {
+            type  uint32; 
+            description
+                "Device-unique port number";
+        }
+
+        leaf label {
+            type  string; 
+            description
+                "Arbitrary port label";
+        }
+
+        leaf type {
+            type  PortType; 
+            description
+                "Type of port";
+        }
+
+        leaf admin_state {
+            type  common:AdminState;
+
+            description
+                "";
+        }
+
+        leaf oper_status {
+            type  common:OperStatus;
+
+            description
+                "";
+        }
+
+        leaf device_id {
+            type  string; 
+            description
+                "Unique .id of device that owns this port";
+        }
+
+
+        typedef PortType {
+            type enumeration {
+                enum UNKNOWN {
+                    description "";
+                }
+                enum ETHERNET_NNI {
+                    description "";
+                }
+                enum ETHERNET_UNI {
+                    description "";
+                }
+                enum PON_OLT {
+                    description "";
+                }
+                enum PON_ONU {
+                    description "";
+                }
+            }
+            description
+                "";
+        }
+
+        grouping PeerPort {
+            description
+                "";
+            leaf device_id {
+                type  string; 
+                description
+                    "";
+            }
+    
+            leaf port_no {
+                type  uint32; 
+                description
+                    "";
+            }
+    
+        }
+    
+    }
+
+    grouping Ports {
+        description
+            "";
+        list items {
+            key "port_no";
+            uses  Port;
+
+            description
+                "";
+        }
+
+    }
+
+    grouping Device {
+        description
+            "A Physical Device instance";
+        leaf id {
+            type  string; 
+            description
+                "Voltha's device identifier";
+        }
+
+        leaf type {
+            type  string; 
+            description
+                "Device type, refers to one of the registered device types";
+        }
+
+        leaf root {
+            type  boolean; 
+            description
+                "Is this device a root device. Each logical switch has one root
+ device that is associated with the logical flow switch.";
+        }
+
+        leaf parent_id {
+            type  string; 
+            description
+                "Parent device id, in the device tree (for a root device, the parent_id
+ is the logical_device.id)";
+        }
+
+        leaf parent_port_no {
+            type  uint32; 
+            description
+                "";
+        }
+
+        leaf vendor {
+            type  string; 
+            description
+                "Vendor, version, serial number, etc.";
+        }
+
+        leaf model {
+            type  string; 
+            description
+                "";
+        }
+
+        leaf hardware_version {
+            type  string; 
+            description
+                "";
+        }
+
+        leaf firmware_version {
+            type  string; 
+            description
+                "";
+        }
+
+        leaf software_version {
+            type  string; 
+            description
+                "";
+        }
+
+        leaf serial_number {
+            type  string; 
+            description
+                "";
+        }
+
+        leaf adapter {
+            type  string; 
+            description
+                "Addapter that takes care of device";
+        }
+
+        leaf vlan {
+            type  uint32; 
+            description
+                "Device contact on vlan (if 0, no vlan)";
+        }
+
+        leaf mac_address {
+            type  string; 
+            description
+                "Device contact MAC address (format:  xx:xx:xx:xx:xx:xx )";
+        }
+
+        leaf ipv4_address {
+            type  string; 
+            description
+                "Device contact IPv4 address (format:  a.b.c.d  or can use hostname too)";
+        }
+
+        leaf ipv6_address {
+            type  string; 
+            description
+                "Device contact IPv6 address using the canonical string form
+ ( xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx )";
+        }
+
+
+        leaf admin_state {
+            type  common:AdminState;
+
+            description
+                "";
+        }
+
+        leaf oper_status {
+            type  common:OperStatus;
+
+            description
+                "";
+        }
+
+        leaf connect_status {
+            type  common:ConnectStatus;
+
+            description
+                "";
+        }
+
+        container custom {
+            uses  any:Any;
+
+            description
+                "Device type specific attributes
+TODO additional common attribute here";
+        }
+
+        list ports {
+            key "port_no";
+            uses  Port;
+
+            description
+                "";
+        }
+
+        container flows {
+            uses  openflow_13:Flows;
+
+            description
+                "";
+        }
+
+        container flow_groups {
+            uses  openflow_13:FlowGroups;
+
+            description
+                "";
+        }
+
+        grouping ProxyAddress {
+            description
+                "";
+            leaf device_id {
+                type  string; 
+                description
+                    "Which device to use as proxy to this device";
+            }
+    
+            leaf channel_id {
+                type  uint32; 
+                description
+                    "Sub-address within proxy device";
+            }
+    
+        }
+    
+    }
+
+    grouping Devices {
+        description
+            "";
+        list items {
+            key "id";
+            uses  Device;
+
+            description
+                "";
+        }
+
+    }
+
+}
\ No newline at end of file