blob: efacb2eb8553817a1c87766e3138394ef4582dd1 [file] [log] [blame]
# Licensed to the Apache ftware Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import tempfile
import pytest
from aria.storage.filesystem_rapi import FileSystemResourceAPI
from aria.storage import (
exceptions,
ResourceStorage
)
from . import TestFileSystem
class TestResourceStorage(TestFileSystem):
def _create(self, storage):
storage.register('service_template')
def _upload(self, storage, tmp_path, id):
with open(tmp_path, 'w') as f:
f.write('fake context')
storage.service_template.upload(entry_id=id, source=tmp_path)
def _upload_dir(self, storage, tmp_dir, tmp_file_name, id):
file_source = os.path.join(tmp_dir, tmp_file_name)
with open(file_source, 'w') as f:
f.write('fake context')
storage.service_template.upload(entry_id=id, source=tmp_dir)
def _create_storage(self):
return ResourceStorage(FileSystemResourceAPI,
api_kwargs=dict(directory=self.path))
def test_name(self):
api = FileSystemResourceAPI
storage = ResourceStorage(FileSystemResourceAPI,
items=['service_template'],
api_kwargs=dict(directory=self.path))
assert repr(storage) == 'ResourceStorage(api={api})'.format(api=api)
assert 'directory={resource_dir}'.format(resource_dir=self.path) in \
repr(storage.registered['service_template'])
def test_create(self):
storage = self._create_storage()
self._create(storage)
assert os.path.exists(os.path.join(self.path, 'service_template'))
def test_upload_file(self):
storage = ResourceStorage(FileSystemResourceAPI, api_kwargs=dict(directory=self.path))
self._create(storage)
tmpfile_path = tempfile.mkstemp(suffix=self.__class__.__name__, dir=self.path)[1]
self._upload(storage, tmpfile_path, id='service_template_id')
storage_path = os.path.join(
self.path,
'service_template',
'service_template_id',
os.path.basename(tmpfile_path))
assert os.path.exists(storage_path)
with open(storage_path, 'rb') as f:
assert f.read() == 'fake context'
def test_download_file(self):
storage = self._create_storage()
self._create(storage)
tmpfile_path = tempfile.mkstemp(suffix=self.__class__.__name__, dir=self.path)[1]
tmpfile_name = os.path.basename(tmpfile_path)
self._upload(storage, tmpfile_path, 'service_template_id')
temp_dir = tempfile.mkdtemp(dir=self.path)
storage.service_template.download(
entry_id='service_template_id',
destination=temp_dir,
path=tmpfile_name)
with open(os.path.join(self.path, os.path.join(temp_dir, tmpfile_name))) as f:
assert f.read() == 'fake context'
def test_download_non_existing_file(self):
storage = self._create_storage()
self._create(storage)
with pytest.raises(exceptions.StorageError):
storage.service_template.download(entry_id='service_template_id', destination='',
path='fake_path')
def test_data_non_existing_file(self):
storage = self._create_storage()
self._create(storage)
with pytest.raises(exceptions.StorageError):
storage.service_template.read(entry_id='service_template_id', path='fake_path')
def test_data_file(self):
storage = self._create_storage()
self._create(storage)
tmpfile_path = tempfile.mkstemp(suffix=self.__class__.__name__, dir=self.path)[1]
self._upload(storage, tmpfile_path, 'service_template_id')
assert storage.service_template.read(entry_id='service_template_id',
path=os.path.basename(tmpfile_path)) == 'fake context'
def test_upload_dir(self):
storage = self._create_storage()
self._create(storage)
tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path)
second_level_tmp_dir = tempfile.mkdtemp(dir=tmp_dir)
tmp_filename = tempfile.mkstemp(dir=second_level_tmp_dir)[1]
self._upload_dir(storage, tmp_dir, tmp_filename, id='service_template_id')
destination = os.path.join(
self.path,
'service_template',
'service_template_id',
os.path.basename(second_level_tmp_dir),
os.path.basename(tmp_filename))
assert os.path.isfile(destination)
def test_upload_path_in_dir(self):
storage = self._create_storage()
self._create(storage)
tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path)
second_level_tmp_dir = tempfile.mkdtemp(dir=tmp_dir)
tmp_filename = tempfile.mkstemp(dir=second_level_tmp_dir)[1]
self._upload_dir(storage, tmp_dir, tmp_filename, id='service_template_id')
second_update_file = tempfile.mkstemp(dir=self.path)[1]
with open(second_update_file, 'w') as f:
f.write('fake context2')
storage.service_template.upload(
entry_id='service_template_id',
source=second_update_file,
path=os.path.basename(second_level_tmp_dir))
assert os.path.isfile(os.path.join(
self.path,
'service_template',
'service_template_id',
os.path.basename(second_level_tmp_dir),
os.path.basename(second_update_file)))
def test_download_dir(self):
storage = self._create_storage()
self._create(storage)
tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path)
second_level_tmp_dir = tempfile.mkdtemp(dir=tmp_dir)
tmp_filename = tempfile.mkstemp(dir=second_level_tmp_dir)[1]
self._upload_dir(storage, tmp_dir, tmp_filename, id='service_template_id')
temp_destination_dir = tempfile.mkdtemp(dir=self.path)
storage.service_template.download(
entry_id='service_template_id',
destination=temp_destination_dir)
destination_file_path = os.path.join(
temp_destination_dir,
os.path.basename(second_level_tmp_dir),
os.path.basename(tmp_filename))
assert os.path.isfile(destination_file_path)
with open(destination_file_path) as f:
assert f.read() == 'fake context'
def test_data_dir(self):
storage = self._create_storage()
self._create(storage)
tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path)
tempfile.mkstemp(dir=tmp_dir)
tempfile.mkstemp(dir=tmp_dir)
storage.service_template.upload(entry_id='service_template_id', source=tmp_dir)
with pytest.raises(exceptions.StorageError):
storage.service_template.read(entry_id='service_template_id', path='')
def test_delete_resource(self):
storage = self._create_storage()
self._create(storage)
tmpfile_path = tempfile.mkstemp(suffix=self.__class__.__name__, dir=self.path)[1]
self._upload(storage, tmpfile_path, 'service_template_id')
tmpfile2_path = tempfile.mkstemp(suffix=self.__class__.__name__, dir=self.path)[1]
self._upload(storage, tmpfile2_path, 'service_template_id')
# deleting the first resource and expecting an error on read
storage.service_template.delete(entry_id='service_template_id',
path=os.path.basename(tmpfile_path))
with pytest.raises(exceptions.StorageError):
storage.service_template.read(entry_id='service_template_id',
path=os.path.basename(tmpfile_path))
# the second resource should still be available for reading
assert storage.service_template.read(
entry_id='service_template_id',
path=os.path.basename(tmpfile2_path)) == 'fake context'
def test_delete_directory(self):
storage = self._create_storage()
self._create(storage)
temp_destination_dir = tempfile.mkdtemp(dir=self.path)
tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path)
second_level_tmp_dir = tempfile.mkdtemp(dir=tmp_dir)
tmp_filename = tempfile.mkstemp(dir=second_level_tmp_dir)[1]
self._upload_dir(storage, tmp_dir, tmp_filename, id='service_template_id')
file_path_in_dir = os.path.join(
os.path.basename(second_level_tmp_dir),
os.path.basename(tmp_filename))
# should be able to read the file and download the directory..
assert storage.service_template.read(
entry_id='service_template_id',
path=file_path_in_dir) == 'fake context'
storage.service_template.download(
entry_id='service_template_id',
path=os.path.basename(second_level_tmp_dir),
destination=temp_destination_dir)
# after deletion, the file and directory should both be gone
storage.service_template.delete(
entry_id='service_template_id',
path=os.path.basename(second_level_tmp_dir))
with pytest.raises(exceptions.StorageError):
assert storage.service_template.read(
entry_id='service_template_id',
path=file_path_in_dir) == 'fake context'
with pytest.raises(exceptions.StorageError):
storage.service_template.download(
entry_id='service_template_id',
path=os.path.basename(second_level_tmp_dir),
destination=temp_destination_dir)
def test_delete_all_resources(self):
storage = self._create_storage()
self._create(storage)
temp_destination_dir = tempfile.mkdtemp(dir=self.path)
tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path)
second_level_tmp_dir = tempfile.mkdtemp(dir=tmp_dir)
tmp_filename = tempfile.mkstemp(dir=second_level_tmp_dir)[1]
self._upload_dir(storage, tmp_dir, tmp_filename, id='service_template_id')
file_path_in_dir = os.path.join(
os.path.basename(second_level_tmp_dir),
os.path.basename(tmp_filename))
# deleting without specifying a path - delete all resources of this entry
storage.service_template.delete(entry_id='service_template_id')
with pytest.raises(exceptions.StorageError):
assert storage.service_template.read(
entry_id='service_template_id',
path=file_path_in_dir) == 'fake context'
with pytest.raises(exceptions.StorageError):
storage.service_template.download(
entry_id='service_template_id',
path=os.path.basename(second_level_tmp_dir),
destination=temp_destination_dir)
def test_delete_nonexisting_resource(self):
storage = self._create_storage()
self._create(storage)
# deleting a nonexisting resource - no effect is expected to happen
assert storage.service_template.delete(entry_id='service_template_id',
path='fake-file') is False