def test_upload_local_artifacts_local_file(self, zip_and_upload_mock): # Case 1: Artifact path is a relative path # Verifies that we package local artifacts appropriately property_name = "property" resource_id = "resource_id" expected_s3_url = "s3://foo/bar?versionId=baz" self.s3_uploader_mock.upload_with_dedup.return_value = expected_s3_url with tempfile.NamedTemporaryFile() as handle: # Artifact is a file in the temporary directory artifact_path = handle.name parent_dir = tempfile.gettempdir() resource_dict = {property_name: artifact_path} result = upload_local_artifacts(resource_id, resource_dict, property_name, parent_dir, self.s3_uploader_mock) self.assertEquals(result, expected_s3_url) # Internally the method would convert relative paths to absolute # path, with respect to the parent directory absolute_artifact_path = make_abs_path(parent_dir, artifact_path) self.s3_uploader_mock.upload_with_dedup.assert_called_with( absolute_artifact_path) zip_and_upload_mock.assert_not_called()
def test_upload_local_artifacts_local_file(self, zip_and_upload_mock): # Case 1: Artifact path is a relative path # Verifies that we package local artifacts appropriately property_name = "property" resource_id = "resource_id" expected_s3_url = "s3://foo/bar?versionId=baz" self.s3_uploader_mock.upload_with_dedup.return_value = expected_s3_url with tempfile.NamedTemporaryFile() as handle: # Artifact is a file in the temporary directory artifact_path = handle.name parent_dir = tempfile.gettempdir() resource_dict = {property_name: artifact_path} result = upload_local_artifacts(resource_id, resource_dict, property_name, parent_dir, self.s3_uploader_mock) self.assertEquals(result, expected_s3_url) # Internally the method would convert relative paths to absolute # path, with respect to the parent directory absolute_artifact_path = make_abs_path(parent_dir, artifact_path) self.s3_uploader_mock.upload_with_dedup.assert_called_with(absolute_artifact_path) zip_and_upload_mock.assert_not_called()
def test_template_export(self, yaml_parse_mock): parent_dir = os.path.sep template_dir = os.path.join(parent_dir, 'foo', 'bar') template_path = os.path.join(template_dir, 'path') template_str = self.example_yaml_template() resource_type1_class = Mock() resource_type1_class.RESOURCE_TYPE = "resource_type1" resource_type1_instance = Mock() resource_type1_class.return_value = resource_type1_instance resource_type2_class = Mock() resource_type2_class.RESOURCE_TYPE = "resource_type2" resource_type2_instance = Mock() resource_type2_class.return_value = resource_type2_instance resources_to_export = [resource_type1_class, resource_type2_class] properties = {"foo": "bar"} template_dict = { "Resources": { "Resource1": { "Type": "resource_type1", "Properties": properties }, "Resource2": { "Type": "resource_type2", "Properties": properties }, "Resource3": { "Type": "some-other-type", "Properties": properties } } } open_mock = mock.mock_open() yaml_parse_mock.return_value = template_dict # Patch the file open method to return template string with patch( "awscli.customizations.cloudformation.artifact_exporter.open", open_mock(read_data=template_str)) as open_mock: template_exporter = Template(template_path, parent_dir, self.s3_uploader_mock, resources_to_export) exported_template = template_exporter.export() self.assertEquals(exported_template, template_dict) open_mock.assert_called_once_with( make_abs_path(parent_dir, template_path), "r") self.assertEquals(1, yaml_parse_mock.call_count) resource_type1_class.assert_called_once_with(self.s3_uploader_mock) resource_type1_instance.export.assert_called_once_with( "Resource1", mock.ANY, template_dir) resource_type2_class.assert_called_once_with(self.s3_uploader_mock) resource_type2_instance.export.assert_called_once_with( "Resource2", mock.ANY, template_dir)
def test_template_export_metadata(self, yaml_parse_mock): parent_dir = os.path.sep template_dir = os.path.join(parent_dir, 'foo', 'bar') template_path = os.path.join(template_dir, 'path') template_str = self.example_yaml_template() metadata_type1_class = Mock() metadata_type1_class.RESOURCE_TYPE = "metadata_type1" metadata_type1_class.PROPERTY_NAME = "property_1" metadata_type1_instance = Mock() metadata_type1_class.return_value = metadata_type1_instance metadata_type2_class = Mock() metadata_type2_class.RESOURCE_TYPE = "metadata_type2" metadata_type2_class.PROPERTY_NAME = "property_2" metadata_type2_instance = Mock() metadata_type2_class.return_value = metadata_type2_instance metadata_to_export = [ metadata_type1_class, metadata_type2_class ] template_dict = { "Metadata": { "metadata_type1": { "property_1": "abc" }, "metadata_type2": { "property_2": "def" } } } open_mock = mock.mock_open() yaml_parse_mock.return_value = template_dict # Patch the file open method to return template string with patch( "awscli.customizations.cloudformation.artifact_exporter.open", open_mock(read_data=template_str)) as open_mock: template_exporter = Template( template_path, parent_dir, self.s3_uploader_mock, metadata_to_export=metadata_to_export) exported_template = template_exporter.export() self.assertEquals(exported_template, template_dict) open_mock.assert_called_once_with( make_abs_path(parent_dir, template_path), "r") self.assertEquals(1, yaml_parse_mock.call_count) metadata_type1_class.assert_called_once_with(self.s3_uploader_mock) metadata_type1_instance.export.assert_called_once_with( "metadata_type1", mock.ANY, template_dir) metadata_type2_class.assert_called_once_with(self.s3_uploader_mock) metadata_type2_instance.export.assert_called_once_with( "metadata_type2", mock.ANY, template_dir)
def do_export(self, resource_id, resource_dict, parent_dir): """ Upload to S3 and set property to an dict representing the S3 url of the uploaded object """ local_path = resource_dict.get(self.PROPERTY_NAME, None) local_path = make_abs_path(parent_dir, local_path) with open(local_path, 'r') as fp: data = fp.read() resource_dict[self.PROPERTY_NAME] = data
def test_upload_local_artifacts_local_folder(self, zip_and_upload_mock): property_name = "property" resource_id = "resource_id" expected_s3_url = "s3://foo/bar?versionId=baz" zip_and_upload_mock.return_value = expected_s3_url # Artifact path is a Directory with self.make_temp_dir() as artifact_path: # Artifact is a file in the temporary directory parent_dir = tempfile.gettempdir() resource_dict = {property_name: artifact_path} result = upload_local_artifacts(resource_id, resource_dict, property_name, parent_dir, Mock()) self.assertEquals(result, expected_s3_url) absolute_artifact_path = make_abs_path(parent_dir, artifact_path) zip_and_upload_mock.assert_called_once_with( absolute_artifact_path, mock.ANY)
def test_upload_local_artifacts_local_file_abs_path(self, zip_and_upload_mock): # Case 2: Artifact path is an absolute path # Verifies that we package local artifacts appropriately property_name = "property" resource_id = "resource_id" expected_s3_url = "s3://foo/bar?versionId=baz" self.s3_uploader_mock.upload_with_dedup.return_value = expected_s3_url with tempfile.NamedTemporaryFile() as handle: parent_dir = tempfile.gettempdir() artifact_path = make_abs_path(parent_dir, handle.name) resource_dict = {property_name: artifact_path} result = upload_local_artifacts(resource_id, resource_dict, property_name, parent_dir, self.s3_uploader_mock) self.assertEquals(result, expected_s3_url) self.s3_uploader_mock.upload_with_dedup.assert_called_with(artifact_path) zip_and_upload_mock.assert_not_called()
def test_upload_local_artifacts_local_file_abs_path( self, zip_and_upload_mock): # Case 2: Artifact path is an absolute path # Verifies that we package local artifacts appropriately property_name = "property" resource_id = "resource_id" expected_s3_url = "s3://foo/bar?versionId=baz" self.s3_uploader_mock.upload_with_dedup.return_value = expected_s3_url with tempfile.NamedTemporaryFile() as handle: parent_dir = tempfile.gettempdir() artifact_path = make_abs_path(parent_dir, handle.name) resource_dict = {property_name: artifact_path} result = upload_local_artifacts(resource_id, resource_dict, property_name, parent_dir, self.s3_uploader_mock) self.assertEquals(result, expected_s3_url) self.s3_uploader_mock.upload_with_dedup.assert_called_with( artifact_path) zip_and_upload_mock.assert_not_called()
def test_upload_local_artifacts_local_folder(self, zip_and_upload_mock): property_name = "property" resource_id = "resource_id" expected_s3_url = "s3://foo/bar?versionId=baz" zip_and_upload_mock.return_value = expected_s3_url # Artifact path is a Directory with self.make_temp_dir() as artifact_path: # Artifact is a file in the temporary directory parent_dir = tempfile.gettempdir() resource_dict = {property_name: artifact_path} result = upload_local_artifacts(resource_id, resource_dict, property_name, parent_dir, Mock()) self.assertEquals(result, expected_s3_url) absolute_artifact_path = make_abs_path(parent_dir, artifact_path) zip_and_upload_mock.assert_called_once_with(absolute_artifact_path, mock.ANY)
def test_template_export(self, yaml_parse_mock): parent_dir = os.path.sep template_dir = os.path.join(parent_dir, 'foo', 'bar') template_path = os.path.join(template_dir, 'path') template_str = self.example_yaml_template() resource_type1_class = Mock() resource_type1_class.RESOURCE_TYPE = "resource_type1" resource_type1_instance = Mock() resource_type1_class.return_value = resource_type1_instance resource_type2_class = Mock() resource_type2_class.RESOURCE_TYPE = "resource_type2" resource_type2_instance = Mock() resource_type2_class.return_value = resource_type2_instance resources_to_export = [ resource_type1_class, resource_type2_class ] properties = {"foo": "bar"} template_dict = { "Resources": { "Resource1": { "Type": "resource_type1", "Properties": properties }, "Resource2": { "Type": "resource_type2", "Properties": properties }, "Resource3": { "Type": "some-other-type", "Properties": properties } } } open_mock = mock.mock_open() yaml_parse_mock.return_value = template_dict # Patch the file open method to return template string with patch( "awscli.customizations.cloudformation.artifact_exporter.open", open_mock(read_data=template_str)) as open_mock: template_exporter = Template( template_path, parent_dir, self.s3_uploader_mock, resources_to_export) exported_template = template_exporter.export() self.assertEquals(exported_template, template_dict) open_mock.assert_called_once_with( make_abs_path(parent_dir, template_path), "r") self.assertEquals(1, yaml_parse_mock.call_count) resource_type1_class.assert_called_once_with(self.s3_uploader_mock) resource_type1_instance.export.assert_called_once_with( "Resource1", mock.ANY, template_dir) resource_type2_class.assert_called_once_with(self.s3_uploader_mock) resource_type2_instance.export.assert_called_once_with( "Resource2", mock.ANY, template_dir)