{"action":"created","comment":{"url":"https://api.github.com/repos/snapcore/snapd/pulls/comments/75040603","id":75040603,"diff_hunk":"@@ -0,0 +1,541 @@\n+// -*- Mode: Go; indent-tabs-mode: t -*-\n+\n+/*\n+ * Copyright (C) 2016 Canonical Ltd\n+ *\n+ * This program is free software: you can redistribute it and/or modify\n+ * it under the terms of the GNU General Public License version 3 as\n+ * published by the Free Software Foundation.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU General Public License\n+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n+ *\n+ */\n+\n+package builtin\n+\n+import (\n+\t\"github.com/snapcore/snapd/interfaces\"\n+)\n+\n+const dockerPermanentSlotAppArmor = `\n+# Description: Allow operating as the Docker daemon. Reserved because this\n+#  gives privileged access to the system.\n+# Usage: reserved\n+\n+# Allow sockets\n+/{,var/}run/docker.sock rw,\n+/{,var/}run/docker/     rw,\n+/{,var/}run/docker/**   mrwklix,\n+/{,var/}run/runc/       rw,\n+/{,var/}run/runc/**     mrwklix,\n+\n+# Wide read access to /proc, but somewhat limited writes for now\n+@{PROC}/ r,\n+@{PROC}/** r,\n+@{PROC}/[0-9]*/attr/exec w,\n+@{PROC}/sys/net/** w,\n+@{PROC}/[0-9]*/cmdline r,\n+@{PROC}/[0-9]*/oom_score_adj w,\n+\n+# Wide read access to /sys\n+/sys/** r,\n+# Limit cgroup writes a bit\n+/sys/fs/cgroup/*/docker/   rw,\n+/sys/fs/cgroup/*/docker/** rw,\n+\n+# Allow tracing ourself (especially the \"runc\" process we create)\n+ptrace (trace) peer=@{profile_name},\n+\n+# Docker needs a lot of caps, but limits them in the app container\n+capability,\n+\n+# Docker does all kinds of mounts all over the filesystem\n+/dev/mapper/control rw,\n+/dev/mapper/docker* rw,\n+/dev/loop* r,\n+/dev/loop[0-9]* w,\n+mount,\n+umount,\n+\n+# After doing a pivot_root using <graph-dir>/<container-fs>/.pivot_rootNNNNNN,\n+# Docker removes the leftover /.pivot_rootNNNNNN directory (which is now\n+# relative to \"/\" instead of \"<graph-dir>/<container-fs>\" thanks to pivot_root)\n+pivot_root,\n+/.pivot_root[0-9]*/ rw,\n+\n+# file descriptors (/proc/NNN/fd/X)\n+/[0-9]* rw,\n+# file descriptors in the container show up here due to attach_disconnected\n+\n+# Docker needs to be able to create and load the profile it applies to containers (\"docker-default\")\n+# XXX We might be able to get rid of this if we generate and load docker-default ourselves and make docker not do it.\n+/sbin/apparmor_parser ixr,\n+/etc/apparmor.d/cache/ r,\n+/etc/apparmor.d/cache/.features r,\n+/etc/apparmor.d/cache/docker* rw,\n+/etc/apparmor/parser.conf r,\n+/etc/apparmor/subdomain.conf r,\n+/sys/kernel/security/apparmor/.replace rw,\n+\n+# We'll want to adjust this to support --security-opts...\n+change_profile -> docker-default,\n+signal (send) peer=docker-default,\n+ptrace (read, trace) peer=docker-default,\n+\n+# Graph (storage) driver bits\n+/dev/shm/aufs.xino rw,\n+\n+#cf bug 1502785\n+/ r,\n+`\n+\n+const dockerConnectedPlugAppArmor = `\n+# Description: Allow using Docker. Reserved because this gives\n+#  privileged access to the service/host.\n+# Usage: reserved\n+\n+# Obviously need to be able to talk to the daemon\n+/{,var/}run/docker.sock rw,\n+\n+@{PROC}/sys/net/core/somaxconn r,\n+`\n+\n+const dockerPermanentSlotSecComp = `\n+# The Docker daemon needs to be able to launch arbitrary processes within\n+# containers (whose syscall needs are unknown beforehand)\n+\n+# Calls the Docker daemon itself requires\n+#   /snap/docker/VERSION/bin/docker-runc\n+#     \"do not inherit the parent's session keyring\"\n+#     \"make session keyring searcheable\"\n+keyctl\n+#   /snap/docker/VERSION/bin/docker-runc\n+pivot_root\n+\n+# This list comes from Docker's default seccomp whitelist (which is applied to\n+#   all containers launched unless a custom profile is specified or\n+#   \"--privileged\" is used)\n+# https://github.com/docker/docker/blob/v1.12.0/profiles/seccomp/seccomp_default.go#L39-L1879\n+# $ grep -C1 'ActAllow' -- profiles/seccomp/seccomp_default.go \\\n+#     | grep 'Name:' \\\n+#     | cut -d'\"' -f2 \\\n+#     | sort -u\n+accept\n+accept4\n+access\n+acct\n+adjtimex\n+alarm\n+arch_prctl\n+bind\n+bpf\n+breakpoint\n+brk\n+cacheflush\n+capget\n+capset\n+chdir\n+chmod\n+chown\n+chown32\n+chroot\n+clock_getres\n+clock_gettime\n+clock_nanosleep\n+clone\n+close\n+connect\n+copy_file_range\n+creat\n+delete_module\n+dup\n+dup2\n+dup3\n+epoll_create\n+epoll_create1\n+epoll_ctl\n+epoll_ctl_old\n+epoll_pwait\n+epoll_wait\n+epoll_wait_old\n+eventfd\n+eventfd2\n+execve\n+execveat\n+exit\n+exit_group\n+faccessat\n+fadvise64\n+fadvise64_64\n+fallocate\n+fanotify_init\n+fanotify_mark\n+fchdir\n+fchmod\n+fchmodat\n+fchown\n+fchown32\n+fchownat\n+fcntl\n+fcntl64\n+fdatasync\n+fgetxattr\n+finit_module\n+flistxattr\n+flock\n+fork\n+fremovexattr\n+fsetxattr\n+fstat\n+fstat64\n+fstatat64\n+fstatfs\n+fstatfs64\n+fsync\n+ftruncate\n+ftruncate64\n+futex\n+futimesat\n+getcpu\n+getcwd\n+getdents\n+getdents64\n+getegid\n+getegid32\n+geteuid\n+geteuid32\n+getgid\n+getgid32\n+getgroups\n+getgroups32\n+getitimer\n+getpeername\n+getpgid\n+getpgrp\n+getpid\n+getppid\n+getpriority\n+getrandom\n+getresgid\n+getresgid32\n+getresuid\n+getresuid32\n+getrlimit\n+get_robust_list\n+getrusage\n+getsid\n+getsockname\n+getsockopt\n+get_thread_area\n+gettid\n+gettimeofday\n+getuid\n+getuid32\n+getxattr\n+init_module\n+inotify_add_watch\n+inotify_init\n+inotify_init1\n+inotify_rm_watch\n+io_cancel\n+ioctl\n+io_destroy\n+io_getevents\n+ioperm\n+iopl\n+ioprio_get\n+ioprio_set\n+io_setup\n+io_submit\n+ipc\n+kcmp\n+kill\n+lchown\n+lchown32\n+lgetxattr\n+link\n+linkat\n+listen\n+listxattr\n+llistxattr\n+_llseek\n+lookup_dcookie\n+lremovexattr\n+lseek\n+lsetxattr\n+lstat\n+lstat64\n+madvise\n+memfd_create\n+mincore\n+mkdir\n+mkdirat\n+mknod\n+mknodat\n+mlock\n+mlock2\n+mlockall\n+mmap\n+mmap2\n+modify_ldt\n+mount\n+mprotect\n+mq_getsetattr\n+mq_notify\n+mq_open\n+mq_timedreceive\n+mq_timedsend\n+mq_unlink\n+mremap\n+msgctl\n+msgget\n+msgrcv\n+msgsnd\n+msync\n+munlock\n+munlockall\n+munmap\n+name_to_handle_at\n+nanosleep\n+newfstatat\n+_newselect\n+open\n+openat\n+open_by_handle_at\n+pause\n+perf_event_open\n+personality\n+pipe\n+pipe2\n+poll\n+ppoll\n+prctl\n+pread64\n+preadv\n+prlimit64\n+process_vm_readv\n+process_vm_writev\n+pselect6\n+ptrace\n+pwrite64\n+pwritev\n+query_module\n+read\n+readahead\n+readlink\n+readlinkat\n+readv\n+reboot\n+recv\n+recvfrom\n+recvmmsg\n+recvmsg\n+remap_file_pages\n+removexattr\n+rename\n+renameat\n+renameat2\n+restart_syscall\n+rmdir\n+rt_sigaction\n+rt_sigpending\n+rt_sigprocmask\n+rt_sigqueueinfo\n+rt_sigreturn\n+rt_sigsuspend\n+rt_sigtimedwait\n+rt_tgsigqueueinfo\n+s390_pci_mmio_read\n+s390_pci_mmio_write\n+s390_runtime_instr\n+sched_getaffinity\n+sched_getattr\n+sched_getparam\n+sched_get_priority_max\n+sched_get_priority_min\n+sched_getscheduler\n+sched_rr_get_interval\n+sched_setaffinity\n+sched_setattr\n+sched_setparam\n+sched_setscheduler\n+sched_yield\n+seccomp\n+select\n+semctl\n+semget\n+semop\n+semtimedop\n+send\n+sendfile\n+sendfile64\n+sendmmsg\n+sendmsg\n+sendto\n+setdomainname\n+setfsgid\n+setfsgid32\n+setfsuid\n+setfsuid32\n+setgid\n+setgid32\n+setgroups\n+setgroups32\n+sethostname\n+setitimer\n+setns\n+setpgid\n+setpriority\n+setregid\n+setregid32\n+setresgid\n+setresgid32\n+setresuid\n+setresuid32\n+setreuid\n+setreuid32\n+setrlimit\n+set_robust_list\n+setsid\n+setsockopt\n+set_thread_area\n+set_tid_address\n+settimeofday\n+set_tls\n+setuid\n+setuid32\n+setxattr\n+shmat\n+shmctl\n+shmdt\n+shmget\n+shutdown\n+sigaltstack\n+signalfd\n+signalfd4\n+sigreturn\n+socket\n+socketcall\n+socketpair\n+splice\n+stat\n+stat64\n+statfs\n+statfs64\n+stime\n+symlink\n+symlinkat\n+sync\n+sync_file_range\n+syncfs\n+sysinfo\n+syslog\n+tee\n+tgkill\n+time\n+timer_create\n+timer_delete\n+timerfd_create\n+timerfd_gettime\n+timerfd_settime\n+timer_getoverrun\n+timer_gettime\n+timer_settime\n+times\n+tkill\n+truncate\n+truncate64\n+ugetrlimit\n+umask\n+umount\n+umount2\n+uname\n+unlink\n+unlinkat\n+unshare\n+utime\n+utimensat\n+utimes\n+vfork\n+vhangup\n+vmsplice\n+wait4\n+waitid\n+waitpid\n+write\n+writev\n+`\n+\n+const dockerConnectedPlugSecComp = `","path":"interfaces/builtin/docker.go","position":492,"original_position":475,"commit_id":"0415c644e16196389dc37063ee8a77f8e77758e8","original_commit_id":"8ceb59bf36112fe11c01bb558a9e2b89f82d9876","user":{"login":"tianon","id":161631,"avatar_url":"https://avatars.githubusercontent.com/u/161631?v=3","gravatar_id":"","url":"https://api.github.com/users/tianon","html_url":"https://github.com/tianon","followers_url":"https://api.github.com/users/tianon/followers","following_url":"https://api.github.com/users/tianon/following{/other_user}","gists_url":"https://api.github.com/users/tianon/gists{/gist_id}","starred_url":"https://api.github.com/users/tianon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tianon/subscriptions","organizations_url":"https://api.github.com/users/tianon/orgs","repos_url":"https://api.github.com/users/tianon/repos","events_url":"https://api.github.com/users/tianon/events{/privacy}","received_events_url":"https://api.github.com/users/tianon/received_events","type":"User","site_admin":false},"body":"GitHub doesn't reflect it since it changed the next line, not this one, but this is added. :+1:","created_at":"2016-08-16T23:37:15Z","updated_at":"2016-08-16T23:37:15Z","html_url":"https://github.com/snapcore/snapd/pull/1619#discussion_r75040603","pull_request_url":"https://api.github.com/repos/snapcore/snapd/pulls/1619","_links":{"self":{"href":"https://api.github.com/repos/snapcore/snapd/pulls/comments/75040603"},"html":{"href":"https://github.com/snapcore/snapd/pull/1619#discussion_r75040603"},"pull_request":{"href":"https://api.github.com/repos/snapcore/snapd/pulls/1619"}}},"pull_request":{"url":"https://api.github.com/repos/snapcore/snapd/pulls/1619","id":79783477,"html_url":"https://github.com/snapcore/snapd/pull/1619","diff_url":"https://github.com/snapcore/snapd/pull/1619.diff","patch_url":"https://github.com/snapcore/snapd/pull/1619.patch","issue_url":"https://api.github.com/repos/snapcore/snapd/issues/1619","number":1619,"state":"open","locked":false,"title":"Add initial \"docker\" interface based on some of 15.04's privileges","user":{"login":"tianon","id":161631,"avatar_url":"https://avatars.githubusercontent.com/u/161631?v=3","gravatar_id":"","url":"https://api.github.com/users/tianon","html_url":"https://github.com/tianon","followers_url":"https://api.github.com/users/tianon/followers","following_url":"https://api.github.com/users/tianon/following{/other_user}","gists_url":"https://api.github.com/users/tianon/gists{/gist_id}","starred_url":"https://api.github.com/users/tianon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tianon/subscriptions","organizations_url":"https://api.github.com/users/tianon/orgs","repos_url":"https://api.github.com/users/tianon/repos","events_url":"https://api.github.com/users/tianon/events{/privacy}","received_events_url":"https://api.github.com/users/tianon/received_events","type":"User","site_admin":false},"body":"This is a first pass on adding a `docker` interface to `snapd`.  I've been discussing this off-and-on with @jdstrand on IRC, so hopefully it's at least an OK start, but if not, I'm happy to amend, rebase, refactor, etc as necessary or desired. :+1:\r\n\r\nOne main question I've still got is around slot/plug overlap.  With the way this is currently implemented, by `docker` snap includes both the `docker` and the `network` plugs on the Docker client command, and the `docker` slot plus the `network-bind` and `firewall-control` plugs on the Docker daemon.  My question is whether that's the correct way to be thinking about this, or whether those overlapping privileges should be rolled into the `docker` interface directly?\r\n\r\nTo be more precise, here's the exact `snapcraft.yml` snippet:\r\n```yaml\r\napps:\r\n  docker:\r\n    command: docker-wrapper docker\r\n    plugs:\r\n      - docker\r\n      - network\r\n\r\n  dockerd:\r\n    command: dockerd-wrapper\r\n    daemon: simple\r\n    plugs:\r\n      - network-bind\r\n      - firewall-control\r\n    slots:\r\n      - docker\r\n```\r\n\r\nAnd the interfaces I've got to have connected for it to function appropriately: (as one would expect)\r\n```console\r\n$ snap interfaces | grep docker\r\ndocker:docker        docker\r\n:firewall-control    docker\r\n:network             docker\r\n:network-bind        docker\r\n```","created_at":"2016-08-02T18:20:55Z","updated_at":"2016-08-16T23:37:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c165022305d6111741d7765d58927247a50c337f","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/snapcore/snapd/pulls/1619/commits","review_comments_url":"https://api.github.com/repos/snapcore/snapd/pulls/1619/comments","review_comment_url":"https://api.github.com/repos/snapcore/snapd/pulls/comments{/number}","comments_url":"https://api.github.com/repos/snapcore/snapd/issues/1619/comments","statuses_url":"https://api.github.com/repos/snapcore/snapd/statuses/0415c644e16196389dc37063ee8a77f8e77758e8","head":{"label":"infosiftr:docker","ref":"docker","sha":"0415c644e16196389dc37063ee8a77f8e77758e8","user":{"login":"infosiftr","id":894614,"avatar_url":"https://avatars.githubusercontent.com/u/894614?v=3","gravatar_id":"","url":"https://api.github.com/users/infosiftr","html_url":"https://github.com/infosiftr","followers_url":"https://api.github.com/users/infosiftr/followers","following_url":"https://api.github.com/users/infosiftr/following{/other_user}","gists_url":"https://api.github.com/users/infosiftr/gists{/gist_id}","starred_url":"https://api.github.com/users/infosiftr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/infosiftr/subscriptions","organizations_url":"https://api.github.com/users/infosiftr/orgs","repos_url":"https://api.github.com/users/infosiftr/repos","events_url":"https://api.github.com/users/infosiftr/events{/privacy}","received_events_url":"https://api.github.com/users/infosiftr/received_events","type":"Organization","site_admin":false},"repo":{"id":64344938,"name":"snapd","full_name":"infosiftr/snapd","owner":{"login":"infosiftr","id":894614,"avatar_url":"https://avatars.githubusercontent.com/u/894614?v=3","gravatar_id":"","url":"https://api.github.com/users/infosiftr","html_url":"https://github.com/infosiftr","followers_url":"https://api.github.com/users/infosiftr/followers","following_url":"https://api.github.com/users/infosiftr/following{/other_user}","gists_url":"https://api.github.com/users/infosiftr/gists{/gist_id}","starred_url":"https://api.github.com/users/infosiftr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/infosiftr/subscriptions","organizations_url":"https://api.github.com/users/infosiftr/orgs","repos_url":"https://api.github.com/users/infosiftr/repos","events_url":"https://api.github.com/users/infosiftr/events{/privacy}","received_events_url":"https://api.github.com/users/infosiftr/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/infosiftr/snapd","description":"The snapd and snap tools enable systems to work with .snap files.","fork":true,"url":"https://api.github.com/repos/infosiftr/snapd","forks_url":"https://api.github.com/repos/infosiftr/snapd/forks","keys_url":"https://api.github.com/repos/infosiftr/snapd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/infosiftr/snapd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/infosiftr/snapd/teams","hooks_url":"https://api.github.com/repos/infosiftr/snapd/hooks","issue_events_url":"https://api.github.com/repos/infosiftr/snapd/issues/events{/number}","events_url":"https://api.github.com/repos/infosiftr/snapd/events","assignees_url":"https://api.github.com/repos/infosiftr/snapd/assignees{/user}","branches_url":"https://api.github.com/repos/infosiftr/snapd/branches{/branch}","tags_url":"https://api.github.com/repos/infosiftr/snapd/tags","blobs_url":"https://api.github.com/repos/infosiftr/snapd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/infosiftr/snapd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/infosiftr/snapd/git/refs{/sha}","trees_url":"https://api.github.com/repos/infosiftr/snapd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/infosiftr/snapd/statuses/{sha}","languages_url":"https://api.github.com/repos/infosiftr/snapd/languages","stargazers_url":"https://api.github.com/repos/infosiftr/snapd/stargazers","contributors_url":"https://api.github.com/repos/infosiftr/snapd/contributors","subscribers_url":"https://api.github.com/repos/infosiftr/snapd/subscribers","subscription_url":"https://api.github.com/repos/infosiftr/snapd/subscription","commits_url":"https://api.github.com/repos/infosiftr/snapd/commits{/sha}","git_commits_url":"https://api.github.com/repos/infosiftr/snapd/git/commits{/sha}","comments_url":"https://api.github.com/repos/infosiftr/snapd/comments{/number}","issue_comment_url":"https://api.github.com/repos/infosiftr/snapd/issues/comments{/number}","contents_url":"https://api.github.com/repos/infosiftr/snapd/contents/{+path}","compare_url":"https://api.github.com/repos/infosiftr/snapd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/infosiftr/snapd/merges","archive_url":"https://api.github.com/repos/infosiftr/snapd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/infosiftr/snapd/downloads","issues_url":"https://api.github.com/repos/infosiftr/snapd/issues{/number}","pulls_url":"https://api.github.com/repos/infosiftr/snapd/pulls{/number}","milestones_url":"https://api.github.com/repos/infosiftr/snapd/milestones{/number}","notifications_url":"https://api.github.com/repos/infosiftr/snapd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/infosiftr/snapd/labels{/name}","releases_url":"https://api.github.com/repos/infosiftr/snapd/releases{/id}","deployments_url":"https://api.github.com/repos/infosiftr/snapd/deployments","created_at":"2016-07-27T22:08:41Z","updated_at":"2016-07-27T22:08:43Z","pushed_at":"2016-08-16T23:36:33Z","git_url":"git://github.com/infosiftr/snapd.git","ssh_url":"git@github.com:infosiftr/snapd.git","clone_url":"https://github.com/infosiftr/snapd.git","svn_url":"https://github.com/infosiftr/snapd","homepage":"","size":33318,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"snapcore:master","ref":"master","sha":"7da8b1e72588c5f1e9ffd002041fb05cbed4e924","user":{"login":"snapcore","id":19532717,"avatar_url":"https://avatars.githubusercontent.com/u/19532717?v=3","gravatar_id":"","url":"https://api.github.com/users/snapcore","html_url":"https://github.com/snapcore","followers_url":"https://api.github.com/users/snapcore/followers","following_url":"https://api.github.com/users/snapcore/following{/other_user}","gists_url":"https://api.github.com/users/snapcore/gists{/gist_id}","starred_url":"https://api.github.com/users/snapcore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snapcore/subscriptions","organizations_url":"https://api.github.com/users/snapcore/orgs","repos_url":"https://api.github.com/users/snapcore/repos","events_url":"https://api.github.com/users/snapcore/events{/privacy}","received_events_url":"https://api.github.com/users/snapcore/received_events","type":"Organization","site_admin":false},"repo":{"id":44672744,"name":"snapd","full_name":"snapcore/snapd","owner":{"login":"snapcore","id":19532717,"avatar_url":"https://avatars.githubusercontent.com/u/19532717?v=3","gravatar_id":"","url":"https://api.github.com/users/snapcore","html_url":"https://github.com/snapcore","followers_url":"https://api.github.com/users/snapcore/followers","following_url":"https://api.github.com/users/snapcore/following{/other_user}","gists_url":"https://api.github.com/users/snapcore/gists{/gist_id}","starred_url":"https://api.github.com/users/snapcore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snapcore/subscriptions","organizations_url":"https://api.github.com/users/snapcore/orgs","repos_url":"https://api.github.com/users/snapcore/repos","events_url":"https://api.github.com/users/snapcore/events{/privacy}","received_events_url":"https://api.github.com/users/snapcore/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/snapcore/snapd","description":"The snapd and snap tools enable systems to work with .snap files.","fork":false,"url":"https://api.github.com/repos/snapcore/snapd","forks_url":"https://api.github.com/repos/snapcore/snapd/forks","keys_url":"https://api.github.com/repos/snapcore/snapd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/snapcore/snapd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/snapcore/snapd/teams","hooks_url":"https://api.github.com/repos/snapcore/snapd/hooks","issue_events_url":"https://api.github.com/repos/snapcore/snapd/issues/events{/number}","events_url":"https://api.github.com/repos/snapcore/snapd/events","assignees_url":"https://api.github.com/repos/snapcore/snapd/assignees{/user}","branches_url":"https://api.github.com/repos/snapcore/snapd/branches{/branch}","tags_url":"https://api.github.com/repos/snapcore/snapd/tags","blobs_url":"https://api.github.com/repos/snapcore/snapd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/snapcore/snapd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/snapcore/snapd/git/refs{/sha}","trees_url":"https://api.github.com/repos/snapcore/snapd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/snapcore/snapd/statuses/{sha}","languages_url":"https://api.github.com/repos/snapcore/snapd/languages","stargazers_url":"https://api.github.com/repos/snapcore/snapd/stargazers","contributors_url":"https://api.github.com/repos/snapcore/snapd/contributors","subscribers_url":"https://api.github.com/repos/snapcore/snapd/subscribers","subscription_url":"https://api.github.com/repos/snapcore/snapd/subscription","commits_url":"https://api.github.com/repos/snapcore/snapd/commits{/sha}","git_commits_url":"https://api.github.com/repos/snapcore/snapd/git/commits{/sha}","comments_url":"https://api.github.com/repos/snapcore/snapd/comments{/number}","issue_comment_url":"https://api.github.com/repos/snapcore/snapd/issues/comments{/number}","contents_url":"https://api.github.com/repos/snapcore/snapd/contents/{+path}","compare_url":"https://api.github.com/repos/snapcore/snapd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/snapcore/snapd/merges","archive_url":"https://api.github.com/repos/snapcore/snapd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/snapcore/snapd/downloads","issues_url":"https://api.github.com/repos/snapcore/snapd/issues{/number}","pulls_url":"https://api.github.com/repos/snapcore/snapd/pulls{/number}","milestones_url":"https://api.github.com/repos/snapcore/snapd/milestones{/number}","notifications_url":"https://api.github.com/repos/snapcore/snapd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/snapcore/snapd/labels{/name}","releases_url":"https://api.github.com/repos/snapcore/snapd/releases{/id}","deployments_url":"https://api.github.com/repos/snapcore/snapd/deployments","created_at":"2015-10-21T11:51:46Z","updated_at":"2016-08-12T23:50:37Z","pushed_at":"2016-08-16T23:36:33Z","git_url":"git://github.com/snapcore/snapd.git","ssh_url":"git@github.com:snapcore/snapd.git","clone_url":"https://github.com/snapcore/snapd.git","svn_url":"https://github.com/snapcore/snapd","homepage":"","size":35615,"stargazers_count":375,"watchers_count":375,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":90,"mirror_url":null,"open_issues_count":25,"forks":90,"open_issues":25,"watchers":375,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/snapcore/snapd/pulls/1619"},"html":{"href":"https://github.com/snapcore/snapd/pull/1619"},"issue":{"href":"https://api.github.com/repos/snapcore/snapd/issues/1619"},"comments":{"href":"https://api.github.com/repos/snapcore/snapd/issues/1619/comments"},"review_comments":{"href":"https://api.github.com/repos/snapcore/snapd/pulls/1619/comments"},"review_comment":{"href":"https://api.github.com/repos/snapcore/snapd/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/snapcore/snapd/pulls/1619/commits"},"statuses":{"href":"https://api.github.com/repos/snapcore/snapd/statuses/0415c644e16196389dc37063ee8a77f8e77758e8"}}}}
{"actor":{"display_login":"tianon"}}