Commit graph

311 commits

Author SHA1 Message Date
Mrunal Patel
22babd5bcd Bump up to version 0.3
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2017-04-28 08:13:00 -07:00
Suraj Deshmukh
2699198610 Add flag --cpu-profile to enable pprof
To collect CPU profile information added a flag `--cpu-profile`
which is a path to file where this collected information will be
dumped.

Fixes #464

Signed-off-by: Suraj Deshmukh <surajssd009005@gmail.com>
2017-04-27 11:17:56 +05:30
Samuel Ortiz
c676b7b6c3 ocic: Initial implementation for ocic ctr exec
We use the k8s remotecommand client API to create a
streaming executor, and then stream the executed process
into stdout/stderr.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
2017-04-24 18:44:49 +02:00
Jacek J. Łakis
3babbf0de1 ocic: Add container exec command
Signed-off-by: Jacek J. Łakis <jacek.lakis@intel.com>
2017-04-24 18:44:40 +02:00
Mrunal Patel
32b546cf0b Release version 0.2
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2017-04-13 09:50:14 -07:00
Daniel J Walsh
19620f3d1e Switch to using opencontainers/selinux
We have moved selinux support out of opencontainers/runc into its
own package.  This patch moves to using the new selinux go bindings.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
2017-03-23 15:53:09 -04:00
Mrunal Patel
e147601584 Bump up version to 0.1
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2017-03-20 14:12:09 -07:00
Samuel Ortiz
2fc4d0cac1 config: Add host privileged runtime configuration
Not all runtimes are able to handle some of the kubelet
security context options, in particular the ones granting
host privileges to containers.

By adding a host privileged runtime path configuration, we
allow ocid to use a different runtime for host privileged
operations like e.g. host namespaces access.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
2017-03-03 17:22:09 +01:00
Daniel J Walsh
cf5b0ae57f Deprecate --storage-option for --storage-opt
container-storage-setup (Formerly docker-storage-setup) is being converted to
run with container runtimes outside of docker.  Specifically we want to use it
with CRI-O/ocid.  It does not know anything about the container runtimes it
is generating options for, so it generates them based on the storage CLI of
docker.  I see no reason to have the storage option for ocid to be different
and we can just depracate the option for now.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
2017-02-25 09:09:50 -05:00
Michał Żyłowski
5c81217e09 Applying k8s.io v3 API for ocic and ocid
Signed-off-by: Michał Żyłowski <michal.zylowski@intel.com>
2017-02-06 13:05:10 +01:00
Nalin Dahyabhai
c0333b102b Integrate containers/storage
Use containers/storage to store images, pod sandboxes, and containers.
A pod sandbox's infrastructure container has the same ID as the pod to
which it belongs, and all containers also keep track of their pod's ID.

The container configuration that we build using the data in a
CreateContainerRequest is stored in the container's ContainerDirectory
and ContainerRunDirectory.

We catch SIGTERM and SIGINT, and when we receive either, we gracefully
exit the grpc loop.  If we also think that there aren't any container
filesystems in use, we attempt to do a clean shutdown of the storage
driver.

The test harness now waits for ocid to exit before attempting to delete
the storage root directory.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
2017-01-18 10:23:30 -05:00
Nalin Dahyabhai
caee4a99c9 Vendor containers/image and containers/storage
Vendor updated containers/image and containers/storage, along
with any new dependencies they drag in, and updated versions of other
dependencies that happen to get pulled in.

github.com/coreos/go-systemd/daemon/SdNotify() now takes a boolean to
control whether or not it unsets the NOTIFY_SOCKET variable from the
calling process's environment.  Adapt.

github.com/opencontainers/runtime-tools/generate/Generator.AddProcessEnv()
now takes the environment variable name and value as two arguments, not
one.  Adapt.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
2017-01-18 10:21:59 -05:00
Jonathan Yu
6c9628cdb1
Build and install from GOPATH
* Rename 'vendor/src' -> 'vendor'
  * Ignore vendor/ instead of vendor/src/ for lint
