blob: fd3670183e42b90f42411d4fa899915d41fb035c [file] [log] [blame]
#!/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.
#
"""Client deploy info.
Library for parsing client_deploy.yaml files and working with these in memory.
"""
from google.appengine.api import appinfo
from google.appengine.api import validation
from google.appengine.api import yaml_builder
from google.appengine.api import yaml_listener
from google.appengine.api import yaml_object
RUNTIME = 'runtime'
START_TIME_USEC = 'start_time_usec'
END_TIME_USEC = 'end_time_usec'
REQUESTS = 'requests'
SUCCESS = 'success'
PATH = 'path'
RESPONSE_CODE = 'response_code'
REQUEST_SIZE_BYTES = 'request_size_bytes'
SDK_VERSION = 'sdk_version'
class Request(validation.Validated):
"""A Request describes a single http request within a deployment attempt."""
ATTRIBUTES = {
PATH: validation.TYPE_STR,
RESPONSE_CODE: validation.Range(100, 599),
START_TIME_USEC: validation.TYPE_LONG,
END_TIME_USEC: validation.TYPE_LONG,
REQUEST_SIZE_BYTES: validation.TYPE_LONG,
}
class ClientDeployInfoExternal(validation.Validated):
"""Describes the format of a client_deployinfo.yaml file."""
ATTRIBUTES = {
RUNTIME: appinfo.RUNTIME_RE_STRING,
START_TIME_USEC: validation.TYPE_LONG,
END_TIME_USEC: validation.TYPE_LONG,
REQUESTS: validation.Optional(validation.Repeated(Request)),
SUCCESS: validation.TYPE_BOOL,
SDK_VERSION: validation.Optional(validation.TYPE_STR)
}
class Error(Exception):
"""Base ClientDeployInfo Exception type."""
class EmptyYaml(Error):
"""Tried to load an empty yaml."""
class MultipleClientDeployInfo(Error):
"""Tried to load a yaml containing multiple client deploy info definitions."""
def LoadSingleClientDeployInfo(client_deploy_info):
"""Returns a ClientDeployInfoExternal from a deploy_info.yaml file or string.
Args:
client_deploy_info: The contents of a client_deploy_info.yaml file or
string, or an open file object.
Returns:
A ClientDeployInfoExternal instance which represents the contents of the
parsed yaml.
Raises:
EmptyYaml: when there are no documents in yaml.
MultipleClientDeployInfo: when there are multiple documents in yaml.
yaml_errors.EventError: when an error occurs while parsing the yaml.
"""
builder = yaml_object.ObjectBuilder(ClientDeployInfoExternal)
handler = yaml_builder.BuilderHandler(builder)
listener = yaml_listener.EventListener(handler)
listener.Parse(client_deploy_info)
parsed_yaml = handler.GetResults()
if not parsed_yaml:
raise EmptyYaml()
if len(parsed_yaml) > 1:
raise MultipleClientDeployInfo()
return parsed_yaml[0]