blob: 343a3c01652657dba06115fe1e8b8130fd000783 [file] [log] [blame]
herbertxue34776bb2018-07-03 21:57:48 +08001#!/usr/bin/env python
2#
3# Copyright 2018 - The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16"""Tests for acloud.setup.gcp_setup_runner."""
17
18import unittest
19import os
20import mock
21
22# pylint: disable=no-name-in-module,import-error
23from acloud.internal.proto import user_config_pb2
24from acloud.public import config
25from acloud.setup import gcp_setup_runner
26
27_GCP_USER_CONFIG = """
28[compute]
29region = new_region
30zone = new_zone
31[core]
32account = new@google.com
33disable_usage_reporting = False
34project = new_project
35"""
36
37
38def _CreateCfgFile():
39 """A helper method that creates a mock configuration object."""
40 default_cfg = """
41project: "fake_project"
42zone: "fake_zone"
43storage_bucket_name: "fake_bucket"
44client_id: "fake_client_id"
45client_secret: "fake_client_secret"
46"""
47 return default_cfg
48
49
50# pylint: disable=protected-access
51class AcloudGCPSetupTest(unittest.TestCase):
52 """Test GCP Setup steps."""
53
54 def setUp(self):
55 """Create config and gcp_env_runner."""
56 self.cfg_path = "acloud_unittest.config"
57 file_write = open(self.cfg_path, 'w')
58 file_write.write(_CreateCfgFile().strip())
59 file_write.close()
60 self.gcp_env_runner = gcp_setup_runner.GcpTaskRunner(self.cfg_path)
61 self.gcloud_runner = gcp_setup_runner.GoogleSDKBins("")
62
63 def tearDown(self):
64 """Remove temp file."""
65 if os.path.isfile(self.cfg_path):
66 os.remove(self.cfg_path)
67
68 def testUpdateConfigFile(self):
69 """Test update config file."""
70 # Test update project field.
71 gcp_setup_runner.UpdateConfigFile(self.cfg_path, "project",
72 "test_project")
73 cfg = config.AcloudConfigManager.LoadConfigFromProtocolBuffer(
74 open(self.cfg_path, "r"), user_config_pb2.UserConfig)
75 self.assertEqual(cfg.project, "test_project")
76 self.assertEqual(cfg.ssh_private_key_path, "")
77 # Test add ssh key path in config
78 gcp_setup_runner.UpdateConfigFile(self.cfg_path,
79 "ssh_private_key_path", "test_path")
80 cfg = config.AcloudConfigManager.LoadConfigFromProtocolBuffer(
81 open(self.cfg_path, "r"), user_config_pb2.UserConfig)
82 self.assertEqual(cfg.project, "test_project")
83 self.assertEqual(cfg.ssh_private_key_path, "test_path")
84
85 @mock.patch.object(gcp_setup_runner.GcpTaskRunner, "_CreateBucket")
86 @mock.patch.object(gcp_setup_runner.GcpTaskRunner, "_BucketExists")
87 @mock.patch.object(gcp_setup_runner.GcpTaskRunner, "_BucketInDefaultRegion")
88 def testCreateDefaultBucket(self, mock_valid, mock_exist, mock_create):
89 """Test default bucket name.
90
91 Default bucket name is "acloud-{project}".
92 If default bucket exist but region is not in default region,
93 bucket name changes to "acloud-{project}-us".
94 """
95 self.gcp_env_runner.project = "fake_project"
96 mock_exist.return_value = False
97 mock_valid.return_value = False
98 mock_create.return_value = True
99 self.assertEqual(
100 "acloud-fake_project",
101 self.gcp_env_runner._CreateDefaultBucket(self.gcloud_runner))
102 mock_exist.return_value = True
103 mock_valid.return_value = False
104 self.assertEqual(
105 "acloud-fake_project-%s" %
106 gcp_setup_runner._DEFAULT_BUCKET_REGION.lower(),
107 self.gcp_env_runner._CreateDefaultBucket(self.gcloud_runner))
108
109 @mock.patch("os.path.dirname", return_value="")
110 @mock.patch("subprocess.check_output")
111 def testSeupProjectZone(self, mock_runner, mock_path):
112 """Test setup project and zone."""
113 gcloud_runner = gcp_setup_runner.GoogleSDKBins(mock_path)
114 self.gcp_env_runner.project = "fake_project"
115 self.gcp_env_runner.zone = "fake_zone"
116 mock_runner.side_effect = [0, _GCP_USER_CONFIG]
117 self.gcp_env_runner._UpdateProject(gcloud_runner)
118 self.assertEqual(self.gcp_env_runner.project, "new_project")
119 self.assertEqual(self.gcp_env_runner.zone, "new_zone")
120
121 @mock.patch("__builtin__.raw_input")
122 def testSetupClientIDSecret(self, mock_id):
123 """Test setup client ID and client secret."""
124 self.gcp_env_runner.client_id = "fake_client_id"
125 self.gcp_env_runner.client_secret = "fake_client_secret"
126 mock_id.side_effect = ["new_id", "new_secret"]
127 self.gcp_env_runner._SetupClientIDSecret()
128 self.assertEqual(self.gcp_env_runner.client_id, "new_id")
129 self.assertEqual(self.gcp_env_runner.client_secret, "new_secret")
130
herbertxueefb02a82018-10-08 12:02:54 +0800131 def testGenerateBucketName(self):
132 """Test generate default bucket name."""
133 # Filter out organization name for project name.
134 bucket_name = self.gcp_env_runner._GenerateBucketName(
135 "AOSP.com:fake_project")
136 self.assertEqual(bucket_name, "acloud-fake_project")
137
138 # A bucket name can contain lowercase alphanumeric characters,
139 # hyphens and underscores.
140 bucket_name = self.gcp_env_runner._GenerateBucketName(
141 "@.fake_*Project.#")
142 self.assertEqual(bucket_name, "acloud-fake_project")
143
144 # Bucket names must limit to 63 characters.
145 bucket_name = self.gcp_env_runner._GenerateBucketName(
146 "fake_project-fake_project-fake_project-fake_project-fake_project")
147 self.assertEqual(bucket_name,
148 "acloud-fake_project-fake_project-fake_project-fake_project-fake")
149
150 # Rule 3: Bucket names must end with a number or letter.
151 bucket_name = self.gcp_env_runner._GenerateBucketName("fake_project__--")
152 self.assertEqual(bucket_name, "acloud-fake_project")
153
herbertxue34776bb2018-07-03 21:57:48 +0800154 @mock.patch.object(gcp_setup_runner.GoogleSDKBins, "RunGsutil")
155 def testBucketExists(self, mock_bucket_name):
156 """Test bucket name exist or not."""
157 mock_bucket_name.return_value = "gs://acloud-fake_project/"
158 self.assertTrue(
159 self.gcp_env_runner._BucketExists("acloud-fake_project",
160 self.gcloud_runner))
161 self.assertFalse(
162 self.gcp_env_runner._BucketExists("wrong_project",
163 self.gcloud_runner))
164
165 @mock.patch.object(gcp_setup_runner.GoogleSDKBins, "RunGsutil")
166 def testBucketNotInDefaultRegion(self, mock_region):
167 """Test bucket region is in default region or not."""
168 mock_region.return_value = "Location constraint:ASIA"
169 self.assertFalse(
170 self.gcp_env_runner._BucketInDefaultRegion("test-bucket",
171 self.gcloud_runner))
172 mock_region.return_value = "Location constraint:US"
173 self.assertTrue(
174 self.gcp_env_runner._BucketInDefaultRegion("test-bucket",
175 self.gcloud_runner))
176
177
178if __name__ == "__main__":
179 unittest.main()