bazel_tools: add helm_install macro and use it in core services
diff --git a/appmanager/BUILD b/appmanager/BUILD
index 9faa2ab..ac84729 100644
--- a/appmanager/BUILD
+++ b/appmanager/BUILD
@@ -1,4 +1,6 @@
 load("//:bazel_tools/docker.bzl", "docker_image")
+load("//:bazel_tools/helm.bzl", "helm_install")
+load("@rules_pkg//:pkg.bzl", "pkg_tar")
 
 # TODO(lekva): figure out how to build py_binary with pip dependencies and
 # migrate off docker_image rule
@@ -10,3 +12,21 @@
 	dockerfile = "Dockerfile",
 	srcs = glob(["**"], exclude=["Dockerfile"]),
 )
+
+pkg_tar(
+	name = "chart",
+	srcs = glob(["chart/**"]),
+	extension = "tar.gz",
+	strip_prefix = "./chart",
+)
+
+helm_install(
+	name = "install",
+	namespace = "pcloud-app-manager",
+	release_name = "init",
+	chart = ":chart",
+	args = {
+	     "image.name": "localhost:30500/giolekva/pcloud-app-manager",
+     	     "image.pullPolicy": "Always",
+	},
+)
diff --git a/bazel_tools/helm.bzl b/bazel_tools/helm.bzl
new file mode 100644
index 0000000..7b71492
--- /dev/null
+++ b/bazel_tools/helm.bzl
@@ -0,0 +1,56 @@
+__HELM_INSTALL_TMPL = """
+#!/bin/sh
+# --- begin runfiles.bash initialization ---
+# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
+set -euo pipefail
+if [[ ! -d "\$${{RUNFILES_DIR:-/dev/null}}" && ! -f "\$${{RUNFILES_MANIFEST_FILE:-/dev/null}}" ]]; then
+    if [[ -f "\$$0.runfiles_manifest" ]]; then
+        export RUNFILES_MANIFEST_FILE="\$$0.runfiles_manifest"
+    elif [[ -f "\$$0.runfiles/MANIFEST" ]]; then
+        export RUNFILES_MANIFEST_FILE="\$$0.runfiles/MANIFEST"
+    elif [[ -f "\$$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
+        export RUNFILES_DIR="\$$0.runfiles"
+    fi
+fi
+if [[ -f "\$${{RUNFILES_DIR:-/dev/null}}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
+    source "\$${{RUNFILES_DIR}}/bazel_tools/tools/bash/runfiles/runfiles.bash"
+elif [[ -f "\$${{RUNFILES_MANIFEST_FILE:-/dev/null}}" ]]; then
+    source "\$$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
+    	                 "\$$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
+else
+    echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
+    exit 1
+fi
+# --- end runfiles.bash initialization ---
+CHART_TARBALL=\$$(rlocation __main__/{package}/{chart})
+helm --namespace={namespace} install --create-namespace {release_name} \$$CHART_TARBALL {args}
+"""
+
+def helm_install(name, namespace, release_name, chart, args):
+    args_str = ""
+    for arg, value in args.items():
+        args_str += "--set %s=%s " % (arg, value)
+    native.genrule(
+	name = "%s.sh" % name,
+	executable = False,
+	srcs = [chart,],
+	outs = ["helm_install.sh",],
+	cmd = """cat > $@ <<EOM
+%s
+EOM
+""" % __HELM_INSTALL_TMPL.format(
+		namespace = namespace,
+		release_name = release_name,
+		package = native.package_name(),
+		chart = "%s.tar.gz" % chart.split(":")[1],
+		args = args_str,
+	))
+    native.sh_binary(
+	name = name,
+	srcs = ["helm_install.sh",],
+	data = [
+	     chart,
+	],
+	deps = [
+	     "@bazel_tools//tools/bash/runfiles",
+	])
diff --git a/controller/BUILD b/controller/BUILD
index bfdf0b1..48e6b37 100644
--- a/controller/BUILD
+++ b/controller/BUILD
@@ -1,4 +1,6 @@
 load("//:bazel_tools/docker.bzl", "docker_image")
+load("//:bazel_tools/helm.bzl", "helm_install")
+load("@rules_pkg//:pkg.bzl", "pkg_tar")
 
 # TODO(lekva): figure out how to build py_binary with pip dependencies and
 # migrate off docker_image rule
@@ -10,3 +12,21 @@
 	dockerfile = "Dockerfile",
 	srcs = glob(["**"], exclude=["Dockerfile"]),
 )
+
+pkg_tar(
+	name = "chart",
+	srcs = glob(["chart/**"]),
+	extension = "tar.gz",
+	strip_prefix = "./chart",
+)
+
+helm_install(
+	name = "install",
+	namespace = "pcloud",
+	release_name = "init",
+	chart = ":chart",
+	args = {
+	     "image.name": "localhost:30500/giolekva/pcloud-api-server",
+     	     "image.pullPolicy": "Always",
+	},
+)
diff --git a/dev/install_core_services.sh b/dev/install_core_services.sh
index d1515c6..28d66f8 100755
--- a/dev/install_core_services.sh
+++ b/dev/install_core_services.sh
@@ -2,28 +2,17 @@
 
 ROOT="$(dirname -- $(pwd))"
 
+# Dgraph
 source $ROOT/apps/dgraph/install.sh
 
 # Knowledge Graph
-cd "$ROOT/controller"
 bazel run //controller:push_to_dev
-kubectl create namespace pcloud
-helm --namespace=pcloud install init chart \
-     --set image.name=localhost:30500/giolekva/pcloud-api-server \
-     --set image.pullPolicy=Always
+bazel run //controller:install
 
 # Application Manager
-cd "$ROOT/appmanager"
 bazel run //appmanager:push_to_dev
-kubectl create namespace pcloud-app-manager
-helm --namespace=pcloud-app-manager install init chart \
-     --set image.name=localhost:30500/giolekva/pcloud-app-manager \
-     --set image.pullPolicy=Always
+bazel run //appmanager:install
 
 # Event Processor
-cd "$ROOT/events"
 bazel run //events:push_to_dev
-kubectl create namespace pcloud-event-processor
-helm --namespace=pcloud-event-processor install init chart \
-     --set image.name=localhost:30500/giolekva/pcloud-event-processor \
-     --set image.pullPolicy=Always
+bazel run //events:install
diff --git a/events/BUILD b/events/BUILD
index a53e460..71bacea 100644
--- a/events/BUILD
+++ b/events/BUILD
@@ -1,4 +1,6 @@
 load("//:bazel_tools/docker.bzl", "docker_image")
+load("//:bazel_tools/helm.bzl", "helm_install")
+load("@rules_pkg//:pkg.bzl", "pkg_tar")
 
 # TODO(lekva): figure out how to build py_binary with pip dependencies and
 # migrate off docker_image rule
@@ -10,3 +12,21 @@
 	dockerfile = "Dockerfile",
 	srcs = glob(["**"], exclude=["Dockerfile"]),
 )
+
+pkg_tar(
+	name = "chart",
+	srcs = glob(["chart/**"]),
+	extension = "tar.gz",
+	strip_prefix = "./chart",
+)
+
+helm_install(
+	name = "install",
+	namespace = "pcloud-event-processor",
+	release_name = "init",
+	chart = ":chart",
+	args = {
+	     "image.name": "localhost:30500/giolekva/pcloud-event-processor",
+     	     "image.pullPolicy": "Always",
+	},
+)