{"action":"created","comment":{"url":"https://api.github.com/repos/delphix/appliance-build/pulls/comments/234723637","pull_request_review_id":176416375,"id":234723637,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzNDcyMzYzNw==","diff_hunk":"@@ -0,0 +1,165 @@\n+#!/bin/bash -eux\n+#\n+# Copyright 2018 Delphix\n+#\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+#\n+#     http://www.apache.org/licenses/LICENSE-2.0\n+#\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.\n+#\n+\n+die() {\n+\techo \"$*\" 1>&2\n+\texit 1\n+}\n+\n+#\n+# This script is intended to be used as part of Delphix's build process.\n+# It's role is to convert the \"binary\" directory generated by live-build,\n+# into a cpio archive that will be wrapper in a tarball. That tarball is\n+# the migration artifact that illumos-based engines use to migrate to\n+# Linux.\n+#\n+MIGRATION_ARTIFACT=\"$APPLIANCE_VARIANT.migration.tar.gz\"\n+\n+#\n+# At the time of this writing dx_unpack.sh expects a tarball of the\n+# following structure:\n+#\n+# depot/                       the top level container\n+# depot/dx_prepare             top-level script to prepare the archive\n+#                              for upgrade\n+# depot/version.info           version and date information about the\n+#                              upgrade image\n+# depot/hashes                 the sha256sum of any upgrade artifacts\n+#                              (see below)\n+# depot/hashes.sig[.<release>] one cryptographic signature of depot/hashes\n+#                              per Delphix release\n+# depot/<upgrade artifacts>    generally cpio archives of OS and appliance\n+#\n+# As dx_upack.sh is the only piece of code that runs from the old\n+# world, we treat it as a contract that lists the bare minimum\n+# requirements for our artifact.\n+#\n+DEPOT_DIRECTORY=depot\n+\n+#\n+# Delete any leftover files from previous runs.\n+#\n+rm -rf \"$MIGRATION_ARTIFACT\" \"$DEPOT_DIRECTORY\"\n+\n+if [ ! -d binary/opt/delphix ]; then\n+\techo \"This artifact does not contain the appliance.\" \\\n+\t\t\" Skipping migration image...\"\n+\texit 0\n+fi\n+\n+mkdir $DEPOT_DIRECTORY\n+\n+#\n+# Generate archive for os root directory.\n+#\n+# Note: We temporarily change directory in the subshell (we move to the\n+# \"binary\" directory) because we find prints evenrything as a relative\n+# path to the current directory and we don't want the generated archive\n+# to have \"binary\" as its top-level directory.\n+#\n+(\n+\tcd binary\n+\tfind ./* -depth -print | cpio -ocB\n+) >$DEPOT_DIRECTORY/os-root.cpio\n+\n+#\n+# Copy all migration scripts including dx_prepare which is needed by\n+# dx_unpack.\n+#\n+cp migration-scripts/* $DEPOT_DIRECTORY\n+\n+#\n+# There may be a version.info file in the current directory already.\n+# That version.info is Linux-specific and does not necessarily have\n+# all the fields that the illumos upgrade process requires. Thus, we\n+# create our own special version info directly in the depot directory\n+# with all the expected fields plus a special variable that indicates\n+# that this is a migration image, so dx_prepare knows how to tell the\n+# difference between normal illumos upgrade and illumos-to-Linux\n+# migrations.\n+#\n+KERNEL_VERSION=$(basename \"$(find binary/boot/vmlinuz-* | sort -r | head -n 1)\")\n+{\n+\techo \"DLPX_DATE=$(date '+%Y.%m.%d.%H.%M.%S')\"\n+\techo \"DLPX_OS_VERSION=$KERNEL_VERSION\"\n+\techo \"DLPX_VERSION=$(date '+%Y.%m.%d.%H')\"\n+\techo \"DLPX_MIN_VERSION=5.3.0.0\"\n+\techo \"MIGRATION_IMAGE=y\"\n+} >$DEPOT_DIRECTORY/version.info\n+\n+#\n+# Generate hashes file.\n+#\n+(\n+\tcd binary\n+\tfind ./* -type f -print0 | xargs -0 sha256sum\n+) >$DEPOT_DIRECTORY/os-root.hashes || die \"generating os-root.hashes failed\"\n+(\n+\tcd $DEPOT_DIRECTORY\n+\tsha256sum ./* >hashes\n+)\n+\n+#\n+# DLPX_SIGNING_LOGIN is used for signing our migration image.\n+# The signature is later unpacked and verified on the VM\n+# performing the migration. If DLPX_SIGNING_LOGIN has not been\n+# specified by the user when running this hook we skip generating\n+# the signature for this image.\n+#\n+# Note that DLPX_KEY_URL should also be specified for this to\n+# work, as the default is really a placeholder.\n+#\n+if [ \"$DLPX_SIGNING_LOGIN\" != \"delphix\" ]; then\n+\t#\n+\t# Generate depot/hashes.sig[.<release>]\n+\t#\n+\t# Assumption: we always migrate from version 5.3\n+\t#\n+\tUPGRADE_VERSION=\"5.3\"\n+\tDLPX_SIGNING_URL=\"$DLPX_KEY_URL/upgrade/keyVersion/$UPGRADE_VERSION/sign\"\n+\n+\thashes_data=$(base64 -w 0 $DEPOT_DIRECTORY/hashes)\n+\tjson_payload=\"{\\\"data\\\": \\\"${hashes_data}\\\"}\"\n+\trequest_url=\"$DLPX_SIGNING_URL\"\n+\n+\t#\n+\t# Compute signature\n+\t#\n+\tresult=$(\n+\t\tset -o pipefail\n+\t\techo \"$json_payload\" | curl -s -f -H \\\n+\t\t\t\"Content-Type: application/json\" \\\n+\t\t\t-u \"$DLPX_SIGNING_LOGIN\" \"$request_url\" -d @-\n+\t) || die \"Failure signing hashes with $request_url\"\n+\n+\t#\n+\t# Extract signature from JSON response, ensure it is not empty\n+\t# and save it.\n+\t#\n+\tsignature=$(echo \"$result\" | grep signature |","path":"live-build/misc/live-build-hooks/90-linux-migration-artifact.binary","position":153,"original_position":153,"commit_id":"d76b5fdd4390e89e6a134f498e34505d79b18e62","original_commit_id":"d76b5fdd4390e89e6a134f498e34505d79b18e62","user":{"login":"prakashsurya","id":658081,"node_id":"MDQ6VXNlcjY1ODA4MQ==","avatar_url":"https://avatars3.githubusercontent.com/u/658081?v=4","gravatar_id":"","url":"https://api.github.com/users/prakashsurya","html_url":"https://github.com/prakashsurya","followers_url":"https://api.github.com/users/prakashsurya/followers","following_url":"https://api.github.com/users/prakashsurya/following{/other_user}","gists_url":"https://api.github.com/users/prakashsurya/gists{/gist_id}","starred_url":"https://api.github.com/users/prakashsurya/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prakashsurya/subscriptions","organizations_url":"https://api.github.com/users/prakashsurya/orgs","repos_url":"https://api.github.com/users/prakashsurya/repos","events_url":"https://api.github.com/users/prakashsurya/events{/privacy}","received_events_url":"https://api.github.com/users/prakashsurya/received_events","type":"User","site_admin":false},"body":"I know you didn't create this code yourself (it's mostly copied from `mkimage.sh`, right?), but can we try to clean it up while where here.. e.g. can we use something like `jq` to parse the output, rather than `grep` and `sed`? what is the output format?","created_at":"2018-11-19T18:04:41Z","updated_at":"2018-11-19T18:12:29Z","html_url":"https://github.com/delphix/appliance-build/pull/154#discussion_r234723637","pull_request_url":"https://api.github.com/repos/delphix/appliance-build/pulls/154","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/delphix/appliance-build/pulls/comments/234723637"},"html":{"href":"https://github.com/delphix/appliance-build/pull/154#discussion_r234723637"},"pull_request":{"href":"https://api.github.com/repos/delphix/appliance-build/pulls/154"}}},"pull_request":{"url":"https://api.github.com/repos/delphix/appliance-build/pulls/154","id":231764704,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMxNzY0NzA0","html_url":"https://github.com/delphix/appliance-build/pull/154","diff_url":"https://github.com/delphix/appliance-build/pull/154.diff","patch_url":"https://github.com/delphix/appliance-build/pull/154.patch","issue_url":"https://api.github.com/repos/delphix/appliance-build/issues/154","number":154,"state":"open","locked":false,"title":"LX-1550 create migration image","user":{"login":"sdimitro","id":2281588,"node_id":"MDQ6VXNlcjIyODE1ODg=","avatar_url":"https://avatars2.githubusercontent.com/u/2281588?v=4","gravatar_id":"","url":"https://api.github.com/users/sdimitro","html_url":"https://github.com/sdimitro","followers_url":"https://api.github.com/users/sdimitro/followers","following_url":"https://api.github.com/users/sdimitro/following{/other_user}","gists_url":"https://api.github.com/users/sdimitro/gists{/gist_id}","starred_url":"https://api.github.com/users/sdimitro/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sdimitro/subscriptions","organizations_url":"https://api.github.com/users/sdimitro/orgs","repos_url":"https://api.github.com/users/sdimitro/repos","events_url":"https://api.github.com/users/sdimitro/events{/privacy}","received_events_url":"https://api.github.com/users/sdimitro/received_events","type":"User","site_admin":false},"body":"This change creates a new hook for live-build that creates a tarball\r\nfor illumos to Linux migrations. The tarball contains our normal\r\nLinux root filesystem, packaged in a way that it can be understood\r\nby our current upgrade logic (dx_unpack specifically).\r\n\r\nThe signed hashes file is not generated by default. If you need that\r\nfile please specify the following environment variables:\r\n- DLPX_SIGNING_LOGIN\r\n- DLPX_KEY_URL\r\n\r\nIn addition, I've added the pigz package to the environment of the\r\ndocker container to speed up the compression of the tarball.\r\nUsing the single-threaded compression from built into tar it would\r\ntake ~12m 40s to archive and compress 21GB of data. Pigz in the\r\ncontainer with 2 CPUs brings that to ~9m 41s.\r\n\r\nFinally, I've created a migration-scripts directory similar to the\r\nupgrade one. It may seem useless in this PR as I only have dx_prepare\r\nwhich is basically a no-op, but I actually do have some WIP scripts\r\nthere in my local repo for the next steps of the migration.\r\n\r\nAfter running appliance build with the two new environment variables\r\nset I scp'd the compressed migration tar artifact of the interna-qa\r\nvariant to an illumos 5.3 VM and called dx_unpack:\r\n```\r\n$ sudo /opt/delphix/server/bin/upgrade/dx_unpack internal-qa.migration.tar.gz\r\nProgress increment: 18:55:58:872276013+0000, 10, Extracting upgrade image\r\n18:55:58:875080352:+0000: Unpacking internal-qa.migration.tar.gz ...\r\n19:05:24:436752844:+0000: done.\r\nProgress increment: 19:05:24:440796731+0000, 40,  verifying format\r\nProgress increment: 19:05:24:507477818+0000, 50,  verifying signature\r\n19:05:24:510590314:+0000: Verify signature ... Verified OK\r\nProgress increment: 19:05:25:072324099+0000, 70, Verifying integrity of upgrade image\r\n19:05:25:075460462:+0000: Verifying contents of dx_apply ... dx_apply: OK\r\n19:05:26:518439350:+0000: Verifying contents of dx_execute ... dx_execute: OK\r\n19:05:26:534407155:+0000: Verifying contents of dx_prepare ... dx_prepare: OK\r\n19:05:26:547907130:+0000: Verifying contents of dx_verify ... dx_verify: OK\r\n19:05:26:558378011:+0000: Verifying contents of os-root.cpio ... os-root.cpio: OK\r\n19:07:03:668049935:+0000: Verifying contents of os-root.hashes ... os-root.hashes: OK\r\n19:07:03:795593227:+0000: Verifying contents of version.info ... version.info: OK\r\nProgress increment: 19:07:03:809621540+0000, 80, Verifying integrity of upgrade image done\r\nProgress increment: 19:07:03:936732121+0000, 90, preparing upgrade image\r\nProgress increment: 19:07:03:944176874+0000, 100, unpacking successful\r\n```\r\n\r\nThere reason why I tried the internal-qa variant and not the\r\ninternal-dev was that the qa variant does not include the source\r\ncode of the app-gate and masking and thus takes less space.\r\n(/var/dlpx-update which is the place where images are unpacked has\r\na reservation of 12G so internal-dev doesn't fit).\r\n\r\nUnfortunately we can't really boot into Linux from 5.3 as the rpool\r\nhas features like the Log Spacemap that are enabled and don't exist\r\nin ZoL. For that reason I ensured that I could boot into the Linux\r\nimage by untaring the internal-qa variant in a 5.2 VM and doing the\r\nfollowing things (some of them will end up in the migration version\r\nof dx_apply which is currently a WIP):\r\n\r\n```\r\nTMPDIR=$(mktemp -d -p \"/tmp\" -t delphix.XXXXXXX)\r\nFSNAME=$(basename \"$TMPDIR\")\r\nzfs create -o canmount=off -o mountpoint=none \"$RPOOL/ROOT\"\r\nzfs create -o canmount=noauto -o mountpoint=/ \"$RPOOL/ROOT/$FSNAME\"\r\n\r\nTMP_ROOT=\"$TMPDIR/root\"\r\nzfs set mountpoint=\"$TMP_ROOT\" \"$RPOOL/ROOT/$FSNAME\"\r\nzfs mount \"$RPOOL/ROOT/$FSNAME\"\r\n(cd $TMP_ROOT; cpio -idmu) < $ARCHIVE_DIR/os-root.cpio\r\n\r\ncp $(ls $TMP_ROOT/boot/initrd.img-* | sort -r | head -n 1) /boot\r\ncp $(ls $TMP_ROOT/boot/vmlinuz-* | sort -r | head -n 1) /boot\r\n\r\nzfs umount \"$RPOOL/ROOT/$FSNAME\"\r\nzfs set mountpoint=/ \"$RPOOL/ROOT/$FSNAME\"\r\n```\r\n\r\nThen rebooting the machine and getting in the bootloader's prompt:\r\n```\r\n> set console=ttya\r\n> load load /boot/vmlinuz-4.15.0-38-generic root=ZFS=rpool/ROOT/delphix.HIFKlSm console=tty0 console=ttyS0,115200n8 zfsforce=1\r\n> load -t rootfs /boot/initrd.img-4.15.0-38-generic\r\n> boot\r\n```\r\n\r\nThen wait for the new system to boot up and login (includes interesting bits from console):\r\n```\r\n...\r\nBegin: Sleeping for ... done.\r\n[    6.247809] spl: loading out-of-tree module taints kernel.\r\n[    6.250949] spl: module verification failed: signature and/or required key missing - tainting kernel\r\n[    6.257025] znvpair: module license 'CDDL' taints kernel.\r\n[    6.259017] Disabling lock debugging due to kernel taint\r\n[    7.939793] ZFS: Loaded module v1.0.0-20181101T233420-aa2d882, ZFS pool version 5000, ZFS filesystem version 5\r\nBegin: Sleeping for ... done.\r\nBegin: Importing ZFS root pool 'rpool' ... Begin: Importing pool 'rpool' using defaults ... [    8.136087] print_req_error: I/O error, dev fd0, sector 0\r\n[    8.138347] floppy: error 10 while reading block 0\r\n[    8.249208] random: crng init done\r\n[    8.250434] random: 7 urandom warning(s) missed due to ratelimiting\r\ndone.\r\ndone.\r\nBegin: Mounting 'rpool/ROOT/delphix.HIFKlSm' on '/root//' ... done.\r\nBegin: Running /scripts/local-bottom ... done.\r\n...\r\n[  OK  ] Mounted Kernel Debug File System.\r\n...\r\n[  OK  ] Started udev Wait for Complete Device Initialization.\r\n[  OK  ] Reached target ZFS pool import target.\r\n         Starting Mount ZFS filesystems...\r\n[  OK  ] Started Mount ZFS filesystems.\r\n...\r\n[  OK  ] Started Initial cloud-init job (metadata service crawler).\r\n[  OK  ] Reached target Cloud-config availability.\r\n...\r\n[  OK  ] Started ZFS Event Daemon (zed).\r\n[  OK  ] Started D-Bus System Message Bus.\r\n[  OK  ] Started Daily Cleanup of Temporary Directories.\r\n         Starting ZFS file system shares...\r\n...\r\n[  OK  ] Started Delphix Perfomance Statistics.\r\n[  OK  ] Started Delphix default PostgreSQL database server.\r\n[  OK  ] Started Delphix Appliance Platform Service\r\n...\r\nlocalhost login: delphix\r\npassword:\r\n```\r\n\r\nAnd then within the VM:\r\n```\r\ndelphix@localhost:~$ uname -a\r\nLinux localhost 4.15.0-38-generic #42-Ubuntu SMP Tue Oct 23 15:48:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux\r\n```\r\n\r\nOther notes:\r\nPostgress is up but the app-stack fails with failures like the following in the\r\nerror log:\r\n```\r\nContext initialization failed java.lang.NullPointerException ...\r\n        at java.lang.NullPointerException.<init>(NullPointerException.java:60)\r\n        at com.delphix.appliance.server.upg.impl.UpgradeManagerImpl.setVersionStatus(UpgradeManagerImpl.java:791)\r\n        at com.delphix.appliance.server.upg.impl.UpgradeManagerImpl.versionFromDirectoryLinux(UpgradeManagerImpl.java:850)\r\n        at com.delphix.appliance.server.upg.impl.UpgradeManagerImpl.addNewVersions(UpgradeManagerImpl.java:1022)\r\n        at com.delphix.appliance.server.upg.impl.UpgradeManagerImpl.update(UpgradeManagerImpl.java:907)\r\n        at com.delphix.appliance.server.upg.impl.UpgradeManagerImpl.start(UpgradeManagerImpl.java:463)\r\n```\r\n\r\nWill look into it but it can be part of a separate issue.","created_at":"2018-11-18T02:43:22Z","updated_at":"2018-11-19T18:12:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7b8e17bec7b4af53d91043e7ed450ccbbf7c73cb","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/delphix/appliance-build/pulls/154/commits","review_comments_url":"https://api.github.com/repos/delphix/appliance-build/pulls/154/comments","review_comment_url":"https://api.github.com/repos/delphix/appliance-build/pulls/comments{/number}","comments_url":"https://api.github.com/repos/delphix/appliance-build/issues/154/comments","statuses_url":"https://api.github.com/repos/delphix/appliance-build/statuses/d76b5fdd4390e89e6a134f498e34505d79b18e62","head":{"label":"sdimitro:LX-1550","ref":"LX-1550","sha":"d76b5fdd4390e89e6a134f498e34505d79b18e62","user":{"login":"sdimitro","id":2281588,"node_id":"MDQ6VXNlcjIyODE1ODg=","avatar_url":"https://avatars2.githubusercontent.com/u/2281588?v=4","gravatar_id":"","url":"https://api.github.com/users/sdimitro","html_url":"https://github.com/sdimitro","followers_url":"https://api.github.com/users/sdimitro/followers","following_url":"https://api.github.com/users/sdimitro/following{/other_user}","gists_url":"https://api.github.com/users/sdimitro/gists{/gist_id}","starred_url":"https://api.github.com/users/sdimitro/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sdimitro/subscriptions","organizations_url":"https://api.github.com/users/sdimitro/orgs","repos_url":"https://api.github.com/users/sdimitro/repos","events_url":"https://api.github.com/users/sdimitro/events{/privacy}","received_events_url":"https://api.github.com/users/sdimitro/received_events","type":"User","site_admin":false},"repo":{"id":132043042,"node_id":"MDEwOlJlcG9zaXRvcnkxMzIwNDMwNDI=","name":"appliance-build","full_name":"sdimitro/appliance-build","private":false,"owner":{"login":"sdimitro","id":2281588,"node_id":"MDQ6VXNlcjIyODE1ODg=","avatar_url":"https://avatars2.githubusercontent.com/u/2281588?v=4","gravatar_id":"","url":"https://api.github.com/users/sdimitro","html_url":"https://github.com/sdimitro","followers_url":"https://api.github.com/users/sdimitro/followers","following_url":"https://api.github.com/users/sdimitro/following{/other_user}","gists_url":"https://api.github.com/users/sdimitro/gists{/gist_id}","starred_url":"https://api.github.com/users/sdimitro/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sdimitro/subscriptions","organizations_url":"https://api.github.com/users/sdimitro/orgs","repos_url":"https://api.github.com/users/sdimitro/repos","events_url":"https://api.github.com/users/sdimitro/events{/privacy}","received_events_url":"https://api.github.com/users/sdimitro/received_events","type":"User","site_admin":false},"html_url":"https://github.com/sdimitro/appliance-build","description":"This repository contains the code used to build the Ubuntu-based Delphix Appliance, leveraging open-source tools such as Debian's live-build, Docker, Ansible, OpenZFS, and others.","fork":true,"url":"https://api.github.com/repos/sdimitro/appliance-build","forks_url":"https://api.github.com/repos/sdimitro/appliance-build/forks","keys_url":"https://api.github.com/repos/sdimitro/appliance-build/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sdimitro/appliance-build/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sdimitro/appliance-build/teams","hooks_url":"https://api.github.com/repos/sdimitro/appliance-build/hooks","issue_events_url":"https://api.github.com/repos/sdimitro/appliance-build/issues/events{/number}","events_url":"https://api.github.com/repos/sdimitro/appliance-build/events","assignees_url":"https://api.github.com/repos/sdimitro/appliance-build/assignees{/user}","branches_url":"https://api.github.com/repos/sdimitro/appliance-build/branches{/branch}","tags_url":"https://api.github.com/repos/sdimitro/appliance-build/tags","blobs_url":"https://api.github.com/repos/sdimitro/appliance-build/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sdimitro/appliance-build/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sdimitro/appliance-build/git/refs{/sha}","trees_url":"https://api.github.com/repos/sdimitro/appliance-build/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sdimitro/appliance-build/statuses/{sha}","languages_url":"https://api.github.com/repos/sdimitro/appliance-build/languages","stargazers_url":"https://api.github.com/repos/sdimitro/appliance-build/stargazers","contributors_url":"https://api.github.com/repos/sdimitro/appliance-build/contributors","subscribers_url":"https://api.github.com/repos/sdimitro/appliance-build/subscribers","subscription_url":"https://api.github.com/repos/sdimitro/appliance-build/subscription","commits_url":"https://api.github.com/repos/sdimitro/appliance-build/commits{/sha}","git_commits_url":"https://api.github.com/repos/sdimitro/appliance-build/git/commits{/sha}","comments_url":"https://api.github.com/repos/sdimitro/appliance-build/comments{/number}","issue_comment_url":"https://api.github.com/repos/sdimitro/appliance-build/issues/comments{/number}","contents_url":"https://api.github.com/repos/sdimitro/appliance-build/contents/{+path}","compare_url":"https://api.github.com/repos/sdimitro/appliance-build/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sdimitro/appliance-build/merges","archive_url":"https://api.github.com/repos/sdimitro/appliance-build/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sdimitro/appliance-build/downloads","issues_url":"https://api.github.com/repos/sdimitro/appliance-build/issues{/number}","pulls_url":"https://api.github.com/repos/sdimitro/appliance-build/pulls{/number}","milestones_url":"https://api.github.com/repos/sdimitro/appliance-build/milestones{/number}","notifications_url":"https://api.github.com/repos/sdimitro/appliance-build/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sdimitro/appliance-build/labels{/name}","releases_url":"https://api.github.com/repos/sdimitro/appliance-build/releases{/id}","deployments_url":"https://api.github.com/repos/sdimitro/appliance-build/deployments","created_at":"2018-05-03T19:55:14Z","updated_at":"2018-05-30T21:28:31Z","pushed_at":"2018-11-18T03:23:52Z","git_url":"git://github.com/sdimitro/appliance-build.git","ssh_url":"git@github.com:sdimitro/appliance-build.git","clone_url":"https://github.com/sdimitro/appliance-build.git","svn_url":"https://github.com/sdimitro/appliance-build","homepage":"","size":322,"stargazers_count":0,"watchers_count":0,"language":"Shell","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"delphix:master","ref":"master","sha":"29f296d4f9c900520f5fce17c2d79c0df7052553","user":{"login":"delphix","id":682240,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4MjI0MA==","avatar_url":"https://avatars2.githubusercontent.com/u/682240?v=4","gravatar_id":"","url":"https://api.github.com/users/delphix","html_url":"https://github.com/delphix","followers_url":"https://api.github.com/users/delphix/followers","following_url":"https://api.github.com/users/delphix/following{/other_user}","gists_url":"https://api.github.com/users/delphix/gists{/gist_id}","starred_url":"https://api.github.com/users/delphix/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delphix/subscriptions","organizations_url":"https://api.github.com/users/delphix/orgs","repos_url":"https://api.github.com/users/delphix/repos","events_url":"https://api.github.com/users/delphix/events{/privacy}","received_events_url":"https://api.github.com/users/delphix/received_events","type":"Organization","site_admin":false},"repo":{"id":131873230,"node_id":"MDEwOlJlcG9zaXRvcnkxMzE4NzMyMzA=","name":"appliance-build","full_name":"delphix/appliance-build","private":false,"owner":{"login":"delphix","id":682240,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4MjI0MA==","avatar_url":"https://avatars2.githubusercontent.com/u/682240?v=4","gravatar_id":"","url":"https://api.github.com/users/delphix","html_url":"https://github.com/delphix","followers_url":"https://api.github.com/users/delphix/followers","following_url":"https://api.github.com/users/delphix/following{/other_user}","gists_url":"https://api.github.com/users/delphix/gists{/gist_id}","starred_url":"https://api.github.com/users/delphix/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/delphix/subscriptions","organizations_url":"https://api.github.com/users/delphix/orgs","repos_url":"https://api.github.com/users/delphix/repos","events_url":"https://api.github.com/users/delphix/events{/privacy}","received_events_url":"https://api.github.com/users/delphix/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/delphix/appliance-build","description":"This repository contains the code used to build the Ubuntu-based Delphix Appliance, leveraging open-source tools such as Debian's live-build, Docker, Ansible, OpenZFS, and others.","fork":false,"url":"https://api.github.com/repos/delphix/appliance-build","forks_url":"https://api.github.com/repos/delphix/appliance-build/forks","keys_url":"https://api.github.com/repos/delphix/appliance-build/keys{/key_id}","collaborators_url":"https://api.github.com/repos/delphix/appliance-build/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/delphix/appliance-build/teams","hooks_url":"https://api.github.com/repos/delphix/appliance-build/hooks","issue_events_url":"https://api.github.com/repos/delphix/appliance-build/issues/events{/number}","events_url":"https://api.github.com/repos/delphix/appliance-build/events","assignees_url":"https://api.github.com/repos/delphix/appliance-build/assignees{/user}","branches_url":"https://api.github.com/repos/delphix/appliance-build/branches{/branch}","tags_url":"https://api.github.com/repos/delphix/appliance-build/tags","blobs_url":"https://api.github.com/repos/delphix/appliance-build/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/delphix/appliance-build/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/delphix/appliance-build/git/refs{/sha}","trees_url":"https://api.github.com/repos/delphix/appliance-build/git/trees{/sha}","statuses_url":"https://api.github.com/repos/delphix/appliance-build/statuses/{sha}","languages_url":"https://api.github.com/repos/delphix/appliance-build/languages","stargazers_url":"https://api.github.com/repos/delphix/appliance-build/stargazers","contributors_url":"https://api.github.com/repos/delphix/appliance-build/contributors","subscribers_url":"https://api.github.com/repos/delphix/appliance-build/subscribers","subscription_url":"https://api.github.com/repos/delphix/appliance-build/subscription","commits_url":"https://api.github.com/repos/delphix/appliance-build/commits{/sha}","git_commits_url":"https://api.github.com/repos/delphix/appliance-build/git/commits{/sha}","comments_url":"https://api.github.com/repos/delphix/appliance-build/comments{/number}","issue_comment_url":"https://api.github.com/repos/delphix/appliance-build/issues/comments{/number}","contents_url":"https://api.github.com/repos/delphix/appliance-build/contents/{+path}","compare_url":"https://api.github.com/repos/delphix/appliance-build/compare/{base}...{head}","merges_url":"https://api.github.com/repos/delphix/appliance-build/merges","archive_url":"https://api.github.com/repos/delphix/appliance-build/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/delphix/appliance-build/downloads","issues_url":"https://api.github.com/repos/delphix/appliance-build/issues{/number}","pulls_url":"https://api.github.com/repos/delphix/appliance-build/pulls{/number}","milestones_url":"https://api.github.com/repos/delphix/appliance-build/milestones{/number}","notifications_url":"https://api.github.com/repos/delphix/appliance-build/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/delphix/appliance-build/labels{/name}","releases_url":"https://api.github.com/repos/delphix/appliance-build/releases{/id}","deployments_url":"https://api.github.com/repos/delphix/appliance-build/deployments","created_at":"2018-05-02T15:49:13Z","updated_at":"2018-11-14T18:05:08Z","pushed_at":"2018-11-19T17:35:33Z","git_url":"git://github.com/delphix/appliance-build.git","ssh_url":"git@github.com:delphix/appliance-build.git","clone_url":"https://github.com/delphix/appliance-build.git","svn_url":"https://github.com/delphix/appliance-build","homepage":"","size":314,"stargazers_count":8,"watchers_count":8,"language":"Shell","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":20,"mirror_url":null,"archived":false,"open_issues_count":13,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":20,"open_issues":13,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/delphix/appliance-build/pulls/154"},"html":{"href":"https://github.com/delphix/appliance-build/pull/154"},"issue":{"href":"https://api.github.com/repos/delphix/appliance-build/issues/154"},"comments":{"href":"https://api.github.com/repos/delphix/appliance-build/issues/154/comments"},"review_comments":{"href":"https://api.github.com/repos/delphix/appliance-build/pulls/154/comments"},"review_comment":{"href":"https://api.github.com/repos/delphix/appliance-build/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/delphix/appliance-build/pulls/154/commits"},"statuses":{"href":"https://api.github.com/repos/delphix/appliance-build/statuses/d76b5fdd4390e89e6a134f498e34505d79b18e62"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"prakashsurya"}}