* Rename 'cmd/client' -> 'cmd/ocic' to make it 'go install'able
* Rename 'cmd/server' -> 'cmd/ocid' to make it 'go install'able
* Update Makefile to build and install from GOPATH
* Update tests to locate ocid/ocic in GOPATH/bin
* Search for binaries in GOPATH/bin instead of PATH
* Install tools using `go get -u`, so they are updated on each run

Signed-off-by: Jonathan Yu <jawnsy@redhat.com>
2017-01-17 12:09:09 -08:00
Jonathan Yu
d5d297d50b
Promote DefaultConfig() to server package
The default configuration can only be accessed from the cmd/server
package, which cannot be imported (since it's a "package main").
This change promotes DefaultConfig() to the "server" package.

Closes: #315

Signed-off-by: Jonathan Yu <jawnsy@redhat.com>
2017-01-16 16:22:35 -08:00
Xianglin Gao
088c53579a Remove byName in cmd/server/main.go, since urfave/cli#544 has been in.
Signed-off-by: Xianglin Gao <xlgao@zju.edu.cn>
2017-01-05 15:42:22 +08:00
Antonio Murdaca
ac7943c707 Merge pull request #285 from sameo/topic/network-bats
Add Initial networking BATs
2016-12-20 16:49:04 +01:00
Nalin Dahyabhai
5e28e20213 Fix client size reporting
The client size field that we get back when we inspect an image is a
pointer to a number, not just a number, so we need to dereference it for
display.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
2016-12-20 09:06:07 -05:00
Samuel Ortiz
c525459000
main: Add CNI options
We add 2 ocid options for choosing the CNI configuration and plugin
binaries directories: --cni-config-dir and --cni-plugin-dir.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
2016-12-20 12:50:17 +01:00
Mrunal Patel
edad8f866d Add configuration for specifying cgroup manager
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2016-12-19 15:04:34 -08:00
Nalin Dahyabhai
d45ff58056 Initialize the reexec package
Any binary that will be managing storage needs to initialize the reexec
package in order to be able to apply or read image layers.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
2016-12-19 11:44:34 -05:00
Antonio Murdaca
e1054cf28e
cmd/client: move pod create to pod run
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-12-14 18:15:37 +01:00
Antonio Murdaca
430297dd81
store annotations and image for a container
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-12-12 11:12:03 +01:00
Mrunal Patel
79073df3c2 Merge pull request #215 from xlgao-zju/support-apparmor
support apparmor
2016-12-05 21:24:50 -08:00
Mrunal Patel
529bebbe68 Merge pull request #222 from mheon/kpod
Add basic skeleton of kpod executable
2016-12-01 20:37:32 -08:00
Matthew Heon
f512f211d0 Add basic skeleton of kpod executable
Signed-off-by: Matthew Heon <mheon@redhat.com>
2016-12-01 22:42:54 -05:00
Mrunal Patel
0d0b70a475 Add README for kpod
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2016-12-01 07:31:36 -08:00
Xianglin Gao
06cc0ba6ba Add docs about apparmor profile setting
Signed-off-by: Xianglin Gao <xlgao@zju.edu.cn>
2016-12-01 13:26:59 +08:00
Xianglin Gao
26645c90ac Make the profile configurable
Signed-off-by: Xianglin Gao <xlgao@zju.edu.cn>
2016-12-01 13:26:59 +08:00
Antonio Murdaca
78ee03a8fc
add seccomp support
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-11-28 22:05:34 +01:00
Mrunal Patel
5c1adcbf6a Add client implementation for exec sync
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2016-11-17 16:42:08 -08:00
Mrunal Patel
b62a150151 Update to the latest upstream API
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2016-11-16 17:20:37 -08:00
Crazykev
82a01cbdda fix ocic time display
Signed-off-by: Crazykev <crazykev@zju.edu.cn>
2016-11-16 15:36:32 +08:00
Antonio Murdaca
02ec8754f5 Merge pull request #169 from cyphar/make-configurable
server: make more things configurable
2016-11-10 14:55:29 +01:00
Crazykev
295c32331a sort all map type result in ocic
Signed-off-by: Crazykev <crazykev@zju.edu.cn>
2016-11-02 14:36:42 +08:00
Crazykev
ca59eaf1a4 display container metadata on the client for container list and status
Signed-off-by: Crazykev <crazykev@zju.edu.cn>
2016-11-02 00:37:40 +08:00
Aleksa Sarai
96c0966ce9
server: make logDir configurable
While logDir isn't currently used (until the conmon implementation
lands) it's probably not a great idea to hardcode our defaults. The main
issue with this setting is that the kubelet can override it at will.

