blob: 8f131448385f9fa9906f9b614b02b0e0b7438de1 [file] [log] [blame]
Kevin Chengee6030f2018-06-26 10:55:30 -07001# Copyright 2018 - The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14r"""Setup entry point.
15
16Setup will handle all of the necessary steps to enable acloud to create a local
17or remote instance of an Android Virtual Device.
18"""
19
20from __future__ import print_function
Kevin Cheng99cf3d32018-10-05 02:09:21 -070021import os
22import subprocess
Sam Chiud22127a2018-11-21 09:23:34 +080023import sys
Kevin Chengee6030f2018-06-26 10:55:30 -070024
Sam Chiud22127a2018-11-21 09:23:34 +080025from acloud.internal import constants
Sam Chiu81bdc652018-06-29 18:45:08 +080026from acloud.internal.lib import utils
herbertxuec0f98f32020-05-20 14:00:56 +080027from acloud.public import config
Sam Chiu81bdc652018-06-29 18:45:08 +080028from acloud.setup import host_setup_runner
herbertxue34776bb2018-07-03 21:57:48 +080029from acloud.setup import gcp_setup_runner
Kevin Chengee6030f2018-06-26 10:55:30 -070030
Sam Chiu81bdc652018-06-29 18:45:08 +080031
herbertxue34776bb2018-07-03 21:57:48 +080032def Run(args):
Kevin Chengee6030f2018-06-26 10:55:30 -070033 """Run setup.
34
herbertxue34776bb2018-07-03 21:57:48 +080035 Setup options:
36 -host: Setup host settings.
37 -gcp_init: Setup gcp settings.
38 -None, default behavior will setup host and gcp settings.
39
Kevin Chengee6030f2018-06-26 10:55:30 -070040 Args:
41 args: Namespace object from argparse.parse_args.
42 """
herbertxuec0f98f32020-05-20 14:00:56 +080043 if args.update_config:
44 _UpdateConfig(args.config_file, args.update_config[0], args.update_config[1])
45 return
46
Kevin Cheng99cf3d32018-10-05 02:09:21 -070047 _RunPreSetup()
48
Sam Chiu81bdc652018-06-29 18:45:08 +080049 # Setup process will be in the following manner:
50 # 1.Print welcome message.
51 _PrintWelcomeMessage()
52
53 # 2.Init all subtasks in queue and traverse them.
Kevin Chengeb997272019-06-05 14:53:18 -070054 host_base_runner = host_setup_runner.HostBasePkgInstaller()
55 host_avd_runner = host_setup_runner.AvdPkgInstaller()
herbertxue975b8872020-02-12 14:41:41 +080056 host_cf_common_runner = host_setup_runner.CuttlefishCommonPkgInstaller()
chojoyceb0817032022-01-12 18:29:36 +080057 host_localca_runner = host_setup_runner.LocalCAHostSetup()
herbertxue34776bb2018-07-03 21:57:48 +080058 host_env_runner = host_setup_runner.CuttlefishHostSetup()
59 gcp_runner = gcp_setup_runner.GcpTaskRunner(args.config_file)
60 task_queue = []
Kevin Chengeb997272019-06-05 14:53:18 -070061 # User must explicitly specify --host to install the avd host packages.
chojoycee8595ea2021-12-20 19:28:46 +080062 if args.host and utils.IsSupportedKvm():
Kevin Chengeb997272019-06-05 14:53:18 -070063 task_queue.append(host_base_runner)
64 task_queue.append(host_avd_runner)
herbertxue975b8872020-02-12 14:41:41 +080065 task_queue.append(host_cf_common_runner)
herbertxue34776bb2018-07-03 21:57:48 +080066 task_queue.append(host_env_runner)
chojoyceb0817032022-01-12 18:29:36 +080067
68 task_queue.append(host_localca_runner)
chojoyce574f8f02021-10-27 12:21:03 +080069
Kevin Chengeb997272019-06-05 14:53:18 -070070 # We should do these setup tasks if specified or if no args were used.
71 if args.host_base or (not args.host and not args.gcp_init):
72 task_queue.append(host_base_runner)
73 if args.gcp_init or (not args.host and not args.host_base):
herbertxue34776bb2018-07-03 21:57:48 +080074 task_queue.append(gcp_runner)
Sam Chiu81bdc652018-06-29 18:45:08 +080075
76 for subtask in task_queue:
Kevin Cheng58b7e792018-10-05 02:26:53 -070077 subtask.Run(force_setup=args.force)
Sam Chiu81bdc652018-06-29 18:45:08 +080078
79 # 3.Print the usage hints.
80 _PrintUsage()
81
82
83def _PrintWelcomeMessage():
84 """Print welcome message when acloud setup been called."""
85
86 # pylint: disable=anomalous-backslash-in-string
87 asc_art = " \n" \
88 " ___ _______ ____ __ _____ \n" \
89 " / _ |/ ___/ / / __ \/ / / / _ \\ \n" \
90 " / __ / /__/ /__/ /_/ / /_/ / // / \n" \
91 "/_/ |_\\___/____/\\____/\\____/____/ \n" \
92 " \n"
93
94 print("\nWelcome to")
95 print(asc_art)
96
97
98def _PrintUsage():
99 """Print cmd usage hints when acloud setup been finished."""
herbertxue34776bb2018-07-03 21:57:48 +0800100 utils.PrintColorString("")
101 utils.PrintColorString("Setup process finished")
Kevin Cheng99cf3d32018-10-05 02:09:21 -0700102
103
104def _RunPreSetup():
105 """This will run any pre-setup scripts.
106
107 If we can find any pre-setup scripts, run it and don't care about the
108 results. Pre-setup scripts will do any special setup before actual
109 setup occurs (e.g. copying configs).
110 """
Sam Chiud22127a2018-11-21 09:23:34 +0800111 if constants.ENV_ANDROID_BUILD_TOP not in os.environ:
112 print("Can't find $%s." % constants.ENV_ANDROID_BUILD_TOP)
113 print("Please run '#source build/envsetup.sh && lunch <target>' first.")
Sam Chiue791f602019-05-03 15:18:10 +0800114 sys.exit(constants.EXIT_BY_USER)
Sam Chiud22127a2018-11-21 09:23:34 +0800115
116 pre_setup_sh = os.path.join(os.environ.get(constants.ENV_ANDROID_BUILD_TOP),
117 "tools",
118 "acloud",
119 "setup",
120 "pre_setup_sh",
121 "acloud_pre_setup.sh")
122
Kevin Cheng99cf3d32018-10-05 02:09:21 -0700123 if os.path.exists(pre_setup_sh):
124 subprocess.call([pre_setup_sh])
herbertxuec0f98f32020-05-20 14:00:56 +0800125
126def _UpdateConfig(config_file, field, value):
127 """Update the user config.
128
129 Args:
130 config_file: String of config file path.
131 field: String, field name in user config.
132 value: String, the value of field.
133 """
134 config_mgr = config.AcloudConfigManager(config_file)
135 config_mgr.Load()
136 user_config = config_mgr.user_config_path
137 print("Your config (%s) is updated." % user_config)
138 gcp_setup_runner.UpdateConfigFile(user_config, field, value)
139 _PrintUsage()