Repository: chanzuckerberg/fogg
Pull request #582 (2021-05-24 20:12:15)

[breaking]: use go embed; remove packr; remove helm_template kind; update dependencies
### Summary
There are a bunch of changes here, apologies for the dump in advance:

- Updating all deps.
- terraform core packages, such as plan, are now internal and can't be imported. Removing experimental commands that depended on them.
- go 1.16 stdlib allows for embedding of files, use that instead of packr. One annoying bit is we have to enumerate all embeded files that start with `.` 


### Test Plan
- running in internal repo
- make sure only change in golden test files are:
   - removal of the entropy command
   - removal of kind: helm components 

### References



codecov[bot]: # [Codecov](https://codecov.io/gh/chanzuckerberg/fogg/pull/582?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=chanzuckerberg) Report
> :exclamation: No coverage uploaded for pull request base (`main@6a4bf7b`). [Click here to learn what that means](https://docs.codecov.io/docs/error-reference?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=chanzuckerberg#section-missing-base-commit).
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/chanzuckerberg/fogg/pull/582/graphs/tree.svg?width=650&height=150&src=pr&token=57DhtZ7g2A&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=chanzuckerberg)](https://codecov.io/gh/chanzuckerberg/fogg/pull/582?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=chanzuckerberg)

```diff
@@           Coverage Diff           @@
##             main     #582   +/-   ##
=======================================
  Coverage        ?   55.12%           
=======================================
  Files           ?       22           
  Lines           ?     2117           
  Branches        ?        0           
=======================================
  Hits            ?     1167           
  Misses          ?      787           
  Partials        ?      163           
```



------

[Continue to review full report at Codecov](https://codecov.io/gh/chanzuckerberg/fogg/pull/582?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=chanzuckerberg).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=chanzuckerberg)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/chanzuckerberg/fogg/pull/582?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=chanzuckerberg). Last update [6a4bf7b...2f0edde](https://codecov.io/gh/chanzuckerberg/fogg/pull/582?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=chanzuckerberg). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=chanzuckerberg).

jgadling: do we still need refs to packr in `.godownloader-packr.sh` and `.gitignore`?

Patch:
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 56956952..f52f1c92 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -8,7 +8,7 @@ jobs:
       - uses: actions/checkout@v2
       - uses: actions/setup-go@v2
         with:
-          go-version: '1.14.0'
+          go-version: '1.16'
       - run: go version
       - name: Setup buildevents
         uses: kvrhdn/gha-buildevents@v1
diff --git a/.github/workflows/mods.yml b/.github/workflows/mods.yml
index 27a3a7a8..2a6600e6 100644
--- a/.github/workflows/mods.yml
+++ b/.github/workflows/mods.yml
@@ -9,7 +9,7 @@ jobs:
           token: ${{ secrets.CZIBUILDBOT_GITHUB_TOKEN }}
       - uses: actions/setup-go@v2
         with:
-          go-version: '1.15.2'
+          go-version: '1.16'
       - name: fix go modules
         run: |
           go mod tidy
@@ -18,4 +18,3 @@ jobs:
           git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
           git commit -m "tidy modules" || true
           git push
-
diff --git a/.gitignore b/.gitignore
index 8dbf47ee..3234999a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,9 +3,6 @@ coverage.out
 dist
 .vscode
 
-# Ignore -packr generated files
-**-packr.go
-
 coverage.txt
 
 bin
diff --git a/.godownloader-packr.sh b/.godownloader-packr.sh
deleted file mode 100755
index de0629c6..00000000
--- a/.godownloader-packr.sh
+++ /dev/null
@@ -1,375 +0,0 @@
-#!/bin/sh
-set -e
-# Code generated by godownloader on 2019-09-11T00:27:45Z. DO NOT EDIT.
-#
-
-usage() {
-  this=$1
-  cat <<EOF
-$this: download go binaries for gobuffalo/packr
-
-Usage: $this [-b] bindir [-d] [tag]
-  -b sets bindir or installation directory, Defaults to ./bin
-  -d turns on debug logging
-   [tag] is a tag from
-   https://github.com/gobuffalo/packr/releases
-   If tag is missing, then the latest will be used.
-
- Generated by godownloader
-  https://github.com/goreleaser/godownloader
-
-EOF
-  exit 2
-}
-
-parse_args() {
-  #BINDIR is ./bin unless set be ENV
-  # over-ridden by flag below
-
-  BINDIR=${BINDIR:-./bin}
-  while getopts "b:dh?x" arg; do
-    case "$arg" in
-      b) BINDIR="$OPTARG" ;;
-      d) log_set_priority 10 ;;
-      h | \?) usage "$0" ;;
-      x) set -x ;;
-    esac
-  done
-  shift $((OPTIND - 1))
-  TAG=$1
-}
-# this function wraps all the destructive operations
-# if a curl|bash cuts off the end of the script due to
-# network, either nothing will happen or will syntax error
-# out preventing half-done work
-execute() {
-  tmpdir=$(mktemp -d)
-  log_debug "downloading files into ${tmpdir}"
-  http_download "${tmpdir}/${TARBALL}" "${TARBALL_URL}"
-  http_download "${tmpdir}/${CHECKSUM}" "${CHECKSUM_URL}"
-  hash_sha256_verify "${tmpdir}/${TARBALL}" "${tmpdir}/${CHECKSUM}"
-  srcdir="${tmpdir}"
-  (cd "${tmpdir}" && untar "${TARBALL}")
-  test ! -d "${BINDIR}" && install -d "${BINDIR}"
-  for binexe in $BINARIES; do
-    if [ "$OS" = "windows" ]; then
-      binexe="${binexe}.exe"
-    fi
-    install "${srcdir}/${binexe}" "${BINDIR}/"
-    log_info "installed ${BINDIR}/${binexe}"
-  done
-  rm -rf "${tmpdir}"
-}
-get_binaries() {
-  case "$PLATFORM" in
-    darwin/386) BINARIES="packr" ;;
-    darwin/amd64) BINARIES="packr" ;;
-    linux/386) BINARIES="packr" ;;
-    linux/amd64) BINARIES="packr" ;;
-    windows/386) BINARIES="packr" ;;
-    windows/amd64) BINARIES="packr" ;;
-    *)
-      log_crit "platform $PLATFORM is not supported.  Make sure this script is up-to-date and file request at https://github.com/${PREFIX}/issues/new"
-      exit 1
-      ;;
-  esac
-}
-tag_to_version() {
-  if [ -z "${TAG}" ]; then
-    log_info "checking GitHub for latest tag"
-  else
-    log_info "checking GitHub for tag '${TAG}'"
-  fi
-  REALTAG=$(github_release "$OWNER/$REPO" "${TAG}") && true
-  if test -z "$REALTAG"; then
-    log_crit "unable to find '${TAG}' - use 'latest' or see https://github.com/${PREFIX}/releases for details"
-    exit 1
-  fi
-  # if version starts with 'v', remove it
-  TAG="$REALTAG"
-  VERSION=${TAG#v}
-}
-adjust_format() {
-  # change format (tar.gz or zip) based on OS
-  true
-}
-adjust_os() {
-  # adjust archive name based on OS
-  true
-}
-adjust_arch() {
-  # adjust archive name based on ARCH
-  true
-}
-
-cat /dev/null <<EOF
-------------------------------------------------------------------------
-https://github.com/client9/shlib - portable posix shell functions
-Public domain - http://unlicense.org
-https://github.com/client9/shlib/blob/master/LICENSE.md
-but credit (and pull requests) appreciated.
-------------------------------------------------------------------------
-EOF
-is_command() {
-  command -v "$1" >/dev/null
-}
-echoerr() {
-  echo "$@" 1>&2
-}
-log_prefix() {
-  echo "$0"
-}
-_logp=6
-log_set_priority() {
-  _logp="$1"
-}
-log_priority() {
-  if test -z "$1"; then
-    echo "$_logp"
-    return
-  fi
-  [ "$1" -le "$_logp" ]
-}
-log_tag() {
-  case $1 in
-    0) echo "emerg" ;;
-    1) echo "alert" ;;
-    2) echo "crit" ;;
-    3) echo "err" ;;
-    4) echo "warning" ;;
-    5) echo "notice" ;;
-    6) echo "info" ;;
-    7) echo "debug" ;;
-    *) echo "$1" ;;
-  esac
-}
-log_debug() {
-  log_priority 7 || return 0
-  echoerr "$(log_prefix)" "$(log_tag 7)" "$@"
-}
-log_info() {
-  log_priority 6 || return 0
-  echoerr "$(log_prefix)" "$(log_tag 6)" "$@"
-}
-log_err() {
-  log_priority 3 || return 0
-  echoerr "$(log_prefix)" "$(log_tag 3)" "$@"
-}
-log_crit() {
-  log_priority 2 || return 0
-  echoerr "$(log_prefix)" "$(log_tag 2)" "$@"
-}
-uname_os() {
-  os=$(uname -s | tr '[:upper:]' '[:lower:]')
-  case "$os" in
-    cygwin_nt*) os="windows" ;;
-    mingw*) os="windows" ;;
-    msys_nt*) os="windows" ;;
-  esac
-  echo "$os"
-}
-uname_arch() {
-  arch=$(uname -m)
-  case $arch in
-    x86_64) arch="amd64" ;;
-    x86) arch="386" ;;
-    i686) arch="386" ;;
-    i386) arch="386" ;;
-    aarch64) arch="arm64" ;;
-    armv5*) arch="armv5" ;;
-    armv6*) arch="armv6" ;;
-    armv7*) arch="armv7" ;;
-  esac
-  echo ${arch}
-}
-uname_os_check() {
-  os=$(uname_os)
-  case "$os" in
-    darwin) return 0 ;;
-    dragonfly) return 0 ;;
-    freebsd) return 0 ;;
-    linux) return 0 ;;
-    android) return 0 ;;
-    nacl) return 0 ;;
-    netbsd) return 0 ;;
-    openbsd) return 0 ;;
-    plan9) return 0 ;;
-    solaris) return 0 ;;
-    windows) return 0 ;;
-  esac
-  log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib"
-  return 1
-}
-uname_arch_check() {
-  arch=$(uname_arch)
-  case "$arch" in
-    386) return 0 ;;
-    amd64) return 0 ;;
-    arm64) return 0 ;;
-    armv5) return 0 ;;
-    armv6) return 0 ;;
-    armv7) return 0 ;;
-    ppc64) return 0 ;;
-    ppc64le) return 0 ;;
-    mips) return 0 ;;
-    mipsle) return 0 ;;
-    mips64) return 0 ;;
-    mips64le) return 0 ;;
-    s390x) return 0 ;;
-    amd64p32) return 0 ;;
-  esac
-  log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value.  Please file bug report at https://github.com/client9/shlib"
-  return 1
-}
-untar() {
-  tarball=$1
-  case "${tarball}" in
-    *.tar.gz | *.tgz) tar -xzf "${tarball}" ;;
-    *.tar) tar -xf "${tarball}" ;;
-    *.zip) unzip "${tarball}" ;;
-    *)
-      log_err "untar unknown archive format for ${tarball}"
-      return 1
-      ;;
-  esac
-}
-http_download_curl() {
-  local_file=$1
-  source_url=$2
-  header=$3
-  if [ -z "$header" ]; then
-    code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url")
-  else
-    code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url")
-  fi
-  if [ "$code" != "200" ]; then
-    log_debug "http_download_curl received HTTP status $code"
-    return 1
-  fi
-  return 0
-}
-http_download_wget() {
-  local_file=$1
-  source_url=$2
-  header=$3
-  if [ -z "$header" ]; then
-    wget -q -O "$local_file" "$source_url"
-  else
-    wget -q --header "$header" -O "$local_file" "$source_url"
-  fi
-}
-http_download() {
-  log_debug "http_download $2"
-  if is_command curl; then
-    http_download_curl "$@"
-    return
-  elif is_command wget; then
-    http_download_wget "$@"
-    return
-  fi
-  log_crit "http_download unable to find wget or curl"
-  return 1
-}
-http_copy() {
-  tmp=$(mktemp)
-  http_download "${tmp}" "$1" "$2" || return 1
-  body=$(cat "$tmp")
-  rm -f "${tmp}"
-  echo "$body"
-}
-github_release() {
-  owner_repo=$1
-  version=$2
-  test -z "$version" && version="latest"
-  giturl="https://github.com/${owner_repo}/releases/${version}"
-  json=$(http_copy "$giturl" "Accept:application/json")
-  test -z "$json" && return 1
-  version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//')
-  test -z "$version" && return 1
-  echo "$version"
-}
-hash_sha256() {
-  TARGET=${1:-/dev/stdin}
-  if is_command gsha256sum; then
-    hash=$(gsha256sum "$TARGET") || return 1
-    echo "$hash" | cut -d ' ' -f 1
-  elif is_command sha256sum; then
-    hash=$(sha256sum "$TARGET") || return 1
-    echo "$hash" | cut -d ' ' -f 1
-  elif is_command shasum; then
-    hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1
-    echo "$hash" | cut -d ' ' -f 1
-  elif is_command openssl; then
-    hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1
-    echo "$hash" | cut -d ' ' -f a
-  else
-    log_crit "hash_sha256 unable to find command to compute sha-256 hash"
-    return 1
-  fi
-}
-hash_sha256_verify() {
-  TARGET=$1
-  checksums=$2
-  if [ -z "$checksums" ]; then
-    log_err "hash_sha256_verify checksum file not specified in arg2"
-    return 1
-  fi
-  BASENAME=${TARGET##*/}
-  want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1)
-  if [ -z "$want" ]; then
-    log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'"
-    return 1
-  fi
-  got=$(hash_sha256 "$TARGET")
-  if [ "$want" != "$got" ]; then
-    log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got"
-    return 1
-  fi
-}
-cat /dev/null <<EOF
-------------------------------------------------------------------------
-End of functions from https://github.com/client9/shlib
-------------------------------------------------------------------------
-EOF
-
-PROJECT_NAME="packr"
-OWNER=gobuffalo
-REPO="packr"
-BINARY=packr
-FORMAT=tar.gz
-OS=$(uname_os)
-ARCH=$(uname_arch)
-PREFIX="$OWNER/$REPO"
-
-# use in logging routines
-log_prefix() {
-	echo "$PREFIX"
-}
-PLATFORM="${OS}/${ARCH}"
-GITHUB_DOWNLOAD=https://github.com/${OWNER}/${REPO}/releases/download
-
-uname_os_check "$OS"
-uname_arch_check "$ARCH"
-
-parse_args "$@"
-
-get_binaries
-
-tag_to_version
-
-adjust_format
-
-adjust_os
-
-adjust_arch
-
-log_info "found version: ${VERSION} for ${TAG}/${OS}/${ARCH}"
-
-NAME=${PROJECT_NAME}_${VERSION}_${OS}_${ARCH}
-TARBALL=${NAME}.${FORMAT}
-TARBALL_URL=${GITHUB_DOWNLOAD}/${TAG}/${TARBALL}
-CHECKSUM=checksums.txt
-CHECKSUM_URL=${GITHUB_DOWNLOAD}/${TAG}/${CHECKSUM}
-
-
-execute
diff --git a/.goreleaser.prerelease.yml b/.goreleaser.prerelease.yml
index ebc7a509..e2a95181 100644
--- a/.goreleaser.prerelease.yml
+++ b/.goreleaser.prerelease.yml
@@ -1,7 +1,6 @@
 before:
   hooks:
     - make clean