Signed-off-by: Aleksa Sarai <asarai@suse.de>
2016-10-31 23:26:42 +11:00
Aleksa Sarai
33f47d6a6b
server: make ImageStore configurable
It's a bit odd to have ImageStore be part of the config and yet we don't
allow people to modify it. However, leave it out of the commented
version because it's currently unused.

Signed-off-by: Aleksa Sarai <asarai@suse.de>
2016-10-31 23:26:42 +11:00
Mrunal Patel
e4b76edd96 Add timestamps to logs
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2016-10-26 12:45:29 -07:00
Nalin Dahyabhai
346553312e Add "image list/remove/status" to the client
Add "image list", "image status", and "image remove" subcommands to the
client.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
2016-10-26 13:19:36 -04:00
HaoZhang
9c11cc7dba make conmon inherit env from ocid
Signed-off-by: HaoZhang <crazykev@zju.edu.cn>
2016-10-23 19:22:27 +08:00
Mrunal Patel
68a350d9ae Merge pull request #157 from YaoZengzeng/ocic-timeout
add timeout for ocic connect to server
2016-10-18 09:32:09 -07:00
YaoZengzeng
8f91c149e2 add timeout for ocic connect to server
Signed-off-by: Yao Zengzeng <yaozengzeng@zju.edu.cn>
2016-10-18 13:50:16 +08:00
Mrunal Patel
1694591f6c Add support for adding labels at pod creation time
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2016-10-17 12:33:48 -07:00
Mrunal Patel
2cc40ef9ef Add client support for filtering pods
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2016-10-17 12:25:30 -07:00
Mrunal Patel
52dc8e4865 Add support for adding labels at ctr create time
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2016-10-14 12:05:47 -07:00
Mrunal Patel
f12d94100c Add client changes for filtering containers by labels
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2016-10-13 17:02:02 -07:00
Mrunal Patel
8d88bf1ab1 Add client support for filtering containers
Signed-off-by: Mrunal Patel <mpatel@redhat.com>
2016-10-13 12:40:07 -07:00
Mrunal Patel
da4cc11077 Merge pull request #135 from runcom/sdnotify
Sdnotify
2016-10-13 11:00:22 -07:00
Antonio Murdaca
93ba37d00b
vendor go-systemd
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-10-13 19:40:18 +02:00
Antonio Murdaca
cf677a20f6
cmd/server: sort flags
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-10-13 16:57:48 +02:00
Dan Walsh
09bed25074 Add support for sd_notify
Signed-off-by: Dan Walsh <dwalsh@redhat.com>
2016-10-13 09:45:31 -04:00
Dan Walsh
f6d9d626a9 Cleanup help and add options to man page
Missing options from man page, and sort options alphabetically, as best
we can.

Signed-off-by: Dan Walsh <dwalsh@redhat.com>
2016-10-13 09:26:28 -04:00
Aleksa Sarai
9fb23bf0dc
ocid: add config subcommand
This subcommand is so that users can get a nice commented version of the
ocid configuration file. This comes from the "current" version of the
configuration (allowing somone to get their custom configuration as a
file). It also has a --default option.

