begin hacking on command execution
This commit is contained in:
parent
ba78e6fc98
commit
15c63e8b46
teeth_agent
@ -22,6 +22,7 @@ from teeth_rest import encoding
|
|||||||
from werkzeug import serving
|
from werkzeug import serving
|
||||||
|
|
||||||
from teeth_agent import api
|
from teeth_agent import api
|
||||||
|
from teeth_agent import errors
|
||||||
|
|
||||||
|
|
||||||
class TeethAgentStatus(encoding.Serializable):
|
class TeethAgentStatus(encoding.Serializable):
|
||||||
@ -46,6 +47,7 @@ class BaseTeethAgent(object):
|
|||||||
self.started_at = None
|
self.started_at = None
|
||||||
self.mode = mode
|
self.mode = mode
|
||||||
self.api = api.TeethAgentAPIServer(self)
|
self.api = api.TeethAgentAPIServer(self)
|
||||||
|
self.command_map = {}
|
||||||
|
|
||||||
def get_status(self):
|
def get_status(self):
|
||||||
"""Retrieve a serializable status."""
|
"""Retrieve a serializable status."""
|
||||||
@ -57,7 +59,10 @@ class BaseTeethAgent(object):
|
|||||||
|
|
||||||
def execute_command(self, command_name, **kwargs):
|
def execute_command(self, command_name, **kwargs):
|
||||||
"""Execute an agent command."""
|
"""Execute an agent command."""
|
||||||
pass
|
if command_name not in self.command_map:
|
||||||
|
raise errors.InvalidCommandError(command_name)
|
||||||
|
|
||||||
|
self.comand_map[command_name](**kwargs)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""Run the Teeth Agent."""
|
"""Run the Teeth Agent."""
|
||||||
|
36
teeth_agent/errors.py
Normal file
36
teeth_agent/errors.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
"""
|
||||||
|
Copyright 2013 Rackspace, 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.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from teeth_rest import errors
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidCommandError(errors.InvalidContentError):
|
||||||
|
"""Error which is raised when an unknown command is issued."""
|
||||||
|
|
||||||
|
messsage = 'Unknown command'
|
||||||
|
|
||||||
|
def __init__(self, command_name):
|
||||||
|
details = 'Command \'{}\' is unknown.'.format(command_name)
|
||||||
|
super(InvalidCommandError, self).__init__(details)
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidCommandParamsError(errors.InvalidContentError):
|
||||||
|
"""Error which is raised when command parameters are invalid."""
|
||||||
|
|
||||||
|
message = 'Invalid command parameters'
|
||||||
|
|
||||||
|
def __init__(self, details):
|
||||||
|
super(InvalidCommandParamsError, self).__init__(details)
|
@ -15,8 +15,37 @@ limitations under the License.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from teeth_agent import base
|
from teeth_agent import base
|
||||||
|
from teeth_agent import errors
|
||||||
|
|
||||||
|
|
||||||
class StandbyAgent(base.BaseTeethAgent):
|
class StandbyAgent(base.BaseTeethAgent):
|
||||||
def __init__(self, listen_host, listen_port):
|
def __init__(self, listen_host, listen_port):
|
||||||
super(StandbyAgent, self).__init__(listen_host, listen_port, 'STANDBY')
|
super(StandbyAgent, self).__init__(listen_host, listen_port, 'STANDBY')
|
||||||
|
|
||||||
|
self.command_map = {
|
||||||
|
'standby.cache_images': self.cache_images,
|
||||||
|
}
|
||||||
|
|
||||||
|
def _validate_image_info(self, image_info):
|
||||||
|
for field in ['id', 'urls', 'hashes']:
|
||||||
|
if field not in image_info:
|
||||||
|
msg = 'Image is missing \'{}\' field.'.format(field)
|
||||||
|
raise errors.InvalidCommandParamsError(msg)
|
||||||
|
|
||||||
|
if type(image_info['urls']) != list:
|
||||||
|
raise errors.InvalidCommandParamsError(
|
||||||
|
'Image \'urls\' must be a list.')
|
||||||
|
|
||||||
|
if type(image_info['hashes']) != dict:
|
||||||
|
raise errors.InvalidCommandParamsError(
|
||||||
|
'Image \'hashes\' must be a dictionary.')
|
||||||
|
|
||||||
|
def cache_images(self, image_infos):
|
||||||
|
if type(image_infos) != list:
|
||||||
|
raise errors.InvalidCommandParamsError(
|
||||||
|
'\'image_infos\' parameter must be a list.')
|
||||||
|
|
||||||
|
for image_info in image_infos:
|
||||||
|
self._validate_image_info(image_info)
|
||||||
|
|
||||||
|
# TODO(russellhaering): Actually cache images
|
||||||
|
Loading…
x
Reference in New Issue
Block a user