get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/808642/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 808642,
    "url": "http://patchwork.ozlabs.org/api/patches/808642/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170901112829.2571-7-apahim@redhat.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20170901112829.2571-7-apahim@redhat.com>",
    "list_archive_url": null,
    "date": "2017-09-01T11:28:22",
    "name": "[v8,06/13] qemu.py: make sure we only remove files we create",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "f6a1f8df17a49268dc129fc987f00d97f7eced6d",
    "submitter": {
        "id": 71999,
        "url": "http://patchwork.ozlabs.org/api/people/71999/?format=api",
        "name": "Amador Pahim",
        "email": "apahim@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170901112829.2571-7-apahim@redhat.com/mbox/",
    "series": [
        {
            "id": 1006,
            "url": "http://patchwork.ozlabs.org/api/series/1006/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=1006",
            "date": "2017-09-01T11:28:16",
            "name": "scripts/qemu.py fixes and cleanups",
            "version": 8,
            "mbox": "http://patchwork.ozlabs.org/series/1006/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/808642/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/808642/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)",
            "ext-mx05.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com",
            "ext-mx05.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=apahim@redhat.com"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xkHCq3QFfz9sRV\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri,  1 Sep 2017 21:32:39 +1000 (AEST)",
            "from localhost ([::1]:36370 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dnkBh-0001Dw-Gg\n\tfor incoming@patchwork.ozlabs.org; Fri, 01 Sep 2017 07:32:37 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:59670)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <apahim@redhat.com>) id 1dnkAu-0001CA-HD\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 07:31:49 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <apahim@redhat.com>) id 1dnkAt-0006vq-D7\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 07:31:48 -0400",
            "from mx1.redhat.com ([209.132.183.28]:54900)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <apahim@redhat.com>) id 1dnkAt-0006uA-4v\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 07:31:47 -0400",
            "from smtp.corp.redhat.com\n\t(int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 3D18C552D1;\n\tFri,  1 Sep 2017 11:31:46 +0000 (UTC)",
            "from t460p.pahim.org.com (ovpn-204-134.brq.redhat.com\n\t[10.40.204.134])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 820297EBF0;\n\tFri,  1 Sep 2017 11:31:43 +0000 (UTC)"
        ],
        "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com 3D18C552D1",
        "From": "Amador Pahim <apahim@redhat.com>",
        "To": "qemu-devel@nongnu.org",
        "Date": "Fri,  1 Sep 2017 13:28:22 +0200",
        "Message-Id": "<20170901112829.2571-7-apahim@redhat.com>",
        "In-Reply-To": "<20170901112829.2571-1-apahim@redhat.com>",
        "References": "<20170901112829.2571-1-apahim@redhat.com>",
        "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.12",
        "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.29]);\n\tFri, 01 Sep 2017 11:31:46 +0000 (UTC)",
        "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]",
        "X-Received-From": "209.132.183.28",
        "Subject": "[Qemu-devel] [PATCH v8 06/13] qemu.py: make sure we only remove\n\tfiles we create",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.21",
        "Precedence": "list",
        "List-Id": "<qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Cc": "kwolf@redhat.com, ldoktor@redhat.com, famz@redhat.com,\n\tehabkost@redhat.com, \n\tstefanha@gmail.com, Amador Pahim <apahim@redhat.com>,\n\tarmbru@redhat.com, mreitz@redhat.com, crosa@redhat.com",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"
    },
    "content": "To launch a VM, we need to create basically two files: the monitor\nsocket (if it's a UNIX socket) and the qemu log file.\n\nFor the qemu log file, we currently just open the path, which will\ncreate the file if it does not exist or overwrite the file if it does\nexist.\n\nFor the monitor socket, if it already exists, we are currently removing\nit, even if it's not created by us.\n\nThis patch moves to pre_launch() the responsibility to make sure we only\ncreate files that are not pre-existent and to populate a list of\ncontrolled files. This list will then be used as the reference of\nfiles to remove during the cleanup (post_shutdown()).\n\nSigned-off-by: Amador Pahim <apahim@redhat.com>\n---\n scripts/qemu.py | 30 +++++++++++++++++++++++-------\n 1 file changed, 23 insertions(+), 7 deletions(-)",
    "diff": "diff --git a/scripts/qemu.py b/scripts/qemu.py\nindex 3ebe5ee0a4..c26e1412f9 100644\n--- a/scripts/qemu.py\n+++ b/scripts/qemu.py\n@@ -41,6 +41,7 @@ class QEMUMachine(object):\n             monitor_address = os.path.join(test_dir, name + \"-monitor.sock\")\n         self._monitor_address = monitor_address\n         self._qemu_log_path = os.path.join(test_dir, name + \".log\")\n+        self._qemu_log_fd = None\n         self._popen = None\n         self._binary = binary\n         self._args = list(args) # Force copy args in case we modify them\n@@ -50,6 +51,7 @@ class QEMUMachine(object):\n         self._socket_scm_helper = socket_scm_helper\n         self._debug = debug\n         self._qemu_full_args = None\n+        self._created_files = []\n \n     # This can be used to add an unused monitor instance.\n     def add_monitor_telnet(self, ip, port):\n@@ -128,30 +130,44 @@ class QEMUMachine(object):\n                 '-display', 'none', '-vga', 'none']\n \n     def _pre_launch(self):\n-        self._qmp = qmp.qmp.QEMUMonitorProtocol(self._monitor_address, server=True,\n-                                                debug=self._debug)\n+        try:\n+            self._qmp = qmp.qmp.QEMUMonitorProtocol(self._monitor_address,\n+                                                    server=True,\n+                                                    debug=self._debug)\n+        except:\n+            raise\n+        else:\n+            if not isinstance(self._monitor_address, tuple):\n+                self._created_files.append(self._monitor_address)\n+\n+        try:\n+            flags = os.O_CREAT | os.O_EXCL | os.O_WRONLY\n+            os.open(self._qemu_log_path, flags)\n+        except:\n+            raise\n+        else:\n+            self._created_files.append(self._qemu_log_path)\n+            self._qemu_log_fd = open(self._qemu_log_path, 'wb')\n \n     def _post_launch(self):\n         self._qmp.accept()\n \n     def _post_shutdown(self):\n-        if not isinstance(self._monitor_address, tuple):\n-            self._remove_if_exists(self._monitor_address)\n-        self._remove_if_exists(self._qemu_log_path)\n+        while self._created_files:\n+            self._remove_if_exists(self._created_files.pop())\n \n     def launch(self):\n         '''Launch the VM and establish a QMP connection'''\n         self._iolog = None\n         self._qemu_full_args = None\n         devnull = open(os.path.devnull, 'rb')\n-        qemulog = open(self._qemu_log_path, 'wb')\n         try:\n             self._pre_launch()\n             self._qemu_full_args = (self._wrapper + [self._binary] +\n                                     self._base_args() + self._args)\n             self._popen = subprocess.Popen(self._qemu_full_args,\n                                            stdin=devnull,\n-                                           stdout=qemulog,\n+                                           stdout=self._qemu_log_fd,\n                                            stderr=subprocess.STDOUT,\n                                            shell=False)\n             self._post_launch()\n",
    "prefixes": [
        "v8",
        "06/13"
    ]
}