In addition, update the tests to use `ocid config` so that we test this
setup (the loading and saving of the options).

Signed-off-by: Aleksa Sarai <asarai@suse.de>
2016-10-11 21:21:58 +11:00
Aleksa Sarai
cd9e7de108
ocid: add TOML configuration file
The --config is merged with the default, and then is overridden by any
command-line options. Everything is organised to be in sub-tables so
that the sections are more clear.

Signed-off-by: Aleksa Sarai <asarai@suse.de>
2016-10-11 03:10:32 +11:00
Aleksa Sarai
7bf5110b76
server: refactor to use Config struct
This paves the way for having a configuration file that is loaded rather
than everything being set via the command-line.

Signed-off-by: Aleksa Sarai <asarai@suse.de>
2016-10-11 03:10:32 +11:00
Aleksa Sarai
3f48986ea0
cmd: switch to --connect and --listen flags
Signed-off-by: Aleksa Sarai <asarai@suse.de>
2016-10-11 03:09:59 +11:00
Antonio Murdaca
a2fe83fe56
cmd/client/container: add --quiet to ctr list
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-10-08 14:46:39 +02:00
Antonio Murdaca
30757221b4
cmd/client/sandbox: add --quiet to pod list
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-10-08 14:46:39 +02:00
Antonio Murdaca
0cf8daa786 Merge pull request #118 from mrunalp/ctr_name
Allow overriding the container name in the config
2016-10-07 20:49:39 +02:00
Mrunal Patel
d916b586c8 Allow overriding the container name in the config
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-10-07 13:42:08 -05:00
Mrunal Patel
7c0a441c4b Display pod metadata on the client for list and status
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-10-07 13:32:33 -05:00
Mrunal Patel
027aaf15b7 Merge pull request #100 from rhatdan/selinux
Selinux
2016-10-06 12:28:12 -07:00
Dan Walsh
be77b841fa Add SELinux support to OCID
Signed-off-by: Dan Walsh <dwalsh@redhat.com>
2016-10-06 14:13:06 -04:00
Mike Brown
609d7630ca small amount of error checking and help for path to the runtime
Signed-off-by: Mike Brown <brownwm@us.ibm.com>
2016-10-06 11:14:54 -05:00
Aleksa Sarai
bd9acaf584
conmon: minor fixes
This fixes a bug where --conmon wouldn't actually set the conmon binary
path, and also where we weren't setting CFLAGS while compiling conmon.

Signed-off-by: Aleksa Sarai <asarai@suse.de>
2016-10-02 20:11:16 +11:00
Aleksa Sarai
bac579a9e5
server: create pause rootfs manually without Docker
This lessens the Docker requirement for creating sandboxes (with the
requirement only existing for the actual image pulling that is done when
adding a container to a pod). The interface was chosen to match the
--conmon interface, so that the location of the pause binary can be
chosen by a user.

