blob: 41853ba91e371744ca0994b8730ab09b41c6c712 [file] [log] [blame]
Tri Vo29ac1822016-10-01 17:06:29 -07001#!/usr/bin/env python
2#
3# Copyright 2016 - 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
17"""Tests for acloud.public.device_driver."""
18
19import datetime
20import uuid
21
Kevin Cheng5c124ec2018-05-16 13:28:51 -070022import unittest
Tri Vo29ac1822016-10-01 17:06:29 -070023import mock
24
Kevin Cheng5c124ec2018-05-16 13:28:51 -070025import dateutil.parser
26
Tri Vo29ac1822016-10-01 17:06:29 -070027from acloud.internal.lib import auth
Tri Vo05f01892017-03-02 11:28:31 -080028from acloud.internal.lib import android_build_client
Tri Vo29ac1822016-10-01 17:06:29 -070029from acloud.internal.lib import android_compute_client
30from acloud.internal.lib import driver_test_lib
31from acloud.internal.lib import gstorage_client
32from acloud.public import device_driver
33
34
Kevin Cheng5c124ec2018-05-16 13:28:51 -070035def _CreateCfg():
36 """A helper method that creates a mock configuration object."""
37 cfg = mock.MagicMock()
38 cfg.service_account_name = "fake@service.com"
39 cfg.service_account_private_key_path = "/fake/path/to/key"
40 cfg.zone = "fake_zone"
41 cfg.disk_image_name = "fake_image.tar.gz"
42 cfg.disk_image_mime_type = "fake/type"
43 cfg.storage_bucket_name = "fake_bucket"
44 cfg.extra_data_disk_size_gb = 4
45 cfg.precreated_data_image_map = {
46 4: "extradisk-image-4gb",
47 10: "extradisk-image-10gb"
48 }
49 cfg.ssh_private_key_path = ""
50 cfg.ssh_public_key_path = ""
51
52 return cfg
53
54
Tri Vo29ac1822016-10-01 17:06:29 -070055class DeviceDriverTest(driver_test_lib.BaseDriverTest):
56 """Test device_driver."""
57
58 def setUp(self):
59 """Set up the test."""
60 super(DeviceDriverTest, self).setUp()
61 self.build_client = mock.MagicMock()
62 self.Patch(android_build_client, "AndroidBuildClient",
Kevin Cheng5c124ec2018-05-16 13:28:51 -070063 return_value=self.build_client)
Tri Vo29ac1822016-10-01 17:06:29 -070064 self.storage_client = mock.MagicMock()
65 self.Patch(
66 gstorage_client, "StorageClient", return_value=self.storage_client)
67 self.compute_client = mock.MagicMock()
68 self.Patch(
69 android_compute_client,
70 "AndroidComputeClient",
71 return_value=self.compute_client)
72 self.Patch(auth, "CreateCredentials", return_value=mock.MagicMock())
73
Tri Vo29ac1822016-10-01 17:06:29 -070074 def testCreateAndroidVirtualDevices(self):
75 """Test CreateAndroidVirtualDevices."""
Kevin Cheng5c124ec2018-05-16 13:28:51 -070076 cfg = _CreateCfg()
Tri Vo29ac1822016-10-01 17:06:29 -070077 fake_gs_url = "fake_gs_url"
78 fake_ip = "140.1.1.1"
79 fake_instance = "fake-instance"
80 fake_image = "fake-image"
81 fake_build_target = "fake_target"
82 fake_build_id = "12345"
83
84 # Mock uuid
85 fake_uuid = mock.MagicMock(hex="1234")
86 self.Patch(uuid, "uuid4", return_value=fake_uuid)
87 fake_gs_object = fake_uuid.hex + "-" + cfg.disk_image_name
88 self.storage_client.GetUrl.return_value = fake_gs_url
89
90 # Mock compute client methods
91 disk_name = "extradisk-image-4gb"
92 self.compute_client.GetInstanceIP.return_value = fake_ip
93 self.compute_client.GenerateImageName.return_value = fake_image
94 self.compute_client.GenerateInstanceName.return_value = fake_instance
95 self.compute_client.GetDataDiskName.return_value = disk_name
96
97 # Verify
Kevin Cheng5c124ec2018-05-16 13:28:51 -070098 report = device_driver.CreateAndroidVirtualDevices(
99 cfg, fake_build_target, fake_build_id)
Tri Vo29ac1822016-10-01 17:06:29 -0700100 self.build_client.CopyTo.assert_called_with(
Kevin Cheng5c124ec2018-05-16 13:28:51 -0700101 fake_build_target, fake_build_id, artifact_name=cfg.disk_image_name,
102 destination_bucket=cfg.storage_bucket_name,
103 destination_path=fake_gs_object)
Tri Vo29ac1822016-10-01 17:06:29 -0700104 self.compute_client.CreateImage.assert_called_with(
Kevin Cheng5c124ec2018-05-16 13:28:51 -0700105 image_name=fake_image, source_uri=fake_gs_url)
Tri Vo29ac1822016-10-01 17:06:29 -0700106 self.compute_client.CreateInstance.assert_called_with(
Kevin Chengb5963882018-05-09 00:06:27 -0700107 instance=fake_instance,
108 image_name=fake_image,
109 extra_disk_name=disk_name)
Tri Vo29ac1822016-10-01 17:06:29 -0700110 self.compute_client.DeleteImage.assert_called_with(fake_image)
111 self.storage_client.Delete(cfg.storage_bucket_name, fake_gs_object)
112
113 self.assertEquals(
Kevin Cheng5c124ec2018-05-16 13:28:51 -0700114 report.data,
Tri Vo29ac1822016-10-01 17:06:29 -0700115 {
116 "devices": [
117 {
118 "instance_name": fake_instance,
119 "ip": fake_ip,
120 },
121 ],
122 }
123 )
Kevin Cheng5c124ec2018-05-16 13:28:51 -0700124 self.assertEquals(report.command, "create")
125 self.assertEquals(report.status, "SUCCESS")
Tri Vo29ac1822016-10-01 17:06:29 -0700126
127
128 def testDeleteAndroidVirtualDevices(self):
129 """Test DeleteAndroidVirtualDevices."""
130 instance_names = ["fake-instance-1", "fake-instance-2"]
131 self.compute_client.DeleteInstances.return_value = (instance_names, [],
132 [])
Kevin Cheng5c124ec2018-05-16 13:28:51 -0700133 cfg = _CreateCfg()
134 report = device_driver.DeleteAndroidVirtualDevices(cfg, instance_names)
Tri Vo29ac1822016-10-01 17:06:29 -0700135 self.compute_client.DeleteInstances.assert_called_once_with(
136 instance_names, cfg.zone)
Kevin Cheng5c124ec2018-05-16 13:28:51 -0700137 self.assertEquals(report.data, {
Tri Vo29ac1822016-10-01 17:06:29 -0700138 "deleted": [
139 {
140 "name": instance_names[0],
141 "type": "instance",
142 },
143 {
144 "name": instance_names[1],
145 "type": "instance",
146 },
147 ],
148 })
Kevin Cheng5c124ec2018-05-16 13:28:51 -0700149 self.assertEquals(report.command, "delete")
150 self.assertEquals(report.status, "SUCCESS")
Tri Vo29ac1822016-10-01 17:06:29 -0700151
152 def testCleanup(self):
Kevin Cheng5c124ec2018-05-16 13:28:51 -0700153 """Test Cleanup."""
Tri Vo29ac1822016-10-01 17:06:29 -0700154 expiration_mins = 30
155 before_deadline = "2015-10-29T12:00:30.018-07:00"
156 after_deadline = "2015-10-29T12:45:30.018-07:00"
157 now = "2015-10-29T13:00:30.018-07:00"
158 self.Patch(device_driver, "datetime")
159 device_driver.datetime.datetime.now.return_value = dateutil.parser.parse(
160 now)
161 device_driver.datetime.timedelta.return_value = datetime.timedelta(
162 minutes=expiration_mins)
163 fake_instances = [
164 {
165 "name": "fake_instance_1",
166 "creationTimestamp": before_deadline,
167 }, {
168 "name": "fake_instance_2",
169 "creationTimestamp": after_deadline,
170 }
171 ]
172 fake_images = [
173 {
174 "name": "extradisk-image-4gb",
175 "creationTimestamp": before_deadline,
176 }, {
177 "name": "fake_image_1",
178 "creationTimestamp": before_deadline,
179 }, {
180 "name": "fake_image_2",
181 "creationTimestamp": after_deadline,
182 }
183 ]
184 fake_disks = [
185 {
186 "name": "fake_disk_1",
187 "creationTimestamp": before_deadline,
188 }, {
189 "name": "fake_disk_2",
190 "creationTimestamp": before_deadline,
191 "users": ["some-instance-using-the-disk"]
192 }, {
193 "name": "fake_disk_3",
194 "creationTimestamp": after_deadline,
195 }
196 ]
197 fake_objects = [
198 {
199 "name": "fake_object_1",
200 "timeCreated": before_deadline,
201 }, {
202 "name": "fake_object_2",
203 "timeCreated": after_deadline,
204 }
205 ]
206 self.compute_client.ListInstances.return_value = fake_instances
207 self.compute_client.ListImages.return_value = fake_images
208 self.compute_client.ListDisks.return_value = fake_disks
209 self.storage_client.List.return_value = fake_objects
210 self.compute_client.DeleteInstances.return_value = (
211 ["fake_instance_1"], [], [])
212 self.compute_client.DeleteImages.return_value = (["fake_image_1"], [],
213 [])
214 self.compute_client.DeleteDisks.return_value = (["fake_disk_1"], [],
215 [])
216 self.storage_client.DeleteFiles.return_value = (["fake_object_1"], [],
217 [])
Kevin Cheng5c124ec2018-05-16 13:28:51 -0700218 cfg = _CreateCfg()
219 report = device_driver.Cleanup(cfg, expiration_mins)
220 self.assertEqual(report.errors, [])
Tri Vo29ac1822016-10-01 17:06:29 -0700221 expected_report_data = {
222 "deleted": [
223 {"name": "fake_instance_1",
224 "type": "instance"},
225 {"name": "fake_image_1",
226 "type": "image"},
227 {"name": "fake_disk_1",
228 "type": "disk"},
229 {"name": "fake_object_1",
230 "type": "cached_build_artifact"},
231 ]
232 }
Kevin Cheng5c124ec2018-05-16 13:28:51 -0700233 self.assertEqual(report.data, expected_report_data)
Tri Vo29ac1822016-10-01 17:06:29 -0700234
235 self.compute_client.ListInstances.assert_called_once_with(
236 zone=cfg.zone)
237 self.compute_client.DeleteInstances.assert_called_once_with(
238 instances=["fake_instance_1"], zone=cfg.zone)
239
240 self.compute_client.ListImages.assert_called_once_with()
241 self.compute_client.DeleteImages.assert_called_once_with(
242 image_names=["fake_image_1"])
243
244 self.compute_client.ListDisks.assert_called_once_with(zone=cfg.zone)
245 self.compute_client.DeleteDisks.assert_called_once_with(
246 disk_names=["fake_disk_1"], zone=cfg.zone)
247
248 self.storage_client.List.assert_called_once_with(
249 bucket_name=cfg.storage_bucket_name)
250 self.storage_client.DeleteFiles.assert_called_once_with(
251 bucket_name=cfg.storage_bucket_name,
252 object_names=["fake_object_1"])
253
254
255if __name__ == "__main__":
256 unittest.main()