| #!/usr/bin/env python |
| # |
| # Copyright 2007 Google Inc. |
| # |
| # 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. |
| # |
| """Stub implementation of the modules service.""" |
| |
| from google.appengine.api import apiproxy_stub |
| from google.appengine.api import request_info |
| from google.appengine.api.modules import modules_service_pb |
| from google.appengine.runtime import apiproxy_errors |
| |
| |
| class ModulesServiceStub(apiproxy_stub.APIProxyStub): |
| |
| |
| _ACCEPTS_REQUEST_ID = True |
| THREADSAFE = True |
| |
| def __init__(self, request_data): |
| super(ModulesServiceStub, self).__init__('modules', |
| request_data=request_data) |
| |
| def _GetModuleFromRequest(self, request, request_id): |
| dispatcher = self.request_data.get_dispatcher() |
| if request.has_module(): |
| module = request.module() |
| else: |
| module = self.request_data.get_module(request_id) |
| return module, dispatcher |
| |
| def _GetModuleAndVersionFromRequest(self, request, request_id): |
| module, dispatcher = self._GetModuleFromRequest(request, request_id) |
| if request.has_version(): |
| version = request.version() |
| else: |
| version = self.request_data.get_version(request_id) |
| if version not in dispatcher.get_versions(module): |
| version = dispatcher.get_default_version(module) |
| return module, version, dispatcher |
| |
| def _Dynamic_GetModules(self, request, response, request_id): |
| dispatcher = self.request_data.get_dispatcher() |
| for module in dispatcher.get_module_names(): |
| response.add_module(module) |
| |
| def _Dynamic_GetVersions(self, request, response, request_id): |
| module, dispatcher = self._GetModuleFromRequest(request, request_id) |
| try: |
| for version in dispatcher.get_versions(module): |
| response.add_version(version) |
| except request_info.ModuleDoesNotExistError: |
| raise apiproxy_errors.ApplicationError( |
| modules_service_pb.ModulesServiceError.INVALID_MODULE) |
| |
| def _Dynamic_GetDefaultVersion(self, request, response, request_id): |
| module, dispatcher = self._GetModuleFromRequest(request, request_id) |
| try: |
| response.set_version(dispatcher.get_default_version(module)) |
| except request_info.ModuleDoesNotExistError: |
| raise apiproxy_errors.ApplicationError( |
| modules_service_pb.ModulesServiceError.INVALID_MODULE) |
| |
| def _Dynamic_GetNumInstances(self, request, response, request_id): |
| try: |
| module, version, dispatcher = self._GetModuleAndVersionFromRequest( |
| request, request_id) |
| response.set_instances(dispatcher.get_num_instances(module, version)) |
| except (request_info.ModuleDoesNotExistError, |
| request_info.VersionDoesNotExistError, |
| request_info.NotSupportedWithAutoScalingError): |
| raise apiproxy_errors.ApplicationError( |
| modules_service_pb.ModulesServiceError.INVALID_VERSION) |
| |
| def _Dynamic_SetNumInstances(self, request, response, request_id): |
| try: |
| module, version, dispatcher = self._GetModuleAndVersionFromRequest( |
| request, request_id) |
| dispatcher.set_num_instances(module, version, request.instances()) |
| except (request_info.ModuleDoesNotExistError, |
| request_info.VersionDoesNotExistError, |
| request_info.NotSupportedWithAutoScalingError): |
| raise apiproxy_errors.ApplicationError( |
| modules_service_pb.ModulesServiceError.INVALID_VERSION) |
| |
| def _Dynamic_StartModule(self, request, response, request_id): |
| module = request.module() |
| version = request.version() |
| dispatcher = self.request_data.get_dispatcher() |
| try: |
| dispatcher.start_version(module, version) |
| except (request_info.ModuleDoesNotExistError, |
| request_info.VersionDoesNotExistError, |
| request_info.NotSupportedWithAutoScalingError): |
| raise apiproxy_errors.ApplicationError( |
| modules_service_pb.ModulesServiceError.INVALID_VERSION) |
| except request_info.VersionAlreadyStartedError: |
| raise apiproxy_errors.ApplicationError( |
| modules_service_pb.ModulesServiceError.UNEXPECTED_STATE) |
| |
| def _Dynamic_StopModule(self, request, response, request_id): |
| try: |
| module, version, dispatcher = self._GetModuleAndVersionFromRequest( |
| request, request_id) |
| dispatcher.stop_version(module, version) |
| except (request_info.ModuleDoesNotExistError, |
| request_info.VersionDoesNotExistError, |
| request_info.NotSupportedWithAutoScalingError): |
| raise apiproxy_errors.ApplicationError( |
| modules_service_pb.ModulesServiceError.INVALID_VERSION) |
| except request_info.VersionAlreadyStoppedError: |
| raise apiproxy_errors.ApplicationError( |
| modules_service_pb.ModulesServiceError.UNEXPECTED_STATE) |
| |
| def _Dynamic_GetHostname(self, request, response, request_id): |
| if request.has_instance(): |
| instance = request.instance() |
| else: |
| instance = None |
| try: |
| module, version, dispatcher = self._GetModuleAndVersionFromRequest( |
| request, request_id) |
| response.set_hostname(dispatcher.get_hostname(module, version, instance)) |
| except (request_info.ModuleDoesNotExistError, |
| request_info.VersionDoesNotExistError): |
| raise apiproxy_errors.ApplicationError( |
| modules_service_pb.ModulesServiceError.INVALID_MODULE) |
| except request_info.InvalidInstanceIdError: |
| raise apiproxy_errors.ApplicationError( |
| modules_service_pb.ModulesServiceError.INVALID_INSTANCES) |