From e8bdee6218a557b2e482c1a267595d0f5b529877 Mon Sep 17 00:00:00 2001
From: Adnan Abdulhussein <adnan@prydoni.us>
Date: Fri, 27 Apr 2018 18:37:41 +0100
Subject: [PATCH] adds support for latest builds in master (#279)

* adds support for latest builds in master

- adds static and generated to gitignore
- makes static and generated targets phony so they're always generated
- generated manifests use the `latest` tag by default if VERSION not
  provided for the Kubeapps core components

* don't push docker images in pull requests
---
 .gitignore                 |    1 +
 .travis.yml                |    8 +-
 Makefile                   |    4 +-
 generated/statik/statik.go |   12 -
 static/.gitignore          |    2 +
 static/kubeapps-objs.yaml  | 1239 ------------------------------------
 6 files changed, 11 insertions(+), 1255 deletions(-)
 delete mode 100644 generated/statik/statik.go
 create mode 100644 static/.gitignore
 delete mode 100644 static/kubeapps-objs.yaml

diff --git a/.gitignore b/.gitignore
index 578c49439c6..e56c5116a65 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
 /kubeapps
 /statik
+/generated
 .GOPATH
 *.*~
 telepresence.log
diff --git a/.travis.yml b/.travis.yml
index 03875e22702..225eb9be87b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -60,9 +60,13 @@ jobs:
     script: make VERSION="$VERSION" $IMAGE
     after_success:
     - |
-      if [[ -n "$TRAVIS_TAG" ]]; then
+      if [[ "$TRAVIS_PULL_REQUEST" == "false" && "$TRAVIS_BRANCH" == "master" ]]; then
         docker login -u="${DOCKER_USERNAME}" -p="${DOCKER_PASSWORD}"
-        docker push $IMAGE:$VERSION
+        if [[ -n "$TRAVIS_TAG" ]]; then
+          docker push $IMAGE:$VERSION
+        fi
+        docker tag $IMAGE:$VERSION $IMAGE:latest
+        docker push $IMAGE:latest
       fi
   - <<: *imageBuild
     env: IMAGE=kubeapps/chartsvc
diff --git a/Makefile b/Makefile
index 51cd0f22a6a..ec0d0aac993 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ $(EMBEDDED_STATIC): static/kubeapps-objs.yaml
 	$(GO) generate
 
 static/kubeapps-objs.yaml:
-	KUBEAPPS_VERSION=$$(git describe --tags --abbrev=0) ;\
+	KUBEAPPS_VERSION=$${VERSION:-latest} ;\
 	pushd manifests/vendor/kubeless ;\
 	KUBELESS_VERSION=$$(git describe --tags --abbrev=0) ;\
 	popd ;\
@@ -44,4 +44,4 @@ vet:
 clean:
 	$(RM) ./kubeapps ./chart-repo ./statik $(EMBEDDED_STATIC) static/kubeapps-objs.yaml
 
-.PHONY: default test fmt vet clean build-prep chart-repo kubeapps
+.PHONY: default test fmt vet clean build-prep chart-repo kubeapps $(EMBEDDED_STATIC) static/kubeapps-objs.yaml
diff --git a/generated/statik/statik.go b/generated/statik/statik.go
deleted file mode 100644
index 37dd13444ab..00000000000
--- a/generated/statik/statik.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Code generated by statik. DO NOT EDIT.
-
-package statik
-
-import (
-	"github.com/rakyll/statik/fs"
-)
-
-func init() {
-	data := "PK\x03\x04\x14\x00\x08\x00\x08\x00%c\x9aL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00	\x00kubeapps-objs.yamlUT\x05\x00\x01'\xc5\xe1Z\xec<ks\xdb\xb6\x96\xdf\xfd+0nv\xd2v/%\x92\xa2^\xecdf]'M\xbdM\x1c\x8f\x9d\xf4\xee\xddn\xeb\x01\xc1C	1I\xb0\x00(E\xed\xed\xfe\xf6\x1d\xf0->$J\x96\xbb\xb9\xbbW_$\x01\xe0y\xe3\x9c\x83\x03\x80\x9a\xa6\x9d\xe1\x88\xfe\x08\\P\x16\xda\x88;\x98\x0cp,\x97\x8c\xd3\xdf\xb0\xa4,\x1c<\xcc\xc4\x80\xb2\xe1\xcap@b\xe3\xec\x81\x86\xae\x8dn\x99\x0f\xdf\xd2\xd0\xa5\xe1\xe2,\x00\x89],\xb1}\x86\x10\x0eC&\x93\xe7\x84\x8d~\xff\xe3\x0c!\x1f;\xe0\x0b\xd5\x87\x10\xe1\x80%\xb8\x9a\xb3\xb1\xd1C\xec\x00\x8e\"\x91t\x848\x00\x1b\xe1(\xe2\x101A%\xe3\x1b\x8d\xb0Pr\xe6\xfb\xc0\xcfz\x0e\x10\x11&P\x81\xcc\x99\x0f\xb7\xe0%tE\xf45gq\xb4\x83\xc33\x84J\xde\xf6\xa3\x14\xb1\xf3\x11\x88\x14\xf6\x99\x96=w\x07|E	\\\x10\xc2\xe2P\xee\x87\xd0Nt]#\xab\\\xe45\xf0\x9f\xad\xd4\xeb\x0c\xe4\x1d\x03\xc2\x82\xe1\xca\xc0~\xb4,\xcc\xe8\"\x8an\x0b\xd0\xa7c\x89\x86$v\xb0d%\x0f\xf5\x96:\xd1\"\x02\xa2@\xcbM\x046Z\x82\x1f\x9c!\x14s\xdfFK)#a\x0f\x87j(\x0fA\x82\xd0\xc8\x12s)\xb4\x02\xe6@H\xc6\xf1\x02\x06\x0b\xc6\x16>\xe0\x88&\xcc~\x0e\x92\x10\x12;\x15k\xde\xfa{\x02\x19|\xce\x9c\xaf\x88Fp9\x0d\xb7\xff\x1f\xce{\xf6<\xf6\xd9\xe2@\xe6\xfb\xfa\xd4K?\x16\x12x\xe2~N&\x86\xe3g7\x8f}H\xbc[\xee;\x13\x84\x1ar\xb0$\xcb3\x848\x08\x16s\x02Y3\xe1,\xfc\xc8\x1c\x85{\x05\xdc\xc9Z\x17 \x93o\x9f\x8a\xf4\xc7:y\xfa\x04\"\xfa\x8c\xa2\xcf\x91q\xa6\xaa\xef\xbd8\xfe\xacp\x83#\n\x9f$\x84\xea\x9f\xe8PB,$\x0bn3\xf5\xbf\x04\x8f\x86T\xf1\xf74\xaa\xa0 \x06U\xf7\xd1\xcahcP>\x9f\x17\xa92Z\x00d\x94\xb4\xf9 \xd5\x1e\xf91\xc7~\x03K\xd2'\x96\x8c\xcb\xeb\x12\x86V\x8cJ\x8d?\x0f\xdc\x99\x9b\xab\x8b\xb8\x94oM\xb0/!\xf2\xd9&\x80\x83\xa2;\x8e\xa2\x9dJ?H\xd8\x87\xd9\xfdnW\x1a\xd0\xf0\x16\xb0\xbb\xb9\x03\xc2BW\xd8h\xa4'^#\xf2)\xc1\xc2FF\xf2oE\x95$\xbe\xa7\xca\x97n\xde\xd0\x80J\x1b\x19j\xa0\x90\x1cKXlR.\x15F\x1a.>D.\x96\x906!\x14\xe0Ow1_\x80\x8d\xcc\xf1\xbf\x94m\x1fB\xbc\xc2\xd4W\x91\xae\xecI\x1d\xfbm\x15\x8cr\xf7\x10D~\x01\xb1*\xf4D\xb4\x0d\xc1\xabOU\xf8\xfd\x14\xb0S	\xbd\x14\x81P.\xd5\x04\x16\x0b%\xa6!\xf0\x82\n\x0da\xbe\xa8\xd0\xa4!M\xf3\xd9B2!]\xe0|\xab]\xe1\xd0\xc4&$\x1a\x0d\xf0\x02^\xe4\xd4\x0c\x93\xa8\x96t\xdb+}0\x1d\x18%\xf1,\x08p\xe8V\xe1\x0f\xf7r\x0c\xe1\xcaF?\xfd\\\xfcO\xb0\x95\xccw\x02\xa8#O\x85\xd3\x82 b\\\x8a-\x14B\xba4\xb4\x91\x87}\x01E\xa3\x94\x9bz\xd3\x8a\xf9q\x00o\x95\xdf\xac\x02H(\xbc\x89}\xff\x0e\x08\x87\xad.\xb1\xe5l\xaf\xf7\xebK\xd9\x16\x0fh\x98\x98\xcfk\x8e	\xdc\x00\xa7\xcc\xdd\x9e\x0d%1)\xb2c\xe3\xe2\xe7\x923\xb4{\x84\xaeL\xe2\xfc\xbc\x99F\xc0\nBYK\"Rr\x1f\x99\x89d@Z\x93\x928\xf7\x07E~\xd2\x13U'\x9a\x06\x80Z\x04\xaa\xc1iF\x99]9T\x93\xdc=k\xc6\xd3\x99F\x9a\xf9\xae\xc8YGCW0H\xe7jB\xb2\xfai\xa3\x99>K'\x80\xc4|\x01\xf2&iT\xb9\xb6r\xfd\xe0\x03\x91\x8cW\x02\\\x05M\x0b\xe6\xd4\xb9g\xf9\xd4\xd5\xcd\x9f\x11q\xb7\x08z\"\xa1\xfd\xbf\x8a\xa0[\x02\xdd)\xd4V\xc1\x1e\x13!\x03\x16.\x98\x16s\xffE\xf2\xcbu\x06\x0d<\x95a\x02\xf8\x0b\xce\x98,	l\x89\x8a\x0d.T\x14\xac\x0cH\xe9~\xfb\xee\xfa\xf5\xbb\xfb\x9b\x8b\xbb\xbb\xbf\xbe\xbb}Yt#\xb4\xc2~\x0c\xdfq\x16\xd8\x95F5!T<\xfa\x016\xd9*\xa3\xfay\x80\x8d\x8d2\xfa5E\x9f\x16a!\xd6\x8c\xbb\xb5\x81)\xeald\xd1W\x8f\xca9\x03\x1dQ\xb8\xce^1\xaf\xd3\x8fVJ\xfef{\x9aW\xa1d\xd3<\xfd<]\xcc>E\x00\xfe,\x96CK\xf0\x03\x0e>`\x01b\xa0\xfe\x0c\x1c*C\x1c\xd0\xad\xf5P\x9fQ]\x9e&[&u=\x95R\x99\xb2\xfb=\xf8\xc1m\x8a&iUQ\xe9\x87z\xcf\x9b4T\x95\xcb\xa8*q\xe9l\xa5\xe1\"\xf61\xdf\xeaRN\x8b0\xe5f\xaesb\xdd\xed%\xd5\xd1\x19\xd2SV\x0e$U\xc9\x8fFR\x14\x1av\x03\x1a\x9e\xed\xec<a\xc5`\x1bp\xef2AJV\xcf\xa2\xc0\xa1\xf13\x91\x17e\xe1{\x1a\x80\x908\x88l\x14\xc6\xbe\xdf\x16G\xb3R[O\x19\xd7\xa5\xea&\xf8\xf7\x18w\x11\x07S\xc5\xee\x8eX\xdd\xa4\xa3\xae\xc8U\xb0\xd0B\xed1aI\xcd(\x08_\xf8\x8c`\x7f\xc9\x84\xb4-\xcb\x18Y\xc5\x90\xb6\xb0S\xc1\x87\xba\x82\xce\xfb\xab7o^\xdd\xde__\xbc}uwsq\xf9\xaa\xe2\x96\x93\xb0\xd3\x12ek\x8f~\x7fu\xf7\xfe\xdd\xed\xdf\xee\xdf^\xfcG\xf3\xe1s\xfd\xbch\xcc\x82\xca\x82p5\x11\x1f\xca\xaa\xb1\x12UF\xac\xbd2\x07\xb3\x81\xbe\xfd\x8cr\xe47\xcc\xa7dc\xa3+\xef\x9a\xc9\x1b\x0e\x02\xc22\xe6\xfat\x05!\x08q\xc3\x99\x03\xd5P\xa8b\xcak\x90\xdb\xd11\xc2ri\xa3a\xfe\xd0v_\x12\x9f\x94h\xc7\x95\xf6\xc4wc\xff%\xf8\xb8L\xbb\x8c\xca\x00I\x03`\xb1l\xe9kh\x1e\xb5\xaeQ9`\x97\x1e\xccB\xf1\xd4\xd3\xf2P.K\xcal\xad\xcdD\x97,\x80\x17\xc3-\xc3O\x9b\x85<\xc8n;\xca\x06\x0d\x03\xbcy\xf7\xf28\xc3}{\xf3\xf2\xea\xb6\xf9\xc06\xe9\x99\xb9f\x81/\xe9\xd3\x08wk5\x89Q\xc5X\xc3\x03j\x12@bN\xe5\xe6\x92\x85\x12>miW)\xf5]\xe8on\x19\x93\xdfQ\x1f\xc4FH\x08l$y\\\xe6=G\xe5G\x15A\x04\xaa\xe5&\xb5\xa2-\xae\x8b\xbc\x81\x059\x94\xb6*\xc7\x96A\xe7\xa9Ra\x1a\x10Dr\xf3\x92\xf2\x8a\xbdl\xc1\x15\x12\xcb8\xb5\xa6}\x8b\xd4\x93ol\xb6\x86\x8c\x9e\x11oe\x9c\xe54\xac\x94-\x0f\x08\x0b=\x1b\xfd\xfd,\x17\x13p\xf4{\xc6p\xea\xaf\x93T\xf7\x9b\xb3\xacm\xf1\x1b\x8d\x10\x0b\xbf\xc9\xfe~\x81.\xd2t\x07]\xbe\xb9B\xd8W\x9a\xdf\xa0%\x16\xc9\xc0\x08\\$\x97\x80\xb0\x10 \x05\xfa2\\ '\xa6\xbe\x8b4-\xe2L}a&\xbf\xaa@\xbeWb\xa5\x04%\x18r*\x18I\x04\x85\x86\x05a\x08I\xbe\xb9\xf7\x94e\xa1g1\xa7hHC\x17>\x0d\x962\xf0s\xcaR\xad\xfd\x91B\xf9\x02\xdd\x82K9\x10\x89\xd6\xeb5\x92\x0c\x85,\xd4\xd6\xebu\xd6\xfb\x1e?@\x88<\xce\x82b[\x0c\xb0\xd8@\xb8\xa0!(W/c\xc98\xc5\xbe\x18\xaa\xa6O\xc3\xf5z\xade 4\x9e\x81\xa6,\x1c\xb6\x891\xfd{\xaf\xb4\x83\xce\xff\xfb\x97\xf5z\xfd_\x83/\x07_\x7f\xf5\xec\x1c\xe5\xc4r\x901\x0f\xd1H7\xd03A\x96\x10\x80=\x1c>3\x9eq\xf85\x06!\xef\x15\x8f\xdfd\x0ce\x19\x13\x0b=\xbax\x8b\xa3\x03\xcc*	\xea\xb9eh.\x16K\x87\xe1l9\xb5\xc7\xe4\x9aOi1\xd5\x12\x0b:\xeb1F\xb3\xcc\xb1\x0b\x96\xd1\xd3H\x0fM\xcb\x1e5\x9bZ\xc9\xde\xcd\xd4?\xcb\x1bh\xa7`\xf7\x0b\xb7g\xfaX\x8d7\xfb\xca\xee\x05\x86\xfa\n\xff\xa8\xd4j\xbb\xadm\xc9\xdf\x9a\x8dL\xaa#\x1a\xe9H=\xcenOAt\x92\xb2\x03B\x11g\x92\x11\xe6\xdb\xe8\xfd\xe5M\xd1~\\zv\xa4\x18vI\xa1\xcc\xe8N\x99\x01\xe49N\xea\x9eUP\x1b&\x9eG4\xa4\x95;-t\xda\"Ka\xb8$\xf7\xccv\x03u?\x0f\xd9$v_\x86q\x803<u\x0cx\x94\xa3|D\xf1|7\xd2}u\xf3\x13\x15WzD\x99\x92N\x1f\x84\xa8d\xde\xd9\x12\xff\xb4\xa7,v\xe2\xe9]B\xa9<\x8c	i9Y\xa4P\x1cVQtA\x10N#\x99\x8c\xfc\xa1X7\xa3k,\xe9\n\x12B\x80+\xb0\xe8;\x8e\x03X3\xfepH\x15\xb2\xb7\"\xbc8L\x12\xb5\xf4T\x85B\xa8D\xdar\xa8\"\xef\xcaxOA\xa7\x14}\x97\xc1H\x9a\xf2:`\x018i-\x8b\x80^9xO\x050\x15\xd4\xf1R\xbd\xbc}\x89X\xa2a\xe41\x8e\xbe\x7f\xff\xfe\x06IN\x17\x0b\xe0\xc9|x\x12y\xaa\xb9\x99!y\x8cH\x15\xb1\xefS0[R\xad\x82\xaf	\xb6\xd2\xf5\x7fT\xb6\xd9v\xef	\xc4{\xc9Y\xf8\xef\xcci\x93p\x0dIM\xc8\xdb\xbd\xc7\xca\xb9\x08W\xc5c\x07\x04\xac\x1eA\xc9O\xcbG\xb5\x86\x1d+\xdfd\x11\n\\\xab\xa4\x90\xea\x91a>Y\xd3\x0e-\x1b\xa6\xf2\xc9IR#q\x8b\xe5\x87\x8d\x9e\xff\xfe\xc7\xf33\x95\x95\xaal;\x1d\xaa		\x91\x8d\xce\x93\xec\xe5\xfc\x0c\x15\x93_\xe3\xb0\xa0B\xf2\x8d&}\xa1\xad\x80Soc\xa3s\xc9\xe3d\x18\x0d\x17\\9\xed\x14\x96[\x85\xc0\xe3P\xe5O)A\xc2F\x7f\xd7\x12\xde\x7f\xca\xd2\x84rA|~\xf5\xf2\xdcF\xe7\xd1F.Yx\xfe\x97\xb2\x9d\xb0 \xa2>\xb8\xe7YVU\xe9\xca\x14'\xce\xed\x02\xe06\xd0d\x94\x12k	\xda\x9cV\x80W\xa1\xa8!\xe6\xa0\xd1\x9b1p\xa5\xe8WC\nY\xa7\xe0\xfeM,\xb19\x9e\xd8\xfa\x94x\x8e\xee\x8d\xdc\x993q\x1d\xdd\x1a\xbbddL\xdd\xd1\xd85\xc6\x93\x91\xe5N\x1d\x18\x835\x9a\xcc-\x8b\x98\xd3\x89\xe3\x8d\xa6\x8eA&#\xdd\xd1G\xd8ugu\xb4j\xe2\x158ST\xb6\xa2\xae2\xea\x8f\xbf\xf4\xe5yd\xed\xe0y4h\xf4\xf6\xe4\xd93\xe6\x13K'ck\x8aG\xde\xdcp\x1d\xc7s\x8c\x191\xc6\xce\x18&\xa6\xa5\x9bs\xc7\xd2'cb8\xd83gs\xd3\xb0,\xd0\xa7d4\xf1t<%3\xaf\x0f\xcf\x8a\xba\xe3x\x9e\xec\xe4\xb9\xd1\xdb\x93g\x9d\xcc\xbd\x9975\xa7\xaeeN\xcc1\xb6\xc0\x1c\x9b#\x9dx01L\xd7\x9bZ\xb3\x993\x19{\xe6l\x04\xd3\xf9\xd4\xf4f\x96\xa1\xcf\xdc\xd9\x14\xa6\x965r\xa7f?\x9e'[<\x17\xbf\x7f\xae\xd8\xbe\x0b\xd1u\xc60\x87_c\xcaAMk1\x90\x9fdu\xf6x\xd4\x075\xee.\xf6<\xfaI\x8d\x1eD\x9b\x1cz!\xcd\xc64\x0c\x99\x0b\x1f\xc5\x93LC\x05z\x97n\xfak&%2\xd7\xcc\xc4 cl\xe8\x18\x13g\xaa\xcf\x895\x9e\x8e\xb1>\xc7\x16\xc6\xe6\xcc\x9b\x99\xa6c\xba\xba>#\xba\xebx\x16\xc6\xbac\x98\xd6T\x1f\x03\xcc	6\xac\x917\xdf\xa9\x19\x85\xca\x9e\x0c\x0c\xfdPcT\x0f6&w\x85\xdbF_On=b`<\x9f\xc0xl\x18\x13K\xd7\x01\x8c\x91;\x99Xx2\x1e\xbb\x9ec\xeaj5\xe6\xce\x8d\xd9x\x06\x8e\xe7\x8e=\xa2\x93\x99\xa7\xbb\x13gn\x8e\xc0\xc1\xfb\xb9\x9d\x1dd\x83\x11&\x0fx\x01\x83\x8fb\xdb{\xb7\xd8\xdfG\xb1\xdf\xfex\xecl\x9e\xc4\xfa\x14`s\x97;4\x0fp\x87\nX\xe1\x18\\\x02\xe6\x9c\xe8\xe0\x98\xd8\xb4&\xde\xd4\x9d\x99cg2\xb1,\x00\x0c\xd3\xf9x\xea\x98\x13\xcft<\xec\x9a\xcet>\x9bz\xa61\xb2\x08\x99:\xa3\xb1\xee\x99\xbb\x9da^\x1cP\x08m\xb3\xe6\x12\xf7\xa9\xe65\x04J\x0b{\xb4\xc2\x9d\xfdZ\x89\x96\xd1\x93(%ZFM\xcfX\xd1\xc9t\xd0\xe8\xedv\xd7\xcb(W\xc9\xcct\xe6\x16\x99\xcc\x8d\x91n:dfz\xa3\xb9\xae[\x96e\x8e\xc7\x04;\xce\xcc3G\xba5\x9bN'\x16`\x0f\x1c<\x9dM&\x98Xsw\xae\xbb.\x199;U\xa2\x98g\x02\xb8m\x1c\xe8\xad\xf3\x07\xfbL\x15%\xf0\xbdZY\xb0\x0e\xa5\xa8\xf4\xech\x9d,\x98\xa1\xdc]\xb7R\xda\xba;\xb5\xb2`\xb9R\x1cojNLsdYxl\xa9\x8cH\xf7F\x86;\xf2\x00\x8f\xc1\x99\xbb\x04\x9bd>\xf1\x1cp\x89J\x13\xdc)\x19[\xde\x08\x9c\x99\xe7L\x1dw4\x1e\xedTJ\x05\x9f\xa6:r\xa4\x04&\xe0Y\x1e\xf6`l\xcc\xc0\x9d\xce\x9c\x11\x9e\xcc\x1c}4\xb7\xa6D\x9fX\x1e\x10\x83x32\x99L\x89k\xe8s\x98\x8fF\x86g\x9a\xd3\xd9t\xea\x8c\xf0\xfc \x05\xbff\xd1\xc3b Y\xe0\xef\xd1\xee\x82\x15\xcaM\xbe\x7f>+6\xfa\xb4z\x01h\xd7\xa6I\x8f\xd5F\xb3\xba\xe2\xd1E\xef\xbaH\xd4s\x1b\xa3\x07!\xa8\xc0S\xdb\xa5\xed\xae\xff\x048\xc4\x8b\xb6\xfd\xc1\x84\xda\xe2,\xc9Vu-\xc0\x92,\xdfl\x95\xfb;\xf0\xee\xdeG\xa8\xef\x18t\x00\xd9\xbf\x1b\xd0\xbay\xfe\xc3\x87o_\xbdyuww\x7fu\xfd\xfaV}\xbf\xba\xbe\xf8\xf6\xcd\xab\x1e\xe7\x0e\x8b\x1a\xed\x8e\xa3\x87\xb5UYmH\x97E\xa4\x9f\x06\x85w\xafn\x7f\xbc\xba|u\xff\xfeo7\x8dm\xfe\xe3\xc8\xabZ\xfa\xe3h\xeb<\x7f\xd0$\xcc\xa3\xe0\xbb-\x14%\xedi%>7\x81Aam\xdd\x98/\xdf]\x7fw\xf5\xba\x8e\xb6\x9b\xf4\xday\x86\x1d\xd6^\xae\xd9+O\xee=\x84\xd3g\x12\xa1\x8e\xe3\x04\xf5\xa2\xe9\xbe\x9a}\xdb\xa9\x80\x1e\x0e\xe01\x15\xda#\xaa\xde\xc7\x91\xd7&\xc1\xb2\xdc}\xc0\xa5\x89L\xd0\xe2\xac\xdcX	p\x82h\xf7\x05\x08\x17|\xc8\x9a\xda.\x17D\xedw!2\x1e\xb4\xca\xfes\x93\xa4\xb2\x06\xf4Td\xb4	\"bn\x0d]\x010C\xb2\x1bLq\xa9O+\x95S\x14\xa5\x08\x07\x17BI\xb1\xdf\xc2ozD[4on\xb4\xde\x04)\x8b\x9050\xd5\xfa\xb8V\xaf\xebj-e\xc8\xfdwmk\xd2\xec\x92\xc3\xfe\xcb4;\xae\xbbth3\xfdI\x94e\xe7\xd5\xfd\x83T\x8cc\xc9\x04\xc1>\x0d\x17M\xca\x92\xe9\xa9b\xa0\x1f17\x1f\xd9\x10\xca\xc9\xcc\xad\xad\n\xde\"\xae\xa4\xb4\x9d7\xbaEi{\x97\xaa\x1a\xa8\x02\x16&\x17\x81\xc2\xc5\x800\x0e\xac\xeb\xd2\x90\x0f\\f\x1e7\xd5O\xc4Y\x00r	\xb1\xc8|A\xe6\x182\x805\"\x9e\x7f\xfd\xbc\x89{\xd7\x9c\xceB}\xfd~R\xcf\x9bU\xb9\xe1=\xe9!\x96d\xdf\xb6z\xc7aO]\xbc\x1c\xda\xf6\xffs8\xb9\xa2\x97-\x1f\xaa\xe7V\xd2-\xf0\xa7;\xb5\xd2\x90\xe4Ni\xb6It\x7f\xba\xdazx\xa5\x91\x07%\xb7e^~{\x7f\xfb\xee\xdd\xfb\xcf\xea\xd2L\x9e`e\xdd\xf6h`\x0d\xe6\x1a\xefq\xa4\x06>\x95\x82I?\x8d\xd3\xb1(;\xbb\x11.X\xadM\xd3`\x85\xfdZ\xa3\xeb\x0c\x92\x1b\x00\x97)\x9c/\x9fG4\\<\xff\xaa2\xaa\xf5\x04\xca\xa8\xdf\x11\x94v1\xec;\x85cNucZ\x81\xdf\x0e\xa5\xfb\xc4\xcdg#\xa5\xf1\x0e!\xb5\x1d\x9e\xae\x0c\xcf\x8e&\x8a\x1a\x1fQ\xac|\x81\x1el\xb5\x06\x100\xbe\xb1\x919\x9e\xbc\xa5E\xcfS\x1c\xff\xa9\xeb \xd7\x8dr\x13Y\xe3S\x9c\xf9i A(Rq@H\x08\xe5\x8f\xc9\xe8K\x1f\xd3\xad\x89LT\xc3u\xd5r\xb4\x04@\xe7\xc2\xe1\xa6\x0d\xe2\x01!\xa4_\xc4\xd02.:\x1b\xbbb\x07&\x04\x84x\xcb\xdc<\xaa\xaaH\xf2WN%\xbc\x0b\x93E`\xcd\x8c\xea\x06\x94\xbdt\xc6F\xb3\xd7t\xef\xea\xe9\xe4l\x1f\x18(\x1b'\x97J\x97P=\xbaT\x02k\xb9\xfa[\xb5\xd5:\xee}\x07\x98\x9e \xb9\xd8\x92M\x8f]\xf7\xc6\x8a\xaf\xd2\xf09\xe4\x17\xff\x9b'c\x9b\x02\xdd)\xd4V\xc1\x1e\x99e\xb4\x1c\x91\xdd:\x1bi\x1b\x03\xc3,F|\xbegc\x13b\xcf\xaaXvE\xe4\x7f\x9e\x8b\xad\xc8\xe6\x1f\xf7\\lz\x14v<3\x0co^7\x88\xa7=\n\x9b\xb4<\x91\xd7{\xc41\xd7&\x8d\x0d\xcc\xfbB\xc5\xce\x1b?_\xa0[P\xf3(\xb9\xa6\xe3\x82\x87c_\xa6S\x0f-q\xe8*\xc7\x88\x98W\xc4j\xb4\xa6r\xc9b\x890:\xbfda\x98V?\xce\xd1\x12\xb0\x9bUG\x03\x1c\xa1g\x8a\x97\xfb8Zp\xec\x02zF\x8a\x91E[\xbek\x96\xa3\xcc\xda\xf3\xfb0\xcf\x9f\xa7\xdf\xc4g\x02\xf2\x8b/\x19\xc1\x17\xbe\xcf\xd6h\x0d\x8e`\xe4\x01$*\xa1\xa7\x02\x8a8\xfb\xb4\xb9\x17 \xefS\xaa\xd0\x87\x0c'B\xdb\x84}\xd3>\xbc\xe4\xab\x8d\xf2\xecZR\x8f\x9bR\xe5\xbd%\x1c\xa5\xb5\xea\xca^!\x87\xb5\xca\x8c\xca\xbe\xe1\x97\x83\xaf\xbfB\xc3g\x06r8\xe0\x87o\xbaG\xa2a}H\xca\x82Z\xe8\xb5\xbc\xd0p\x90\x89\xb8\x1c\xfe\x05zI\x85\x8a\x84\xc8\x89=\x0f\xb8\xd2\xb1\xc78\xf2\xd9BEX\xc0AZ\x96\xaa\x02/G2\xcf\xab\x82\xfa\x9e\xba\x80\xfe\xba^k\x17\xb1\\B()\xc1\x12\x90d(\xe2\xc9\x1bo\x10\x95\xf9II\xf54F\x0e\x16\x94 \x1c\xcbeR\xd5\x89$\xa2a\x05\x9e\xb2C\x87\xb3\xb5\x00\x9e\x18\x1b\x12,\x80\xfc.\xb8\xa8Q\xb5\xa4.\xe4j\xab\xd3P\xde\x03k\xd5G\xfe\xc2\x87.\x9d\xe4\xfd\xfd\xf4R@\xdb\xa7\x1b{X\xbe\x88\"\xb5\x96N*+\x945\x81\x14\x1e\xb3z\xf0\xbd\x06\x11\x9d\xf2\xbaX\xd2\xd2\xd3?v\xdd\x0b\xab{\xf76\x9f\xf9g\x9f\x1dm\xf7\xe7\xfb\xa2\xcc\xa36o\x04`\x1f\\-+\xac\xef|\xcb\x94\x96\xde\x9c}\xda=\xe5\xa3\xa9*\xde-z\xd0\x1e\xf0~t\xfb3\xdf\x96+\xd7-w\x96\xb3\xf4\xf7\xd7\x18o\x06\x94\x15\xa9P'j{\xa5\x0f\xc6\x8f\xbd8\xb6\x04\xec\xcb\xe5o\xdb]\xcd\x04\xb1\x8f\x14\xd0I\x12\xdf\xe3\x12\xdc\x9el<\xf6\x12xr\xc2\xf9B\\\xb3P\x0dk\xef\xfc \x80'E\xa5\\3m\xdb\xaf\xdd\x92\xdc7\x97\xff\xf4\xe9\xd2\x95\x0e\xb6]p\xea\xcfV\xdf\xcd\xddG\xdfe:\x82\xf3#o8m]m\xaa\xa1}\x80M\xcb\x9baJ\xe8\xc9\xee\xe7\xce[NG\xf0\xf1\x18\x99\x9fD\xd8%\xd7\xdd\xb2\xee\xb3\xbd^\xd9\x0enbx\xcc\x1ep\xfb&~\xcb\xd3\xd9\xde\xda\xb1\x12=\xd5\xc5\xbcn#8\xd2f\xdbn\xe5\xe5\xd0\xe30A\xc7\xff\x11L\xf6\xd1g@\x1aLw\xbev{\xeb\xb5\\\x0d\xdbQ\x1cw\xda\x1fjy\x03\xf7cM\x12\xf5\xda\xdd=\xd5\xfb\xd3\x0e\x90gE\x12[\xef2\xab\xdd\x05\xdb\xf3\x9a\xb3\xbb\x04NZ\xd7I\x9a\xcb\xf7\x9cU\xbb\x1a/:\xabk\xa2zM\xac\xda\xd7uI\x0c\xfb\xd4M\xec-%\x86E\x10^\xdc\\\xfd8\xba#K\x08\x8ad1}\xfb\x05\xb6\xf3u\xceG\xc1B-m\x1b0\xbe\x18\xba\x1c{R\xd3\xada\xda\xf6E\xf6\xd8\xd6e\xbd\x8b\x8c\x1e\xf4%\x84\x84o\"	\xeeW\xa8\xc2p\xb2\x9e\x8a\x80KZ\xdd\xd1\xaa\xa6\x9c]c\x12T\x95\xd4\xb6\x18\x8b\xa5\x04\x1e\xda\xe8\x97\x9f~\xb9\xd0\xfe\x13k\xbf\xe9\xda\xfc_\x87/~\xfe\xfaYmdZ\xac\x11\x92W\x97\xd8ysz\xc3\xf0\xac\xb5\xa9\xf9\xf6\xed\xff	\x00\x00\xff\xffPK\x07\x08\n\x94G\x82a\x12\x00\x00\xe2d\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00%c\x9aL\n\x94G\x82a\x12\x00\x00\xe2d\x00\x00\x12\x00	\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00kubeapps-objs.yamlUT\x05\x00\x01'\xc5\xe1ZPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00I\x00\x00\x00\xaa\x12\x00\x00\x00\x00"
-	fs.Register(data)
-}
diff --git a/static/.gitignore b/static/.gitignore
new file mode 100644
index 00000000000..d6b7ef32c84
--- /dev/null
+++ b/static/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/static/kubeapps-objs.yaml b/static/kubeapps-objs.yaml
deleted file mode 100644
index cf31d8f5c79..00000000000
--- a/static/kubeapps-objs.yaml
+++ /dev/null
@@ -1,1239 +0,0 @@
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: RoleBinding
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: apprepository-controller
-  name: apprepository-controller
-  namespace: kubeapps
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: Role
-  name: apprepository-controller
-subjects:
-- kind: ServiceAccount
-  name: apprepository-controller
-  namespace: kubeapps
----
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: apprepository-controller
-  name: apprepository-controller
-  namespace: kubeapps
----
-apiVersion: kubeapps.com/v1alpha1
-kind: AppRepository
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: incubator
-  name: incubator
-  namespace: kubeapps
-spec:
-  type: helm
-  url: https://kubernetes-charts-incubator.storage.googleapis.com
----
-apiVersion: kubeapps.com/v1alpha1
-kind: AppRepository
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: stable
-  name: stable
-  namespace: kubeapps
-spec:
-  type: helm
-  url: https://kubernetes-charts.storage.googleapis.com
----
-apiVersion: kubeapps.com/v1alpha1
-kind: AppRepository
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: svc-cat
-  name: svc-cat
-  namespace: kubeapps
-spec:
-  type: helm
-  url: https://svc-catalog-charts.storage.googleapis.com
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: ClusterRole
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: apprepository-controller
-  name: apprepository-controller
-rules:
-- apiGroups:
-  - batch
-  resources:
-  - cronjobs
-  verbs:
-  - get
-  - list
-  - watch
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: ClusterRoleBinding
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: apprepository-controller
-  name: apprepository-controller
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: apprepository-controller
-subjects:
-- kind: ServiceAccount
-  name: apprepository-controller
-  namespace: kubeapps
----
-apiVersion: apiextensions.k8s.io/v1beta1
-kind: CustomResourceDefinition
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: apprepositories.kubeapps.com
-  name: apprepositories.kubeapps.com
-spec:
-  group: kubeapps.com
-  names:
-    kind: AppRepository
-    plural: apprepositories
-    shortNames:
-    - apprepos
-  version: v1alpha1
----
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  annotations: {}
-  labels:
-    app: apprepository-controller
-    created-by: kubeapps
-    name: apprepository-controller
-  name: apprepository-controller
-  namespace: kubeapps
-spec:
-  minReadySeconds: 30
-  replicas: 1
-  revisionHistoryLimit: 10
-  strategy:
-    rollingUpdate:
-      maxSurge: 25%
-      maxUnavailable: 25%
-    type: RollingUpdate
-  template:
-    metadata:
-      annotations: {}
-      labels:
-        app: apprepository-controller
-        created-by: kubeapps
-        name: apprepository-controller
-    spec:
-      containers:
-      - args:
-        - --logtostderr
-        - --repo-sync-image=kubeapps/chart-repo:v0.7.1
-        command:
-        - /apprepository-controller
-        env: []
-        image: kubeapps/apprepository-controller:v0.7.1
-        name: controller
-        ports: []
-        stdin: false
-        tty: false
-        volumeMounts: []
-      imagePullSecrets: []
-      serviceAccountName: apprepository-controller
-      terminationGracePeriodSeconds: 30
-      volumes: []
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: Role
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: apprepository-controller
-  name: apprepository-controller
-  namespace: kubeapps
-rules:
-- apiGroups:
-  - ""
-  resources:
-  - events
-  verbs:
-  - create
-- apiGroups:
-  - batch
-  resources:
-  - cronjobs
-  verbs:
-  - create
-  - get
-  - list
-  - update
-  - watch
-- apiGroups:
-  - batch
-  resources:
-  - jobs
-  verbs:
-  - create
-- apiGroups:
-  - kubeapps.com
-  resources:
-  - apprepositories
-  verbs:
-  - get
-  - list
-  - update
-  - watch
----
-apiVersion: v1
-kind: Service
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: chartsvc
-  name: chartsvc
-  namespace: kubeapps
-spec:
-  ports:
-  - port: 8080
-    targetPort: http
-  selector:
-    app: chartsvc
-    name: chartsvc
-  type: ClusterIP
----
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  annotations: {}
-  labels:
-    app: chartsvc
-    created-by: kubeapps
-    name: chartsvc
-  name: chartsvc
-  namespace: kubeapps
-spec:
-  minReadySeconds: 30
-  replicas: 1
-  revisionHistoryLimit: 10
-  strategy:
-    rollingUpdate:
-      maxSurge: 25%
-      maxUnavailable: 25%
-    type: RollingUpdate
-  template:
-    metadata:
-      annotations: {}
-      labels:
-        app: chartsvc
-        created-by: kubeapps
-        name: chartsvc
-    spec:
-      containers:
-      - args:
-        - --mongo-url=mongodb.kubeapps
-        - --mongo-user=root
-        command:
-        - /chartsvc
-        env:
-        - name: MONGO_PASSWORD
-          valueFrom:
-            secretKeyRef:
-              key: mongodb-root-password
-              name: mongodb
-        image: kubeapps/chartsvc:v0.7.1
-        name: chartsvc
-        ports:
-        - containerPort: 8080
-          name: http
-        stdin: false
-        tty: false
-        volumeMounts: []
-      imagePullSecrets: []
-      terminationGracePeriodSeconds: 30
-      volumes: []
----
-apiVersion: apiextensions.k8s.io/v1beta1
-kind: CustomResourceDefinition
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: helmreleases.helm.bitnami.com
-  name: helmreleases.helm.bitnami.com
-  namespace: kubeapps
-spec:
-  group: helm.bitnami.com
-  names:
-    kind: HelmRelease
-    listKind: HelmReleaseList
-    plural: helmreleases
-    singular: helmrelease
-  scope: Namespaced
-  version: v1
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: ClusterRoleBinding
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: tiller-cluster-admin
-  name: tiller-cluster-admin
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: cluster-admin
-subjects:
-- kind: ServiceAccount
-  name: tiller
-  namespace: kubeapps
----
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  creationTimestamp: null
-  labels:
-    app: helm
-    created-by: kubeapps
-    name: tiller
-  name: tiller-deploy
-  namespace: kubeapps
-spec:
-  strategy: {}
-  template:
-    metadata:
-      creationTimestamp: null
-      labels:
-        app: helm
-        name: tiller
-    spec:
-      containers:
-      - args:
-        - --listen=localhost:44134
-        command:
-        - /tiller
-        env:
-        - name: TILLER_NAMESPACE
-          value: kubeapps
-        - name: TILLER_HISTORY_MAX
-          value: "0"
-        image: gcr.io/kubernetes-helm/tiller:v2.8.0
-        imagePullPolicy: IfNotPresent
-        livenessProbe:
-          httpGet:
-            path: /liveness
-            port: 44135
-          initialDelaySeconds: 1
-          timeoutSeconds: 1
-        name: tiller
-        ports: []
-        readinessProbe:
-          httpGet:
-            path: /readiness
-            port: 44135
-          initialDelaySeconds: 1
-          timeoutSeconds: 1
-        resources: {}
-      - args:
-        - --home=/helm
-        - --host=localhost:44134
-        command:
-        - /controller
-        env:
-        - name: POD_NAMESPACE
-          value: kubeapps
-        - name: TMPDIR
-          value: /helm
-        image: bitnami/helm-crd-controller:v0.3.0
-        name: controller
-        ports: []
-        securityContext:
-          readOnlyRootFilesystem: true
-        stdin: false
-        tty: false
-        volumeMounts:
-        - mountPath: /helm
-          name: home
-      serviceAccountName: tiller
-      volumes:
-      - emptyDir: {}
-        name: home
-status: {}
----
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: tiller
-  name: tiller
-  namespace: kubeapps
----
-apiVersion: v1
-data:
-  vhost.conf: |
-    server {
-      listen 8080;
-
-      gzip on;
-      # Angular CLI already has gzipped the assets (ng build --prod --aot)
-      gzip_static  on;
-
-      location / {
-        try_files $uri /index.html;
-      }
-    }
-
-    # Redirect www to non-www
-    # Taken from https://easyengine.io/tutorials/nginx/www-non-www-redirection/
-    server {
-      server_name "~^www\.(.*)$" ;
-      return 301 $scheme://$1$request_uri ;
-    }
-kind: ConfigMap
-metadata:
-  annotations: {}
-  labels:
-    app: kubeapps-dashboard
-    created-by: kubeapps
-    name: kubeapps-dashboard-ui-vhost
-  name: kubeapps-dashboard-ui-vhost-425de41
-  namespace: kubeapps
----
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: kubeapps-dashboard-ui
-  name: kubeapps-dashboard-ui
-  namespace: kubeapps
-spec:
-  minReadySeconds: 30
-  replicas: 1
-  revisionHistoryLimit: 10
-  strategy:
-    rollingUpdate:
-      maxSurge: 25%
-      maxUnavailable: 25%
-    type: RollingUpdate
-  template:
-    metadata:
-      annotations: {}
-      labels:
-        created-by: kubeapps
-        name: kubeapps-dashboard-ui
-    spec:
-      containers:
-      - args: []
-        env: []
-        image: kubeapps/dashboard:v0.7.1
-        livenessProbe:
-          httpGet:
-            path: /
-            port: 8080
-          initialDelaySeconds: 60
-          timeoutSeconds: 10
-        name: dashboard
-        ports:
-        - containerPort: 8080
-          name: http
-          protocol: TCP
-        readinessProbe:
-          httpGet:
-            path: /
-            port: 8080
-          initialDelaySeconds: 0
-          timeoutSeconds: 5
-        stdin: false
-        tty: false
-        volumeMounts:
-        - mountPath: /bitnami/nginx/conf/vhosts
-          name: vhost
-      imagePullSecrets: []
-      terminationGracePeriodSeconds: 30
-      volumes:
-      - configMap:
-          name: kubeapps-dashboard-ui-vhost-425de41
-        name: vhost
----
-apiVersion: v1
-kind: Service
-metadata:
-  annotations: {}
-  labels:
-    app: kubeapps-dashboard
-    created-by: kubeapps
-    name: kubeapps-dashboard-ui
-  name: kubeapps-dashboard-ui
-  namespace: kubeapps
-spec:
-  ports:
-  - port: 8080
-    targetPort: http
-  selector:
-    name: kubeapps-dashboard-ui
-  type: ClusterIP
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: ClusterRoleBinding
-metadata:
-  labels:
-    created-by: kubeapps
-  name: kubeless-controller-deployer
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: kubeless-controller-deployer
-subjects:
-- kind: ServiceAccount
-  name: controller-acct
-  namespace: kubeless
----
-apiVersion: apiextensions.k8s.io/v1beta1
-description: Kubernetes Native Serverless Framework
-kind: CustomResourceDefinition
-metadata:
-  labels:
-    created-by: kubeapps
-  name: functions.kubeless.io
-spec:
-  group: kubeless.io
-  names:
-    kind: Function
-    plural: functions
-    singular: function
-  scope: Namespaced
-  version: v1beta1
----
-apiVersion: apiextensions.k8s.io/v1beta1
-description: CRD object for HTTP trigger type
-kind: CustomResourceDefinition
-metadata:
-  labels:
-    created-by: kubeapps
-  name: httptriggers.kubeless.io
-spec:
-  group: kubeless.io
-  names:
-    kind: HTTPTrigger
-    plural: httptriggers
-    singular: httptrigger
-  scope: Namespaced
-  version: v1beta1
----
-apiVersion: apiextensions.k8s.io/v1beta1
-description: CRD object for HTTP trigger type
-kind: CustomResourceDefinition
-metadata:
-  labels:
-    created-by: kubeapps
-  name: cronjobtriggers.kubeless.io
-spec:
-  group: kubeless.io
-  names:
-    kind: CronJobTrigger
-    plural: cronjobtriggers
-    singular: cronjobtrigger
-  scope: Namespaced
-  version: v1beta1
----
-apiVersion: v1
-kind: Namespace
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: kubeless
-  name: kubeless
----
-apiVersion: v1
-data:
-  builder-image: kubeless/function-image-builder:v0.6.0
-  deployment: '{}'
-  enable-build-step: "false"
-  function-registry-tls-verify: "true"
-  ingress-enabled: "false"
-  runtime-images: |-
-    [
-      {
-        "ID": "python",
-        "compiled": false,
-        "versions": [
-          {
-            "name": "python27",
-            "version": "2.7",
-            "runtimeImage": "kubeless/python@sha256:07cfb0f3d8b6db045dc317d35d15634d7be5e436944c276bf37b1c630b03add8",
-            "initImage": "python:2.7"
-          },
-          {
-            "name": "python34",
-            "version": "3.4",
-            "runtimeImage": "kubeless/python@sha256:f19640c547a3f91dbbfb18c15b5e624029b4065c1baf2892144e07c36f0a7c8f",
-            "initImage": "python:3.4"
-          },
-          {
-            "name": "python36",
-            "version": "3.6",
-            "runtimeImage": "kubeless/python@sha256:0c9f8f727d42625a4e25230cfe612df7488b65f283e7972f84108d87e7443d72",
-            "initImage": "python:3.6"
-          }
-        ],
-        "depName": "requirements.txt",
-        "fileNameSuffix": ".py"
-      },
-      {
-        "ID": "nodejs",
-        "compiled": false,
-        "versions": [
-          {
-            "name": "node6",
-            "version": "6",
-            "runtimeImage": "kubeless/nodejs@sha256:61c5a10aacb709c4575a09a4aa28f822b2d008c0dbf4aa0b124705ee9ca143f9",
-            "initImage": "node:6.10"
-          },
-          {
-            "name": "node8",
-            "version": "8",
-            "runtimeImage": "kubeless/nodejs@sha256:fc1aa96e55116400ee13d664a655dfb2025ded91858ebfd5fc0c8f0d6b923eba",
-            "initImage": "node:8"
-          }
-        ],
-        "depName": "package.json",
-        "fileNameSuffix": ".js"
-      },
-      {
-        "ID": "ruby",
-        "compiled": false,
-        "versions": [
-          {
-            "name": "ruby24",
-            "version": "2.4",
-            "runtimeImage": "kubeless/ruby@sha256:0dce29c0eb2a246f7d825b6644eeae7957b26f2bfad2b7987f2134cc7b350f2f",
-            "initImage": "bitnami/ruby:2.4"
-          }
-        ],
-        "depName": "Gemfile",
-        "fileNameSuffix": ".rb"
-      },
-      {
-        "ID": "php",
-        "compiled": false,
-        "versions": [
-          {
-            "name": "php72",
-            "version": "7.2",
-            "runtimeImage": "kubeless/php@sha256:82b94c691302bc82f3900444255cabb8f230487764eafeba7866ac49d90ddc3b",
-            "initImage": "composer:1.6"
-          }
-        ],
-        "depName": "composer.json",
-        "fileNameSuffix": ".php"
-      },
-      {
-        "ID": "go",
-        "compiled": true,
-        "versions": [
-          {
-            "name": "go1.10",
-            "version": "1.10",
-            "runtimeImage": "kubeless/go@sha256:bf72622344a54e4360f31d3fea5eb9dca2c96fbedc6f0ad7c54f3eb8fb7bd353",
-            "initImage": "kubeless/go-init@sha256:ce6ef4fafe518ed78b3a68b03947c064fec1cf8c667cd109e9331f227877b3a9"
-          }
-        ],
-        "depName": "Gopkg.toml",
-        "fileNameSuffix": ".go"
-      }
-    ]
-  service-type: ClusterIP
-kind: ConfigMap
-metadata:
-  labels:
-    created-by: kubeapps
-  name: kubeless-config
-  namespace: kubeless
----
-apiVersion: apps/v1beta1
-kind: Deployment
-metadata:
-  labels:
-    created-by: kubeapps
-    kubeless: controller
-  name: kubeless-controller-manager
-  namespace: kubeless
-spec:
-  selector:
-    matchLabels:
-      kubeless: controller
-  template:
-    metadata:
-      labels:
-        kubeless: controller
-    spec:
-      containers:
-      - env:
-        - name: KUBELESS_INGRESS_ENABLED
-          valueFrom:
-            configMapKeyRef:
-              key: ingress-enabled
-              name: kubeless-config
-        - name: KUBELESS_SERVICE_TYPE
-          valueFrom:
-            configMapKeyRef:
-              key: service-type
-              name: kubeless-config
-        - name: KUBELESS_NAMESPACE
-          valueFrom:
-            fieldRef:
-              fieldPath: metadata.namespace
-        - name: KUBELESS_CONFIG
-          value: kubeless-config
-        image: bitnami/kubeless-controller-manager:v0.6.0
-        imagePullPolicy: IfNotPresent
-        name: kubeless-controller-manager
-      serviceAccountName: controller-acct
----
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  labels:
-    created-by: kubeapps
-  name: controller-acct
-  namespace: kubeless
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: ClusterRole
-metadata:
-  labels:
-    created-by: kubeapps
-  name: kubeless-controller-deployer
-rules:
-- apiGroups:
-  - ""
-  resources:
-  - services
-  - configmaps
-  verbs:
-  - create
-  - get
-  - delete
-  - list
-  - update
-  - patch
-- apiGroups:
-  - apps
-  - extensions
-  resources:
-  - deployments
-  verbs:
-  - create
-  - get
-  - delete
-  - list
-  - update
-  - patch
-- apiGroups:
-  - ""
-  resources:
-  - pods
-  verbs:
-  - list
-  - delete
-- apiGroups:
-  - ""
-  resourceNames:
-  - kubeless-registry-credentials
-  resources:
-  - secrets
-  verbs:
-  - get
-- apiGroups:
-  - kubeless.io
-  resources:
-  - functions
-  - httptriggers
-  - cronjobtriggers
-  verbs:
-  - get
-  - list
-  - watch
-  - update
-  - delete
-- apiGroups:
-  - batch
-  resources:
-  - cronjobs
-  - jobs
-  verbs:
-  - create
-  - get
-  - delete
-  - deletecollection
-  - list
-  - update
-  - patch
-- apiGroups:
-  - autoscaling
-  resources:
-  - horizontalpodautoscalers
-  verbs:
-  - create
-  - get
-  - delete
-  - list
-  - update
-  - patch
-- apiGroups:
-  - apiextensions.k8s.io
-  resources:
-  - customresourcedefinitions
-  verbs:
-  - get
-  - list
-- apiGroups:
-  - monitoring.coreos.com
-  resources:
-  - alertmanagers
-  - prometheuses
-  - servicemonitors
-  verbs:
-  - '*'
-- apiGroups:
-  - extensions
-  resources:
-  - ingresses
-  verbs:
-  - create
-  - get
-  - list
-  - update
-  - delete
----
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  annotations: {}
-  labels:
-    app: mongodb
-    created-by: kubeapps
-    name: mongodb
-  name: mongodb
-  namespace: kubeapps
-spec:
-  minReadySeconds: 30
-  replicas: 1
-  revisionHistoryLimit: 10
-  strategy:
-    rollingUpdate:
-      maxSurge: 0
-      maxUnavailable: 1
-    type: RollingUpdate
-  template:
-    metadata:
-      annotations: {}
-      labels:
-        app: mongodb
-        created-by: kubeapps
-        name: mongodb
-    spec:
-      containers:
-      - args: []
-        env:
-        - name: MONGODB_ROOT_PASSWORD
-          valueFrom:
-            secretKeyRef:
-              key: mongodb-root-password
-              name: mongodb
-        image: bitnami/mongodb:3.4.9-r1
-        livenessProbe:
-          exec:
-            command:
-            - mongo
-            - --eval
-            - db.adminCommand('ping')
-          initialDelaySeconds: 30
-          timeoutSeconds: 5
-        name: mongodb
-        ports:
-        - containerPort: 27017
-          name: mongodb
-        readinessProbe:
-          exec:
-            command:
-            - mongo
-            - --eval
-            - db.adminCommand('ping')
-          initialDelaySeconds: 5
-          timeoutSeconds: 1
-        resources:
-          requests:
-            cpu: 100m
-            memory: 256Mi
-        stdin: false
-        tty: false
-        volumeMounts:
-        - mountPath: /bitnami/mongodb
-          name: data
-      imagePullSecrets: []
-      terminationGracePeriodSeconds: 30
-      volumes:
-      - name: data
-        persistentVolumeClaim:
-          claimName: mongodb-data
----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: mongodb-data
-  name: mongodb-data
-  namespace: kubeapps
-spec:
-  accessModes:
-  - ReadWriteOnce
-  resources:
-    requests:
-      storage: 8Gi
----
-apiVersion: v1
-kind: Service
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: mongodb
-  name: mongodb
-  namespace: kubeapps
-spec:
-  ports:
-  - port: 27017
-    targetPort: mongodb
-  selector:
-    app: mongodb
-    name: mongodb
-  type: ClusterIP
----
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  annotations: {}
-  labels:
-    app: kubeapps
-    created-by: kubeapps
-    name: kubeapps
-  name: kubeapps
-  namespace: kubeapps
-spec:
-  minReadySeconds: 30
-  replicas: 1
-  revisionHistoryLimit: 10
-  strategy:
-    rollingUpdate:
-      maxSurge: 25%
-      maxUnavailable: 25%
-    type: RollingUpdate
-  template:
-    metadata:
-      annotations: {}
-      labels:
-        app: kubeapps
-        created-by: kubeapps
-        name: kubeapps
-    spec:
-      containers:
-      - args: []
-        env: []
-        image: bitnami/nginx:1.12
-        livenessProbe:
-          httpGet:
-            path: /
-            port: 8080
-          initialDelaySeconds: 60
-          timeoutSeconds: 10
-        name: nginx
-        ports:
-        - containerPort: 8080
-          name: http
-          protocol: TCP
-        readinessProbe:
-          httpGet:
-            path: /
-            port: 8080
-          initialDelaySeconds: 0
-          timeoutSeconds: 5
-        stdin: false
-        tty: false
-        volumeMounts:
-        - mountPath: /bitnami/nginx/conf/vhosts
-          name: vhost
-      imagePullSecrets: []
-      terminationGracePeriodSeconds: 30
-      volumes:
-      - configMap:
-          name: kubeapps-vhost-5811f90
-        name: vhost
----
-apiVersion: v1
-kind: Service
-metadata:
-  annotations: {}
-  labels:
-    app: kubeapps
-    created-by: kubeapps
-    name: kubeapps
-  name: kubeapps
-  namespace: kubeapps
-spec:
-  ports:
-  - port: 8080
-    targetPort: http
-  selector:
-    app: kubeapps
-    name: kubeapps
-  type: ClusterIP
----
-apiVersion: v1
-data:
-  vhost.conf: |
-    # Retain the default nginx handling of requests without a "Connection" header
-    map $http_upgrade $connection_upgrade {
-      default upgrade;
-      ''      close;
-    }
-
-    # Allow websocket connections
-    proxy_set_header Upgrade    $http_upgrade;
-    proxy_set_header Connection $connection_upgrade;
-
-    server {
-      listen 8080;
-
-      location /api/kube {
-        rewrite /api/kube/(.*) /$1 break;
-        rewrite /api/kube / break;
-        proxy_pass https://kubernetes.default;
-        # Disable buffering for log streaming
-        proxy_buffering off;
-        # Hide Www-Authenticate to prevent it triggering a basic auth prompt in
-        # the browser with some clusters
-        proxy_hide_header Www-Authenticate;
-      }
-
-      location /api/chartsvc {
-        rewrite /api/chartsvc/(.*) /$1 break;
-        rewrite /api/chartsvc / break;
-        proxy_pass http://chartsvc:8080;
-      }
-
-      location / {
-        proxy_pass http://kubeapps-dashboard-ui:8080;
-      }
-    }
-kind: ConfigMap
-metadata:
-  annotations: {}
-  labels:
-    app: kubeapps
-    created-by: kubeapps
-    name: kubeapps-vhost
-  name: kubeapps-vhost-5811f90
-  namespace: kubeapps
----
-apiVersion: v1
-kind: Namespace
-metadata:
-  annotations: {}
-  labels:
-    created-by: kubeapps
-    name: kubeapps
-  name: kubeapps
----
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  labels:
-    created-by: kubeapps
-  name: sealed-secrets-controller
-  namespace: kube-system
----
-apiVersion: apps/v1beta1
-kind: Deployment
-metadata:
-  labels:
-    created-by: kubeapps
-  name: sealed-secrets-controller
-  namespace: kube-system
-spec:
-  template:
-    metadata:
-      labels:
-        name: sealed-secrets-controller
-    spec:
-      containers:
-      - command:
-        - controller
-        image: quay.io/bitnami/sealed-secrets-controller:v0.5.1
-        livenessProbe:
-          httpGet:
-            path: /healthz
-            port: 8080
-        name: sealed-secrets-controller
-        ports:
-        - containerPort: 8080
-          name: http
-        readinessProbe:
-          httpGet:
-            path: /healthz
-            port: 8080
-        securityContext:
-          readOnlyRootFilesystem: true
-          runAsNonRoot: true
-          runAsUser: 1001
-      serviceAccountName: sealed-secrets-controller
----
-apiVersion: v1
-kind: Service
-metadata:
-  labels:
-    created-by: kubeapps
-  name: sealed-secrets-controller
-  namespace: kube-system
-spec:
-  ports:
-  - port: 8080
-  selector:
-    name: sealed-secrets-controller
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: RoleBinding
-metadata:
-  labels:
-    created-by: kubeapps
-  name: sealed-secrets-controller
-  namespace: kube-system
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: Role
-  name: sealed-secrets-key-admin
-subjects:
-- apiGroup: ""
-  kind: ServiceAccount
-  name: sealed-secrets-controller
-  namespace: kube-system
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: Role
-metadata:
-  labels:
-    created-by: kubeapps
-  name: sealed-secrets-key-admin
-  namespace: kube-system
-rules:
-- apiGroups:
-  - ""
-  resourceNames:
-  - sealed-secrets-key
-  resources:
-  - secrets
-  verbs:
-  - get
-- apiGroups:
-  - ""
-  resources:
-  - secrets
-  verbs:
-  - create
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: ClusterRoleBinding
-metadata:
-  labels:
-    created-by: kubeapps
-  name: sealed-secrets-controller
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: ClusterRole
-  name: secrets-unsealer
-subjects:
-- apiGroup: ""
-  kind: ServiceAccount
-  name: sealed-secrets-controller
-  namespace: kube-system
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: ClusterRole
-metadata:
-  labels:
-    created-by: kubeapps
-  name: secrets-unsealer
-rules:
-- apiGroups:
-  - bitnami.com
-  resources:
-  - sealedsecrets
-  verbs:
-  - get
-  - list
-  - watch
-- apiGroups:
-  - ""
-  resources:
-  - secrets
-  verbs:
-  - create
-  - update
-  - delete
----
-apiVersion: apiextensions.k8s.io/v1beta1
-kind: CustomResourceDefinition
-metadata:
-  labels:
-    created-by: kubeapps
-  name: sealedsecrets.bitnami.com
-spec:
-  group: bitnami.com
-  names:
-    kind: SealedSecret
-    listKind: SealedSecretList
-    plural: sealedsecrets
-    singular: sealedsecret
-  scope: Namespaced
-  validation:
-    openAPIV3Schema:
-      $schema: http://json-schema.org/draft-04/schema#
-      description: A sealed (encrypted) Secret
-      properties:
-        spec:
-          properties:
-            data:
-              pattern: ^[^A-Za-z0-9+/=]*$
-              type: string
-          type: object
-      type: object
-  version: v1alpha1