Repository: schemahero/schemahero
Pull request #130 (2020-04-04 16:23:12)

Bump client-go and the required deps to 1.18.0
The controller-runtime SHA is the odd one here.  Currently controller-runtime is at 0.5.2 which is incompatible with client-go 1.18.0 because:

https://github.com/kubernetes-sigs/controller-runtime/blob/release-0.5/pkg/metrics/client_go_adapter.go#L133 doesn't match https://github.com/kubernetes/client-go/blob/8e91b7aa91b1ac2ad5d144bd602f01d7daa7d187/tools/metrics/metrics.go#L73

This has been fixed, but there's no new release of controller-runtime yet, so using this SHA makes everything compatible. When 0.5.3 is released, we should update.


Patch:
diff --git a/.github/workflows/tagged-release.yaml b/.github/workflows/tagged-release.yaml
index e7bfcef1..5299786b 100644
--- a/.github/workflows/tagged-release.yaml
+++ b/.github/workflows/tagged-release.yaml
@@ -9,7 +9,7 @@ jobs:
     steps:
       - uses: actions/setup-go@v1
         with:
-          go-version: "1.12.14"
+          go-version: "1.14.1"
       - name: setup goenv
         run: |
           echo "::set-env name=GOPATH::$(go env GOPATH)"
@@ -93,7 +93,7 @@ jobs:
         run: git fetch --prune --unshallow
       - uses: actions/setup-go@v1
         with:
-          go-version: "1.12.14"
+          go-version: "1.14.1"
       - uses: azure/docker-login@v1
         with:
           username: schemaherodeploy
diff --git a/Makefile b/Makefile
index 592abe9d..325dcdb0 100644
--- a/Makefile
+++ b/Makefile
@@ -71,8 +71,16 @@ deploy: manifests
 
 .PHONY: manifests
 manifests: controller-gen
-	$(CONTROLLER_GEN) rbac:roleName=manager-role webhook crd:crdVersions=v1beta1 output:crd:artifacts:config=config/crds/v1beta1 paths="./..."
-	$(CONTROLLER_GEN) rbac:roleName=manager-role webhook crd:crdVersions=v1 output:crd:artifacts:config=config/crds/v1 paths="./..."
+	$(CONTROLLER_GEN) \
+		rbac:roleName=manager-role webhook \
+		crd:crdVersions=v1beta1 \
+		output:crd:artifacts:config=config/crds/v1beta1 \
+		paths="./..."
+	$(CONTROLLER_GEN) \
+		rbac:roleName=manager-role webhook \
+		crd:crdVersions=v1 \
+		output:crd:artifacts:config=config/crds/v1 \
+		paths="./..."
 	go run ./generate/...
 
 .PHONY: fmt
@@ -86,8 +94,8 @@ vet:
 .PHONY: generate
 generate: controller-gen client-gen
 	$(CONTROLLER_GEN) object:headerFile=./hack/boilerplate.go.txt paths=./pkg/apis/...
-	$(CLIENT_GEN) -\
-		-output-package=github.com/schemahero/schemahero/pkg/client \
+	$(CLIENT_GEN) \
+		--output-package=github.com/schemahero/schemahero/pkg/client \
 		--clientset-name schemaheroclientset \
 		--input-base github.com/schemahero/schemahero/pkg/apis \
 		--input databases/v1alpha3 \
@@ -127,16 +135,16 @@ kotsimages: bin/schemahero bin/kubectl-schemahero manager
 .PHONY: contoller-gen
 controller-gen:
 ifeq (, $(shell which controller-gen))
-	go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.2.4
+	go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.2.8
 CONTROLLER_GEN=$(shell go env GOPATH)/bin/controller-gen
 else
-CONTROLLER_GEN=$(shell which controller-gen)
+CONTROLLER_GEN=$(shell which controller-mangwegen)
 endif
 
 .PHONY: client-gen
 client-gen:
 ifeq (, $(shell which client-gen))
-	go get k8s.io/code-generator/cmd/client-gen@kubernetes-1.16.4
+	go get k8s.io/code-generator/cmd/client-gen@kubernetes-1.18.0
 CLIENT_GEN=$(shell go env GOPATH)/bin/client-gen
 else
 CLIENT_GEN=$(shell which client-gen)
