blob: 550c5b61fdf8c898abc42f361ed47433bfd4738e [file] [log] [blame]
#
# 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.
#
from mock import call, create_autospec, patch
from apache.aurora.client.api.scheduler_client import SchedulerClient
from apache.aurora.client.cli import EXIT_UNKNOWN_ERROR
from apache.aurora.client.cli.client import AuroraCommandLine
from .util import AuroraClientCommandTest
from gen.apache.aurora.api import AuroraAdmin
from gen.apache.aurora.api.ttypes import (
JobKey,
ResponseCode,
Result,
ScheduleStatusResult,
TaskQuery
)
class TestApiFromCLI(AuroraClientCommandTest):
"""A container for tests that are probing at API functionality,
to see if the CLI can handle API-level errors.
"""
@classmethod
def create_mock_scheduled_task_no_metadata(cls):
result = cls.create_mock_scheduled_tasks()
for task in result:
task.assignedTask.task.metadata = None
return result
@classmethod
def create_status_response(cls):
resp = cls.create_simple_success_response()
resp.result = Result(
scheduleStatusResult=ScheduleStatusResult(tasks=set(cls.create_scheduled_tasks())))
return resp
@classmethod
def create_status_response_null_metadata(cls):
resp = cls.create_simple_success_response()
resp.result = Result(
scheduleStatusResult=ScheduleStatusResult(
tasks=set(cls.create_mock_scheduled_task_no_metadata())))
return resp
@classmethod
def create_failed_status_response(cls):
return cls.create_blank_response(ResponseCode.INVALID_REQUEST, 'No tasks found for query')
def test_successful_status_deep(self):
"""Test the status command more deeply: in a request with a fully specified
job, it should end up doing a query using getTasksWithoutConfigs."""
mock_scheduler_client = create_autospec(spec=SchedulerClient, instance=True)
mock_thrift_client = create_autospec(spec=AuroraAdmin.Client, instance=True)
mock_scheduler_client.get_thrift_client.return_value = mock_thrift_client
mock_thrift_client.getTasksWithoutConfigs.return_value = self.create_status_response()
with patch('apache.aurora.client.api.scheduler_client.SchedulerClient.get',
return_value=mock_scheduler_client):
cmd = AuroraCommandLine()
cmd.execute(['job', 'status', 'west/bozo/test/hello'])
assert mock_thrift_client.getTasksWithoutConfigs.mock_calls == [
call(TaskQuery(jobKeys=[JobKey(role='bozo', environment='test', name='hello')]))]
def test_status_api_failure(self):
mock_scheduler_client = create_autospec(spec=SchedulerClient, instance=True)
mock_thrift_client = create_autospec(spec=AuroraAdmin.Client, instance=True)
mock_scheduler_client.get_thrift_client.return_value = mock_thrift_client
mock_thrift_client.getTasksWithoutConfigs.side_effect = IOError("Uh-Oh")
with patch('apache.aurora.client.api.scheduler_client.SchedulerClient.get',
return_value=mock_scheduler_client):
cmd = AuroraCommandLine()
# This should create a scheduler client, set everything up, and then issue a
# getTasksWithoutConfigs call against the mock_scheduler_client. That should raise an
# exception, which results in the command failing with an error code.
result = cmd.execute(['job', 'status', 'west/bozo/test/hello'])
assert result == EXIT_UNKNOWN_ERROR
assert mock_thrift_client.getTasksWithoutConfigs.mock_calls == [
call(TaskQuery(jobKeys=[JobKey(role='bozo', environment='test', name='hello')]))]