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