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()