Signed-off-by: Aleksa Sarai <asarai@suse.de>
2016-10-02 20:11:07 +11:00
Dan Walsh
f51c98b057 Install conmon in /usr/libexec/ocid/conmon
Signed-off-by: Dan Walsh <dwalsh@redhat.com>
2016-09-29 08:55:12 -04:00
Mrunal Patel
953f2e9f3b Add client impl for listing containers
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-27 15:17:56 -07:00
Antonio Murdaca
56f2b34def
cmd/client: lowercase error
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-27 10:43:11 +02:00
Antonio Murdaca
fe774f82b1 Merge pull request #57 from mrunalp/pod_name_param
Allow overriding name in a pod sandbox config file
2016-09-27 07:52:19 +02:00
Mrunal Patel
4606f2a61a Fix the build for ocid to cri-o rename
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-26 16:55:12 -07:00
Mrunal Patel
6d5fb53675 Allow overriding name in a pod sandbox config file
This makes it easier to test creation of multiple pods
from the same config.json file.

Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-26 14:50:34 -07:00
Mrunal Patel
fd3691a0e3 Add client impl for listing pod sandboxes
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-26 12:46:00 -07:00
Mrunal Patel
bdce43971f Improve pod status output formatting
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-26 11:28:03 -07:00
Antonio Murdaca
ab05a4526b
vendor: bump k8s@5fe2495588425a6613e28a048d8cc7bcb7513c7f
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-26 10:07:46 +02:00
Antonio Murdaca
857aaa7816
cmd/server: provide a flag to set ocid root dir
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-24 00:38:06 +02:00
Antonio Murdaca
ec173002fd
cmd/client: split commands in multiple files
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-24 00:31:46 +02:00
Antonio Murdaca
6c5767fb6f
cmd/client: cleanups
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-24 00:31:46 +02:00
Antonio Murdaca
45a7cb3fdf
cmd/server: fix cmd name and usage
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-23 09:33:49 +02:00
Antonio Murdaca
569183030f
fix vendored deps
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-22 18:17:45 +02:00
Antonio Murdaca
910f343f79
cmd/server: add socket flag
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-20 19:17:18 +02:00
Mrunal Patel
1263e54396 Better output formatting for container status
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-19 15:16:28 -07:00
Antonio Murdaca
22d434c1e6
restructure and make lint
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-19 19:56:13 +02:00
Antonio Murdaca
59aae8cdb5
*: Failed -> failed in errors
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-18 11:38:14 +02:00
Antonio Murdaca
d626a32c56
server: add debug to ocid
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-17 17:30:00 +02:00
Shaya Potter
3c0485dd71 make socket location configurable on cmd line 2016-09-15 15:57:39 -07:00
Mrunal Patel
1dc98efdcf Add client support for container status
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-12 15:03:26 -07:00
Mrunal Patel
bbe5325afc Fix the build to account for the change in repository
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:48:39 -07:00
Mrunal Patel
32a9f23dd2 Client changes for getting pod status
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
f5f2ff63b2 Improve CLI messages
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
a2fee5a256 Refactor the container CLI
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
ea77713223 Refactor the cli for pods
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
a27d6e6ff1 Add client impl for RemoveContainer
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
788da618c8 Add client impl for StopContainer
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
08c76ed7fb Add client code for starting a container
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
aea93ac6ab Add client code for remove pod sandbox
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
2c95c0bb0d Add client code for stop pod sandbox
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Haiyan Meng
c2ee13d187 Implement CreateContainer
Signed-off-by: Haiyan Meng <hmeng@redhat.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
764f02ca11 Add container dir to oci
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
ac1340488d Refactor to add oci and util packages
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>

Change the sandbox directory path

Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Haiyan Meng
839463d837 set up CPU and Memory resources
Signed-off-by: Haiyan Meng <hmeng@redhat.com>
2016-09-09 14:41:03 -07:00
Haiyan Meng
c0a267bf56 Fixes
Signed-off-by: Haiyan Meng <hmeng@redhat.com>
2016-09-09 14:41:03 -07:00
Haiyan Meng
819d76b6fd Add first version of createPodSandbox
Signed-off-by: Haiyan Meng <hmeng@redhat.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
0766dfecfe Use unix domain socket by default
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Antonio Murdaca
05f679f643 implement raw pullimage functionality
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-09 14:41:03 -07:00
Antonio Murdaca
06e013cd3d *: abstractions and ImageService
plus some fix here and there

Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-09 14:41:03 -07:00
Antonio Murdaca
713bbabc61 server,cmd: fix error handling
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
32876892fc Refactor runtimeversion to be a command instead of option
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
df8fe51ee7 Rename ocidclient to ocic
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00
Haiyan Meng
5c4a79543f Add Server.Version and cmd/client test code
Signed-off-by: Haiyan Meng <hmeng@redhat.com>
2016-09-09 14:41:03 -07:00
Mrunal Patel
e93156e71e Add stubs for server implementation
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
2016-09-09 14:41:03 -07:00