diff --git a/cmd/manager/main.go b/cmd/manager/main.go
index b1b22e22..8312af12 100644
--- a/cmd/manager/main.go
+++ b/cmd/manager/main.go
@@ -28,7 +28,7 @@ import (
 	_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
 	"sigs.k8s.io/controller-runtime/pkg/client/config"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
-	"sigs.k8s.io/controller-runtime/pkg/runtime/signals"
+	"sigs.k8s.io/controller-runtime/pkg/manager/signals"
 )
 
 func main() {
diff --git a/config/crds/v1/databases.schemahero.io_databases.yaml b/config/crds/v1/databases.schemahero.io_databases.yaml
index a7280fcb..c2554e90 100644
--- a/config/crds/v1/databases.schemahero.io_databases.yaml
+++ b/config/crds/v1/databases.schemahero.io_databases.yaml
@@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: databases.databases.schemahero.io
 spec:
diff --git a/config/crds/v1/schemas.schemahero.io_migrations.yaml b/config/crds/v1/schemas.schemahero.io_migrations.yaml
index 789b6e59..0ad89e98 100644
--- a/config/crds/v1/schemas.schemahero.io_migrations.yaml
+++ b/config/crds/v1/schemas.schemahero.io_migrations.yaml
@@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: migrations.schemas.schemahero.io
 spec:
diff --git a/config/crds/v1/schemas.schemahero.io_tables.yaml b/config/crds/v1/schemas.schemahero.io_tables.yaml
index 84e150d4..90ac1d25 100644
--- a/config/crds/v1/schemas.schemahero.io_tables.yaml
+++ b/config/crds/v1/schemas.schemahero.io_tables.yaml
@@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: tables.schemas.schemahero.io
 spec:
diff --git a/config/crds/v1beta1/databases.schemahero.io_databases.yaml b/config/crds/v1beta1/databases.schemahero.io_databases.yaml
index c4645a35..afa85f45 100644
--- a/config/crds/v1beta1/databases.schemahero.io_databases.yaml
+++ b/config/crds/v1beta1/databases.schemahero.io_databases.yaml
@@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: databases.databases.schemahero.io
 spec:
diff --git a/config/crds/v1beta1/schemas.schemahero.io_migrations.yaml b/config/crds/v1beta1/schemas.schemahero.io_migrations.yaml
index 2146d156..5ea7a91a 100644
--- a/config/crds/v1beta1/schemas.schemahero.io_migrations.yaml
+++ b/config/crds/v1beta1/schemas.schemahero.io_migrations.yaml
@@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: migrations.schemas.schemahero.io
 spec:
diff --git a/config/crds/v1beta1/schemas.schemahero.io_tables.yaml b/config/crds/v1beta1/schemas.schemahero.io_tables.yaml
index 1b6759e4..424bb044 100644
--- a/config/crds/v1beta1/schemas.schemahero.io_tables.yaml
+++ b/config/crds/v1beta1/schemas.schemahero.io_tables.yaml
@@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: tables.schemas.schemahero.io
 spec:
diff --git a/config/dev/github/projects.yaml b/config/dev/github/projects.yaml
deleted file mode 100644
index 2ed8a655..00000000
--- a/config/dev/github/projects.yaml
+++ /dev/null
@@ -1,20 +0,0 @@
-database: testdb
-name: projects
-requires: []
-schema:
-  postgres:
-    primaryKey: [id]
-    foreignKeys:
-      - columns:
-          - id
-        references:
-          table: users
-          columns:
-            - id
-    columns:
-      - name: id
-        type: integer
-      - name: name
-        type: varchar(255)
-      - name: user_id
-        type: integer
diff --git a/config/dev/github/users-table-pg.yaml b/config/dev/github/users-table-pg.yaml
index e55bcbb4..52e168c3 100644
--- a/config/dev/github/users-table-pg.yaml
+++ b/config/dev/github/users-table-pg.yaml
@@ -17,7 +17,3 @@ spec:
           type: varchar(255)
         - name: description
           type: text
-        - name: someone
-          type: text[]
-        - name: it
-          type: int
diff --git a/config/dev/github/users.yaml b/config/dev/github/users.yaml
deleted file mode 100644
index b96630aa..00000000
--- a/config/dev/github/users.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-database: testdb
-name: users
-requires: []
-schema:
-  postgres:
-    primaryKey: [id]
-    columns:
-      - name: id
-        type: integer
-      - name: login
-        type: varchar(255)
-      - name: name
-        type: varchar(255)
-
-
diff --git a/go.mod b/go.mod
index 661cb477..2b266b27 100644
--- a/go.mod
+++ b/go.mod
@@ -8,30 +8,26 @@ require (
 	github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
 	github.com/hashicorp/golang-lru v0.5.3 // indirect
 	github.com/lib/pq v1.1.1
-	github.com/onsi/gomega v1.7.0
+	github.com/onsi/gomega v1.8.1
 	github.com/pkg/errors v0.8.1
-	github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect
 	github.com/spf13/cobra v0.0.5
 	github.com/spf13/viper v1.4.0
 	github.com/stretchr/testify v1.4.0
-	github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf
-	github.com/ventu-io/go-shortid v0.0.0-20171029131806-771a37caa5cf
 	github.com/xo/dburl v0.0.0-20190203050942-98997a05b24f
 	go.uber.org/zap v1.10.0
-	golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586
 	golang.org/x/net v0.0.0-20191004110552-13f9640d40b9
-	golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 // indirect
-	gopkg.in/square/go-jose.v2 v2.3.0 // indirect
-	gopkg.in/src-d/go-git.v4 v4.13.1
-	gopkg.in/yaml.v2 v2.2.4
-	k8s.io/api v0.17.0
-	k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783
-	k8s.io/apimachinery v0.17.0
-	k8s.io/cli-runtime v0.17.0
-	k8s.io/client-go v0.17.0
-	k8s.io/code-generator v0.16.5-beta.1 // indirect
-	sigs.k8s.io/controller-runtime v0.4.0
-	sigs.k8s.io/controller-tools v0.2.4 // indirect
+	gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e // indirect
+	gopkg.in/yaml.v2 v2.2.8
+	k8s.io/api v0.18.0
+	k8s.io/apiextensions-apiserver v0.18.0
+	k8s.io/apimachinery v0.18.0
+	k8s.io/cli-runtime v0.18.0
+	k8s.io/client-go v0.18.0
+	k8s.io/code-generator v0.18.1-beta.0 // indirect
+	sigs.k8s.io/controller-runtime v0.5.1-0.20200402191424-df180accb901
+	sigs.k8s.io/controller-tools v0.2.8 // indirect
+	sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 // indirect
+
 )
 
 replace github.com/appscode/jsonpatch => github.com/gomodules/jsonpatch v2.0.1+incompatible
diff --git a/go.sum b/go.sum
index c86ef01e..506ba141 100644
--- a/go.sum
+++ b/go.sum
@@ -10,6 +10,7 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB
 github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
 github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
 github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
+github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
@@ -21,32 +22,33 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt
 github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
+github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
+github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
 github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
 github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
+github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
 github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
 github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
@@ -59,25 +61,28 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
+github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
 github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
 github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
 github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
 github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
@@ -91,6 +96,7 @@ github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70t
 github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
 github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
 github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
+github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
 github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
@@ -110,8 +116,10 @@ github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf
 github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
+github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk=
 github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
 github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
+github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
 github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
 github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
@@ -121,6 +129,7 @@ github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8
 github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
+github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
 github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
@@ -129,24 +138,25 @@ github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tF
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
 github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
+github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=
 github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
 github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/gobuffalo/flect v0.1.5 h1:xpKq9ap8MbYfhuPCF0dBH854Gp9CxZjr/IocxELFflo=
-github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80=
+github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM=
+github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I=
 github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk=
 github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
@@ -160,6 +170,8 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
 github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
 github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
+github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -167,19 +179,20 @@ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
+github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk=
 github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
 github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
+github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
-github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
 github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk=
@@ -193,8 +206,6 @@ github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28=
 github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
-github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
@@ -203,7 +214,6 @@ github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46O
 github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@@ -213,7 +223,6 @@ github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
-github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4=
@@ -229,10 +238,13 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM=
 github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
 github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
 github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
@@ -246,22 +258,21 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
 github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
 github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.4.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
 github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw=
+github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34=
+github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
 github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
-github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
 github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
@@ -273,22 +284,23 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
-github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
-github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8=
 github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
+github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
 github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
@@ -296,26 +308,28 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
-github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
 github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
 github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
-github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
@@ -324,41 +338,42 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
-github.com/ventu-io/go-shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:6rZqAOk/eYX5FJyjQJ6Z3RBSN389IXX2ijwW4FcggaM=
-github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
-github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/xo/dburl v0.0.0-20190203050942-98997a05b24f h1:mpE3N7Ao9j/miA6UsIpIsm925lXkff09BVQykBPtP9I=
 github.com/xo/dburl v0.0.0-20190203050942-98997a05b24f/go.mod h1:g6rdekR8vgfVZrkLWfobLTm0kVez7GAN23mWtkGCJ14=
 github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
+go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
+go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
+go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0=
+golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo=
+golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -369,13 +384,11 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
 golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -385,8 +398,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
 golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -401,7 +413,6 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180117170059-2c42eef0765b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -410,22 +421,23 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg=
 golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7 h1:HmbHVPwrPEKPGLAcHSrMe6+hqSUlvZU0rab6x5EXfGU=
+golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -434,6 +446,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
 golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@@ -441,8 +454,7 @@ golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3
 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
+golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws=
 golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc=
@@ -455,92 +467,112 @@ gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmK
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
 gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
-gopkg.in/square/go-jose.v2 v2.3.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
-gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98=
-gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g=
-gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
 gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
-gopkg.in/yaml.v2 v2.0.0/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966 h1:B0J02caTR6tpSJozBJyiAzT6CtBzjclw4pgm9gg8Ys0=
 gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-k8s.io/api v0.0.0-20190918155943-95b840bb6a1f/go.mod h1:uWuOHnjmNrtQomJrvEBg0c0HRNyQ+8KTEERVsK0PW48=
-k8s.io/api v0.17.0 h1:H9d/lw+VkZKEVIUc8F3wgiQ+FUXTTr21M87jXLU7yqM=
 k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI=
-k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783 h1:V6ndwCPoao1yZ52agqOKaUAl7DYWVGiXjV7ePA2i610=
-k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY=
-k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4=
-k8s.io/apimachinery v0.17.0 h1:xRBnuie9rXcPxUkDizUsGvPf1cnlZCFu210op7J7LJo=
+k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4=
+k8s.io/api v0.18.0 h1:lwYk8Vt7rsVTwjRU6pzEsa9YNhThbmbocQlKvNBB4EQ=
+k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8=
+k8s.io/apiextensions-apiserver v0.17.0/go.mod h1:XiIFUakZywkUl54fVXa7QTEHcqQz9HG55nHd1DCoHj8=
+k8s.io/apiextensions-apiserver v0.17.2/go.mod h1:4KdMpjkEjjDI2pPfBA15OscyNldHWdBCfsWMDWAmSTs=
+k8s.io/apiextensions-apiserver v0.18.0 h1:HN4/P8vpGZFvB5SOMuPPH2Wt9Y/ryX+KRvIyAkchu1Q=
+k8s.io/apiextensions-apiserver v0.18.0/go.mod h1:18Cwn1Xws4xnWQNC00FLq1E350b9lUF+aOdIWDOZxgo=
 k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg=
-k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg=
-k8s.io/cli-runtime v0.17.0 h1:XEuStbJBHCQlEKFyTQmceDKEWOSYHZkcYWKp3SsQ9Hk=
-k8s.io/cli-runtime v0.17.0/go.mod h1:1E5iQpMODZq2lMWLUJELwRu2MLWIzwvMgDBpn3Y81Qo=
-k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90/go.mod h1:J69/JveO6XESwVgG53q3Uz5OSfgsv4uxpScmmyYOOlk=
-k8s.io/client-go v0.17.0 h1:8QOGvUGdqDMFrm9sD6IUFl256BcffynGoe80sxgTEDg=
+k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg=
+k8s.io/apimachinery v0.18.0 h1:fuPfYpk3cs1Okp/515pAf0dNhL66+8zk8RLbSX+EgAE=
+k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
+k8s.io/apiserver v0.17.0/go.mod h1:ABM+9x/prjINN6iiffRVNCBR2Wk7uY4z+EtEGZD48cg=
+k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo=
+k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw=
+k8s.io/cli-runtime v0.18.0 h1:jG8XpSqQ5TrV0N+EZ3PFz6+gqlCk71dkggWCCq9Mq34=
+k8s.io/cli-runtime v0.18.0/go.mod h1:1eXfmBsIJosjn9LjEBUd2WVPoPAY9XGTqTFcPMIBsUQ=
 k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k=
-k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE=
-k8s.io/code-generator v0.16.5-beta.1 h1:+zWxMQH3a6fd8lZe6utWyW/V7nmG2ZMXwtovSJI2p+0=
-k8s.io/code-generator v0.16.5-beta.1/go.mod h1:mJUgkl06XV4kstAnLHAIzJPVCOzVR+ZcfPIv4fUsFCY=
-k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA=
+k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI=
+k8s.io/client-go v0.18.0 h1:yqKw4cTUQraZK3fcVCMeSa+lqKwcjZ5wtcOIPnxQno4=
+k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8=
+k8s.io/code-generator v0.17.0/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s=
+k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s=
+k8s.io/code-generator v0.18.0 h1:0xIRWzym+qMgVpGmLESDeMfz/orwgxwxFFAo1xfGNtQ=
+k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
+k8s.io/code-generator v0.18.1-beta.0 h1:T87V5TNhNuceelOI55/0jTuNqinWyEyjcHvCescogzA=
+k8s.io/code-generator v0.18.1-beta.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
+k8s.io/component-base v0.17.0/go.mod h1:rKuRAokNMY2nn2A6LP/MiwpoaMRHpfRnrPaUJJj1Yoc=
+k8s.io/component-base v0.17.2/go.mod h1:zMPW3g5aH7cHJpKYQ/ZsGMcgbsA/VyhEugF3QT1awLs=
+k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c=
 k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
-k8s.io/gengo v0.0.0-20190822140433-26a664648505 h1:ZY6yclUKVbZ+SdWnkfY+Je5vrMpKOxmGeKRbsXVmqYM=
 k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/gengo v0.0.0-20200114144118-36b2048a9120 h1:RPscN6KhmG54S33L+lr3GS+oD1jmchIU0ll519K6FA4=
+k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
-k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
 k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
 k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
-k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
-k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU=
 k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
-k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
+k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c h1:/KUFqjjqAcY4Us6luF5RDNZ16KJtb49HfR3ZHB9qYXM=
+k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
 k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo=
 k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
+k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU=
+k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
 modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
 modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
 modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
 modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=
 modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=
-sigs.k8s.io/controller-runtime v0.4.0 h1:wATM6/m+3w8lj8FXNaO6Fs/rq/vqoOjO1Q116Z9NPsg=
-sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns=
-sigs.k8s.io/controller-tools v0.2.4 h1:la1h46EzElvWefWLqfsXrnsO3lZjpkI0asTpX6h8PLA=
-sigs.k8s.io/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3LtJvd/jIzA=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0=
+sigs.k8s.io/controller-runtime v0.5.1-0.20200402191424-df180accb901 h1:qwHvTyQQBjATQeKPdJ0TwcXdtScjyI6GuiAQ5CSqEvM=
+sigs.k8s.io/controller-runtime v0.5.1-0.20200402191424-df180accb901/go.mod h1:j4echH3Y/UPHRpXS65rxGXujda8iWOheMQvDh1uNgaY=
+sigs.k8s.io/controller-runtime v0.5.2 h1:pyXbUfoTo+HA3jeIfr0vgi+1WtmNh0CwlcnQGLXwsSw=
+sigs.k8s.io/controller-runtime v0.5.2/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A=
+sigs.k8s.io/controller-tools v0.2.8 h1:UmYsnu89dn8/wBhjKL3lkGyaDGRnPDYUx2+iwXRnylA=
+sigs.k8s.io/controller-tools v0.2.8/go.mod h1:9VKHPszmf2DHz/QmHkcfZoewO6BL7pPs9uAiBVsaJSE=
 sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0=
 sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
 sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
-sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA=
-sigs.k8s.io/testing_frameworks v0.1.2 h1:vK0+tvjF0BZ/RYFeZ1E6BYBwHJJXhjuZ3TdsEKH+UQM=
-sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w=
+sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 h1:zD2IemQ4LmOcAumeiyDWXKUI2SO0NYDe3H6QGvPOVgU=
+sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18=
+sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
+sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E=
+sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
 sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
diff --git a/pkg/cli/schemaherokubectlcli/approve_migration.go b/pkg/cli/schemaherokubectlcli/approve_migration.go
index ed2efa9a..fa738444 100644
--- a/pkg/cli/schemaherokubectlcli/approve_migration.go
+++ b/pkg/cli/schemaherokubectlcli/approve_migration.go
@@ -1,6 +1,7 @@
 package schemaherokubectlcli
 
 import (
+	"context"
 	"fmt"
 	"time"
 
@@ -27,6 +28,7 @@ func ApproveMigrationCmd() *cobra.Command {
 		},
 		RunE: func(cmd *cobra.Command, args []string) error {
 			v := viper.GetViper()
+			ctx := context.Background()
 			migrationName := args[0]
 
 			cfg, err := config.GetConfig()
@@ -47,7 +49,7 @@ func ApproveMigrationCmd() *cobra.Command {
 			namespaceNames := []string{}
 
 			if viper.GetBool("all-namespaces") {
-				namespaces, err := client.CoreV1().Namespaces().List(metav1.ListOptions{})
+				namespaces, err := client.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
 				if err != nil {
 					return err
 				}
@@ -64,7 +66,7 @@ func ApproveMigrationCmd() *cobra.Command {
 			}
 
 			for _, namespaceName := range namespaceNames {
-				migration, err := schemasClient.Migrations(namespaceName).Get(migrationName, metav1.GetOptions{})
+				migration, err := schemasClient.Migrations(namespaceName).Get(ctx, migrationName, metav1.GetOptions{})
 				if kuberneteserrors.IsNotFound(err) {
 					// continue to the next namespace
 					continue
@@ -74,7 +76,7 @@ func ApproveMigrationCmd() *cobra.Command {
 				}
 
 				migration.Status.ApprovedAt = time.Now().Unix()
-				if _, err := schemasClient.Migrations(namespaceName).Update(migration); err != nil {
+				if _, err := schemasClient.Migrations(namespaceName).Update(ctx, migration, metav1.UpdateOptions{}); err != nil {
 					return err
 				}
 
diff --git a/pkg/cli/schemaherokubectlcli/describe_migration.go b/pkg/cli/schemaherokubectlcli/describe_migration.go
index 8e6dddb1..f4cfe927 100644
--- a/pkg/cli/schemaherokubectlcli/describe_migration.go
+++ b/pkg/cli/schemaherokubectlcli/describe_migration.go
@@ -1,6 +1,7 @@
 package schemaherokubectlcli
 
 import (
+	"context"
 	"fmt"
 	"time"
 
@@ -27,6 +28,7 @@ func DescribeMigrationCmd() *cobra.Command {
 		},
 		RunE: func(cmd *cobra.Command, args []string) error {
 			v := viper.GetViper()
+			ctx := context.Background()
 			migrationName := args[0]
 
 			cfg, err := config.GetConfig()
@@ -47,7 +49,7 @@ func DescribeMigrationCmd() *cobra.Command {
 			namespaceNames := []string{}
 
 			if viper.GetBool("all-namespaces") {
-				namespaces, err := client.CoreV1().Namespaces().List(metav1.ListOptions{})
+				namespaces, err := client.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
 				if err != nil {
 					return err
 				}
@@ -64,7 +66,7 @@ func DescribeMigrationCmd() *cobra.Command {
 			}
 
 			for _, namespaceName := range namespaceNames {
-				foundMigration, err := schemasClient.Migrations(namespaceName).Get(migrationName, metav1.GetOptions{})
+				foundMigration, err := schemasClient.Migrations(namespaceName).Get(ctx, migrationName, metav1.GetOptions{})
 				if kuberneteserrors.IsNotFound(err) {
 					// next namespace
 					continue
diff --git a/pkg/cli/schemaherokubectlcli/get_databases.go b/pkg/cli/schemaherokubectlcli/get_databases.go
index 96c93a26..1e0b5f69 100644
--- a/pkg/cli/schemaherokubectlcli/get_databases.go
+++ b/pkg/cli/schemaherokubectlcli/get_databases.go
@@ -1,6 +1,7 @@
 package schemaherokubectlcli
 
 import (
+	"context"
 	"fmt"
 	"os"
 	"text/tabwriter"
@@ -24,6 +25,8 @@ func GetDatabasesCmd() *cobra.Command {
 			viper.BindPFlags(cmd.Flags())
 		},
 		RunE: func(cmd *cobra.Command, args []string) error {
+			ctx := context.Background()
+
 			cfg, err := config.GetConfig()
 			if err != nil {
 				return err
@@ -39,7 +42,7 @@ func GetDatabasesCmd() *cobra.Command {
 				return err
 			}
 
-			namespaces, err := client.CoreV1().Namespaces().List(metav1.ListOptions{})
+			namespaces, err := client.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
 			if err != nil {
 				return err
 			}
@@ -47,7 +50,7 @@ func GetDatabasesCmd() *cobra.Command {
 			matchingDatabases := []databasesv1alpha3.Database{}
 
 			for _, namespace := range namespaces.Items {
-				databases, err := databasesClient.Databases(namespace.Name).List(metav1.ListOptions{})
+				databases, err := databasesClient.Databases(namespace.Name).List(ctx, metav1.ListOptions{})
 				if err != nil {
 					return err
 				}
diff --git a/pkg/cli/schemaherokubectlcli/get_migrations.go b/pkg/cli/schemaherokubectlcli/get_migrations.go
index 4533b4be..2d7ab7cf 100644
--- a/pkg/cli/schemaherokubectlcli/get_migrations.go
+++ b/pkg/cli/schemaherokubectlcli/get_migrations.go
@@ -1,6 +1,7 @@
 package schemaherokubectlcli
 
 import (
+	"context"
 	"fmt"
 	"os"
 	"text/tabwriter"
@@ -26,6 +27,8 @@ func GetMigrationsCmd() *cobra.Command {
 		},
 		RunE: func(cmd *cobra.Command, args []string) error {
 			v := viper.GetViper()
+			ctx := context.Background()
+
 			databaseNameFilter := v.GetString("database")
 
 			cfg, err := config.GetConfig()
@@ -46,7 +49,7 @@ func GetMigrationsCmd() *cobra.Command {
 			namespaceNames := []string{}
 
 			if viper.GetBool("all-namespaces") {
-				namespaces, err := client.CoreV1().Namespaces().List(metav1.ListOptions{})
+				namespaces, err := client.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
 				if err != nil {
 					return err
 				}
@@ -64,7 +67,7 @@ func GetMigrationsCmd() *cobra.Command {
 
 			matchingMigrations := []schemasv1alpha3.Migration{}
 			for _, namespaceName := range namespaceNames {
-				migrations, err := schemasClient.Migrations(namespaceName).List(metav1.ListOptions{})
+				migrations, err := schemasClient.Migrations(namespaceName).List(ctx, metav1.ListOptions{})
 				if err != nil {
 					return err
 				}
@@ -75,7 +78,7 @@ func GetMigrationsCmd() *cobra.Command {
 						continue
 					}
 
-					table, err := schemasClient.Tables(migration.Spec.TableNamespace).Get(migration.Spec.TableName, metav1.GetOptions{})
+					table, err := schemasClient.Tables(migration.Spec.TableNamespace).Get(ctx, migration.Spec.TableName, metav1.GetOptions{})
 					if err != nil {
 						return err
 					}
diff --git a/pkg/cli/schemaherokubectlcli/get_tables.go b/pkg/cli/schemaherokubectlcli/get_tables.go
index 44dd13a3..b1f6c0a3 100644
--- a/pkg/cli/schemaherokubectlcli/get_tables.go
+++ b/pkg/cli/schemaherokubectlcli/get_tables.go
@@ -1,6 +1,7 @@
 package schemaherokubectlcli
 
 import (
+	"context"
 	"fmt"
 	"os"
 	"text/tabwriter"
@@ -25,6 +26,8 @@ func GetTablesCmd() *cobra.Command {
 		},
 		RunE: func(cmd *cobra.Command, args []string) error {
 			v := viper.GetViper()
+			ctx := context.Background()
+
 			databaseNameFilter := v.GetString("database")
 
 			cfg, err := config.GetConfig()
@@ -42,7 +45,7 @@ func GetTablesCmd() *cobra.Command {
 				return err
 			}
 
-			namespaces, err := client.CoreV1().Namespaces().List(metav1.ListOptions{})
+			namespaces, err := client.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
 			if err != nil {
 				return err
 			}
@@ -50,7 +53,7 @@ func GetTablesCmd() *cobra.Command {
 			matchingTables := []schemasv1alpha3.Table{}
 
 			for _, namespace := range namespaces.Items {
-				tables, err := schemasClient.Tables(namespace.Name).List(metav1.ListOptions{})
+				tables, err := schemasClient.Tables(namespace.Name).List(ctx, metav1.ListOptions{})
 				if err != nil {
 					return err
 				}
diff --git a/pkg/client/schemaheroclientset/clientset.go b/pkg/client/schemaheroclientset/clientset.go
index 88dbc16a..9d36f5ed 100644
--- a/pkg/client/schemaheroclientset/clientset.go
+++ b/pkg/client/schemaheroclientset/clientset.go
@@ -66,7 +66,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) {
 	configShallowCopy := *c
 	if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
 		if configShallowCopy.Burst <= 0 {
-			return nil, fmt.Errorf("Burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0")
+			return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0")
 		}
 		configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
 	}
diff --git a/pkg/client/schemaheroclientset/typed/databases/v1alpha3/database.go b/pkg/client/schemaheroclientset/typed/databases/v1alpha3/database.go
index 9ea4898c..248a6a3b 100644
--- a/pkg/client/schemaheroclientset/typed/databases/v1alpha3/database.go
+++ b/pkg/client/schemaheroclientset/typed/databases/v1alpha3/database.go
@@ -18,6 +18,7 @@ limitations under the License.
 package v1alpha3
 
 import (
+	"context"
 	"time"
 
 	v1alpha3 "github.com/schemahero/schemahero/pkg/apis/databases/v1alpha3"
@@ -36,15 +37,15 @@ type DatabasesGetter interface {
 
 // DatabaseInterface has methods to work with Database resources.
 type DatabaseInterface interface {
-	Create(*v1alpha3.Database) (*v1alpha3.Database, error)
-	Update(*v1alpha3.Database) (*v1alpha3.Database, error)
-	UpdateStatus(*v1alpha3.Database) (*v1alpha3.Database, error)
-	Delete(name string, options *v1.DeleteOptions) error
-	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
-	Get(name string, options v1.GetOptions) (*v1alpha3.Database, error)
-	List(opts v1.ListOptions) (*v1alpha3.DatabaseList, error)
-	Watch(opts v1.ListOptions) (watch.Interface, error)
-	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Database, err error)
+	Create(ctx context.Context, database *v1alpha3.Database, opts v1.CreateOptions) (*v1alpha3.Database, error)
+	Update(ctx context.Context, database *v1alpha3.Database, opts v1.UpdateOptions) (*v1alpha3.Database, error)
+	UpdateStatus(ctx context.Context, database *v1alpha3.Database, opts v1.UpdateOptions) (*v1alpha3.Database, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha3.Database, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha3.DatabaseList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.Database, err error)
 	DatabaseExpansion
 }
 
@@ -63,20 +64,20 @@ func newDatabases(c *DatabasesV1alpha3Client, namespace string) *databases {
 }
 
 // Get takes name of the database, and returns the corresponding database object, and an error if there is any.
-func (c *databases) Get(name string, options v1.GetOptions) (result *v1alpha3.Database, err error) {
+func (c *databases) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha3.Database, err error) {
 	result = &v1alpha3.Database{}
 	err = c.client.Get().
 		Namespace(c.ns).
 		Resource("databases").
 		Name(name).
 		VersionedParams(&options, scheme.ParameterCodec).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // List takes label and field selectors, and returns the list of Databases that match those selectors.
-func (c *databases) List(opts v1.ListOptions) (result *v1alpha3.DatabaseList, err error) {
+func (c *databases) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha3.DatabaseList, err error) {
 	var timeout time.Duration
 	if opts.TimeoutSeconds != nil {
 		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -87,13 +88,13 @@ func (c *databases) List(opts v1.ListOptions) (result *v1alpha3.DatabaseList, er
 		Resource("databases").
 		VersionedParams(&opts, scheme.ParameterCodec).
 		Timeout(timeout).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // Watch returns a watch.Interface that watches the requested databases.
-func (c *databases) Watch(opts v1.ListOptions) (watch.Interface, error) {
+func (c *databases) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
 	var timeout time.Duration
 	if opts.TimeoutSeconds != nil {
 		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -104,87 +105,90 @@ func (c *databases) Watch(opts v1.ListOptions) (watch.Interface, error) {
 		Resource("databases").
 		VersionedParams(&opts, scheme.ParameterCodec).
 		Timeout(timeout).
-		Watch()
+		Watch(ctx)
 }
 
 // Create takes the representation of a database and creates it.  Returns the server's representation of the database, and an error, if there is any.
-func (c *databases) Create(database *v1alpha3.Database) (result *v1alpha3.Database, err error) {
+func (c *databases) Create(ctx context.Context, database *v1alpha3.Database, opts v1.CreateOptions) (result *v1alpha3.Database, err error) {
 	result = &v1alpha3.Database{}
 	err = c.client.Post().
 		Namespace(c.ns).
 		Resource("databases").
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(database).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // Update takes the representation of a database and updates it. Returns the server's representation of the database, and an error, if there is any.
-func (c *databases) Update(database *v1alpha3.Database) (result *v1alpha3.Database, err error) {
+func (c *databases) Update(ctx context.Context, database *v1alpha3.Database, opts v1.UpdateOptions) (result *v1alpha3.Database, err error) {
 	result = &v1alpha3.Database{}
 	err = c.client.Put().
 		Namespace(c.ns).
 		Resource("databases").
 		Name(database.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(database).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // UpdateStatus was generated because the type contains a Status member.
 // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-
-func (c *databases) UpdateStatus(database *v1alpha3.Database) (result *v1alpha3.Database, err error) {
+func (c *databases) UpdateStatus(ctx context.Context, database *v1alpha3.Database, opts v1.UpdateOptions) (result *v1alpha3.Database, err error) {
 	result = &v1alpha3.Database{}
 	err = c.client.Put().
 		Namespace(c.ns).
 		Resource("databases").
 		Name(database.Name).
 		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(database).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // Delete takes name of the database and deletes it. Returns an error if one occurs.
-func (c *databases) Delete(name string, options *v1.DeleteOptions) error {
+func (c *databases) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
 	return c.client.Delete().
 		Namespace(c.ns).
 		Resource("databases").
 		Name(name).
-		Body(options).
-		Do().
+		Body(&opts).
+		Do(ctx).
 		Error()
 }
 
 // DeleteCollection deletes a collection of objects.
-func (c *databases) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+func (c *databases) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
 	var timeout time.Duration
-	if listOptions.TimeoutSeconds != nil {
-		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+	if listOpts.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
 	}
 	return c.client.Delete().
 		Namespace(c.ns).
 		Resource("databases").
-		VersionedParams(&listOptions, scheme.ParameterCodec).
+		VersionedParams(&listOpts, scheme.ParameterCodec).
 		Timeout(timeout).
-		Body(options).
-		Do().
+		Body(&opts).
+		Do(ctx).
 		Error()
 }
 
 // Patch applies the patch and returns the patched database.
-func (c *databases) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Database, err error) {
+func (c *databases) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.Database, err error) {
 	result = &v1alpha3.Database{}
 	err = c.client.Patch(pt).
 		Namespace(c.ns).
 		Resource("databases").
-		SubResource(subresources...).
 		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(data).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
diff --git a/pkg/client/schemaheroclientset/typed/databases/v1alpha3/fake/fake_database.go b/pkg/client/schemaheroclientset/typed/databases/v1alpha3/fake/fake_database.go
index fc0656ae..b1440e57 100644
--- a/pkg/client/schemaheroclientset/typed/databases/v1alpha3/fake/fake_database.go
+++ b/pkg/client/schemaheroclientset/typed/databases/v1alpha3/fake/fake_database.go
@@ -18,6 +18,8 @@ limitations under the License.
 package fake
 
 import (
+	"context"
+
 	v1alpha3 "github.com/schemahero/schemahero/pkg/apis/databases/v1alpha3"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	labels "k8s.io/apimachinery/pkg/labels"
@@ -38,7 +40,7 @@ var databasesResource = schema.GroupVersionResource{Group: "databases.schemahero
 var databasesKind = schema.GroupVersionKind{Group: "databases.schemahero.io", Version: "v1alpha3", Kind: "Database"}
 
 // Get takes name of the database, and returns the corresponding database object, and an error if there is any.
-func (c *FakeDatabases) Get(name string, options v1.GetOptions) (result *v1alpha3.Database, err error) {
+func (c *FakeDatabases) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha3.Database, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewGetAction(databasesResource, c.ns, name), &v1alpha3.Database{})
 
@@ -49,7 +51,7 @@ func (c *FakeDatabases) Get(name string, options v1.GetOptions) (result *v1alpha
 }
 
 // List takes label and field selectors, and returns the list of Databases that match those selectors.
-func (c *FakeDatabases) List(opts v1.ListOptions) (result *v1alpha3.DatabaseList, err error) {
+func (c *FakeDatabases) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha3.DatabaseList, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewListAction(databasesResource, databasesKind, c.ns, opts), &v1alpha3.DatabaseList{})
 
@@ -71,14 +73,14 @@ func (c *FakeDatabases) List(opts v1.ListOptions) (result *v1alpha3.DatabaseList
 }
 
 // Watch returns a watch.Interface that watches the requested databases.
-func (c *FakeDatabases) Watch(opts v1.ListOptions) (watch.Interface, error) {
+func (c *FakeDatabases) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
 	return c.Fake.
 		InvokesWatch(testing.NewWatchAction(databasesResource, c.ns, opts))
 
 }
 
 // Create takes the representation of a database and creates it.  Returns the server's representation of the database, and an error, if there is any.
-func (c *FakeDatabases) Create(database *v1alpha3.Database) (result *v1alpha3.Database, err error) {
+func (c *FakeDatabases) Create(ctx context.Context, database *v1alpha3.Database, opts v1.CreateOptions) (result *v1alpha3.Database, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewCreateAction(databasesResource, c.ns, database), &v1alpha3.Database{})
 
@@ -89,7 +91,7 @@ func (c *FakeDatabases) Create(database *v1alpha3.Database) (result *v1alpha3.Da
 }
 
 // Update takes the representation of a database and updates it. Returns the server's representation of the database, and an error, if there is any.
-func (c *FakeDatabases) Update(database *v1alpha3.Database) (result *v1alpha3.Database, err error) {
+func (c *FakeDatabases) Update(ctx context.Context, database *v1alpha3.Database, opts v1.UpdateOptions) (result *v1alpha3.Database, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewUpdateAction(databasesResource, c.ns, database), &v1alpha3.Database{})
 
@@ -101,7 +103,7 @@ func (c *FakeDatabases) Update(database *v1alpha3.Database) (result *v1alpha3.Da
 
 // UpdateStatus was generated because the type contains a Status member.
 // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *FakeDatabases) UpdateStatus(database *v1alpha3.Database) (*v1alpha3.Database, error) {
+func (c *FakeDatabases) UpdateStatus(ctx context.Context, database *v1alpha3.Database, opts v1.UpdateOptions) (*v1alpha3.Database, error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewUpdateSubresourceAction(databasesResource, "status", c.ns, database), &v1alpha3.Database{})
 
@@ -112,7 +114,7 @@ func (c *FakeDatabases) UpdateStatus(database *v1alpha3.Database) (*v1alpha3.Dat
 }
 
 // Delete takes name of the database and deletes it. Returns an error if one occurs.
-func (c *FakeDatabases) Delete(name string, options *v1.DeleteOptions) error {
+func (c *FakeDatabases) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
 	_, err := c.Fake.
 		Invokes(testing.NewDeleteAction(databasesResource, c.ns, name), &v1alpha3.Database{})
 
@@ -120,15 +122,15 @@ func (c *FakeDatabases) Delete(name string, options *v1.DeleteOptions) error {
 }
 
 // DeleteCollection deletes a collection of objects.
-func (c *FakeDatabases) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
-	action := testing.NewDeleteCollectionAction(databasesResource, c.ns, listOptions)
+func (c *FakeDatabases) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(databasesResource, c.ns, listOpts)
 
 	_, err := c.Fake.Invokes(action, &v1alpha3.DatabaseList{})
 	return err
 }
 
 // Patch applies the patch and returns the patched database.
-func (c *FakeDatabases) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Database, err error) {
+func (c *FakeDatabases) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.Database, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewPatchSubresourceAction(databasesResource, c.ns, name, pt, data, subresources...), &v1alpha3.Database{})
 
diff --git a/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/fake/fake_migration.go b/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/fake/fake_migration.go
index 1f1f3ffc..4ff256be 100644
--- a/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/fake/fake_migration.go
+++ b/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/fake/fake_migration.go
@@ -18,6 +18,8 @@ limitations under the License.
 package fake
 
 import (
+	"context"
+
 	v1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	labels "k8s.io/apimachinery/pkg/labels"
@@ -38,7 +40,7 @@ var migrationsResource = schema.GroupVersionResource{Group: "schemas.schemahero.
 var migrationsKind = schema.GroupVersionKind{Group: "schemas.schemahero.io", Version: "v1alpha3", Kind: "Migration"}
 
 // Get takes name of the migration, and returns the corresponding migration object, and an error if there is any.
-func (c *FakeMigrations) Get(name string, options v1.GetOptions) (result *v1alpha3.Migration, err error) {
+func (c *FakeMigrations) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha3.Migration, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewGetAction(migrationsResource, c.ns, name), &v1alpha3.Migration{})
 
@@ -49,7 +51,7 @@ func (c *FakeMigrations) Get(name string, options v1.GetOptions) (result *v1alph
 }
 
 // List takes label and field selectors, and returns the list of Migrations that match those selectors.
-func (c *FakeMigrations) List(opts v1.ListOptions) (result *v1alpha3.MigrationList, err error) {
+func (c *FakeMigrations) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha3.MigrationList, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewListAction(migrationsResource, migrationsKind, c.ns, opts), &v1alpha3.MigrationList{})
 
@@ -71,14 +73,14 @@ func (c *FakeMigrations) List(opts v1.ListOptions) (result *v1alpha3.MigrationLi
 }
 
 // Watch returns a watch.Interface that watches the requested migrations.
-func (c *FakeMigrations) Watch(opts v1.ListOptions) (watch.Interface, error) {
+func (c *FakeMigrations) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
 	return c.Fake.
 		InvokesWatch(testing.NewWatchAction(migrationsResource, c.ns, opts))
 
 }
 
 // Create takes the representation of a migration and creates it.  Returns the server's representation of the migration, and an error, if there is any.
-func (c *FakeMigrations) Create(migration *v1alpha3.Migration) (result *v1alpha3.Migration, err error) {
+func (c *FakeMigrations) Create(ctx context.Context, migration *v1alpha3.Migration, opts v1.CreateOptions) (result *v1alpha3.Migration, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewCreateAction(migrationsResource, c.ns, migration), &v1alpha3.Migration{})
 
@@ -89,7 +91,7 @@ func (c *FakeMigrations) Create(migration *v1alpha3.Migration) (result *v1alpha3
 }
 
 // Update takes the representation of a migration and updates it. Returns the server's representation of the migration, and an error, if there is any.
-func (c *FakeMigrations) Update(migration *v1alpha3.Migration) (result *v1alpha3.Migration, err error) {
+func (c *FakeMigrations) Update(ctx context.Context, migration *v1alpha3.Migration, opts v1.UpdateOptions) (result *v1alpha3.Migration, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewUpdateAction(migrationsResource, c.ns, migration), &v1alpha3.Migration{})
 
@@ -101,7 +103,7 @@ func (c *FakeMigrations) Update(migration *v1alpha3.Migration) (result *v1alpha3
 
 // UpdateStatus was generated because the type contains a Status member.
 // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *FakeMigrations) UpdateStatus(migration *v1alpha3.Migration) (*v1alpha3.Migration, error) {
+func (c *FakeMigrations) UpdateStatus(ctx context.Context, migration *v1alpha3.Migration, opts v1.UpdateOptions) (*v1alpha3.Migration, error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewUpdateSubresourceAction(migrationsResource, "status", c.ns, migration), &v1alpha3.Migration{})
 
@@ -112,7 +114,7 @@ func (c *FakeMigrations) UpdateStatus(migration *v1alpha3.Migration) (*v1alpha3.
 }
 
 // Delete takes name of the migration and deletes it. Returns an error if one occurs.
-func (c *FakeMigrations) Delete(name string, options *v1.DeleteOptions) error {
+func (c *FakeMigrations) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
 	_, err := c.Fake.
 		Invokes(testing.NewDeleteAction(migrationsResource, c.ns, name), &v1alpha3.Migration{})
 
@@ -120,15 +122,15 @@ func (c *FakeMigrations) Delete(name string, options *v1.DeleteOptions) error {
 }
 
 // DeleteCollection deletes a collection of objects.
-func (c *FakeMigrations) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
-	action := testing.NewDeleteCollectionAction(migrationsResource, c.ns, listOptions)
+func (c *FakeMigrations) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(migrationsResource, c.ns, listOpts)
 
 	_, err := c.Fake.Invokes(action, &v1alpha3.MigrationList{})
 	return err
 }
 
 // Patch applies the patch and returns the patched migration.
-func (c *FakeMigrations) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Migration, err error) {
+func (c *FakeMigrations) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.Migration, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewPatchSubresourceAction(migrationsResource, c.ns, name, pt, data, subresources...), &v1alpha3.Migration{})
 
diff --git a/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/fake/fake_table.go b/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/fake/fake_table.go
index b4c438ae..1532d9a7 100644
--- a/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/fake/fake_table.go
+++ b/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/fake/fake_table.go
@@ -18,6 +18,8 @@ limitations under the License.
 package fake
 
 import (
+	"context"
+
 	v1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	labels "k8s.io/apimachinery/pkg/labels"
@@ -38,7 +40,7 @@ var tablesResource = schema.GroupVersionResource{Group: "schemas.schemahero.io",
 var tablesKind = schema.GroupVersionKind{Group: "schemas.schemahero.io", Version: "v1alpha3", Kind: "Table"}
 
 // Get takes name of the table, and returns the corresponding table object, and an error if there is any.
-func (c *FakeTables) Get(name string, options v1.GetOptions) (result *v1alpha3.Table, err error) {
+func (c *FakeTables) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha3.Table, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewGetAction(tablesResource, c.ns, name), &v1alpha3.Table{})
 
@@ -49,7 +51,7 @@ func (c *FakeTables) Get(name string, options v1.GetOptions) (result *v1alpha3.T
 }
 
 // List takes label and field selectors, and returns the list of Tables that match those selectors.
-func (c *FakeTables) List(opts v1.ListOptions) (result *v1alpha3.TableList, err error) {
+func (c *FakeTables) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha3.TableList, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewListAction(tablesResource, tablesKind, c.ns, opts), &v1alpha3.TableList{})
 
@@ -71,14 +73,14 @@ func (c *FakeTables) List(opts v1.ListOptions) (result *v1alpha3.TableList, err
 }
 
 // Watch returns a watch.Interface that watches the requested tables.
-func (c *FakeTables) Watch(opts v1.ListOptions) (watch.Interface, error) {
+func (c *FakeTables) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
 	return c.Fake.
 		InvokesWatch(testing.NewWatchAction(tablesResource, c.ns, opts))
 
 }
 
 // Create takes the representation of a table and creates it.  Returns the server's representation of the table, and an error, if there is any.
-func (c *FakeTables) Create(table *v1alpha3.Table) (result *v1alpha3.Table, err error) {
+func (c *FakeTables) Create(ctx context.Context, table *v1alpha3.Table, opts v1.CreateOptions) (result *v1alpha3.Table, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewCreateAction(tablesResource, c.ns, table), &v1alpha3.Table{})
 
@@ -89,7 +91,7 @@ func (c *FakeTables) Create(table *v1alpha3.Table) (result *v1alpha3.Table, err
 }
 
 // Update takes the representation of a table and updates it. Returns the server's representation of the table, and an error, if there is any.
-func (c *FakeTables) Update(table *v1alpha3.Table) (result *v1alpha3.Table, err error) {
+func (c *FakeTables) Update(ctx context.Context, table *v1alpha3.Table, opts v1.UpdateOptions) (result *v1alpha3.Table, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewUpdateAction(tablesResource, c.ns, table), &v1alpha3.Table{})
 
@@ -101,7 +103,7 @@ func (c *FakeTables) Update(table *v1alpha3.Table) (result *v1alpha3.Table, err
 
 // UpdateStatus was generated because the type contains a Status member.
 // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *FakeTables) UpdateStatus(table *v1alpha3.Table) (*v1alpha3.Table, error) {
+func (c *FakeTables) UpdateStatus(ctx context.Context, table *v1alpha3.Table, opts v1.UpdateOptions) (*v1alpha3.Table, error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewUpdateSubresourceAction(tablesResource, "status", c.ns, table), &v1alpha3.Table{})
 
@@ -112,7 +114,7 @@ func (c *FakeTables) UpdateStatus(table *v1alpha3.Table) (*v1alpha3.Table, error
 }
 
 // Delete takes name of the table and deletes it. Returns an error if one occurs.
-func (c *FakeTables) Delete(name string, options *v1.DeleteOptions) error {
+func (c *FakeTables) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
 	_, err := c.Fake.
 		Invokes(testing.NewDeleteAction(tablesResource, c.ns, name), &v1alpha3.Table{})
 
@@ -120,15 +122,15 @@ func (c *FakeTables) Delete(name string, options *v1.DeleteOptions) error {
 }
 
 // DeleteCollection deletes a collection of objects.
-func (c *FakeTables) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
-	action := testing.NewDeleteCollectionAction(tablesResource, c.ns, listOptions)
+func (c *FakeTables) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+	action := testing.NewDeleteCollectionAction(tablesResource, c.ns, listOpts)
 
 	_, err := c.Fake.Invokes(action, &v1alpha3.TableList{})
 	return err
 }
 
 // Patch applies the patch and returns the patched table.
-func (c *FakeTables) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Table, err error) {
+func (c *FakeTables) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.Table, err error) {
 	obj, err := c.Fake.
 		Invokes(testing.NewPatchSubresourceAction(tablesResource, c.ns, name, pt, data, subresources...), &v1alpha3.Table{})
 
diff --git a/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/migration.go b/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/migration.go
index 899a689f..6d3aea51 100644
--- a/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/migration.go
+++ b/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/migration.go
@@ -18,6 +18,7 @@ limitations under the License.
 package v1alpha3
 
 import (
+	"context"
 	"time"
 
 	v1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
@@ -36,15 +37,15 @@ type MigrationsGetter interface {
 
 // MigrationInterface has methods to work with Migration resources.
 type MigrationInterface interface {
-	Create(*v1alpha3.Migration) (*v1alpha3.Migration, error)
-	Update(*v1alpha3.Migration) (*v1alpha3.Migration, error)
-	UpdateStatus(*v1alpha3.Migration) (*v1alpha3.Migration, error)
-	Delete(name string, options *v1.DeleteOptions) error
-	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
-	Get(name string, options v1.GetOptions) (*v1alpha3.Migration, error)
-	List(opts v1.ListOptions) (*v1alpha3.MigrationList, error)
-	Watch(opts v1.ListOptions) (watch.Interface, error)
-	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Migration, err error)
+	Create(ctx context.Context, migration *v1alpha3.Migration, opts v1.CreateOptions) (*v1alpha3.Migration, error)
+	Update(ctx context.Context, migration *v1alpha3.Migration, opts v1.UpdateOptions) (*v1alpha3.Migration, error)
+	UpdateStatus(ctx context.Context, migration *v1alpha3.Migration, opts v1.UpdateOptions) (*v1alpha3.Migration, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha3.Migration, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha3.MigrationList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.Migration, err error)
 	MigrationExpansion
 }
 
@@ -63,20 +64,20 @@ func newMigrations(c *SchemasV1alpha3Client, namespace string) *migrations {
 }
 
 // Get takes name of the migration, and returns the corresponding migration object, and an error if there is any.
-func (c *migrations) Get(name string, options v1.GetOptions) (result *v1alpha3.Migration, err error) {
+func (c *migrations) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha3.Migration, err error) {
 	result = &v1alpha3.Migration{}
 	err = c.client.Get().
 		Namespace(c.ns).
 		Resource("migrations").
 		Name(name).
 		VersionedParams(&options, scheme.ParameterCodec).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // List takes label and field selectors, and returns the list of Migrations that match those selectors.
-func (c *migrations) List(opts v1.ListOptions) (result *v1alpha3.MigrationList, err error) {
+func (c *migrations) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha3.MigrationList, err error) {
 	var timeout time.Duration
 	if opts.TimeoutSeconds != nil {
 		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -87,13 +88,13 @@ func (c *migrations) List(opts v1.ListOptions) (result *v1alpha3.MigrationList,
 		Resource("migrations").
 		VersionedParams(&opts, scheme.ParameterCodec).
 		Timeout(timeout).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // Watch returns a watch.Interface that watches the requested migrations.
-func (c *migrations) Watch(opts v1.ListOptions) (watch.Interface, error) {
+func (c *migrations) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
 	var timeout time.Duration
 	if opts.TimeoutSeconds != nil {
 		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -104,87 +105,90 @@ func (c *migrations) Watch(opts v1.ListOptions) (watch.Interface, error) {
 		Resource("migrations").
 		VersionedParams(&opts, scheme.ParameterCodec).
 		Timeout(timeout).
-		Watch()
+		Watch(ctx)
 }
 
 // Create takes the representation of a migration and creates it.  Returns the server's representation of the migration, and an error, if there is any.
-func (c *migrations) Create(migration *v1alpha3.Migration) (result *v1alpha3.Migration, err error) {
+func (c *migrations) Create(ctx context.Context, migration *v1alpha3.Migration, opts v1.CreateOptions) (result *v1alpha3.Migration, err error) {
 	result = &v1alpha3.Migration{}
 	err = c.client.Post().
 		Namespace(c.ns).
 		Resource("migrations").
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(migration).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // Update takes the representation of a migration and updates it. Returns the server's representation of the migration, and an error, if there is any.
-func (c *migrations) Update(migration *v1alpha3.Migration) (result *v1alpha3.Migration, err error) {
+func (c *migrations) Update(ctx context.Context, migration *v1alpha3.Migration, opts v1.UpdateOptions) (result *v1alpha3.Migration, err error) {
 	result = &v1alpha3.Migration{}
 	err = c.client.Put().
 		Namespace(c.ns).
 		Resource("migrations").
 		Name(migration.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(migration).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // UpdateStatus was generated because the type contains a Status member.
 // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-
-func (c *migrations) UpdateStatus(migration *v1alpha3.Migration) (result *v1alpha3.Migration, err error) {
+func (c *migrations) UpdateStatus(ctx context.Context, migration *v1alpha3.Migration, opts v1.UpdateOptions) (result *v1alpha3.Migration, err error) {
 	result = &v1alpha3.Migration{}
 	err = c.client.Put().
 		Namespace(c.ns).
 		Resource("migrations").
 		Name(migration.Name).
 		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(migration).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // Delete takes name of the migration and deletes it. Returns an error if one occurs.
-func (c *migrations) Delete(name string, options *v1.DeleteOptions) error {
+func (c *migrations) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
 	return c.client.Delete().
 		Namespace(c.ns).
 		Resource("migrations").
 		Name(name).
-		Body(options).
-		Do().
+		Body(&opts).
+		Do(ctx).
 		Error()
 }
 
 // DeleteCollection deletes a collection of objects.
-func (c *migrations) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+func (c *migrations) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
 	var timeout time.Duration
-	if listOptions.TimeoutSeconds != nil {
-		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+	if listOpts.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
 	}
 	return c.client.Delete().
 		Namespace(c.ns).
 		Resource("migrations").
-		VersionedParams(&listOptions, scheme.ParameterCodec).
+		VersionedParams(&listOpts, scheme.ParameterCodec).
 		Timeout(timeout).
-		Body(options).
-		Do().
+		Body(&opts).
+		Do(ctx).
 		Error()
 }
 
 // Patch applies the patch and returns the patched migration.
-func (c *migrations) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Migration, err error) {
+func (c *migrations) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.Migration, err error) {
 	result = &v1alpha3.Migration{}
 	err = c.client.Patch(pt).
 		Namespace(c.ns).
 		Resource("migrations").
-		SubResource(subresources...).
 		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(data).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
diff --git a/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/table.go b/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/table.go
index d2997860..82d823ae 100644
--- a/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/table.go
+++ b/pkg/client/schemaheroclientset/typed/schemas/v1alpha3/table.go
@@ -18,6 +18,7 @@ limitations under the License.
 package v1alpha3
 
 import (
+	"context"
 	"time"
 
 	v1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
@@ -36,15 +37,15 @@ type TablesGetter interface {
 
 // TableInterface has methods to work with Table resources.
 type TableInterface interface {
-	Create(*v1alpha3.Table) (*v1alpha3.Table, error)
-	Update(*v1alpha3.Table) (*v1alpha3.Table, error)
-	UpdateStatus(*v1alpha3.Table) (*v1alpha3.Table, error)
-	Delete(name string, options *v1.DeleteOptions) error
-	DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
-	Get(name string, options v1.GetOptions) (*v1alpha3.Table, error)
-	List(opts v1.ListOptions) (*v1alpha3.TableList, error)
-	Watch(opts v1.ListOptions) (watch.Interface, error)
-	Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Table, err error)
+	Create(ctx context.Context, table *v1alpha3.Table, opts v1.CreateOptions) (*v1alpha3.Table, error)
+	Update(ctx context.Context, table *v1alpha3.Table, opts v1.UpdateOptions) (*v1alpha3.Table, error)
+	UpdateStatus(ctx context.Context, table *v1alpha3.Table, opts v1.UpdateOptions) (*v1alpha3.Table, error)
+	Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+	DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+	Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha3.Table, error)
+	List(ctx context.Context, opts v1.ListOptions) (*v1alpha3.TableList, error)
+	Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+	Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.Table, err error)
 	TableExpansion
 }
 
@@ -63,20 +64,20 @@ func newTables(c *SchemasV1alpha3Client, namespace string) *tables {
 }
 
 // Get takes name of the table, and returns the corresponding table object, and an error if there is any.
-func (c *tables) Get(name string, options v1.GetOptions) (result *v1alpha3.Table, err error) {
+func (c *tables) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha3.Table, err error) {
 	result = &v1alpha3.Table{}
 	err = c.client.Get().
 		Namespace(c.ns).
 		Resource("tables").
 		Name(name).
 		VersionedParams(&options, scheme.ParameterCodec).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // List takes label and field selectors, and returns the list of Tables that match those selectors.
-func (c *tables) List(opts v1.ListOptions) (result *v1alpha3.TableList, err error) {
+func (c *tables) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha3.TableList, err error) {
 	var timeout time.Duration
 	if opts.TimeoutSeconds != nil {
 		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -87,13 +88,13 @@ func (c *tables) List(opts v1.ListOptions) (result *v1alpha3.TableList, err erro
 		Resource("tables").
 		VersionedParams(&opts, scheme.ParameterCodec).
 		Timeout(timeout).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // Watch returns a watch.Interface that watches the requested tables.
-func (c *tables) Watch(opts v1.ListOptions) (watch.Interface, error) {
+func (c *tables) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
 	var timeout time.Duration
 	if opts.TimeoutSeconds != nil {
 		timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -104,87 +105,90 @@ func (c *tables) Watch(opts v1.ListOptions) (watch.Interface, error) {
 		Resource("tables").
 		VersionedParams(&opts, scheme.ParameterCodec).
 		Timeout(timeout).
-		Watch()
+		Watch(ctx)
 }
 
 // Create takes the representation of a table and creates it.  Returns the server's representation of the table, and an error, if there is any.
-func (c *tables) Create(table *v1alpha3.Table) (result *v1alpha3.Table, err error) {
+func (c *tables) Create(ctx context.Context, table *v1alpha3.Table, opts v1.CreateOptions) (result *v1alpha3.Table, err error) {
 	result = &v1alpha3.Table{}
 	err = c.client.Post().
 		Namespace(c.ns).
 		Resource("tables").
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(table).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // Update takes the representation of a table and updates it. Returns the server's representation of the table, and an error, if there is any.
-func (c *tables) Update(table *v1alpha3.Table) (result *v1alpha3.Table, err error) {
+func (c *tables) Update(ctx context.Context, table *v1alpha3.Table, opts v1.UpdateOptions) (result *v1alpha3.Table, err error) {
 	result = &v1alpha3.Table{}
 	err = c.client.Put().
 		Namespace(c.ns).
 		Resource("tables").
 		Name(table.Name).
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(table).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // UpdateStatus was generated because the type contains a Status member.
 // Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-
-func (c *tables) UpdateStatus(table *v1alpha3.Table) (result *v1alpha3.Table, err error) {
+func (c *tables) UpdateStatus(ctx context.Context, table *v1alpha3.Table, opts v1.UpdateOptions) (result *v1alpha3.Table, err error) {
 	result = &v1alpha3.Table{}
 	err = c.client.Put().
 		Namespace(c.ns).
 		Resource("tables").
 		Name(table.Name).
 		SubResource("status").
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(table).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
 
 // Delete takes name of the table and deletes it. Returns an error if one occurs.
-func (c *tables) Delete(name string, options *v1.DeleteOptions) error {
+func (c *tables) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
 	return c.client.Delete().
 		Namespace(c.ns).
 		Resource("tables").
 		Name(name).
-		Body(options).
-		Do().
+		Body(&opts).
+		Do(ctx).
 		Error()
 }
 
 // DeleteCollection deletes a collection of objects.
-func (c *tables) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+func (c *tables) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
 	var timeout time.Duration
-	if listOptions.TimeoutSeconds != nil {
-		timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+	if listOpts.TimeoutSeconds != nil {
+		timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
 	}
 	return c.client.Delete().
 		Namespace(c.ns).
 		Resource("tables").
-		VersionedParams(&listOptions, scheme.ParameterCodec).
+		VersionedParams(&listOpts, scheme.ParameterCodec).
 		Timeout(timeout).
-		Body(options).
-		Do().
+		Body(&opts).
+		Do(ctx).
 		Error()
 }
 
 // Patch applies the patch and returns the patched table.
-func (c *tables) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha3.Table, err error) {
+func (c *tables) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha3.Table, err error) {
 	result = &v1alpha3.Table{}
 	err = c.client.Patch(pt).
 		Namespace(c.ns).
 		Resource("tables").
-		SubResource(subresources...).
 		Name(name).
+		SubResource(subresources...).
+		VersionedParams(&opts, scheme.ParameterCodec).
 		Body(data).
-		Do().
+		Do(ctx).
 		Into(result)
 	return
 }
diff --git a/pkg/controller/migration/lookup.go b/pkg/controller/migration/lookup.go
index 2401c727..2b1b25d6 100644
--- a/pkg/controller/migration/lookup.go
+++ b/pkg/controller/migration/lookup.go
@@ -1,6 +1,8 @@
 package migration
 
 import (
+	"context"
+
 	"github.com/pkg/errors"
 	databasesv1alpha3 "github.com/schemahero/schemahero/pkg/apis/databases/v1alpha3"
 	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
@@ -10,7 +12,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/config"
 )
 
-func tableFromMigration(migration *schemasv1alpha3.Migration) (*schemasv1alpha3.Table, error) {
+func tableFromMigration(ctx context.Context, migration *schemasv1alpha3.Migration) (*schemasv1alpha3.Table, error) {
 	cfg, err := config.GetConfig()
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to get config")
@@ -21,7 +23,7 @@ func tableFromMigration(migration *schemasv1alpha3.Migration) (*schemasv1alpha3.
 		return nil, errors.Wrap(err, "failed to create schemas client")
 	}
 
-	table, err := schemasClient.Tables(migration.Spec.TableNamespace).Get(migration.Spec.TableName, metav1.GetOptions{})
+	table, err := schemasClient.Tables(migration.Spec.TableNamespace).Get(ctx, migration.Spec.TableName, metav1.GetOptions{})
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to get table")
 	}
@@ -29,7 +31,7 @@ func tableFromMigration(migration *schemasv1alpha3.Migration) (*schemasv1alpha3.
 	return table, nil
 }
 
-func databaseFromTable(table *schemasv1alpha3.Table) (*databasesv1alpha3.Database, error) {
+func databaseFromTable(ctx context.Context, table *schemasv1alpha3.Table) (*databasesv1alpha3.Database, error) {
 	cfg, err := config.GetConfig()
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to get config")
@@ -40,7 +42,7 @@ func databaseFromTable(table *schemasv1alpha3.Table) (*databasesv1alpha3.Databas
 		return nil, errors.Wrap(err, "failed to create databases client")
 	}
 
-	database, err := databasesClient.Databases(table.Namespace).Get(table.Spec.Database, metav1.GetOptions{})
+	database, err := databasesClient.Databases(table.Namespace).Get(ctx, table.Spec.Database, metav1.GetOptions{})
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to get database")
 	}
diff --git a/pkg/controller/migration/migration_controller.go b/pkg/controller/migration/migration_controller.go
index 2b3925b5..ce22f2e9 100644
--- a/pkg/controller/migration/migration_controller.go
+++ b/pkg/controller/migration/migration_controller.go
@@ -107,7 +107,7 @@ func (r *ReconcileMigration) Reconcile(request reconcile.Request) (reconcile.Res
 	// so this function is simply an entrypoint that executes the right reconcile loop
 	instance, instanceErr := r.getInstance(request)
 	if instanceErr == nil {
-		result, err := r.reconcileInstance(instance)
+		result, err := r.reconcileInstance(context.Background(), instance)
 		if err != nil {
 			logger.Error(err)
 		}
diff --git a/pkg/controller/migration/objects.go b/pkg/controller/migration/objects.go
index 0fed7742..9d155feb 100644
--- a/pkg/controller/migration/objects.go
+++ b/pkg/controller/migration/objects.go
@@ -6,16 +6,29 @@ import (
 	databasesv1alpha3 "github.com/schemahero/schemahero/pkg/apis/databases/v1alpha3"
 	schemasv1alpha3 "github.com/schemahero/schemahero/pkg/apis/schemas/v1alpha3"
 	corev1 "k8s.io/api/core/v1"
+	apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-func getApplyConfigMap(migrationID string, namespace string, preparedStatement string) (*corev1.ConfigMap, error) {
+func configMapNameForMigration(databaseName string, tableName string, migrationID string) string {
+	configMapName := fmt.Sprintf("%s-%s-%s", databaseName, tableName, migrationID)
+	if len(apimachineryvalidation.NameIsDNSSubdomain(configMapName, false)) > 0 {
+		configMapName = fmt.Sprintf("%s-%s", tableName, migrationID)
+		if len(apimachineryvalidation.NameIsDNSSubdomain(configMapName, false)) > 0 {
+			configMapName = migrationID
+		}
+	}
+
+	return configMapName
+}
+
+func getApplyConfigMap(migrationID string, namespace string, preparedStatement string, tableName string, databaseName string) (*corev1.ConfigMap, error) {
 	data := make(map[string]string)
 	data["ddl.sql"] = preparedStatement
 
 	configMap := &corev1.ConfigMap{
 		ObjectMeta: metav1.ObjectMeta{
-			Name:      migrationID,
+			Name:      configMapNameForMigration(databaseName, tableName, migrationID),
 			Namespace: namespace,
 		},
 		TypeMeta: metav1.TypeMeta{
@@ -98,7 +111,7 @@ func getApplyPod(migrationID string, namespace string, connectionURI string, dat
 					VolumeSource: corev1.VolumeSource{
 						ConfigMap: &corev1.ConfigMapVolumeSource{
 							LocalObjectReference: corev1.LocalObjectReference{
-								Name: migrationID,
+								Name: configMapNameForMigration(database.Name, table.Name, migrationID),
 							},
 						},
 					},
diff --git a/pkg/controller/migration/reconcile.go b/pkg/controller/migration/reconcile.go
index a8df8314..9dc9d42a 100644
--- a/pkg/controller/migration/reconcile.go
+++ b/pkg/controller/migration/reconcile.go
@@ -8,6 +8,8 @@ import (
 	"github.com/schemahero/schemahero/pkg/logger"
 	"go.uber.org/zap"
 	corev1 "k8s.io/api/core/v1"
+	kuberneteserrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/types"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 )
 
@@ -21,42 +23,87 @@ func (r *ReconcileMigration) getInstance(request reconcile.Request) (*schemasv1a
 	return v1alpha3instance, nil
 }
 
-func (r *ReconcileMigration) reconcileInstance(instance *schemasv1alpha3.Migration) (reconcile.Result, error) {
+func (r *ReconcileMigration) reconcileInstance(ctx context.Context, instance *schemasv1alpha3.Migration) (reconcile.Result, error) {
 	logger.Debug("reconciling migration",
 		zap.String("kind", instance.Kind),
 		zap.String("name", instance.Name),
 		zap.String("tableName", instance.Spec.TableName))
 
 	if instance.Status.ApprovedAt > 0 && instance.Status.ExecutedAt == 0 {
-		configMap, err := getApplyConfigMap(instance.Name, instance.Namespace, instance.Spec.GeneratedDDL)
-		if err != nil {
-			return reconcile.Result{}, errors.Wrap(err, "failed to get apply config map")
-		}
-		if err := r.Create(context.Background(), configMap); err != nil {
-			return reconcile.Result{}, errors.Wrap(err, "failed to create config map")
-		}
-
-		table, err := tableFromMigration(instance)
+		table, err := tableFromMigration(ctx, instance)
 		if err != nil {
 			return reconcile.Result{}, errors.Wrap(err, "failed to get table")
 		}
-		database, err := databaseFromTable(table)
+		database, err := databaseFromTable(ctx, table)
 		if err != nil {
 			return reconcile.Result{}, errors.Wrap(err, "failed to get database")
 		}
-
 		connectionURI, err := r.readConnectionURI(database)
 		if err != nil {
 			return reconcile.Result{}, errors.Wrap(err, "failed to get connection uri")
 		}
 
-		pod, err := getApplyPod(instance.Name, instance.Namespace, connectionURI, database, table)
+		desiredConfigMap, err := getApplyConfigMap(instance.Name, instance.Namespace, instance.Spec.GeneratedDDL, table.Name, database.Name)
+		if err != nil {
+			return reconcile.Result{}, errors.Wrap(err, "failed to get apply config map")
+		}
+		var existingConfigMap corev1.ConfigMap
+		configMapChanged := false
+		err = r.Get(ctx, types.NamespacedName{
+			Name:      desiredConfigMap.Name,
+			Namespace: desiredConfigMap.Namespace,
+		}, &existingConfigMap)
+		if kuberneteserrors.IsNotFound(err) {
+			// create it
+			if err := r.Create(ctx, desiredConfigMap); err != nil {
+				return reconcile.Result{}, errors.Wrap(err, "failed to create config map")
+			}
+		} else if err == nil {
+			// update it
+			existingConfigMap.Data = map[string]string{}
+			for k, v := range desiredConfigMap.Data {
+				existingConfigMap.Data[k] = v
+			}
+
+			if err = r.Update(ctx, &existingConfigMap); err != nil {
+				return reconcile.Result{}, errors.Wrap(err, "failed to update config map")
+			}
+			configMapChanged = true
+		} else {
+			// something bad is happening here
+			return reconcile.Result{}, errors.Wrap(err, "failed to check if config map exists")
+		}
+
+		desiredPod, err := getApplyPod(instance.Name, instance.Namespace, connectionURI, database, table)
 		if err != nil {
 			return reconcile.Result{}, errors.Wrap(err, "failed to get apply pod")
 		}
+		var existingPod corev1.Pod
+		err = r.Get(ctx, types.NamespacedName{
+			Name:      desiredPod.Name,
+			Namespace: desiredPod.Namespace,
+		}, &existingPod)
+		if kuberneteserrors.IsNotFound(err) {
+			// create it
+			if err := r.Create(ctx, desiredPod); err != nil {
+				return reconcile.Result{}, errors.Wrap(err, "failed to create apply pod")
+			}
+		} else if err == nil {
+			// maybe update it
+			if configMapChanged {
+				// restart the pod by deleting and recreating
+				logger.Debug("deleting apply pod because config map has changed",
+					zap.String("podName", existingPod.Name))
+				if err = r.Delete(ctx, &existingPod); err != nil {
+					return reconcile.Result{}, errors.Wrap(err, "failed to delete pod")
+				}
 
-		if err := r.Create(context.Background(), pod); err != nil {
-			return reconcile.Result{}, errors.Wrap(err, "failed to create apply pod")
+				// This pod will be recreated later in another exceution of the reconcile loop
+				// we watch pods, and when that above delete completed, the reconcile will happen again
+			}
+		} else {
+			// again, something bad
+			return reconcile.Result{}, errors.Wrap(err, "failed to check if pod exists")
 		}
 
 		return reconcile.Result{}, nil
diff --git a/pkg/controller/table/plan.go b/pkg/controller/table/plan.go
index d95043b4..eac0a37b 100644
--- a/pkg/controller/table/plan.go
+++ b/pkg/controller/table/plan.go
@@ -23,7 +23,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 )
 
-func (r *ReconcileTable) reconcilePod(pod *corev1.Pod) (reconcile.Result, error) {
+func (r *ReconcileTable) reconcilePod(ctx context.Context, pod *corev1.Pod) (reconcile.Result, error) {
 	podLabels := pod.GetObjectMeta().GetLabels()
 	role, ok := podLabels["schemahero-role"]
 	if !ok {
@@ -57,7 +57,7 @@ func (r *ReconcileTable) reconcilePod(pod *corev1.Pod) (reconcile.Result, error)
 
 	podLogOpts := corev1.PodLogOptions{}
 	req := client.CoreV1().Pods(pod.Namespace).GetLogs(pod.Name, &podLogOpts)
-	podLogs, err := req.Stream()
+	podLogs, err := req.Stream(ctx)
 	if err != nil {
 		return reconcile.Result{}, errors.Wrap(err, "failed to open log stream")
 	}
@@ -95,7 +95,7 @@ func (r *ReconcileTable) reconcilePod(pod *corev1.Pod) (reconcile.Result, error)
 		return reconcile.Result{}, errors.Wrap(err, "failed to create schema client")
 	}
 
-	table, err := schemasClient.Tables(tableNamespace).Get(tableName, metav1.GetOptions{})
+	table, err := schemasClient.Tables(tableNamespace).Get(ctx, tableName, metav1.GetOptions{})
 	if err != nil {
 		return reconcile.Result{}, errors.Wrap(err, "failed to get existing table")
 	}
@@ -104,7 +104,7 @@ func (r *ReconcileTable) reconcilePod(pod *corev1.Pod) (reconcile.Result, error)
 		return reconcile.Result{}, errors.Wrap(err, "failed to get sha of table")
 	}
 
-	migration := schemasv1alpha3.Migration{
+	desiredMigration := schemasv1alpha3.Migration{
 		TypeMeta: metav1.TypeMeta{
 			APIVersion: "schemas.schemahero.io/v1alpha3",
 			Kind:       "Migration",
@@ -129,21 +129,38 @@ func (r *ReconcileTable) reconcilePod(pod *corev1.Pod) (reconcile.Result, error)
 		return reconcile.Result{}, errors.Wrap(err, "Failed to create database client")
 	}
 
-	database, err := databasesClient.Databases(tableNamespace).Get(table.Spec.Database, metav1.GetOptions{})
+	database, err := databasesClient.Databases(tableNamespace).Get(ctx, table.Spec.Database, metav1.GetOptions{})
 	if err != nil {
 		return reconcile.Result{}, errors.Wrap(err, "failed to get database")
 	}
 
 	if database.Spec.ImmediateDeploy {
-		migration.Status.ApprovedAt = time.Now().Unix()
-	}
-
-	if err := r.Create(context.Background(), &migration); err != nil {
-		return reconcile.Result{}, errors.Wrap(err, "failed to create migration resource")
+		desiredMigration.Status.ApprovedAt = time.Now().Unix()
+	}
+
+	var existingMigration schemasv1alpha3.Migration
+	err = r.Get(ctx, types.NamespacedName{
+		Name:      desiredMigration.Name,
+		Namespace: desiredMigration.Namespace,
+	}, &existingMigration)
+	if kuberneteserrors.IsNotFound(err) {
+		// create it
+		if err := r.Create(ctx, &desiredMigration); err != nil {
+			return reconcile.Result{}, errors.Wrap(err, "failed to create migration resource")
+		}
+	} else if err == nil {
+		// update it
+		existingMigration.Status = desiredMigration.Status
+		existingMigration.Spec = desiredMigration.Spec
+		if err = r.Update(ctx, &existingMigration); err != nil {
+			return reconcile.Result{}, errors.Wrap(err, "failed to update migration resource")
+		}
+	} else {
+		return reconcile.Result{}, errors.Wrap(err, "failed to get existing migration")
 	}
 
 	// Delete the pod and config map
-	if err := r.Delete(context.Background(), pod); err != nil {
+	if err := r.Delete(ctx, pod); err != nil {
 		return reconcile.Result{}, errors.Wrap(err, "failed to delete pod from plan phase")
 	}
 
diff --git a/pkg/controller/table/reconile.go b/pkg/controller/table/reconile.go
index 94252854..6e93611a 100644
--- a/pkg/controller/table/reconile.go
+++ b/pkg/controller/table/reconile.go
@@ -16,13 +16,13 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 )
 
-func (r *ReconcileTable) reconcileInstance(instance *schemasv1alpha3.Table) (reconcile.Result, error) {
+func (r *ReconcileTable) reconcileInstance(ctx context.Context, instance *schemasv1alpha3.Table) (reconcile.Result, error) {
 	logger.Debug("reconciling table",
 		zap.String("kind", instance.Kind),
 		zap.String("name", instance.Name),
 		zap.String("database", instance.Spec.Database))
 
-	database, err := r.getDatabaseSpec(instance.Namespace, instance.Spec.Database)
+	database, err := r.getDatabaseSpec(ctx, instance.Namespace, instance.Spec.Database)
 	if err != nil {
 		return reconcile.Result{}, errors.Wrap(err, "failed to get database spec")
 	}
@@ -89,7 +89,7 @@ func (r *ReconcileTable) getMigrationSpec(namespace string, name string) (*schem
 	return nil, nil
 }
 
-func (r *ReconcileTable) getDatabaseSpec(namespace string, name string) (*databasesv1alpha3.Database, error) {
+func (r *ReconcileTable) getDatabaseSpec(ctx context.Context, namespace string, name string) (*databasesv1alpha3.Database, error) {
 	logger.Debug("getting database spec",
 		zap.String("namespace", namespace),
 		zap.String("name", name))
@@ -103,7 +103,7 @@ func (r *ReconcileTable) getDatabaseSpec(namespace string, name string) (*databa
 		return nil, err
 	}
 
-	database, err := databasesClient.Databases(namespace).Get(name, metav1.GetOptions{})
+	database, err := databasesClient.Databases(namespace).Get(ctx, name, metav1.GetOptions{})
 	if err != nil {
 		// tables might be deployed before a database... if this is the case
 		// we don't want to crash, we want to re-reconcile later
diff --git a/pkg/controller/table/table_controller.go b/pkg/controller/table/table_controller.go
index 716b1de2..c3985d35 100644
--- a/pkg/controller/table/table_controller.go
+++ b/pkg/controller/table/table_controller.go
@@ -107,7 +107,7 @@ func (r *ReconcileTable) Reconcile(request reconcile.Request) (reconcile.Result,
 	// so this function is simply an entrypoint that executes the right reconcile loop
 	instance, instanceErr := r.getInstance(request)
 	if instanceErr == nil {
-		result, err := r.reconcileInstance(instance)
+		result, err := r.reconcileInstance(context.Background(), instance)
 		if err != nil {
 			logger.Error(err)
 		}
@@ -117,7 +117,7 @@ func (r *ReconcileTable) Reconcile(request reconcile.Request) (reconcile.Result,
 	pod := &corev1.Pod{}
 	podErr := r.Get(context.Background(), request.NamespacedName, pod)
 	if podErr == nil {
-		result, err := r.reconcilePod(pod)
+		result, err := r.reconcilePod(context.Background(), pod)
 		if err != nil {
 			logger.Error(err)
 		}
diff --git a/pkg/database/interfaces/connection.go b/pkg/database/interfaces/connection.go
index b04b30c0..f962c6fd 100644
--- a/pkg/database/interfaces/connection.go
+++ b/pkg/database/interfaces/connection.go
@@ -1,6 +1,7 @@
 package interfaces
 
 import (
+	"context"
 	"database/sql"
 
 	"github.com/schemahero/schemahero/pkg/database/types"
@@ -13,7 +14,7 @@ type SchemaHeroDatabaseConnection interface {
 	DatabaseName() string
 	EngineVersion() string
 
-	CheckAlive(string, string) (bool, error)
+	CheckAlive(context.Context, string, string) (bool, error)
 
 	ListTables() ([]string, error)
 	ListTableForeignKeys(string, string) ([]*types.ForeignKey, error)
diff --git a/pkg/database/mysql/ping.go b/pkg/database/mysql/ping.go
index 898a518f..859e5cd3 100644
--- a/pkg/database/mysql/ping.go
+++ b/pkg/database/mysql/ping.go
@@ -1,15 +1,15 @@
 package mysql
 
 import (
+	"context"
 	"time"
 
-	//	_ "github.com/lib/mysql"
 	databasesclientv1alpha3 "github.com/schemahero/schemahero/pkg/client/schemaheroclientset/typed/databases/v1alpha3"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client/config"
 )
 
-func (m *MysqlConnection) CheckAlive(namespace string, instanceName string) (bool, error) {
+func (m *MysqlConnection) CheckAlive(ctx context.Context, namespace string, instanceName string) (bool, error) {
 	cfg, err := config.GetConfig()
 	if err != nil {
 		return false, err
@@ -18,7 +18,7 @@ func (m *MysqlConnection) CheckAlive(namespace string, instanceName string) (boo
 	if err != nil {
 		return false, err
 	}
-	instance, err := databasesClient.Databases(namespace).Get(instanceName, metav1.GetOptions{})
+	instance, err := databasesClient.Databases(namespace).Get(ctx, instanceName, metav1.GetOptions{})
 	if err != nil {
 		return false, err
 	}
@@ -32,7 +32,7 @@ func (m *MysqlConnection) CheckAlive(namespace string, instanceName string) (boo
 		instance.Status.LastPing = time.Now().Format(time.RFC3339)
 	}
 
-	_, err = databasesClient.Databases(namespace).Update(instance)
+	_, err = databasesClient.Databases(namespace).Update(ctx, instance, metav1.UpdateOptions{})
 	if err != nil {
 		return isConnected, err
 	}
diff --git a/pkg/database/postgres/ping.go b/pkg/database/postgres/ping.go
index 30d6ae16..734dfc29 100644
--- a/pkg/database/postgres/ping.go
+++ b/pkg/database/postgres/ping.go
@@ -1,6 +1,7 @@
 package postgres
 
 import (
+	"context"
 	"time"
 
 	_ "github.com/lib/pq"
@@ -9,7 +10,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/config"
 )
 
-func (p *PostgresConnection) CheckAlive(namespace string, instanceName string) (bool, error) {
+func (p *PostgresConnection) CheckAlive(ctx context.Context, namespace string, instanceName string) (bool, error) {
 	cfg, err := config.GetConfig()
 	if err != nil {
 		return false, err
@@ -18,7 +19,7 @@ func (p *PostgresConnection) CheckAlive(namespace string, instanceName string) (
 	if err != nil {
 		return false, err
 	}
-	instance, err := databasesClient.Databases(namespace).Get(instanceName, metav1.GetOptions{})
+	instance, err := databasesClient.Databases(namespace).Get(ctx, instanceName, metav1.GetOptions{})
 	if err != nil {
 		return false, err
 	}
@@ -32,7 +33,7 @@ func (p *PostgresConnection) CheckAlive(namespace string, instanceName string) (
 		instance.Status.LastPing = time.Now().Format(time.RFC3339)
 	}
 
-	_, err = databasesClient.Databases(namespace).Update(instance)
+	_, err = databasesClient.Databases(namespace).Update(ctx, instance, metav1.UpdateOptions{})
 	if err != nil {
 		return isConnected, err
 	}
diff --git a/pkg/installer/database_objects.go b/pkg/installer/database_objects.go
index b9b54979..7ca184f8 100644
--- a/pkg/installer/database_objects.go
+++ b/pkg/installer/database_objects.go
@@ -6,7 +6,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: databases.databases.schemahero.io
 spec:
@@ -128,7 +128,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: databases.databases.schemahero.io
 spec:
diff --git a/pkg/installer/databases.go b/pkg/installer/databases.go
index 5a10eb9a..723a08fc 100644
--- a/pkg/installer/databases.go
+++ b/pkg/installer/databases.go
@@ -2,6 +2,7 @@ package installer
 
 import (
 	"bytes"
+	"context"
 
 	"github.com/pkg/errors"
 	"github.com/schemahero/schemahero/pkg/client/schemaheroclientset/scheme"
@@ -34,20 +35,20 @@ func databasesCRDYAML(useExtensionsv1beta1 bool) ([]byte, error) {
 	return result.Bytes(), nil
 }
 
-func ensureDatabasesCRD(cfg *rest.Config, useExtensionsv1beta1 bool) error {
+func ensureDatabasesCRD(ctx context.Context, cfg *rest.Config, useExtensionsv1beta1 bool) error {
 	if useExtensionsv1beta1 {
 		extensionsClient, err := extensionsv1beta1client.NewForConfig(cfg)
 		if err != nil {
 			return errors.Wrap(err, "faild to create extensions client")
 		}
 
-		_, err = extensionsClient.CustomResourceDefinitions().Get("databases.databases.schemahero.io", metav1.GetOptions{})
+		_, err = extensionsClient.CustomResourceDefinitions().Get(ctx, "databases.databases.schemahero.io", metav1.GetOptions{})
 		if err != nil {
 			if !kuberneteserrors.IsNotFound(err) {
 				return errors.Wrap(err, "failed to get databases crd")
 			}
 
-			_, err = extensionsClient.CustomResourceDefinitions().Create(databasesCRDV1Beta1())
+			_, err = extensionsClient.CustomResourceDefinitions().Create(ctx, databasesCRDV1Beta1(), metav1.CreateOptions{})
 			if err != nil {
 				return errors.Wrap(err, "failed to create databases crd")
 			}
@@ -61,13 +62,13 @@ func ensureDatabasesCRD(cfg *rest.Config, useExtensionsv1beta1 bool) error {
 		return errors.Wrap(err, "faild to create extensions client")
 	}
 
-	_, err = extensionsClient.CustomResourceDefinitions().Get("databases.databases.schemahero.io", metav1.GetOptions{})
+	_, err = extensionsClient.CustomResourceDefinitions().Get(ctx, "databases.databases.schemahero.io", metav1.GetOptions{})
 	if err != nil {
 		if !kuberneteserrors.IsNotFound(err) {
 			return errors.Wrap(err, "failed to get databases crd")
 		}
 
-		_, err := extensionsClient.CustomResourceDefinitions().Create(databasesCRDV1())
+		_, err := extensionsClient.CustomResourceDefinitions().Create(ctx, databasesCRDV1(), metav1.CreateOptions{})
 		if err != nil {
 			return errors.Wrap(err, "failed to create databases crd")
 		}
diff --git a/pkg/installer/installer.go b/pkg/installer/installer.go
index 2c48b189..e06e2246 100644
--- a/pkg/installer/installer.go
+++ b/pkg/installer/installer.go
@@ -1,6 +1,7 @@
 package installer
 
 import (
+	"context"
 	"strings"
 
 	"github.com/blang/semver"
@@ -102,6 +103,9 @@ func GenerateOperatorYAML(requestedExtensionsAPIVersion string, isEnterprise boo
 }
 
 func InstallOperator(isEnterprise bool, namespace string) error {
+	// todo create and pass this from higher
+	ctx := context.Background()
+
 	cfg, err := config.GetConfig()
 	if err != nil {
 		return errors.Wrap(err, "failed to get kubernetes config")
@@ -113,39 +117,39 @@ func InstallOperator(isEnterprise bool, namespace string) error {
 	}
 
 	useExtensionsV1Beta1 := shouldUseExtensionsV1Beta1(client)
-	if err := ensureDatabasesCRD(cfg, useExtensionsV1Beta1); err != nil {
+	if err := ensureDatabasesCRD(ctx, cfg, useExtensionsV1Beta1); err != nil {
 		return errors.Wrap(err, "failed to create databases crd")
 	}
 
-	if err := ensureTablesCRD(cfg, useExtensionsV1Beta1); err != nil {
+	if err := ensureTablesCRD(ctx, cfg, useExtensionsV1Beta1); err != nil {
 		return errors.Wrap(err, "failed to create tables crd")
 	}
 
-	if err := ensureMigrationsCRD(cfg, useExtensionsV1Beta1); err != nil {
+	if err := ensureMigrationsCRD(ctx, cfg, useExtensionsV1Beta1); err != nil {
 		return errors.Wrap(err, "failed to create migrations crd")
 	}
 
-	if err := ensureClusterRole(client); err != nil {
+	if err := ensureClusterRole(ctx, client); err != nil {
 		return errors.Wrap(err, "failed to create cluster role")
 	}
 
-	if err := ensureClusterRoleBinding(client, namespace); err != nil {
+	if err := ensureClusterRoleBinding(ctx, client, namespace); err != nil {
 		return errors.Wrap(err, "failed to create cluster role binding")
 	}
 
-	if err := ensureNamespace(client, namespace); err != nil {
+	if err := ensureNamespace(ctx, client, namespace); err != nil {
 		return errors.Wrap(err, "failed to create namespace")
 	}
 
-	if err := ensureService(client, namespace); err != nil {
+	if err := ensureService(ctx, client, namespace); err != nil {
 		return errors.Wrap(err, "failed to create service")
 	}
 
-	if err := ensureSecret(client, namespace); err != nil {
+	if err := ensureSecret(ctx, client, namespace); err != nil {
 		return errors.Wrap(err, "failed to create secret")
 	}
 
-	if err := ensureManager(client, isEnterprise, namespace); err != nil {
+	if err := ensureManager(ctx, client, isEnterprise, namespace); err != nil {
 		return errors.Wrap(err, "failed to create manager")
 	}
 
diff --git a/pkg/installer/manager.go b/pkg/installer/manager.go
index 6f3952ec..25508af4 100644
--- a/pkg/installer/manager.go
+++ b/pkg/installer/manager.go
@@ -2,6 +2,7 @@ package installer
 
 import (
 	"bytes"
+	"context"
 
 	"github.com/pkg/errors"
 	"github.com/schemahero/schemahero/pkg/client/schemaheroclientset/scheme"
@@ -28,14 +29,14 @@ func namespaceYAML(name string) ([]byte, error) {
 	return result.Bytes(), nil
 }
 
-func ensureNamespace(clientset *kubernetes.Clientset, name string) error {
-	_, err := clientset.CoreV1().Namespaces().Get(name, metav1.GetOptions{})
+func ensureNamespace(ctx context.Context, clientset *kubernetes.Clientset, name string) error {
+	_, err := clientset.CoreV1().Namespaces().Get(ctx, name, metav1.GetOptions{})
 	if err != nil {
 		if !kuberneteserrors.IsNotFound(err) {
 			return errors.Wrap(err, "failed to get namespace")
 		}
 
-		_, err := clientset.CoreV1().Namespaces().Create(namespace(name))
+		_, err := clientset.CoreV1().Namespaces().Create(ctx, namespace(name), metav1.CreateOptions{})
 		if err != nil {
 			return errors.Wrap(err, "failed to create namespace")
 		}
@@ -66,14 +67,14 @@ func serviceYAML(namespace string) ([]byte, error) {
 	return result.Bytes(), nil
 }
 
-func ensureService(clientset *kubernetes.Clientset, namespace string) error {
-	_, err := clientset.CoreV1().Services(namespace).Get("controller-manager-service", metav1.GetOptions{})
+func ensureService(ctx context.Context, clientset *kubernetes.Clientset, namespace string) error {
+	_, err := clientset.CoreV1().Services(namespace).Get(ctx, "controller-manager-service", metav1.GetOptions{})
 	if err != nil {
 		if !kuberneteserrors.IsNotFound(err) {
 			return errors.Wrap(err, "failed to get service")
 		}
 
-		_, err := clientset.CoreV1().Secrets(namespace).Create(secret(namespace))
+		_, err := clientset.CoreV1().Secrets(namespace).Create(ctx, secret(namespace), metav1.CreateOptions{})
 		if err != nil {
 			return errors.Wrap(err, "failed to create service")
 		}
@@ -116,14 +117,14 @@ func secretYAML(namespace string) ([]byte, error) {
 	return result.Bytes(), nil
 }
 
-func ensureSecret(clientset *kubernetes.Clientset, namespace string) error {
-	_, err := clientset.CoreV1().Secrets(namespace).Get("webhook-server-secret", metav1.GetOptions{})
+func ensureSecret(ctx context.Context, clientset *kubernetes.Clientset, namespace string) error {
+	_, err := clientset.CoreV1().Secrets(namespace).Get(ctx, "webhook-server-secret", metav1.GetOptions{})
 	if err != nil {
 		if !kuberneteserrors.IsNotFound(err) {
 			return errors.Wrap(err, "failed to get secret")
 		}
 
-		_, err := clientset.CoreV1().Secrets(namespace).Create(secret(namespace))
+		_, err := clientset.CoreV1().Secrets(namespace).Create(ctx, secret(namespace), metav1.CreateOptions{})
 		if err != nil {
 			return errors.Wrap(err, "failed to create secret")
 		}
@@ -155,14 +156,14 @@ func managerYAML(isEnterprise bool, namespace string) ([]byte, error) {
 	return result.Bytes(), nil
 }
 
-func ensureManager(clientset *kubernetes.Clientset, isEnterprise bool, namespace string) error {
-	_, err := clientset.AppsV1().StatefulSets(namespace).Get("schemahero", metav1.GetOptions{})
+func ensureManager(ctx context.Context, clientset *kubernetes.Clientset, isEnterprise bool, namespace string) error {
+	_, err := clientset.AppsV1().StatefulSets(namespace).Get(ctx, "schemahero", metav1.GetOptions{})
 	if err != nil {
 		if !kuberneteserrors.IsNotFound(err) {
 			return errors.Wrap(err, "failed to get statefulset")
 		}
 
-		_, err := clientset.AppsV1().StatefulSets(namespace).Create(manager(isEnterprise, namespace))
+		_, err := clientset.AppsV1().StatefulSets(namespace).Create(ctx, manager(isEnterprise, namespace), metav1.CreateOptions{})
 		if err != nil {
 			return errors.Wrap(err, "failed to create statefulset")
 		}
diff --git a/pkg/installer/migration_objects.go b/pkg/installer/migration_objects.go
index 6dce67ba..a19f8660 100644
--- a/pkg/installer/migration_objects.go
+++ b/pkg/installer/migration_objects.go
@@ -6,7 +6,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: migrations.schemas.schemahero.io
 spec:
@@ -90,7 +90,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: migrations.schemas.schemahero.io
 spec:
diff --git a/pkg/installer/migrations.go b/pkg/installer/migrations.go
index 0257494a..9ff6d89d 100644
--- a/pkg/installer/migrations.go
+++ b/pkg/installer/migrations.go
@@ -2,6 +2,7 @@ package installer
 
 import (
 	"bytes"
+	"context"
 
 	"github.com/pkg/errors"
 	"github.com/schemahero/schemahero/pkg/client/schemaheroclientset/scheme"
@@ -32,20 +33,20 @@ func migrationsCRDYAML(useExtensionsv1beta1 bool) ([]byte, error) {
 	return result.Bytes(), nil
 }
 
-func ensureMigrationsCRD(cfg *rest.Config, useExtensionsv1beta1 bool) error {
+func ensureMigrationsCRD(ctx context.Context, cfg *rest.Config, useExtensionsv1beta1 bool) error {
 	if useExtensionsv1beta1 {
 		extensionsClient, err := extensionsv1beta1client.NewForConfig(cfg)
 		if err != nil {
 			return errors.Wrap(err, "faild to create extensions client")
 		}
 
-		_, err = extensionsClient.CustomResourceDefinitions().Get("migrations.schemas.schemahero.io", metav1.GetOptions{})
+		_, err = extensionsClient.CustomResourceDefinitions().Get(ctx, "migrations.schemas.schemahero.io", metav1.GetOptions{})
 		if err != nil {
 			if !kuberneteserrors.IsNotFound(err) {
 				return errors.Wrap(err, "failed to get migrations crd")
 			}
 
-			_, err = extensionsClient.CustomResourceDefinitions().Create(migrationsCRDV1Beta1())
+			_, err = extensionsClient.CustomResourceDefinitions().Create(ctx, migrationsCRDV1Beta1(), metav1.CreateOptions{})
 			if err != nil {
 				return errors.Wrap(err, "failed to create migrations crd")
 			}
@@ -59,13 +60,13 @@ func ensureMigrationsCRD(cfg *rest.Config, useExtensionsv1beta1 bool) error {
 		return errors.Wrap(err, "faild to create extensions client")
 	}
 
-	_, err = extensionsClient.CustomResourceDefinitions().Get("migrations.schemas.schemahero.io", metav1.GetOptions{})
+	_, err = extensionsClient.CustomResourceDefinitions().Get(ctx, "migrations.schemas.schemahero.io", metav1.GetOptions{})
 	if err != nil {
 		if !kuberneteserrors.IsNotFound(err) {
 			return errors.Wrap(err, "failed to get migrations crd")
 		}
 
-		_, err := extensionsClient.CustomResourceDefinitions().Create(migrationsCRDV1())
+		_, err := extensionsClient.CustomResourceDefinitions().Create(ctx, migrationsCRDV1(), metav1.CreateOptions{})
 		if err != nil {
 			return errors.Wrap(err, "failed to create migrations crd")
 		}
diff --git a/pkg/installer/rbac.go b/pkg/installer/rbac.go
index b77e4966..e0f5aaa1 100644
--- a/pkg/installer/rbac.go
+++ b/pkg/installer/rbac.go
@@ -2,6 +2,7 @@ package installer
 
 import (
 	"bytes"
+	"context"
 
 	"github.com/pkg/errors"
 	"github.com/schemahero/schemahero/pkg/client/schemaheroclientset/scheme"
@@ -22,14 +23,14 @@ func clusterRoleYAML() ([]byte, error) {
 	return result.Bytes(), nil
 }
 
-func ensureClusterRole(clientset *kubernetes.Clientset) error {
-	_, err := clientset.RbacV1().ClusterRoles().Get("schemahero-role", metav1.GetOptions{})
+func ensureClusterRole(ctx context.Context, clientset *kubernetes.Clientset) error {
+	_, err := clientset.RbacV1().ClusterRoles().Get(ctx, "schemahero-role", metav1.GetOptions{})
 	if err != nil {
 		if !kuberneteserrors.IsNotFound(err) {
 			return errors.Wrap(err, "failed to get clusterrole")
 		}
 
-		_, err := clientset.RbacV1().ClusterRoles().Create(clusterRole())
+		_, err := clientset.RbacV1().ClusterRoles().Create(ctx, clusterRole(), metav1.CreateOptions{})
 		if err != nil {
 			return errors.Wrap(err, "failed to create cluster role")
 		}
@@ -119,14 +120,14 @@ func clusterRoleBindingYAML(namespace string) ([]byte, error) {
 	return result.Bytes(), nil
 }
 
-func ensureClusterRoleBinding(clientset *kubernetes.Clientset, namespace string) error {
-	_, err := clientset.RbacV1().ClusterRoleBindings().Get("schemahero-rolebinding", metav1.GetOptions{})
+func ensureClusterRoleBinding(ctx context.Context, clientset *kubernetes.Clientset, namespace string) error {
+	_, err := clientset.RbacV1().ClusterRoleBindings().Get(ctx, "schemahero-rolebinding", metav1.GetOptions{})
 	if err != nil {
 		if !kuberneteserrors.IsNotFound(err) {
 			return errors.Wrap(err, "failed to get clusterrolebinding")
 		}
 
-		_, err := clientset.RbacV1().ClusterRoleBindings().Create(clusterRoleBinding(namespace))
+		_, err := clientset.RbacV1().ClusterRoleBindings().Create(ctx, clusterRoleBinding(namespace), metav1.CreateOptions{})
 		if err != nil {
 			return errors.Wrap(err, "failed to create cluster rolebinding")
 		}
diff --git a/pkg/installer/table_objects.go b/pkg/installer/table_objects.go
index 499d243b..00a8a3b6 100644
--- a/pkg/installer/table_objects.go
+++ b/pkg/installer/table_objects.go
@@ -6,7 +6,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: tables.schemas.schemahero.io
 spec:
@@ -224,7 +224,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.2.4
+    controller-gen.kubebuilder.io/version: v0.2.8
   creationTimestamp: null
   name: tables.schemas.schemahero.io
 spec:
diff --git a/pkg/installer/tables.go b/pkg/installer/tables.go
index 4464fb13..3c6753a8 100644
--- a/pkg/installer/tables.go
+++ b/pkg/installer/tables.go
@@ -2,6 +2,7 @@ package installer
 
 import (
 	"bytes"
+	"context"
 
 	"github.com/pkg/errors"
 	"github.com/schemahero/schemahero/pkg/client/schemaheroclientset/scheme"
@@ -33,20 +34,20 @@ func tablesCRDYAML(useExtensionsv1beta1 bool) ([]byte, error) {
 	return result.Bytes(), nil
 }
 
-func ensureTablesCRD(cfg *rest.Config, useExtensionsv1beta1 bool) error {
+func ensureTablesCRD(ctx context.Context, cfg *rest.Config, useExtensionsv1beta1 bool) error {
 	if useExtensionsv1beta1 {
 		extensionsClient, err := extensionsv1beta1client.NewForConfig(cfg)
 		if err != nil {
 			return errors.Wrap(err, "faild to create extensions client")
 		}
 
-		_, err = extensionsClient.CustomResourceDefinitions().Get("tables.schemas.schemahero.io", metav1.GetOptions{})
+		_, err = extensionsClient.CustomResourceDefinitions().Get(ctx, "tables.schemas.schemahero.io", metav1.GetOptions{})
 		if err != nil {
 			if !kuberneteserrors.IsNotFound(err) {
 				return errors.Wrap(err, "failed to get tables crd")
 			}
 
-			_, err = extensionsClient.CustomResourceDefinitions().Create(tablesCRDV1Beta1())
+			_, err = extensionsClient.CustomResourceDefinitions().Create(ctx, tablesCRDV1Beta1(), metav1.CreateOptions{})
 			if err != nil {
 				return errors.Wrap(err, "failed to create tables crd")
 			}
@@ -60,13 +61,13 @@ func ensureTablesCRD(cfg *rest.Config, useExtensionsv1beta1 bool) error {
 		return errors.Wrap(err, "faild to create extensions client")
 	}
 
-	_, err = extensionsClient.CustomResourceDefinitions().Get("tables.schemas.schemahero.io", metav1.GetOptions{})
+	_, err = extensionsClient.CustomResourceDefinitions().Get(ctx, "tables.schemas.schemahero.io", metav1.GetOptions{})
 	if err != nil {
 		if !kuberneteserrors.IsNotFound(err) {
 			return errors.Wrap(err, "failed to get tables crd")
 		}
 
-		_, err := extensionsClient.CustomResourceDefinitions().Create(tablesCRDV1())
+		_, err := extensionsClient.CustomResourceDefinitions().Create(ctx, tablesCRDV1(), metav1.CreateOptions{})
 		if err != nil {
 			return errors.Wrap(err, "failed to create tables crd")
 		}


Test patch:
diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml
index 9a2a92c6..a39e6bfa 100644
--- a/.github/workflows/build-and-test.yaml
+++ b/.github/workflows/build-and-test.yaml
@@ -10,7 +10,7 @@ jobs:
     steps:
       - uses: actions/setup-go@v1
         with:
-          go-version: "1.12.14"
+          go-version: "1.14.1"
       - name: setup goenv
         run: |
           echo "::set-env name=GOPATH::$(go env GOPATH)"
diff --git a/pkg/controller/migration/objects_test.go b/pkg/controller/migration/objects_test.go
new file mode 100644
index 00000000..f32588ab
--- /dev/null
+++ b/pkg/controller/migration/objects_test.go
@@ -0,0 +1,39 @@
+package migration
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func Test_configMapNameForMigration(t *testing.T) {
+	tests := []struct {
+		name         string
+		databaseName string
+		tableName    string
+		migrationID  string
+		expect       string
+	}{
+		{
+			name:         "short-enough",
+			databaseName: "a",
+			tableName:    "b",
+			migrationID:  "c",
+			expect:       "a-b-c",
+		},
+		{
+			name:         "should-be-table-and-id",
+			databaseName: "a-long-database-name-a-long-database-name-a-long-database-name-a-long-database-name-a-long-database-name-a-long-database-name",
+			tableName:    "a-long-table-name-a-long-table-name-a-long-table-name-a-long-table-name-a-long-table-name-a-long-table-name-a-long-table-name",
+			migrationID:  "a-migration-id",
+			expect:       "a-long-table-name-a-long-table-name-a-long-table-name-a-long-table-name-a-long-table-name-a-long-table-name-a-long-table-name-a-migration-id",
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			actual := configMapNameForMigration(test.databaseName, test.tableName, test.migrationID)
+			assert.Equal(t, test.expect, actual)
+		})
+	}
+}