[ONOS-6410] flexible configuration datastore specifier.

- added completer to netconf-config-get

Change-Id: I7cc88637bd51d9f4bea7d906346ffacfbd8706a6
diff --git a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionImplTest.java b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionImplTest.java
index 846642c..0602c90 100644
--- a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionImplTest.java
+++ b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSessionImplTest.java
@@ -21,8 +21,8 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.junit.Assert.assertFalse;
-import static org.onosproject.netconf.TargetConfig.RUNNING;
-import static org.onosproject.netconf.TargetConfig.CANDIDATE;
+import static org.onosproject.netconf.DatastoreId.CANDIDATE;
+import static org.onosproject.netconf.DatastoreId.RUNNING;
 
 import java.io.File;
 import java.util.Arrays;
@@ -46,10 +46,10 @@
 import org.junit.Test;
 import org.onlab.junit.TestTools;
 import org.onlab.packet.Ip4Address;
-import org.onosproject.netconf.TargetConfig;
 import org.onosproject.netconf.NetconfDeviceInfo;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.DatastoreId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -163,7 +163,7 @@
         assertNotNull("Incorrect sessionId", session1.getSessionId());
         try {
             assertTrue("NETCONF edit-config command failed",
-                       session1.editConfig(TargetConfig.RUNNING.toString(),
+                       session1.editConfig(DatastoreId.RUNNING,
                                            null, SAMPLE_REQUEST));
         } catch (NetconfException e) {
             e.printStackTrace();
@@ -192,7 +192,7 @@
         assertNotNull("Incorrect sessionId", session1.getSessionId());
         try {
             assertFalse("NETCONF delete-config command failed",
-                        session1.deleteConfig(TargetConfig.RUNNING));
+                        session1.deleteConfig(DatastoreId.RUNNING));
         } catch (NetconfException e) {
             e.printStackTrace();
             fail("NETCONF delete-config test failed: " + e.getMessage());
@@ -206,16 +206,49 @@
         assertNotNull("Incorrect sessionId", session1.getSessionId());
         try {
             assertTrue("NETCONF copy-config command failed",
-                       session1.copyConfig(TargetConfig.RUNNING.toString(),
-                                           "candidate"));
+                       session1.copyConfig(DatastoreId.RUNNING,
+                                           DatastoreId.CANDIDATE));
         } catch (NetconfException e) {
             e.printStackTrace();
-            fail("NETCONF edit-config test failed: " + e.getMessage());
+            fail("NETCONF copy-config test failed: " + e.getMessage());
         }
         log.info("Finishing copy-config async");
     }
 
     @Test
