Source code for document.agent.instance

from elasticsearch_dsl import Date, Nested, Text

from document.base import BaseDocument, BaseInnerDoc


class AgentInstanceActionInnerDoc(BaseInnerDoc):
    """Action of the agent instance installed in an execution environment."""

    id = Text(required=True)
    timestamp = Date(required=False)


class AgentInstanceParameterValueInnerDoc(BaseInnerDoc):
    """Parameter value of the agent instanceInnerDoc installed
    in an execution environment."""

    new = Text(required=True)
    old = Text(required=True)


class AgentInstanceParameterInnerDoc(BaseInnerDoc):
    """Parameter of the agent instance installed
    in an execution environment."""

    id = Text(required=True)
    timestamp = Date(required=True)
    value = Nested(AgentInstanceParameterValueInnerDoc)


class AgentInstanceResourceInnerDoc(BaseInnerDoc):
    """Resource of the agent instance installed in an execution environment."""

    id = Text(required=True)
    timestamp = Date(required=True)
    content = Text(required=True)


[docs]class AgentInstanceDocument(BaseDocument): """Represents an agent instance installed in an execution environment.""" # id already defined by Elasticsearch agent_catalog_id = Text(required=True) exec_env_id = Text(required=True) status = Text(required=True) actions = Nested(AgentInstanceActionInnerDoc) parameters = Nested(AgentInstanceParameterInnerDoc) resources = Nested(AgentInstanceResourceInnerDoc) description = Text()
[docs] class Index: """Elasticsearch configuration.""" name = "agent-instance"
def edit_action(self, action): status_op = self.StatusOperation # FIXME avoid to pop field but insert in ES explicitly action.pop("type", None) self.actions.append(AgentInstanceActionInnerDoc(**action)) return status_op.UPDATED def edit_parameter(self, parameter): status_op = self.StatusOperation param_id = parameter.get("id", None) timestamp = parameter.get("timestamp", None) value = parameter.get("value", {}) val_new = value.get("new", None) val_old = value.get("old", None) if val_new is not None: val_new = str(val_new) val_old = str(val_old) for param in self.parameters: if param.id == param_id: if param.value.new != val_new: param.value.old = val_old param.value.new = val_new param.timestamp = timestamp return status_op.UPDATED return status_op.NOT_MODIFIED param_doc = AgentInstanceParameterInnerDoc value_doc = AgentInstanceParameterValueInnerDoc self.parameters.append( param_doc( id=param_id, timestamp=timestamp, value=value_doc(new=val_new, old=val_old), ) ) return status_op.UPDATED return status_op.NOT_MODIFIED def edit_resource(self, resource): status_op = self.StatusOperation res_id = resource.get("id", None) timestamp = resource.get("timestamp", None) data = resource.get("data", {}) cnt = data.get("content", None) for res in self.resources: if res.id == res_id: if res.content != cnt: res.content = cnt res.timestamp = timestamp return status_op.UPDATED return status_op.NOT_MODIFIED _res_doc = AgentInstanceResourceInnerDoc self.resources.append( _res_doc(id=res_id, timestamp=timestamp, content=cnt) ) return status_op.UPDATED @staticmethod def from_agent_instance(agent_instance, exec_env_id): _id = agent_instance.pop("id", None) agent_instance.pop("type", None) agent_instance.pop("hasAgentType", None) agent_instance["exec_env_id"] = exec_env_id obj = AgentInstanceDocument.get_or_new(id=_id) for field, data in agent_instance.items(): setattr(obj, field, data) obj.save()