Add docstrings for api/ tree
Does what it says. Partial-Bug 1367915 Change-Id: Id1a718d652f6d98e6acb1d667f42d9c3cc82aef5
This commit is contained in:
@@ -19,6 +19,7 @@ from ironic_python_agent.api import config
|
|||||||
|
|
||||||
|
|
||||||
class AgentHook(hooks.PecanHook):
|
class AgentHook(hooks.PecanHook):
|
||||||
|
"""Hook to attach agent instance to API requests."""
|
||||||
def __init__(self, agent, *args, **kwargs):
|
def __init__(self, agent, *args, **kwargs):
|
||||||
super(AgentHook, self).__init__(*args, **kwargs)
|
super(AgentHook, self).__init__(*args, **kwargs)
|
||||||
self.agent = agent
|
self.agent = agent
|
||||||
@@ -28,12 +29,22 @@ class AgentHook(hooks.PecanHook):
|
|||||||
|
|
||||||
|
|
||||||
def get_pecan_config():
|
def get_pecan_config():
|
||||||
# Set up the pecan configuration
|
"""Set up the pecan configuration.
|
||||||
|
|
||||||
|
:returns: pecan configuration object.
|
||||||
|
"""
|
||||||
filename = config.__file__.replace('.pyc', '.py')
|
filename = config.__file__.replace('.pyc', '.py')
|
||||||
return pecan.configuration.conf_from_file(filename)
|
return pecan.configuration.conf_from_file(filename)
|
||||||
|
|
||||||
|
|
||||||
def setup_app(pecan_config=None, extra_hooks=None, agent=None):
|
def setup_app(pecan_config=None, agent=None):
|
||||||
|
"""Set up the API app.
|
||||||
|
|
||||||
|
:param pecan_config: a pecan configuration object.
|
||||||
|
:param agent: an :class:`ironic_python_agent.agent.IronicPythonAgent`
|
||||||
|
instance.
|
||||||
|
:returns: wsgi app object.
|
||||||
|
"""
|
||||||
app_hooks = [AgentHook(agent)]
|
app_hooks = [AgentHook(agent)]
|
||||||
|
|
||||||
if not pecan_config:
|
if not pecan_config:
|
||||||
@@ -53,6 +64,8 @@ def setup_app(pecan_config=None, extra_hooks=None, agent=None):
|
|||||||
|
|
||||||
|
|
||||||
class VersionSelectorApplication(object):
|
class VersionSelectorApplication(object):
|
||||||
|
"""WSGI application that handles multiple API versions."""
|
||||||
|
|
||||||
def __init__(self, agent):
|
def __init__(self, agent):
|
||||||
pc = get_pecan_config()
|
pc = get_pecan_config()
|
||||||
self.v1 = setup_app(pecan_config=pc, agent=agent)
|
self.v1 = setup_app(pecan_config=pc, agent=agent)
|
||||||
|
@@ -22,6 +22,8 @@ from ironic_python_agent.api.controllers.v1 import base
|
|||||||
|
|
||||||
|
|
||||||
class CommandResult(base.APIBase):
|
class CommandResult(base.APIBase):
|
||||||
|
"""Object representing the result of a given command."""
|
||||||
|
|
||||||
id = types.text
|
id = types.text
|
||||||
command_name = types.text
|
command_name = types.text
|
||||||
command_params = types.DictType(types.text, base.json_type)
|
command_params = types.DictType(types.text, base.json_type)
|
||||||
@@ -31,6 +33,13 @@ class CommandResult(base.APIBase):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_result(cls, result):
|
def from_result(cls, result):
|
||||||
|
"""Convert a BaseCommandResult object to a CommandResult object.
|
||||||
|
|
||||||
|
:param result: a :class:`ironic_python_agent.extensions.base.
|
||||||
|
BaseCommandResult` object.
|
||||||
|
:returns: a :class:`ironic_python_agent.api.controllers.v1.command.
|
||||||
|
CommandResult` object.
|
||||||
|
"""
|
||||||
instance = cls()
|
instance = cls()
|
||||||
for field in ('id', 'command_name', 'command_params', 'command_status',
|
for field in ('id', 'command_name', 'command_params', 'command_status',
|
||||||
'command_error', 'command_result'):
|
'command_error', 'command_result'):
|
||||||
@@ -39,10 +48,18 @@ class CommandResult(base.APIBase):
|
|||||||
|
|
||||||
|
|
||||||
class CommandResultList(base.APIBase):
|
class CommandResultList(base.APIBase):
|
||||||
|
"""An object representing a list of CommandResult objects."""
|
||||||
commands = [CommandResult]
|
commands = [CommandResult]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_results(cls, results):
|
def from_results(cls, results):
|
||||||
|
"""Convert a list of BaseCommandResult objects to a CommandResultList.
|
||||||
|
|
||||||
|
:param results: a list of :class:`ironic_python_agent.extensions.base.
|
||||||
|
BaseCommandResult` objects.
|
||||||
|
:returns: a :class:`ironic_python_agent.api.controllers.v1.command.
|
||||||
|
CommandResultList` object.
|
||||||
|
"""
|
||||||
instance = cls()
|
instance = cls()
|
||||||
instance.commands = [CommandResult.from_result(result)
|
instance.commands = [CommandResult.from_result(result)
|
||||||
for result in results]
|
for result in results]
|
||||||
@@ -50,7 +67,7 @@ class CommandResultList(base.APIBase):
|
|||||||
|
|
||||||
|
|
||||||
class Command(base.APIBase):
|
class Command(base.APIBase):
|
||||||
"""A command representation."""
|
"""A representation of a command."""
|
||||||
name = types.wsattr(types.text, mandatory=True)
|
name = types.wsattr(types.text, mandatory=True)
|
||||||
params = types.wsattr(base.MultiType(dict), mandatory=True)
|
params = types.wsattr(base.MultiType(dict), mandatory=True)
|
||||||
|
|
||||||
@@ -60,12 +77,20 @@ class CommandController(rest.RestController):
|
|||||||
|
|
||||||
@wsme_pecan.wsexpose(CommandResultList)
|
@wsme_pecan.wsexpose(CommandResultList)
|
||||||
def get_all(self):
|
def get_all(self):
|
||||||
|
"""Get all command results."""
|
||||||
agent = pecan.request.agent
|
agent = pecan.request.agent
|
||||||
results = agent.list_command_results()
|
results = agent.list_command_results()
|
||||||
return CommandResultList.from_results(results)
|
return CommandResultList.from_results(results)
|
||||||
|
|
||||||
@wsme_pecan.wsexpose(CommandResult, types.text, types.text)
|
@wsme_pecan.wsexpose(CommandResult, types.text, types.text)
|
||||||
def get_one(self, result_id, wait=None):
|
def get_one(self, result_id, wait=None):
|
||||||
|
"""Get a command result by ID.
|
||||||
|
|
||||||
|
:param result_id: the ID of the result to get.
|
||||||
|
:param wait: if 'true', block until the command completes.
|
||||||
|
:returns: a :class:`ironic_python_agent.api.controller.v1.command.
|
||||||
|
CommandResult` object.
|
||||||
|
"""
|
||||||
agent = pecan.request.agent
|
agent = pecan.request.agent
|
||||||
result = agent.get_command_result(result_id)
|
result = agent.get_command_result(result_id)
|
||||||
|
|
||||||
@@ -76,6 +101,14 @@ class CommandController(rest.RestController):
|
|||||||
|
|
||||||
@wsme_pecan.wsexpose(CommandResult, types.text, body=Command)
|
@wsme_pecan.wsexpose(CommandResult, types.text, body=Command)
|
||||||
def post(self, wait=None, command=None):
|
def post(self, wait=None, command=None):
|
||||||
|
"""Post a command for the agent to run.
|
||||||
|
|
||||||
|
:param wait: if 'true', block until the command completes.
|
||||||
|
:param command: the command to execute. If None, an InvalidCommandError
|
||||||
|
will be returned.
|
||||||
|
:returns: a :class:`ironic_python_agent.api.controller.v1.command.
|
||||||
|
CommandResult` object.
|
||||||
|
"""
|
||||||
# the POST body is always the last arg,
|
# the POST body is always the last arg,
|
||||||
# so command must be a kwarg here
|
# so command must be a kwarg here
|
||||||
if command is None:
|
if command is None:
|
||||||
|
@@ -22,11 +22,20 @@ from ironic_python_agent.api.controllers.v1 import base
|
|||||||
|
|
||||||
|
|
||||||
class AgentStatus(base.APIBase):
|
class AgentStatus(base.APIBase):
|
||||||
|
"""An object representing an agent instance's status."""
|
||||||
|
|
||||||
started_at = base.MultiType(float)
|
started_at = base.MultiType(float)
|
||||||
version = types.text
|
version = types.text
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_agent_status(cls, status):
|
def from_agent_status(cls, status):
|
||||||
|
"""Convert an object representing agent status to an AgentStatus.
|
||||||
|
|
||||||
|
:param status: An :class:`ironic_python_agent.agent.
|
||||||
|
IronicPythonAgentStatus` object.
|
||||||
|
:returns: An :class:`ironic_python_agent.api.controllers.v1.status.
|
||||||
|
AgentStatus` object.
|
||||||
|
"""
|
||||||
instance = cls()
|
instance = cls()
|
||||||
for field in ('started_at', 'version'):
|
for field in ('started_at', 'version'):
|
||||||
setattr(instance, field, getattr(status, field))
|
setattr(instance, field, getattr(status, field))
|
||||||
@@ -38,6 +47,7 @@ class StatusController(rest.RestController):
|
|||||||
|
|
||||||
@wsme_pecan.wsexpose(AgentStatus)
|
@wsme_pecan.wsexpose(AgentStatus)
|
||||||
def get_all(self):
|
def get_all(self):
|
||||||
|
"""Get current status of the running agent."""
|
||||||
agent = pecan.request.agent
|
agent = pecan.request.agent
|
||||||
status = agent.get_status()
|
status = agent.get_status()
|
||||||
return AgentStatus.from_agent_status(status)
|
return AgentStatus.from_agent_status(status)
|
||||||
|
Reference in New Issue
Block a user