+    public void testCopyConfigXml() {
+        log.info("Starting copy-config XML async");
+        assertNotNull("Incorrect sessionId", session1.getSessionId());
+        try {
+            assertTrue("NETCONF copy-config command failed",
+                       session1.copyConfig(DatastoreId.RUNNING,
+                                           "<configuration><device-specific/></configuration>"));
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF copy-config test failed: " + e.getMessage());
+        }
+        log.info("Finishing copy-config XML async");
+    }
+
+    // remove test when ready to dump bare XML String API.
+    @Test
+    public void testCopyConfigBareXml() {
+        log.info("Starting copy-config bare XML async");
+        assertNotNull("Incorrect sessionId", session1.getSessionId());
+        try {
+            assertTrue("NETCONF copy-config command failed",
+                       session1.copyConfig(DatastoreId.RUNNING,
+                                           "<config>"
+                                           + "<configuration><device-specific/></configuration>"
+                                         + "</config>"));
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF copy-config test failed: " + e.getMessage());
+        }
+        log.info("Finishing copy-config bare XML async");
+    }
+
+    @Test
     public void testGetConfigRequest() {
         log.info("Starting get-config async");
         assertNotNull("Incorrect sessionId", session1.getSessionId());
@@ -392,9 +425,9 @@
             Pattern.compile("(<\\?xml).*"
                     + "(<rpc message-id=\")[0-9]*(\") *(xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                     + "(<edit-config>)\\R?"
-                    + "(<target>\\R?((<" + TargetConfig.CANDIDATE.toString() + "/>)|"
-                                    + "(<" + TargetConfig.RUNNING.toString() + "/>)|"
-                                    + "(<" + TargetConfig.STARTUP.toString() + "/>))\\R?</target>)\\R?"
+                    + "(<target>\\R?((<" + DatastoreId.CANDIDATE.toString() + "/>)|"
+                                    + "(<" + DatastoreId.RUNNING.toString() + "/>)|"
+                                    + "(<" + DatastoreId.STARTUP.toString() + "/>))\\R?</target>)\\R?"
                     + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                     + ".*"
                     + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
@@ -405,9 +438,9 @@
                                     + "(<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" "
                                     + "message-id=\")[0-9]*(\">)\\R?"
                                     + "(<lock>)\\R?"
-                                    + "(<target>\\R?((<" + TargetConfig.CANDIDATE.toString() + "/>)|"
-                                    + "(<" + TargetConfig.RUNNING.toString() + "/>)|"
-                                    + "(<" + TargetConfig.STARTUP.toString() + "/>))\\R?</target>)\\R?"
+                                    + "(<target>\\R?((<" + DatastoreId.CANDIDATE.toString() + "/>)|"
+                                    + "(<" + DatastoreId.RUNNING.toString() + "/>)|"
+                                    + "(<" + DatastoreId.STARTUP.toString() + "/>))\\R?</target>)\\R?"
                                     + "(</lock>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
 
     public static final Pattern UNLOCK_REQ_PATTERN =
@@ -415,32 +448,39 @@
                                     + "(<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" "
                                     + "message-id=\")[0-9]*(\">)\\R?"
                                     + "(<unlock>)\\R?"
-                                    + "(<target>\\R?((<" + TargetConfig.CANDIDATE.toString() + "/>)|"
-                                    + "(<" + TargetConfig.RUNNING.toString() + "/>)|"
-                                    + "(<" + TargetConfig.STARTUP.toString() + "/>))\\R?</target>)\\R?"
+                                    + "(<target>\\R?((<" + DatastoreId.CANDIDATE.toString() + "/>)|"
+                                    + "(<" + DatastoreId.RUNNING.toString() + "/>)|"
+                                    + "(<" + DatastoreId.STARTUP.toString() + "/>))\\R?</target>)\\R?"
                                     + "(</unlock>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
 
     public static final Pattern COPY_CONFIG_REQ_PATTERN =
             Pattern.compile("(<\\?xml).*"
                     + "(<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\")[0-9]*(\">)\\R?"
                     + "(<copy-config>)\\R?"
-                    + "(<target>\\R?((<" + TargetConfig.CANDIDATE.toString() + "/>)|"
-                                    + "(<" + TargetConfig.RUNNING.toString() + "/>)|"
-                                    + "(<" + TargetConfig.STARTUP.toString() + "/>))\\R?</target>)\\R?"
-                                    + "(<source>)\\R?(<config>)(("
-                                    + TargetConfig.CANDIDATE.toString() + ")|("
-                                    + TargetConfig.RUNNING.toString() + ")|("
-                                    + TargetConfig.STARTUP.toString()
-                                    + "))(</config>)\\R?(</source>)\\R?"
-                                    + "(</copy-config>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
+                    + "(<target>\\R?"
+                    + "("
+                        + "(<" + DatastoreId.CANDIDATE.toString() + "/>)|"
+                        + "(<" + DatastoreId.RUNNING.toString() + "/>)|"
+                        + "(<" + DatastoreId.STARTUP.toString() + "/>)"
+                    + ")\\R?"
+                    + "</target>)\\R?"
+                    + "(<source>)\\R?"
+                    + "("
+                        + "(<config>)(.*)(</config>)|"
+                        + "(<" + DatastoreId.CANDIDATE.toString() + "/>)|"
+                        + "(<" + DatastoreId.RUNNING.toString() + "/>)|"
+                        + "(<" + DatastoreId.STARTUP.toString() + "/>)"
+                    + ")\\R?"
+                    + "(</source>)\\R?"
+                    + "(</copy-config>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
 
     public static final Pattern GET_CONFIG_REQ_PATTERN =
             Pattern.compile("(<\\?xml).*"
                     + "(<rpc message-id=\")[0-9]*(\"  xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                     + "(<get-config>)\\R?" + "(<source>)\\R?((<"
-                                    + TargetConfig.CANDIDATE.toString()
-                                    + "/>)|(<" + TargetConfig.RUNNING.toString()
-                                    + "/>)|(<" + TargetConfig.STARTUP.toString()
+                                    + DatastoreId.CANDIDATE.toString()
+                                    + "/>)|(<" + DatastoreId.RUNNING.toString()
+                                    + "/>)|(<" + DatastoreId.STARTUP.toString()
                                     + "/>))\\R?(</source>)\\R?"
                     + "(<filter type=\"subtree\">).*(</filter>)\\R?"
                     + "(</get-config>)\\R?(</rpc>)\\R?", Pattern.DOTALL);
@@ -460,10 +500,10 @@
 
     public class NCCopyConfigCallable implements Callable<Boolean> {
         private NetconfSession session;
-        private TargetConfig target;
+        private DatastoreId target;
         private String source;
 
-        public NCCopyConfigCallable(NetconfSession session, TargetConfig target, String source) {
+        public NCCopyConfigCallable(NetconfSession session, DatastoreId target, String source) {
             this.session = session;
             this.target = target;
             this.source = source;