-    - make packr
 
 builds:
   - binary: fogg
diff --git a/.goreleaser.yml b/.goreleaser.yml
index f2330c45..a0984c10 100644
--- a/.goreleaser.yml
+++ b/.goreleaser.yml
@@ -1,7 +1,6 @@
 before:
   hooks:
     - make clean
-    - make packr
 
 builds:
   - binary: fogg
diff --git a/Makefile b/Makefile
index 8aeab537..e57a03cf 100644
--- a/Makefile
+++ b/Makefile
@@ -9,15 +9,12 @@ export GO111MODULE=on
 all: test install
 
 setup: ## setup development dependencies
-	## Build dependencies
-	go get -u github.com/gobuffalo/packr/v2/packr2
-
 	## Release dependencies
 	curl -sfL https://raw.githubusercontent.com/chanzuckerberg/bff/main/download.sh | sh
 .PHONY: setup
 
 fmt:
-	goimports -w -d $$(find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./dist/*")
+	goimports -w -l .
 .PHONY: fmt
 
 lint-setup: ## setup linter dependencies
@@ -56,13 +53,6 @@ lint-all: lint-setup ## run the fast go linters
 
 TEMPLATES := $(shell find templates -not -name "*.go")
 
-templates/a_templates-packr.go: $(TEMPLATES)
-	packr2 clean -v
-	packr2 build -v
-
-packr: templates/a_templates-packr.go ## run the packr tool to generate our static files
-.PHONY: packr
-
 docker: ## check to be sure docker is running
 	@docker ps
 .PHONY: docker
@@ -86,7 +76,7 @@ release-snapshot: setup ## run a release
 	goreleaser release --snapshot
 .PHONY: release-snapshot
 
-build: fmt packr ## build the binary
+build: fmt ## build the binary
 	go build ${LDFLAGS} .
 .PHONY: build
 
@@ -98,7 +88,7 @@ coverage: ## run the go coverage tool, reading file coverage.out
 	go tool cover -html=coverage.out
 .PHONY: coverage
 
-test: fmt deps packr ## run tests
+test: fmt deps ## run tests
  ifeq (, $(shell which gotest))
 	go test -failfast -cover ./...
  else
@@ -106,20 +96,20 @@ test: fmt deps packr ## run tests
  endif
 .PHONY: test
 
-test-ci: packr ## run tests
+test-ci: ## run tests
 	go test -race -coverprofile=coverage.out -covermode=atomic ./...
 .PHONY: test-ci
 
-test-offline: packr  ## run only tests that don't require internet
+test-offline: ## run only tests that don't require internet
 	go test -tags=offline ./...
 .PHONY: test-offline
 
-test-coverage: packr  ## run the test with proper coverage reporting
+test-coverage: ## run the test with proper coverage reporting
 	go test -race -coverprofile=coverage.out -covermode=atomic ./...
 	go tool cover -html=coverage.out
 .PHONY: test-coverage
 
-install: packr ## install the fogg binary in $GOPATH/bin
+install: ## install the fogg binary in $GOPATH/bin
 	go install ${LDFLAGS} .
 .PHONY: install
 
@@ -132,7 +122,6 @@ clean: ## clean the repo
 	go clean
 	go clean -testcache
 	rm -rf dist 2>/dev/null || true
-	packr2 clean
 	rm coverage.out 2>/dev/null || true
 
 update-golden-files: clean deps ## update the golden files in testdata
diff --git a/apply/apply.go b/apply/apply.go
index 93af2772..6a8f3d52 100644
--- a/apply/apply.go
+++ b/apply/apply.go
@@ -4,6 +4,7 @@ import (
 	"bytes"
 	"fmt"
 	"io"
+	"io/fs"
 	"io/ioutil"
 	"net/url"
 	"os"
@@ -17,7 +18,6 @@ import (
 	"github.com/chanzuckerberg/fogg/plan"
 	"github.com/chanzuckerberg/fogg/templates"
 	"github.com/chanzuckerberg/fogg/util"
-	"github.com/gobuffalo/packr/v2"
 	getter "github.com/hashicorp/go-getter"
 	"github.com/hashicorp/hcl2/hclwrite"
 	"github.com/sirupsen/logrus"
@@ -122,11 +122,11 @@ func versionIsChanged(repo string, tool string) bool {
 	return toolVersion.NE(repoVersion)
 }
 
-func applyRepo(fs afero.Fs, p *plan.Plan, repoTemplates, commonTemplates *packr.Box) error {
+func applyRepo(fs afero.Fs, p *plan.Plan, repoTemplates, commonTemplates fs.FS) error {
 	return applyTree(fs, repoTemplates, commonTemplates, "", p)
 }
 
-func applyGlobal(fs afero.Fs, p plan.Component, repoBox, commonBox *packr.Box) error {
+func applyGlobal(fs afero.Fs, p plan.Component, repoBox, commonBox fs.FS) error {
 	logrus.Debug("applying global")
 	path := fmt.Sprintf("%s/global", rootPath)
 	e := fs.MkdirAll(path, 0755)
@@ -136,7 +136,7 @@ func applyGlobal(fs afero.Fs, p plan.Component, repoBox, commonBox *packr.Box) e
 	return applyTree(fs, repoBox, commonBox, path, p)
 }
 
-func applyAccounts(fs afero.Fs, p *plan.Plan, accountBox, commonBox *packr.Box) (e error) {
+func applyAccounts(fs afero.Fs, p *plan.Plan, accountBox, commonBox fs.FS) (e error) {
 	for account, accountPlan := range p.Accounts {
 		path := fmt.Sprintf("%s/accounts/%s", rootPath, account)
 		e = fs.MkdirAll(path, 0755)
@@ -151,7 +151,7 @@ func applyAccounts(fs afero.Fs, p *plan.Plan, accountBox, commonBox *packr.Box)
 	return nil
 }
 
-func applyModules(fs afero.Fs, p map[string]plan.Module, moduleBox, commonBox *packr.Box) (e error) {
+func applyModules(fs afero.Fs, p map[string]plan.Module, moduleBox, commonBox fs.FS) (e error) {
 	for module, modulePlan := range p {
 		path := fmt.Sprintf("%s/modules/%s", rootPath, module)
 		e = fs.MkdirAll(path, 0755)
@@ -166,29 +166,42 @@ func applyModules(fs afero.Fs, p map[string]plan.Module, moduleBox, commonBox *p
 	return nil
 }
 
-func applyEnvs(fs afero.Fs, p *plan.Plan, envBox *packr.Box, componentBoxes map[v2.ComponentKind]*packr.Box, commonBox *packr.Box) (e error) {
+func applyEnvs(
+	fs afero.Fs,
+	p *plan.Plan,
+	envBox fs.FS,
+	componentBoxes map[v2.ComponentKind]fs.FS,
+	commonBox fs.FS) (err error) {
 	logrus.Debug("applying envs")
 	for env, envPlan := range p.Envs {
 		logrus.Debugf("applying %s", env)
 		path := fmt.Sprintf("%s/envs/%s", rootPath, env)
-		e = fs.MkdirAll(path, 0755)
-		if e != nil {
-			return errs.WrapUserf(e, "unable to make directory %s", path)
+		err = fs.MkdirAll(path, 0755)
+		if err != nil {
+			return errs.WrapUserf(err, "unable to make directory %s", path)
 		}
-		e := applyTree(fs, envBox, commonBox, path, envPlan)
-		if e != nil {
-			return errs.WrapUser(e, "unable to apply templates to env")
+		err := applyTree(fs, envBox, commonBox, path, envPlan)
+		if err != nil {
+			return errs.WrapUser(err, "unable to apply templates to env")
 		}
 		for component, componentPlan := range envPlan.Components {
 			path = fmt.Sprintf("%s/envs/%s/%s", rootPath, env, component)
-			e = fs.MkdirAll(path, 0755)
-			if e != nil {
-				return errs.WrapUser(e, "unable to make directories for component")
+			err = fs.MkdirAll(path, 0755)
+			if err != nil {
+				return errs.WrapUser(err, "unable to make directories for component")
 			}
-			componentBox := componentBoxes[componentPlan.Kind.GetOrDefault()]
-			e := applyTree(fs, componentBox, commonBox, path, componentPlan)
-			if e != nil {
-				return errs.WrapUser(e, "unable to apply templates for component")
+
+			// NOTE(el): component kind only support TF now
+			// 					 add a dynamic check to make sure.
+			kind := componentPlan.Kind.GetOrDefault()
+			componentBox, ok := componentBoxes[kind]
+			if !ok {
+				return errs.NewUserf("component of kind '%s' not suppoerted, must be 'terraform'", kind)
+			}
+
+			err := applyTree(fs, componentBox, commonBox, path, componentPlan)
+			if err != nil {
+				return errs.WrapUser(err, "unable to apply templates for component")
 			}
 
 			if componentPlan.ModuleSource != nil {
@@ -202,8 +215,20 @@ func applyEnvs(fs afero.Fs, p *plan.Plan, envBox *packr.Box, componentBoxes map[
 	return nil
 }
 
-func applyTree(dest afero.Fs, source *packr.Box, common *packr.Box, targetBasePath string, subst interface{}) (e error) {
-	return source.Walk(func(path string, sourceFile packr.File) error {
+func applyTree(dest afero.Fs, source fs.FS, common fs.FS, targetBasePath string, subst interface{}) (e error) {
+	return fs.WalkDir(source, ".", func(path string, d fs.DirEntry, err error) error {
+		if err != nil {
+			return errs.WrapInternal(err, "unable to walk dir")
+		}
+		if d.IsDir() {
+			return nil // skip dirs
+		}
+
+		sourceFile, err := source.Open(path)
+		if err != nil {
+			return errs.WrapInternal(err, "could not read source file")
+		}
+
 		extension := filepath.Ext(path)
 		target := getTargetPath(targetBasePath, path)
 		targetExtension := filepath.Ext(target)
@@ -320,7 +345,7 @@ func removeExtension(path string) string {
 	return strings.TrimSuffix(path, filepath.Ext(path))
 }
 
-func applyTemplate(sourceFile io.Reader, commonTemplates *packr.Box, dest afero.Fs, path string, overrides interface{}) error {
+func applyTemplate(sourceFile io.Reader, commonTemplates fs.FS, dest afero.Fs, path string, overrides interface{}) error {
 	dir, _ := filepath.Split(path)
 	ospath := filepath.FromSlash(dir)
 	err := dest.MkdirAll(ospath, 0775)
@@ -350,7 +375,12 @@ type moduleData struct {
 	Outputs      []string
 }
 
-func applyModuleInvocation(fs afero.Fs, path, moduleAddress string, inModuleName *string, box *packr.Box, commonBox *packr.Box) error {
+func applyModuleInvocation(
+	fs afero.Fs,
+	path, moduleAddress string,
+	inModuleName *string,
+	box fs.FS,
+	commonBox fs.FS) error {
 	e := fs.MkdirAll(path, 0755)
 	if e != nil {
 		return errs.WrapUserf(e, "couldn't create %s directory", path)
@@ -391,7 +421,12 @@ func applyModuleInvocation(fs afero.Fs, path, moduleAddress string, inModuleName
 	if e != nil {
 		return errs.WrapUser(e, "could not open template file")
 	}
-	e = applyTemplate(f, commonBox, fs, filepath.Join(path, "main.tf"), &moduleData{moduleName, moduleAddressForSource, variables, outputs})
+	e = applyTemplate(
+		f,
+		commonBox,
+		fs,
+		filepath.Join(path, "main.tf"),
+		&moduleData{moduleName, moduleAddressForSource, variables, outputs})
 	if e != nil {
 		return errs.WrapUser(e, "unable to apply template for main.tf")
 	}
diff --git a/cmd/exp_aws_config.go b/cmd/exp_aws_config.go
index b4d93ab8..6d0cf3fd 100644
--- a/cmd/exp_aws_config.go
+++ b/cmd/exp_aws_config.go
@@ -8,11 +8,11 @@ import (
 	"github.com/aws/aws-sdk-go/aws/arn"
 	"github.com/chanzuckerberg/fogg/config"
 	"github.com/chanzuckerberg/fogg/errs"
-	"github.com/mitchellh/go-homedir"
+	homedir "github.com/mitchellh/go-homedir"
 	"github.com/sirupsen/logrus"
 	"github.com/spf13/afero"
 	"github.com/spf13/cobra"
-	"gopkg.in/ini.v1"
+	ini "gopkg.in/ini.v1"
 )
 
 func init() {
diff --git a/cmd/exp_entropy.go b/cmd/exp_entropy.go
deleted file mode 100644
index 35476a6d..00000000
--- a/cmd/exp_entropy.go
+++ /dev/null
@@ -1,101 +0,0 @@
-package cmd
-
-import (
-	"fmt"
-	"os"
-
-	"github.com/go-logfmt/logfmt"
-	"github.com/hashicorp/terraform/plans"
-	"github.com/hashicorp/terraform/plans/planfile"
-	"github.com/spf13/cobra"
-)
-
-func init() {
-	entropyCmd.Flags().StringP("plan-file", "f", "TODO", "Path to Terraform Plan file to parse.")
-	entropyCmd.Flags().StringP("output-file", "o", "TODO", "Path to write instrumentation to")
-
-	expCmd.AddCommand(entropyCmd)
-}
-
-const (
-	allActions = "AllActions"
-)
-
-var entropyCmd = &cobra.Command{
-	Use:   "entropy",
-	Short: "Measures how many differences result from a terraform plan.",
-	Long: `This command will parse a Terraform plan and track any diffs.
-It is meant to be run with honeycomb/buildevents and thus we generate
-output in LogFmt format.`,
-	Run: func(cmd *cobra.Command, args []string) {
-		err := entropyRun(cmd, args)
-		if err != nil {
-			// We don't want this to error out our build
-			fmt.Fprintf(os.Stderr, "fogg entropy error: %s", err)
-		}
-	},
-}
-
-func entropyRun(cmd *cobra.Command, _ []string) error {
-	planFilePath, err := cmd.Flags().GetString("plan-file")
-	if err != nil {
-		return fmt.Errorf("could not read plan-file flag: %w", err)
-	}
-	outputFilePath, err := cmd.Flags().GetString("output-file")
-	if err != nil {
-		return fmt.Errorf("could not read output-file flag: %w", err)
-	}
-
-	planReader, err := planfile.Open(planFilePath)
-	if err != nil {
-		return fmt.Errorf("could not open terraform plan: %w", err)
-	}
-	defer planReader.Close()
-
-	plan, err := planReader.ReadPlan()
-	if err != nil {
-		return fmt.Errorf("could not read/parse terraform plan: %w", err)
-	}
-
-	f, err := os.Create(outputFilePath)
-	if err != nil {
-		return fmt.Errorf("could not open output file for writing: %w", err)
-	}
-	defer f.Close()
-
-	encoder := logfmt.NewEncoder(f)
-	actionCounts := map[string]int{
-		// Also keep a summary of all actions
-		allActions: 0,
-	}
-
-	// We just keep a simple count of the terraform actions
-	for _, resourceChange := range plan.Changes.Resources {
-		action := resourceChange.Action
-
-		if action == plans.NoOp {
-			continue
-		}
-
-		count, ok := actionCounts[action.String()]
-		if !ok {
-			actionCounts[action.String()] = 1
-		} else {
-			actionCounts[action.String()] = count + 1
-		}
-		actionCounts[allActions] = actionCounts[allActions] + 1
-	}
-
-	for action, count := range actionCounts {
-		err = encoder.EncodeKeyval(action, count)
-		if err != nil {
-			return fmt.Errorf("could not encode key/val %w", err)
-		}
-	}
-
-	err = encoder.EndRecord()
-	if err != nil {
-		return fmt.Errorf("could not end record: %w", err)
-	}
-	return nil
-}
diff --git a/cmd/fmt.go b/cmd/fmt.go
index bfd6ce0e..2df10da0 100644
--- a/cmd/fmt.go
+++ b/cmd/fmt.go
@@ -8,11 +8,10 @@ import (
 	"github.com/pkg/errors"
 	"github.com/spf13/afero"
 	"github.com/spf13/cobra"
-	"gopkg.in/yaml.v3"
+	yaml "gopkg.in/yaml.v3"
 )
 
 func init() {
-	// planCmd.Flags().StringP("config", "c", "fogg.yml", "Use this to override the fogg config file.")
 	rootCmd.AddCommand(fmtCmd)
 }
 
diff --git a/config/config.go b/config/config.go
index 3c92a9a0..6c3de361 100644
--- a/config/config.go
+++ b/config/config.go
@@ -10,7 +10,7 @@ import (
 	goVersion "github.com/hashicorp/go-version"
 	"github.com/sirupsen/logrus"
 	"github.com/spf13/afero"
-	"gopkg.in/yaml.v3"
+	yaml "gopkg.in/yaml.v3"
 )
 
 var defaultTerraformVersion = goVersion.Must(goVersion.NewVersion("0.13.5"))
diff --git a/config/v2/config.go b/config/v2/config.go
index 0575ae8d..7357c448 100644
--- a/config/v2/config.go
+++ b/config/v2/config.go
@@ -12,7 +12,7 @@ import (
 	"github.com/chanzuckerberg/fogg/errs"
 	"github.com/chanzuckerberg/fogg/plugins"
 	"github.com/spf13/afero"
-	"gopkg.in/yaml.v3"
+	yaml "gopkg.in/yaml.v3"
 )
 
 //ReadConfig take a byte array as input and outputs a json or yaml config struct
@@ -352,8 +352,6 @@ const (
 	DefaultComponentKind ComponentKind = "terraform"
 	// ComponentKindTerraform is a terraform component
 	ComponentKindTerraform = DefaultComponentKind
-	// ComponentKindHelmTemplate is a helm template component
-	ComponentKindHelmTemplate ComponentKind = "helm_template"
 )
 
 // Generate is used for test/quick integration. There are supposedly ways to do this without polluting the public
diff --git a/docs/reference/config_file.md b/docs/reference/config_file.md
index 9aa798e7..c62f4707 100644
--- a/docs/reference/config_file.md
+++ b/docs/reference/config_file.md
@@ -207,7 +207,7 @@ Each workspace within an environment is called a `component`
 In addition to the common workspace arguments, components also support the following arguments:
 
 - `eks` - Object that contains a `cluster_name` key to point terraform to a kubectl context
-- `kind` - String, either `terraform` or `helm_template` (DEPRECATED)
+- `kind` - String,  only `terraform` is supported (DEPRECATED)
 - `module_source` - String, path to a terraform module to use for this component. If this is a
   relative path such as `terraform/modules/webserver`, fogg will generate a main.tf in this
   component with a full invocation to this module.
diff --git a/exp/examine/util.go b/exp/examine/util.go
index e81717e1..4442ba2e 100644
--- a/exp/examine/util.go
+++ b/exp/examine/util.go
@@ -4,7 +4,7 @@ import (
 	"os"
 
 	"github.com/chanzuckerberg/fogg/errs"
-	"github.com/hashicorp/go-getter"
+	getter "github.com/hashicorp/go-getter"
 	"github.com/hashicorp/terraform-config-inspect/tfconfig"
 	"github.com/spf13/afero"
 )
diff --git a/exp/hcl/blocks.go b/exp/hcl/blocks.go
index ae24cf3a..32616281 100644
--- a/exp/hcl/blocks.go
+++ b/exp/hcl/blocks.go
@@ -4,7 +4,7 @@ import (
 	"path/filepath"
 	"strings"
 
-	"github.com/hashicorp/hcl/v2"
+	hcl "github.com/hashicorp/hcl/v2"
 	"github.com/hashicorp/hcl/v2/hclparse"
 	"github.com/hashicorp/terraform-config-inspect/tfconfig"
 	"github.com/sirupsen/logrus"
diff --git a/exp/hcl/schema.go b/exp/hcl/schema.go
index 787567c6..1b16edbf 100644
--- a/exp/hcl/schema.go
+++ b/exp/hcl/schema.go
@@ -1,10 +1,8 @@
 package hcl
 
-// taken from https://github.com/hashicorp/terraform-config-inspect/blob/17f92b0546e8602e4cecb14d2263f0b1746b9cc9/tfconfig/schema.go
+import hcl "github.com/hashicorp/hcl/v2"
 
-import (
-	"github.com/hashicorp/hcl/v2"
-)
+// taken from https://github.com/hashicorp/terraform-config-inspect/blob/17f92b0546e8602e4cecb14d2263f0b1746b9cc9/tfconfig/schema.go
 
 var rootSchema = &hcl.BodySchema{
 	Blocks: []hcl.BlockHeaderSchema{
diff --git a/exp/migrate/migrate.go b/exp/migrate/migrate.go
index 210ad733..bca318cc 100644
--- a/exp/migrate/migrate.go
+++ b/exp/migrate/migrate.go
@@ -11,7 +11,7 @@ import (
 	"github.com/aws/aws-sdk-go/aws"
 	"github.com/hashicorp/terraform/terraform"
 	"github.com/pkg/errors"
-	"github.com/segmentio/go-prompt"
+	prompt "github.com/segmentio/go-prompt"
 	"github.com/sirupsen/logrus"
 )
 
diff --git a/exp/modules/modules.go b/exp/modules/modules.go
index a415be5c..c9f5b40a 100644
--- a/exp/modules/modules.go
+++ b/exp/modules/modules.go
@@ -9,7 +9,7 @@ import (
 	"github.com/chanzuckerberg/fogg/config"
 	fogg_hcl "github.com/chanzuckerberg/fogg/exp/hcl"
 	"github.com/chanzuckerberg/go-misc/sets"
-	"github.com/hashicorp/hcl/v2"
+	hcl "github.com/hashicorp/hcl/v2"
 	"github.com/sirupsen/logrus"
 	"github.com/spf13/afero"
 )
diff --git a/go.mod b/go.mod
index 49ad6182..e1abeed5 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
 module github.com/chanzuckerberg/fogg
 
-go 1.14
+go 1.16
 
 replace github.com/spf13/afero v1.2.2 => github.com/chanzuckerberg/afero v0.0.0-20190514223411-36a9495a9b51
 
@@ -17,8 +17,6 @@ require (
 	github.com/davecgh/go-spew v1.1.1
 	github.com/fatih/color v1.10.0
 	github.com/go-errors/errors v1.1.1
-	github.com/go-logfmt/logfmt v0.5.0
-	github.com/gobuffalo/packr/v2 v2.8.1
 	github.com/google/go-github/v27 v27.0.6
 	github.com/hashicorp/go-getter v1.5.2
 	github.com/hashicorp/go-multierror v1.1.1
@@ -32,25 +30,22 @@ require (
 	github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c // indirect
 	github.com/huandu/xstrings v1.3.1 // indirect
 	github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a
-	github.com/karrick/godirwalk v1.16.1 // indirect
 	github.com/kr/pretty v0.2.1
 	github.com/mitchellh/go-homedir v1.1.0
 	github.com/mitchellh/go-testing-interface v1.14.0 // indirect
 	github.com/mitchellh/go-wordwrap v1.0.1 // indirect
 	github.com/peterbourgon/diskv v2.0.1+incompatible
 	github.com/pkg/errors v0.9.1
-	github.com/rogpeppe/go-internal v1.8.0 // indirect
 	github.com/segmentio/go-prompt v1.2.1-0.20161017233205-f0d19b6901ad
 	github.com/sirupsen/logrus v1.8.1
 	github.com/spf13/afero v1.2.2
 	github.com/spf13/cobra v1.1.3
 	github.com/stretchr/testify v1.7.0
-	golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e // indirect
-	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
-	golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6 // indirect
+	golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a // indirect
+	golang.org/x/sys v0.0.0-20210521203332-0cec03c779c1 // indirect
 	golang.org/x/term v0.0.0-20210503060354-a79de5458b56 // indirect
-	golang.org/x/tools v0.1.0 // indirect
+	golang.org/x/tools v0.1.1 // indirect
 	gopkg.in/go-playground/validator.v9 v9.31.0
-	gopkg.in/ini.v1 v1.62.0
+	gopkg.in/ini.v1 v1.51.0
 	gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776
 )
diff --git a/go.sum b/go.sum
index 804588d7..7be0b9ed 100644
--- a/go.sum
+++ b/go.sum
@@ -268,8 +268,6 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=
-github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
 github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8=
 github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
@@ -293,12 +291,6 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me
 github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
 github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
 github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
-github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc=
-github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM=
-github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM=
-github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI=
-github.com/gobuffalo/packr/v2 v2.8.1 h1:tkQpju6i3EtMXJ9uoF5GT6kB+LMTimDWD8Xvbz6zDVA=
-github.com/gobuffalo/packr/v2 v2.8.1/go.mod h1:c/PLlOuTU+p3SybaJATW3H6lX/iK7xEz5OeMf+NnJpg=
 github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
 github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
 github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
@@ -531,9 +523,6 @@ github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0t
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
 github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
-github.com/karrick/godirwalk v1.15.8/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
-github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw=
-github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
 github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk=
 github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U=
 github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw=
@@ -584,12 +573,6 @@ github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
-github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI=
-github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc=
-github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY=
-github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI=
-github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI=
-github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc=
 github.com/masterzen/simplexml v0.0.0-20190410153822-31eea3082786/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc=
 github.com/masterzen/winrm v0.0.0-20200615185753-c42b5136ff88/go.mod h1:a2HXwefeat3evJHxFXSayvRHpYEPJYtErl4uIzfaUqY=
@@ -695,7 +678,6 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
 github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
-github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -730,9 +712,6 @@ github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uY
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
-github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
 github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -764,7 +743,6 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B
 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/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
-github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
 github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
 github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M=
 github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
@@ -839,6 +817,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/zalando/go-keyring v0.1.0/go.mod h1:RaxNwUITJaHVdQ0VC7pELPZ3tOWn13nr0gZMZEhpVU0=
 github.com/zclconf/go-cty v1.0.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
 github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
@@ -877,15 +856,14 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/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-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e h1:8foAy0aoO5GkqCvAEJ4VC4P3zksTg4X4aJCDpZzmgQI=
-golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
+golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc=
+golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
 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-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -918,8 +896,9 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -969,8 +948,9 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -987,7 +967,6 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1042,9 +1021,10 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6 h1:cdsMqa2nXzqlgs183pHxtvoVwU7CyzaCTAUOg94af4c=
-golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210521203332-0cec03c779c1 h1:lCnv+lfrU9FRPGf8NeRuWAAPjNnema5WtBinMgs1fD8=
+golang.org/x/sys v0.0.0-20210521203332-0cec03c779c1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w=
 golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY=
@@ -1106,7 +1086,6 @@ golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapK
 golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -1119,8 +1098,8 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc
 golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
 golang.org/x/tools v0.0.0-20201028111035-eafbe7b904eb/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs=
+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1238,9 +1217,8 @@ gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWd
 gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
 gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
-gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
 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=
diff --git a/plan/plan.go b/plan/plan.go
index a3ee76e9..31b56609 100644
--- a/plan/plan.go
+++ b/plan/plan.go
@@ -11,7 +11,7 @@ import (
 	"github.com/chanzuckerberg/fogg/util"
 	"github.com/chanzuckerberg/go-misc/ptr"
 	"github.com/sirupsen/logrus"
-	"gopkg.in/yaml.v3"
+	yaml "gopkg.in/yaml.v3"
 )
 
 // Plan represents a set of actions to take
@@ -469,10 +469,6 @@ func (p *Plan) buildEnvs(conf *v2.Config) (map[string]Env, error) {
 				return nil, errs.WrapUser(fmt.Errorf("Component %s can't have same name as account", componentName), "Invalid component name")
 			}
 
-			if componentConf.Kind.GetOrDefault() == v2.ComponentKindHelmTemplate {
-				componentPlan.EKS = resolveEKSConfig(envPlan.EKS, componentConf.EKS)
-			}
-
 			componentPlan.ComponentCommon = resolveComponentCommon(defaults.Common, envConf.Common, componentConf.Common)
 			accountRemoteStates := v2.ResolveOptionalStringSlice(v2.DependsOnAccountsGetter, defaults.Common, envConf.Common, componentConf.Common)
 			accountBackends := map[string]Backend{}
@@ -898,17 +894,6 @@ func resolveComponentCommon(commons ...v2.Common) ComponentCommon {
 	}
 }
 
-func resolveEKSConfig(def *v2.EKSConfig, override *v2.EKSConfig) *v2.EKSConfig {
-	resolved := &v2.EKSConfig{}
-	if def != nil {
-		resolved.ClusterName = def.ClusterName
-	}
-	if override != nil {
-		resolved.ClusterName = override.ClusterName
-	}
-	return resolved
-}
-
 func resolveExtraVars(vars ...map[string]string) map[string]string {
 	resolved := map[string]string{}
 
diff --git a/templates/component/helm_template/Chart.yaml.tmpl b/templates/component/helm_template/Chart.yaml.tmpl
deleted file mode 100644
index 26735ab5..00000000
--- a/templates/component/helm_template/Chart.yaml.tmpl
+++ /dev/null
@@ -1,6 +0,0 @@
-# Auto-generated by fogg. Do not edit
-# Make improvements in fogg, so that everyone can benefit.
-
-apiVersion: v1
-name: {{ .Name }}
-version: 0.0.1 # TODO(el): figure out
diff --git a/templates/component/helm_template/Makefile.tmpl b/templates/component/helm_template/Makefile.tmpl
deleted file mode 100644
index 2e8475e9..00000000
--- a/templates/component/helm_template/Makefile.tmpl
+++ /dev/null
@@ -1,46 +0,0 @@
-# Auto-generated by fogg. Do not edit
-# Make improvements in fogg, so that everyone can benefit.
-SHELL := /bin/bash
-
-include {{ .PathToRepoRoot }}/scripts/common.mk
-export PATH := $(REPO_ROOT)/.fogg/bin:$(PATH)
-
-KUBECTL_FLAGS := --wait=true --prune -l fogg/project={{ .Project }},fogg/env={{ .Env }},fogg/component={{ .Name }}
-
-# TODO(el): Replace with kubectl diff once that is supported (k8s >= 1.13)
-plan: set-eks-context
-	@helm template -f variables.yaml . | kubectl --context='{{ .EKS.ClusterName }}' apply --dry-run $(KUBECTL_FLAGS) -f -
-.PHONY: plan
-
-apply: plan
-	@read -p "Continue (yes/no)? " choice && if [ "$${choice}" != "yes" ]; then \
-		echo "Apply cancelled, only yes accepted"; \
-	else \
-		helm template -f variables.yaml . | kubectl --context='{{ .EKS.ClusterName }}' apply $(KUBECTL_FLAGS) -f -; \
-	fi
-.PHONY: apply
-
-check: lint plan
-.PHONY: check
-
-set-eks-context:
-	@aws --region {{ .ProviderConfiguration.AWS.Region }} --profile {{ .ProviderConfiguration.AWS.Profile }} eks update-kubeconfig --name {{ .EKS.ClusterName }} --alias {{ .EKS.ClusterName }}
-.PHONY: set-eks-context
-
-lint:
-	@helm lint -f variables.yaml .
-.PHONY: lint
-
-fmt:
-	@echo "Not implemented for component of kind helm_template"
-.PHONY: fmt
-
-docs:
-	@echo "Not implemented for component of kind helm_template"
-.PHONY: docs
-
-clean:
-	@echo "Nothing to do"
-.PHONY: clean
-
-{{ template "make_help"  }}
diff --git a/templates/component/helm_template/requirements.yaml.touch b/templates/component/helm_template/requirements.yaml.touch
deleted file mode 100644
index e69de29b..00000000
diff --git a/templates/component/helm_template/templates/main.yaml.touch b/templates/component/helm_template/templates/main.yaml.touch
deleted file mode 100644
index e69de29b..00000000
diff --git a/templates/component/helm_template/values.yaml.tmpl b/templates/component/helm_template/values.yaml.tmpl
deleted file mode 100644
index 97f37ab0..00000000
--- a/templates/component/helm_template/values.yaml.tmpl
+++ /dev/null
@@ -1,25 +0,0 @@
-# Auto-generated by fogg. Do not edit
-# Make improvements in fogg, so that everyone can benefit.
-
-env: {{ .Env }}
-project: {{ .Project }}
-region: {{ .ProviderConfiguration.AWS.Region }}
-component: {{ .Name }}
-owner: {{ .Owner }}
-aws_profile: {{ .ProviderConfiguration.AWS.Profile }}
-tags:
-  env: {{ .Env }}
-  project: {{ .Project }}
-  region: {{ .ProviderConfiguration.AWS.Region }}
-  component: {{ .Name }}
-  owner: {{ .Owner }}
-  managedBy: kubectl
-
-{{ range $key, $val := .ExtraVars -}}
-{{ $key }}: {{ $val }}
-{{ end }}
-
-aws_accounts:
-{{- range $accountName, $accountID := .Accounts -}}
-  {{ $accountName }}: {{ $accountID -}}
-{{ end }}
diff --git a/templates/component/helm_template/variables.yaml.touch b/templates/component/helm_template/variables.yaml.touch
deleted file mode 100644
index e69de29b..00000000
diff --git a/templates/templates.go b/templates/templates.go
index 9092c593..f1e55255 100644
--- a/templates/templates.go
+++ b/templates/templates.go
@@ -1,33 +1,67 @@
 package templates
 
 import (
+	"embed"
+	"io/fs"
+
 	v2 "github.com/chanzuckerberg/fogg/config/v2"
-	"github.com/gobuffalo/packr/v2"
+	"github.com/sirupsen/logrus"
 )
 
+// NOTE(el): due to a design decision of go embed, we enumerate files starting with
+//           the following set of characters: {.} giving explicit attention to directories with ONLY
+//           files starting with said characters
+//go:embed templates/.github/*
+//go:embed templates/circleci/.circleci/*
+//go:embed templates/common/*
+//go:embed templates/component/*
+//go:embed templates/env/*
+//go:embed templates/module/*
+//go:embed templates/module/.update-readme.sh.rm
+//go:embed templates/module-invocation/*
+//go:embed templates/repo
+//go:embed templates/repo/scripts/*
+//go:embed templates/repo/.fogg-version.tmpl
+//go:embed templates/repo/.gitattributes
+//go:embed templates/repo/.gitignore
+//go:embed templates/repo/.terraformignore.tmpl
+//go:embed templates/repo/terraform.d/.keep.touch
+//go:embed templates/repo/.terraform.d/plugin-cache/.gitignore
+//go:embed templates/travis-ci/.travis.yml.tmpl
+var templates embed.FS
+
 type T struct {
-	Common           *packr.Box
-	Components       map[v2.ComponentKind]*packr.Box
-	Env              *packr.Box
-	Module           *packr.Box
-	ModuleInvocation *packr.Box
-	Repo             *packr.Box
-	TravisCI         *packr.Box
-	CircleCI         *packr.Box
-	GitHubActionsCI  *packr.Box
+	Common           fs.FS
+	Components       map[v2.ComponentKind]fs.FS
+	Env              fs.FS
+	Module           fs.FS
+	ModuleInvocation fs.FS
+	Repo             fs.FS
+	TravisCI         fs.FS
+	CircleCI         fs.FS
+	GitHubActionsCI  fs.FS
+}
+
+// we control the inputs so should never panic
+func mustFSSub(dir string) fs.FS {
+	fs, err := fs.Sub(templates, dir)
+	if err != nil {
+		logrus.Fatalf("could not find templates for %s: %s", dir, err)
+		return nil
+	}
+	return fs
 }
 
 var Templates = &T{
-	Common: packr.New("common", "./common"),
-	Components: map[v2.ComponentKind]*packr.Box{
-		v2.ComponentKindTerraform:    packr.New("component/terraform", "./component/terraform"),
-		v2.ComponentKindHelmTemplate: packr.New("component/helm_template", "./component/helm_template"),
+	Common: mustFSSub("templates/common"),
+	Components: map[v2.ComponentKind]fs.FS{
+		v2.ComponentKindTerraform: mustFSSub("templates/component/terraform"),
 	},
-	Env:              packr.New("env", "./env"),
-	Module:           packr.New("module", "./module"),
-	ModuleInvocation: packr.New("module-invocation", "./module-invocation"),
-	Repo:             packr.New("repo", "./repo"),
-	TravisCI:         packr.New("travis-ci", "./travis-ci"),
-	CircleCI:         packr.New("circleci", "./circleci"),
-	GitHubActionsCI:  packr.New(".github", "./.github"),
+	Env:              mustFSSub("templates/env"),
+	Module:           mustFSSub("templates/module"),
+	ModuleInvocation: mustFSSub("templates/module-invocation"),
+	Repo:             mustFSSub("templates/repo"),
+	TravisCI:         mustFSSub("templates/travis-ci"),
+	CircleCI:         mustFSSub("templates/circleci"),
+	GitHubActionsCI:  mustFSSub("templates/.github"),
 }
diff --git a/templates/.github/workflows/fogg_ci.yml.tmpl b/templates/templates/.github/workflows/fogg_ci.yml.tmpl
similarity index 100%
rename from templates/.github/workflows/fogg_ci.yml.tmpl
rename to templates/templates/.github/workflows/fogg_ci.yml.tmpl
diff --git a/templates/circleci/.circleci/config.yml.tmpl b/templates/templates/circleci/.circleci/config.yml.tmpl
similarity index 100%
rename from templates/circleci/.circleci/config.yml.tmpl
rename to templates/templates/circleci/.circleci/config.yml.tmpl
diff --git a/templates/common/auth0_provider.tmpl b/templates/templates/common/auth0_provider.tmpl
similarity index 100%
rename from templates/common/auth0_provider.tmpl
rename to templates/templates/common/auth0_provider.tmpl
diff --git a/templates/common/aws_provider.tmpl b/templates/templates/common/aws_provider.tmpl
similarity index 100%
rename from templates/common/aws_provider.tmpl
rename to templates/templates/common/aws_provider.tmpl
diff --git a/templates/common/backends.tmpl b/templates/templates/common/backends.tmpl
similarity index 100%
rename from templates/common/backends.tmpl
rename to templates/templates/common/backends.tmpl
diff --git a/templates/common/bless_provider.tmpl b/templates/templates/common/bless_provider.tmpl
similarity index 100%
rename from templates/common/bless_provider.tmpl
rename to templates/templates/common/bless_provider.tmpl
diff --git a/templates/common/datadog_provider.tmpl b/templates/templates/common/datadog_provider.tmpl
similarity index 100%
rename from templates/common/datadog_provider.tmpl
rename to templates/templates/common/datadog_provider.tmpl
diff --git a/templates/common/fogg_header.tmpl b/templates/templates/common/fogg_header.tmpl
similarity index 100%
rename from templates/common/fogg_header.tmpl
rename to templates/templates/common/fogg_header.tmpl
diff --git a/templates/common/github_provider.tmpl b/templates/templates/common/github_provider.tmpl
similarity index 100%
rename from templates/common/github_provider.tmpl
rename to templates/templates/common/github_provider.tmpl
diff --git a/templates/common/global_remote.tmpl b/templates/templates/common/global_remote.tmpl
similarity index 100%
rename from templates/common/global_remote.tmpl
rename to templates/templates/common/global_remote.tmpl
diff --git a/templates/common/heroku_provider.tmpl b/templates/templates/common/heroku_provider.tmpl
similarity index 100%
rename from templates/common/heroku_provider.tmpl
rename to templates/templates/common/heroku_provider.tmpl
diff --git a/templates/common/make-help.tmpl b/templates/templates/common/make-help.tmpl
similarity index 100%
rename from templates/common/make-help.tmpl
rename to templates/templates/common/make-help.tmpl
diff --git a/templates/common/make_vars.tmpl b/templates/templates/common/make_vars.tmpl
similarity index 100%
rename from templates/common/make_vars.tmpl
rename to templates/templates/common/make_vars.tmpl
diff --git a/templates/common/okta_provider.tmpl b/templates/templates/common/okta_provider.tmpl
similarity index 100%
rename from templates/common/okta_provider.tmpl
rename to templates/templates/common/okta_provider.tmpl
diff --git a/templates/common/remote_state.tmpl b/templates/templates/common/remote_state.tmpl
similarity index 100%
rename from templates/common/remote_state.tmpl
rename to templates/templates/common/remote_state.tmpl
diff --git a/templates/common/sentry_provider.tmpl b/templates/templates/common/sentry_provider.tmpl
similarity index 100%
rename from templates/common/sentry_provider.tmpl
rename to templates/templates/common/sentry_provider.tmpl
diff --git a/templates/common/snowflake_provider.tmpl b/templates/templates/common/snowflake_provider.tmpl
similarity index 100%
rename from templates/common/snowflake_provider.tmpl
rename to templates/templates/common/snowflake_provider.tmpl
diff --git a/templates/common/tfe_provider.tmpl b/templates/templates/common/tfe_provider.tmpl
similarity index 100%
rename from templates/common/tfe_provider.tmpl
rename to templates/templates/common/tfe_provider.tmpl
diff --git a/templates/component/terraform/Makefile.tmpl b/templates/templates/component/terraform/Makefile.tmpl
similarity index 100%
rename from templates/component/terraform/Makefile.tmpl
rename to templates/templates/component/terraform/Makefile.tmpl
diff --git a/templates/component/terraform/README.md.touch b/templates/templates/component/terraform/README.md.touch
similarity index 100%
rename from templates/component/terraform/README.md.touch
rename to templates/templates/component/terraform/README.md.touch
diff --git a/templates/component/terraform/fogg.tf.tmpl b/templates/templates/component/terraform/fogg.tf.tmpl
similarity index 100%
rename from templates/component/terraform/fogg.tf.tmpl
rename to templates/templates/component/terraform/fogg.tf.tmpl
diff --git a/templates/component/terraform/main.tf.touch b/templates/templates/component/terraform/main.tf.touch
similarity index 100%
rename from templates/component/terraform/main.tf.touch
rename to templates/templates/component/terraform/main.tf.touch
diff --git a/templates/component/terraform/outputs.tf.touch b/templates/templates/component/terraform/outputs.tf.touch
similarity index 100%
rename from templates/component/terraform/outputs.tf.touch
rename to templates/templates/component/terraform/outputs.tf.touch
diff --git a/templates/component/terraform/terraform.d.ln b/templates/templates/component/terraform/terraform.d.ln
similarity index 100%
rename from templates/component/terraform/terraform.d.ln
rename to templates/templates/component/terraform/terraform.d.ln
diff --git a/templates/component/terraform/variables.tf.touch b/templates/templates/component/terraform/variables.tf.touch
similarity index 100%
rename from templates/component/terraform/variables.tf.touch
rename to templates/templates/component/terraform/variables.tf.touch
diff --git a/templates/env/Makefile.tmpl b/templates/templates/env/Makefile.tmpl
similarity index 100%
rename from templates/env/Makefile.tmpl
rename to templates/templates/env/Makefile.tmpl
diff --git a/templates/env/README.md.touch b/templates/templates/env/README.md.touch
similarity index 100%
rename from templates/env/README.md.touch
rename to templates/templates/env/README.md.touch
diff --git a/templates/module-invocation/main.tf.tmpl b/templates/templates/module-invocation/main.tf.tmpl
similarity index 100%
rename from templates/module-invocation/main.tf.tmpl
rename to templates/templates/module-invocation/main.tf.tmpl
diff --git a/templates/module-invocation/outputs.tf.tmpl b/templates/templates/module-invocation/outputs.tf.tmpl
similarity index 100%
rename from templates/module-invocation/outputs.tf.tmpl
rename to templates/templates/module-invocation/outputs.tf.tmpl
diff --git a/templates/module/.update-readme.sh.rm b/templates/templates/module/.update-readme.sh.rm
similarity index 100%
rename from templates/module/.update-readme.sh.rm
rename to templates/templates/module/.update-readme.sh.rm
diff --git a/templates/module/Makefile.tmpl b/templates/templates/module/Makefile.tmpl
similarity index 100%
rename from templates/module/Makefile.tmpl
rename to templates/templates/module/Makefile.tmpl
diff --git a/templates/module/README.md.create b/templates/templates/module/README.md.create
similarity index 100%
rename from templates/module/README.md.create
rename to templates/templates/module/README.md.create
diff --git a/templates/module/fogg.tf.tmpl b/templates/templates/module/fogg.tf.tmpl
similarity index 100%
rename from templates/module/fogg.tf.tmpl
rename to templates/templates/module/fogg.tf.tmpl
diff --git a/templates/module/main.tf.touch b/templates/templates/module/main.tf.touch
similarity index 100%
rename from templates/module/main.tf.touch
rename to templates/templates/module/main.tf.touch
diff --git a/templates/module/outputs.tf.touch b/templates/templates/module/outputs.tf.touch
similarity index 100%
rename from templates/module/outputs.tf.touch
rename to templates/templates/module/outputs.tf.touch
diff --git a/templates/module/variables.tf.touch b/templates/templates/module/variables.tf.touch
similarity index 100%
rename from templates/module/variables.tf.touch
rename to templates/templates/module/variables.tf.touch
diff --git a/templates/repo/.fogg-version.tmpl b/templates/templates/repo/.fogg-version.tmpl
similarity index 100%
rename from templates/repo/.fogg-version.tmpl
rename to templates/templates/repo/.fogg-version.tmpl
diff --git a/templates/repo/.gitattributes b/templates/templates/repo/.gitattributes
similarity index 100%
rename from templates/repo/.gitattributes
rename to templates/templates/repo/.gitattributes
diff --git a/templates/repo/.gitignore b/templates/templates/repo/.gitignore
similarity index 100%
rename from templates/repo/.gitignore
rename to templates/templates/repo/.gitignore
diff --git a/templates/repo/.terraform.d/plugin-cache/.gitignore b/templates/templates/repo/.terraform.d/plugin-cache/.gitignore
similarity index 100%
rename from templates/repo/.terraform.d/plugin-cache/.gitignore
rename to templates/templates/repo/.terraform.d/plugin-cache/.gitignore
diff --git a/templates/repo/.terraformignore.tmpl b/templates/templates/repo/.terraformignore.tmpl
similarity index 100%
rename from templates/repo/.terraformignore.tmpl
rename to templates/templates/repo/.terraformignore.tmpl
diff --git a/templates/repo/Makefile.tmpl b/templates/templates/repo/Makefile.tmpl
similarity index 100%
rename from templates/repo/Makefile.tmpl
rename to templates/templates/repo/Makefile.tmpl
diff --git a/templates/repo/README.md.touch b/templates/templates/repo/README.md.touch
similarity index 100%
rename from templates/repo/README.md.touch
rename to templates/templates/repo/README.md.touch
diff --git a/templates/repo/scripts/bless_ssh_config.rm b/templates/templates/repo/scripts/bless_ssh_config.rm
similarity index 100%
rename from templates/repo/scripts/bless_ssh_config.rm
rename to templates/templates/repo/scripts/bless_ssh_config.rm
diff --git a/templates/repo/scripts/common.mk b/templates/templates/repo/scripts/common.mk
similarity index 100%
rename from templates/repo/scripts/common.mk
rename to templates/templates/repo/scripts/common.mk
diff --git a/templates/repo/scripts/component.mk b/templates/templates/repo/scripts/component.mk
similarity index 97%
rename from templates/repo/scripts/component.mk
rename to templates/templates/repo/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/templates/repo/scripts/component.mk
+++ b/templates/templates/repo/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/util/template.go b/util/template.go
index 0ca89942..ae1c8ba4 100644
--- a/util/template.go
+++ b/util/template.go
@@ -2,13 +2,13 @@ package util
 
 import (
 	"io"
-	"io/ioutil"
+	"io/fs"
 	"reflect"
 	"text/template"
 
 	"github.com/Masterminds/sprig"
 	"github.com/chanzuckerberg/fogg/errs"
-	"github.com/gobuffalo/packr/v2"
+	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 )
 
@@ -39,46 +39,40 @@ func avail(name string, data interface{}) bool {
 }
 
 // OpenTemplate will read `source` for a template, parse, configure and return a template.Template
-func OpenTemplate(label string, source io.Reader, commonTemplates *packr.Box) (*template.Template, error) {
+func OpenTemplate(label string, source io.Reader, templates fs.FS) (*template.Template, error) {
 	// TODO we should probably cache these rather than open and parse them for every apply
-
-	var readTemplate = func(source io.Reader) (string, error) {
-		s, err := ioutil.ReadAll(source)
-
-		if err != nil {
-			return "", errs.WrapInternal(err, "could not read template")
-		}
-		return string(s), nil
-	}
-
-	s, err := readTemplate(source)
-	if err != nil {
-		return nil, err
-	}
-
 	funcs := sprig.TxtFuncMap()
 	funcs["dict"] = dict
 	funcs["avail"] = avail
 
-	t, err := template.New(label).Funcs(funcs).Parse(s)
+	s, err := io.ReadAll(source)
 	if err != nil {
-		return nil, err
+		return nil, errs.WrapInternal(err, "could not read template")
 	}
 
-	err = commonTemplates.Walk(func(path string, file packr.File) error {
-		s, err := readTemplate(file)
+	t, err := template.New(label).Funcs(funcs).Parse(string(s))
+	if err != nil {
+		return nil, errs.WrapInternal(err, "could not read template")
+	}
+
+	err = fs.WalkDir(templates, ".", func(path string, d fs.DirEntry, err error) error {
 		if err != nil {
 			return err
 		}
+		if d.IsDir() {
+			return nil // nothing to do
+		}
 
-		t, err = t.Parse(s)
+		contents, err := fs.ReadFile(templates, path)
+		if err != nil {
+			return errors.Wrapf(err, "could not read contents at %s", path)
+		}
 
-		return err
+		t, err = t.Parse(string(contents))
+		return errors.Wrapf(err, "could not parse template at %s", path)
 	})
-
 	if err != nil {
-		return nil, err
+		return nil, errors.Wrap(err, "could not walk templates")
 	}
-
-	return t, err
+	return t, nil
 }


Test patch:
diff --git a/apply/apply_test.go b/apply/apply_test.go
index 9d1954b9..f3922bc7 100644
--- a/apply/apply_test.go
+++ b/apply/apply_test.go
@@ -14,7 +14,7 @@ import (
 	"github.com/sirupsen/logrus"
 	"github.com/spf13/afero"
 	"github.com/stretchr/testify/require"
-	"gopkg.in/yaml.v3"
+	yaml "gopkg.in/yaml.v3"
 )
 
 func init() {
diff --git a/plan/plan_test.go b/plan/plan_test.go
index cab3f473..8b5b2375 100644
--- a/plan/plan_test.go
+++ b/plan/plan_test.go
@@ -84,7 +84,7 @@ func TestPlanBasicV2Yaml(t *testing.T) {
 	r.NotNil(plan.Envs["staging"])
 
 	r.NotNil(plan.Envs["staging"].Components)
-	r.Len(plan.Envs["staging"].Components, 4)
+	r.Len(plan.Envs["staging"].Components, 3)
 
 	r.NotNil(plan.Envs["staging"])
 	r.NotNil(plan.Envs["staging"].Components["vpc"])
@@ -96,9 +96,6 @@ func TestPlanBasicV2Yaml(t *testing.T) {
 	r.NotNil(plan.Envs["staging"].Components["comp1"])
 	r.Equal("0.100.0", plan.Envs["staging"].Components["comp1"].TerraformVersion)
 
-	r.NotNil(plan.Envs["staging"].Components["comp_helm_template"])
-	r.Equal("k8s", plan.Envs["staging"].Components["comp_helm_template"].EKS.ClusterName)
-
 	r.NotNil(plan.Envs["prod"])
 	r.NotNil(plan.Envs["prod"].Components["hero"])
 	r.NotNil(plan.Envs["prod"].Components["hero"].ProviderConfiguration)
@@ -135,13 +132,6 @@ func TestPlanBasicV2Yaml(t *testing.T) {
 	r.True(plan.GitHubActionsCI.Enabled)
 }
 
-func TestResolveEKSConfig(t *testing.T) {
-	r := require.New(t)
-	r.Equal("", resolveEKSConfig(nil, nil).ClusterName)
-	r.Equal("a", resolveEKSConfig(&v2.EKSConfig{ClusterName: "a"}, nil).ClusterName)
-	r.Equal("b", resolveEKSConfig(&v2.EKSConfig{ClusterName: "a"}, &v2.EKSConfig{ClusterName: "b"}).ClusterName)
-}
-
 func TestRemoteBackendPlan(t *testing.T) {
 	r := require.New(t)
 
diff --git a/templates/repo/scripts/dependencies.mk.rm b/templates/templates/repo/scripts/dependencies.mk.rm
similarity index 100%
rename from templates/repo/scripts/dependencies.mk.rm
rename to templates/templates/repo/scripts/dependencies.mk.rm
diff --git a/templates/repo/scripts/failed_output_only b/templates/templates/repo/scripts/failed_output_only
similarity index 100%
rename from templates/repo/scripts/failed_output_only
rename to templates/templates/repo/scripts/failed_output_only
diff --git a/templates/repo/scripts/install_or_update.sh.rm b/templates/templates/repo/scripts/install_or_update.sh.rm
similarity index 100%
rename from templates/repo/scripts/install_or_update.sh.rm
rename to templates/templates/repo/scripts/install_or_update.sh.rm
diff --git a/templates/repo/scripts/module.mk b/templates/templates/repo/scripts/module.mk
similarity index 100%
rename from templates/repo/scripts/module.mk
rename to templates/templates/repo/scripts/module.mk
diff --git a/templates/repo/scripts/ssh_config.tmpl.rm b/templates/templates/repo/scripts/ssh_config.tmpl.rm
similarity index 100%
rename from templates/repo/scripts/ssh_config.tmpl.rm
rename to templates/templates/repo/scripts/ssh_config.tmpl.rm
diff --git a/templates/repo/scripts/update-readme.sh b/templates/templates/repo/scripts/update-readme.sh
similarity index 100%
rename from templates/repo/scripts/update-readme.sh
rename to templates/templates/repo/scripts/update-readme.sh
diff --git a/templates/repo/terraform.d/.keep.touch b/templates/templates/repo/terraform.d/.keep.touch
similarity index 100%
rename from templates/repo/terraform.d/.keep.touch
rename to templates/templates/repo/terraform.d/.keep.touch
diff --git a/templates/travis-ci/.travis.yml.tmpl b/templates/templates/travis-ci/.travis.yml.tmpl
similarity index 100%
rename from templates/travis-ci/.travis.yml.tmpl
rename to templates/templates/travis-ci/.travis.yml.tmpl
diff --git a/templates/templates_test.go b/templates/templates_test.go
index 17dfda5c..1401c1a5 100644
--- a/templates/templates_test.go
+++ b/templates/templates_test.go
@@ -1,11 +1,11 @@
 package templates
 
 import (
+	"io/fs"
 	"testing"
 
 	v2 "github.com/chanzuckerberg/fogg/config/v2"
 	"github.com/chanzuckerberg/fogg/util"
-	"github.com/gobuffalo/packr/v2"
 	"github.com/stretchr/testify/require"
 )
 
@@ -13,7 +13,7 @@ func TestOpenTemplate(t *testing.T) {
 	temps := Templates
 
 	type args struct {
-		box  *packr.Box
+		box  fs.FS
 		path string
 	}
 
@@ -41,4 +41,5 @@ func TestOpenTemplate(t *testing.T) {
 			r.NotNil(temp.Templates())
 		})
 	}
+
 }
diff --git a/testdata/auth0_provider_yaml/scripts/component.mk b/testdata/auth0_provider_yaml/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/auth0_provider_yaml/scripts/component.mk
+++ b/testdata/auth0_provider_yaml/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/testdata/bless_provider_yaml/scripts/component.mk b/testdata/bless_provider_yaml/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/bless_provider_yaml/scripts/component.mk
+++ b/testdata/bless_provider_yaml/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/testdata/circleci/scripts/component.mk b/testdata/circleci/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/circleci/scripts/component.mk
+++ b/testdata/circleci/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/testdata/github_actions/scripts/component.mk b/testdata/github_actions/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/github_actions/scripts/component.mk
+++ b/testdata/github_actions/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/testdata/github_provider_yaml/scripts/component.mk b/testdata/github_provider_yaml/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/github_provider_yaml/scripts/component.mk
+++ b/testdata/github_provider_yaml/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/testdata/okta_provider_yaml/scripts/component.mk b/testdata/okta_provider_yaml/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/okta_provider_yaml/scripts/component.mk
+++ b/testdata/okta_provider_yaml/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/testdata/snowflake_provider_yaml/scripts/component.mk b/testdata/snowflake_provider_yaml/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/snowflake_provider_yaml/scripts/component.mk
+++ b/testdata/snowflake_provider_yaml/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/testdata/tfe_provider_yaml/scripts/component.mk b/testdata/tfe_provider_yaml/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/tfe_provider_yaml/scripts/component.mk
+++ b/testdata/tfe_provider_yaml/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/testdata/v2_full_yaml/.github/workflows/fogg_ci.yml b/testdata/v2_full_yaml/.github/workflows/fogg_ci.yml
index dc6654e2..1f4ce182 100644
--- a/testdata/v2_full_yaml/.github/workflows/fogg_ci.yml
+++ b/testdata/v2_full_yaml/.github/workflows/fogg_ci.yml
@@ -66,9 +66,6 @@ jobs:
       - run: |
           cd terraform/envs/staging/comp2
           make  lint
-      - run: |
-          cd terraform/envs/staging/comp_helm_template
-          make  lint
       - run: |
           cd terraform/envs/staging/vpc
           make  lint
diff --git a/testdata/v2_full_yaml/fogg.yml b/testdata/v2_full_yaml/fogg.yml
index 51c02321..fe1ba016 100644
--- a/testdata/v2_full_yaml/fogg.yml
+++ b/testdata/v2_full_yaml/fogg.yml
@@ -95,10 +95,6 @@ envs:
       host_name: example.com
       organization: foo
     components:
-      comp_helm_template:
-        eks:
-          cluster_name: k8s
-        kind: helm_template
       comp1:
         backend:
           profile: comp1
diff --git a/testdata/v2_full_yaml/scripts/component.mk b/testdata/v2_full_yaml/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/v2_full_yaml/scripts/component.mk
+++ b/testdata/v2_full_yaml/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/testdata/v2_full_yaml/terraform/envs/staging/Makefile b/testdata/v2_full_yaml/terraform/envs/staging/Makefile
index 219711db..9fb1403e 100644
--- a/testdata/v2_full_yaml/terraform/envs/staging/Makefile
+++ b/testdata/v2_full_yaml/terraform/envs/staging/Makefile
@@ -1,7 +1,7 @@
 # Auto-generated by fogg. Do not edit
 # Make improvements in fogg, so that everyone can benefit.
 
-COMPONENTS=comp1 comp2 comp_helm_template vpc
+COMPONENTS=comp1 comp2 vpc
 
 all:
 .PHONY: all
diff --git a/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/Chart.yaml b/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/Chart.yaml
deleted file mode 100644
index 316502a6..00000000
--- a/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/Chart.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-# Auto-generated by fogg. Do not edit
-# Make improvements in fogg, so that everyone can benefit.
-
-apiVersion: v1
-name: comp_helm_template
-version: 0.0.1 # TODO(el): figure out
diff --git a/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/Makefile b/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/Makefile
deleted file mode 100644
index 2b3073ae..00000000
--- a/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-# Auto-generated by fogg. Do not edit
-# Make improvements in fogg, so that everyone can benefit.
-SHELL := /bin/bash
-
-include ../../../..//scripts/common.mk
-export PATH := $(REPO_ROOT)/.fogg/bin:$(PATH)
-
-KUBECTL_FLAGS := --wait=true --prune -l fogg/project=proj,fogg/env=staging,fogg/component=comp_helm_template
-
-# TODO(el): Replace with kubectl diff once that is supported (k8s >= 1.13)
-plan: set-eks-context
-	@helm template -f variables.yaml . | kubectl --context='k8s' apply --dry-run $(KUBECTL_FLAGS) -f -
-.PHONY: plan
-
-apply: plan
-	@read -p "Continue (yes/no)? " choice && if [ "$${choice}" != "yes" ]; then \
-		echo "Apply cancelled, only yes accepted"; \
-	else \
-		helm template -f variables.yaml . | kubectl --context='k8s' apply $(KUBECTL_FLAGS) -f -; \
-	fi
-.PHONY: apply
-
-check: lint plan
-.PHONY: check
-
-set-eks-context:
-	@aws --region us-west-2 --profile profile eks update-kubeconfig --name k8s --alias k8s
-.PHONY: set-eks-context
-
-lint:
-	@helm lint -f variables.yaml .
-.PHONY: lint
-
-fmt:
-	@echo "Not implemented for component of kind helm_template"
-.PHONY: fmt
-
-docs:
-	@echo "Not implemented for component of kind helm_template"
-.PHONY: docs
-
-clean:
-	@echo "Nothing to do"
-.PHONY: clean
-
-
-help: ## display help for this makefile
-	@fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
-.PHONY: help
-
diff --git a/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/requirements.yaml b/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/requirements.yaml
deleted file mode 100644
index e69de29b..00000000
diff --git a/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/templates/main.yaml b/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/templates/main.yaml
deleted file mode 100644
index e69de29b..00000000
diff --git a/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/values.yaml b/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/values.yaml
deleted file mode 100644
index b7550568..00000000
--- a/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/values.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-# Auto-generated by fogg. Do not edit
-# Make improvements in fogg, so that everyone can benefit.
-
-env: staging
-project: proj
-region: us-west-2
-component: comp_helm_template
-owner: foo@example.com
-aws_profile: profile
-tags:
-  env: staging
-  project: proj
-  region: us-west-2
-  component: comp_helm_template
-  owner: foo@example.com
-  managedBy: kubectl
-
-foo: bar2
-
-
-aws_accounts:bar: 456foo: 123
diff --git a/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/variables.yaml b/testdata/v2_full_yaml/terraform/envs/staging/comp_helm_template/variables.yaml
deleted file mode 100644
index e69de29b..00000000
diff --git a/testdata/v2_minimal_valid_yaml/scripts/component.mk b/testdata/v2_minimal_valid_yaml/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/v2_minimal_valid_yaml/scripts/component.mk
+++ b/testdata/v2_minimal_valid_yaml/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \
diff --git a/testdata/v2_no_aws_provider_yaml/scripts/component.mk b/testdata/v2_no_aws_provider_yaml/scripts/component.mk
index 2eb92973..ecd75eba 100644
--- a/testdata/v2_no_aws_provider_yaml/scripts/component.mk
+++ b/testdata/v2_no_aws_provider_yaml/scripts/component.mk
@@ -112,9 +112,6 @@ check-plan: check-auth init refresh-cached ## run a terraform plan and check tha
 	@if [ "$(TF_BACKEND_KIND)" != "remote" ]; then \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false -refresh=$(REFRESH) -out=$(CHECK_PLANFILE_PATH) ; \
 		ERR=$$?; \
-		if [ -n "$(BUILDEVENT_FILE)" ]; then \
-			fogg exp entropy -f $(CHECK_PLANFILE_PATH) -o $(BUILDEVENT_FILE) ; \
-		fi; \
 		rm $(CHECK_PLANFILE_PATH) 2>/dev/null; \
 	else \
 		$(terraform_command) plan $(TF_ARGS) -detailed-exitcode -lock=false; \