sahara/sahara/tests/unit/service/edp/test_s3_common.py

104 lines
3.9 KiB
Python

# Copyright (c) 2017 Massachusetts Open Cloud
#
# Licensed 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 mock
import testtools
from sahara import exceptions as ex
from sahara.service.edp import s3_common
from sahara.tests.unit import base
class FakeJB(object):
extra = {"accesskey": "access",
"secretkey": "my-secret",
"endpoint": "pointy-end"}
url = "s3://temp/temp"
class S3CommonTestCase(base.SaharaTestCase):
@mock.patch("botocore.session.Session.create_client")
@mock.patch("sahara.service.castellan.utils.get_secret")
def test__get_s3_client(self, cast, boto):
cast.return_value = "the-actual-password"
je = FakeJB().extra
s3_common._get_s3_client(je)
args = ('s3', None, False, je['endpoint'], je['accesskey'],
'the-actual-password')
boto.called_once_with(*args)
def test__get_names_from_job_binary_url(self):
self.assertEqual(
s3_common._get_names_from_job_binary_url("s3://buck"), ["buck"])
self.assertEqual(
s3_common._get_names_from_job_binary_url("s3://buck/obj"),
["buck", "obj"])
self.assertEqual(
s3_common._get_names_from_job_binary_url("s3://buck/dir/obj"),
["buck", "dir/obj"])
def test__get_raw_job_binary_data(self):
jb = mock.Mock()
jb.url = "s3://bucket/object"
boto_conn = mock.Mock()
boto_conn.head_object = mock.Mock()
boto_conn.get_object = mock.Mock()
self.override_config('job_binary_max_KB', 1)
boto_conn.head_object.return_value = {"ContentLength": 1025}
self.assertRaises(ex.DataTooBigException,
s3_common._get_raw_job_binary_data,
jb, boto_conn)
reader = mock.Mock()
reader.read = lambda: "the binary"
boto_conn.get_object.return_value = {"Body": reader}
boto_conn.head_object.return_value = {"ContentLength": 1024}
s3_common._get_raw_job_binary_data(jb, boto_conn)
self.assertEqual(s3_common._get_raw_job_binary_data(jb, boto_conn),
"the binary")
def _raiser():
raise ValueError
reader.read = _raiser
self.assertRaises(ex.S3ClientException,
s3_common._get_raw_job_binary_data,
jb, boto_conn)
def test__validate_job_binary_url(self):
jb_url = "s3://bucket/object"
s3_common._validate_job_binary_url(jb_url)
jb_url = "s4://bucket/object"
with testtools.ExpectedException(ex.BadJobBinaryException):
s3_common._validate_job_binary_url(jb_url)
jb_url = "s3://bucket"
with testtools.ExpectedException(ex.BadJobBinaryException):
s3_common._validate_job_binary_url(jb_url)
@mock.patch("sahara.service.edp.s3_common._get_raw_job_binary_data")
@mock.patch("sahara.service.edp.s3_common._get_s3_client")
@mock.patch("sahara.service.edp.s3_common._validate_job_binary_url")
def test_get_raw_job_binary_data(self, validate_jbu, get_s3cl, get_rjbd):
get_s3cl.return_value = "this would have been boto"
jb = FakeJB()
s3_common.get_raw_job_binary_data(jb)
validate_jbu.assert_called_once_with(jb.url)
get_s3cl.assert_called_once_with(jb.extra)
get_rjbd.assert_called_once_with(jb, "this would have been boto")