Merge "Update delete function by instance names."
diff --git a/delete/delete.py b/delete/delete.py
index 490f8d6..d231367 100644
--- a/delete/delete.py
+++ b/delete/delete.py
@@ -43,6 +43,7 @@
 _COMMAND_GET_PROCESS_COMMAND = ["ps", "-o", "command", "-p"]
 _RE_RUN_CVD = re.compile(r"^(?P<run_cvd>.+run_cvd)")
 _SSVNC_VIEWER_PATTERN = "vnc://127.0.0.1:%(vnc_port)d"
+_LOCAL_INSTANCE_PREFIX = "local-"
 
 
 def _GetStopCvd():
@@ -261,6 +262,33 @@
 
     return delete_report
 
+
+def DeleteInstanceByNames(cfg, instances):
+    """Delete instances by the names of these instances.
+
+    Args:
+        cfg: AcloudConfig object.
+        instances: List of instance name.
+
+    Returns:
+        A Report instance.
+    """
+    delete_report = report.Report(command="delete")
+    local_instances = [
+        ins for ins in instances if ins.startswith(_LOCAL_INSTANCE_PREFIX)
+    ]
+    remote_instances = list(set(instances) - set(local_instances))
+    if local_instances:
+        utils.PrintColorString("Deleting local instances")
+        delete_report = DeleteInstances(cfg, list_instances.FilterInstancesByNames(
+            list_instances.GetLocalInstances(), local_instances))
+    if remote_instances:
+        delete_report = DeleteRemoteInstances(cfg,
+                                              remote_instances,
+                                              delete_report)
+    return delete_report
+
+
 def Run(args):
     """Run delete.
 
@@ -273,10 +301,16 @@
     Returns:
         A Report instance.
     """
+    # Prioritize delete instances by names without query all instance info from
+    # GCP project.
+    if args.instance_names:
+        return DeleteInstanceByNames(config.GetAcloudConfig(args),
+                                     args.instance_names)
     if args.remote_host:
         cfg = config.GetAcloudConfig(args)
         return CleanUpRemoteHost(cfg, args.remote_host, args.host_user,
                                  args.host_ssh_private_key_path)
+
     instances = list_instances.GetLocalInstances()
     if args.local_only:
         cfg = None
@@ -284,10 +318,7 @@
         cfg = config.GetAcloudConfig(args)
         instances.extend(list_instances.GetRemoteInstances(cfg))
 
-    if args.instance_names:
-        instances = list_instances.FilterInstancesByNames(instances,
-                                                          args.instance_names)
-    elif args.adb_port:
+    if args.adb_port:
         instances = list_instances.FilterInstancesByAdbPort(instances,
                                                             args.adb_port)
     elif not args.all:
diff --git a/delete/delete_args.py b/delete/delete_args.py
index b62283e..867194f 100644
--- a/delete/delete_args.py
+++ b/delete/delete_args.py
@@ -43,8 +43,8 @@
         dest="instance_names",
         nargs="+",
         required=False,
-        help="The names of the instances that need to delete, "
-        "separated by spaces, e.g. --instance-names instance-1 local-instance-1")
+        help="The names of the instances that need to delete, separated by "
+        "spaces, e.g. --instance-names instance-1 local-instance-1")
     delete_group.add_argument(
         "--all",
         action="store_true",
diff --git a/delete/delete_test.py b/delete/delete_test.py
index b50de00..f1c1e74 100644
--- a/delete/delete_test.py
+++ b/delete/delete_test.py
@@ -20,6 +20,7 @@
 from acloud.delete import delete
 from acloud.internal.lib import driver_test_lib
 from acloud.internal.lib import utils
+from acloud.list import list as list_instances
 from acloud.public import report
 
 
@@ -122,6 +123,24 @@
         self.Patch(utils, "IsCommandRunning", return_value=False)
         subprocess.check_call.assert_not_called()
 
+    @mock.patch.object(delete, "DeleteInstances", return_value="")
+    @mock.patch.object(delete, "DeleteRemoteInstances", return_value="")
+    def testDeleteInstanceByNames(self, mock_delete_remote_ins,
+                                  mock_delete_local_ins):
+        """test DeleteInstanceByNames."""
+        cfg = mock.Mock()
+        # Test delete local instances.
+        instances = ["local-instance-1", "local-instance-2"]
+        self.Patch(list_instances, "FilterInstancesByNames", return_value="")
+        delete.DeleteInstanceByNames(cfg, instances)
+        mock_delete_local_ins.assert_called()
+
+        # Test delete remote instances.
+        instances = ["ins-id1-cf-x86-phone-userdebug",
+                     "ins-id2-cf-x86-phone-userdebug"]
+        delete.DeleteInstanceByNames(cfg, instances)
+        mock_delete_remote_ins.assert_called()
+
 
 if __name__ == "__main__":
     unittest.main()