Skip to content

Commit

Permalink
New version
Browse files Browse the repository at this point in the history
* Implement tf and vault commands in terms of the
raw source command
* Added --tiller-namespace to kube command
* Bump version
* Adds tests
* Updates README
  • Loading branch information
denibertovic committed Feb 19, 2019
1 parent 8ec7a3b commit 5e774a8
Show file tree
Hide file tree
Showing 8 changed files with 94 additions and 53 deletions.
39 changes: 39 additions & 0 deletions README.md
Expand Up @@ -78,6 +78,42 @@ Or specify a path to the password store:
denv pass -p /path/to/password-store
```

## Raw

Example config file in `/tmp/env`:

```bash
export FOO=foo
```

Activate env with:

```bash
denv source /tmp/env
```

`NOTE`: In essence this just exports whatever is written in the env file and keeps track of it
so that we can unset it later.

## Terraform

Example config file in `prod/env`:

```bash
export ENVIRONMENT=prod
export TF_VAR_some_var_foo=$ENVIRONMENT-foo

```

Activate env with:

```bash
denv tf -p prod/env
```

`NOTE`: This command is implemented in terms of the above `raw`.
The only difference is that the prompt will say `tf` instead of `raw`.

## Vault env

Example config file in `~/.vault/example`:
Expand All @@ -94,6 +130,9 @@ Activate env with:
denv vault -p ~/.vault/example
```

`NOTE`: As with the `tf` command, this too is implemented in terms of the `raw` command.
The only difference is that the prompt will show `vault` instead of `raw`.

## AWS env (Beta)

This feature is still in beta. Please report bugs if you find them.
Expand Down
9 changes: 7 additions & 2 deletions completions/_denv
Expand Up @@ -48,7 +48,11 @@ __source () {
"files:filename:_files" \
}

__tf () {}
__tf() {
_arguments \
"(-p --terraform-project)"{-p,--terraform-project=}"[Terraform env file path]:project:_files" \
}


__deactivate () {}

Expand All @@ -72,7 +76,8 @@ __kube_namespaces=(default kube-system monitoring review)
__kube() {
_arguments \
"(-p --kube-project)"{-p,--kube-project=}"[Kube project]:project:_files" \
"(-n --kube-namespace)"{-n,--kube-namespace=}"[Kube namespace]:namespace:($__kube_namespaces)"
"(-n --kube-namespace)"{-n,--kube-namespace=}"[Kube namespace]:namespace:($__kube_namespaces)" \
"(-t --tiller-namespace)"{-t,--tiller-namespace=}"[Tiller namespace]:namespace:($__kube_namespaces)" \
}

__denv_commands () {
Expand Down
4 changes: 2 additions & 2 deletions denv.cabal
Expand Up @@ -4,10 +4,10 @@ cabal-version: 1.12
--
-- see: https://github.com/sol/hpack
--
-- hash: bb7b05cdeaf4a84c8eaefa79748c35904fde5239c448d8a810ff50c1247058ac
-- hash: 909f8e11cfdeacc9e713d84647df54b889ccf87cbcfd4de621a01ee20aa37074

name: denv
version: 0.4.0.1
version: 0.5.0.0
description: Please see the README on GitHub at <https://github.com/denibertovic/denv#readme>
homepage: https://github.com/denibertovic/denv#readme
bug-reports: https://github.com/denibertovic/denv/issues
Expand Down
2 changes: 1 addition & 1 deletion package.yaml
@@ -1,5 +1,5 @@
name: denv
version: 0.4.0.1
version: 0.5.0.0
github: "denibertovic/denv"
license: LGPL-3
author: "Deni Bertovic"
Expand Down
56 changes: 16 additions & 40 deletions src/Denv/Lib.hs
Expand Up @@ -29,67 +29,41 @@ import Denv.Utils
import qualified Denv.Aws as AWS

entrypoint :: DenvArgs -> IO ()
entrypoint (DenvArgs (Kube p n) debug) = mkKubeEnv p n
entrypoint (DenvArgs (Kube p n t) debug) = mkKubeEnv p n t
entrypoint (DenvArgs (Pass p) debug) = mkPassEnv p
entrypoint (DenvArgs (Source p) debug) = mkRawEnv p
entrypoint (DenvArgs (Source p) debug) = mkRawEnv Nothing p
entrypoint (DenvArgs (Vault p) debug) = mkVaultEnv p
entrypoint (DenvArgs (Aws p cmd) debug) = AWS.mkAwsEnv p cmd debug
entrypoint (DenvArgs (Terraform e) debug) = mkTerraformEnv e
entrypoint (DenvArgs (Terraform p) debug) = mkTerraformEnv p
entrypoint (DenvArgs Deactivate debug) = deactivateEnv
entrypoint (DenvArgs (Hook s) debug) = execHook s
entrypoint (DenvArgs (Export s) debug) = execExport s

mkRawEnv :: FilePath -> IO ()
mkRawEnv p = do
mkRawEnv :: Maybe String -> FilePath -> IO ()
mkRawEnv mp p = do
checkEnv
exists <- doesFileExist p
unless exists (die $ "ERROR: File does not exist: " ++ p)
let p' = mkRawEnvShort p
c <- TIO.readFile p
deac <- parseEnvFileOrDie p' c
let prp = T.pack $ maybe "raw|" (\x -> x <> "|") mp
let env =
withVarTracking
(Just deac)
[ Set OldPrompt ps1
, Set RawEnvFile $ T.pack p'
, Set Prompt $ mkEscapedText "raw|$RAW_ENV_FILE $PS1"
, Set Prompt $ mkEscapedText $ prp <> "$RAW_ENV_FILE $PS1"
]
writeRcWithPredefined c env


mkVaultEnv :: FilePath -> IO ()
mkVaultEnv p = do
checkEnv
exists <- doesFileExist p
unless exists (die $ "ERROR: VaultConfig file does not exist: " ++ p)
let p' = takeFileName p
c <- TIO.readFile p
deac <- parseEnvFileOrDie p' c
let env =
withVarTracking
(Just deac)
[ Set OldPrompt ps1
, Set VaultConfig $ T.pack p'
, Set Prompt $ mkEscapedText "vault|$VAULT_CONFIG $PS1"
]
writeRcWithPredefined c env
mkRawEnv (Just "vault") p

mkTerraformEnv :: EnvironmentType -> IO ()
mkTerraformEnv e = do
checkEnv
curDirPath <- getCurrentDirectory
let path = curDirPath </> show e
exists <- doesDirectoryExist path
unless exists (die $ "ERROR: Directory does not exist " ++ path)
c <- TIO.readFile (path </> "env")
deac <- parseEnvFileOrDie path c
let env =
withVarTracking
(Just deac)
[ Set OldPrompt ps1
, Set Prompt $ mkEscapedText "terraform|$ENVIRONMENT $PS1"
]
writeRcWithPredefined c env
mkTerraformEnv :: FilePath -> IO ()
mkTerraformEnv p = do
mkRawEnv (Just "tf") p

mkPassEnv :: Maybe PasswordStorePath -> IO ()
mkPassEnv p = do
Expand All @@ -109,22 +83,24 @@ mkPassEnv p = do
]
writeRc env

mkKubeEnv :: KubeProjectName -> Maybe KubeNamespace -> IO ()
mkKubeEnv p n = do
mkKubeEnv :: KubeProjectName -> Maybe KubeNamespace -> Maybe TillerNamespace -> IO ()
mkKubeEnv p n t = do
checkEnv
exists <- doesFileExist p
unless exists (die $ "ERROR: Kubeconfig does not exist: " ++ p)
let p' = takeFileName p
let n' = fromMaybe "default" n
let t' = fromMaybe "kube-system" t
let env =
withVarTracking
Nothing
[ Set KubeConfig $ T.pack p
, Set KubeConfigShort $ T.pack p'
, Set KubectlNamespace $ T.pack n'
, Set TillerNamespace $ T.pack t'
, Set OldPrompt ps1
, Set Prompt $
mkEscapedText "k8s|$KUBECTL_NAMESPACE|$KUBECONFIG_SHORT $PS1"
mkEscapedText $ "k8s|n:$KUBECTL_NAMESPACE|t:$TILLER_NAMESPACE|$KUBECONFIG_SHORT $PS1"
]
writeRc env

Expand Down
20 changes: 17 additions & 3 deletions src/Denv/Options.hs
Expand Up @@ -20,8 +20,9 @@ data DenvArgs = DenvArgs
data Command
= Kube KubeProjectName
(Maybe KubeNamespace)
(Maybe TillerNamespace)
| Pass (Maybe PasswordStorePath)
| Terraform EnvironmentType
| Terraform FilePath
| Source FilePath
| Aws AwsProfile [String]
| Vault FilePath
Expand Down Expand Up @@ -65,6 +66,13 @@ kubeNamespaceOpt =
(long "kube-namespace" <> short 'n' <> metavar "NAMESPACE" <>
help "Kube Namespace. Example: kube-system or default.")

tillerNamespaceOpt :: Parser (Maybe String)
tillerNamespaceOpt =
optional $
strOption
(long "tiller-namespace" <> short 't' <> metavar "NAMESPACE" <>
help "Tiller Namespace. Example: kube-system or default.")

kubeProjectOpt :: Parser String
kubeProjectOpt =
strOption
Expand Down Expand Up @@ -92,6 +100,12 @@ vaultProjectOpt =
(long "vault-project" <> short 'p' <> metavar "PATH" <>
help "Vault env file path")

terraformEnvOpt :: Parser String
terraformEnvOpt =
strOption
(long "terraform-project" <> short 'p' <> metavar "PATH" <>
help "Terraform env file path")

cmdSource :: Mod CommandFields Command
cmdSource = command "source" infos
where
Expand All @@ -112,7 +126,7 @@ cmdTerraform = command "tf" infos
infos = info (options <**> helper) desc
desc = progDesc "Set terraform environment."
options =
Terraform <$> argument (maybeReader readEnvironmentType) (metavar "ENV")
Terraform <$> terraformEnvOpt

cmdAws :: Env -> Mod CommandFields Command
cmdAws env = command "aws" infos
Expand All @@ -127,7 +141,7 @@ cmdKube = command "kube" infos
where
infos = info (options <**> helper) desc
desc = progDesc "Set kube environment."
options = Kube <$> kubeProjectOpt <*> kubeNamespaceOpt
options = Kube <$> kubeProjectOpt <*> kubeNamespaceOpt <*> tillerNamespaceOpt

cmdPass :: Mod CommandFields Command
cmdPass = command "pass" infos
Expand Down
3 changes: 3 additions & 0 deletions src/Denv/Types.hs
Expand Up @@ -11,6 +11,7 @@ import Data.Typeable
type KubeProjectName = String

type KubeNamespace = String
type TillerNamespace = String

type PasswordStorePath = String

Expand Down Expand Up @@ -49,12 +50,14 @@ data KubeVariable
= KubeConfig
| KubeConfigShort
| KubectlNamespace
| TillerNamespace
deriving (Eq)

instance Show KubeVariable where
show KubeConfig = "KUBECONFIG"
show KubeConfigShort = "KUBECONFIG_SHORT"
show KubectlNamespace = "KUBECTL_NAMESPACE"
show TillerNamespace = "TILLER_NAMESPACE"

data PassVariable
= PasswordStoreDir
Expand Down
14 changes: 9 additions & 5 deletions test/Test/Lib/LibSpec.hs
Expand Up @@ -23,26 +23,30 @@ spec =
it "Tests kube env" $ do
withRandomTempFile $ \d f -> do
setEnv "HOME" d
_ <- mkKubeEnv f Nothing
_ <- mkKubeEnv f Nothing Nothing
cont <- TIO.readFile (d </> ".denv")
let config = "export KUBECONFIG=" <> T.pack f <> ";"
let short = "export KUBECONFIG_SHORT=foobar;"
let namespace = "export KUBECTL_NAMESPACE=default;"
let tillerNamespace = "export TILLER_NAMESPACE=kube-system;"
let ls = T.lines cont
(config `elem` ls) `shouldBe` True
(namespace `elem` ls) `shouldBe` True
(tillerNamespace `elem` ls) `shouldBe` True
(short `elem` ls) `shouldBe` True
it "Tests kube env with namespace" $ do
withRandomTempFile $ \d f -> do
setEnv "HOME" d
_ <- mkKubeEnv f (Just "kube-system")
_ <- mkKubeEnv f (Just "kube-system") (Just "testing")
cont <- TIO.readFile (d </> ".denv")
let config = "export KUBECONFIG=" <> T.pack f <> ";"
let short = "export KUBECONFIG_SHORT=foobar;"
let namespace = "export KUBECTL_NAMESPACE=kube-system;"
let tillerNamespace = "export TILLER_NAMESPACE=testing;"
let ls = T.lines cont
(config `elem` ls) `shouldBe` True
(namespace `elem` ls) `shouldBe` True
(tillerNamespace `elem` ls) `shouldBe` True
(short `elem` ls) `shouldBe` True
it "Tests vault env" $ do
withTempVaultConfig $ \d f -> do
Expand All @@ -53,7 +57,7 @@ spec =
it "Tests sourcing env file" $ do
withTempVaultConfig $ \d f -> do
setEnv "HOME" d
_ <- mkRawEnv f
_ <- mkRawEnv Nothing f
cont <- TIO.readFile (d </> ".denv")
(testVaultConfig `isPrefixOf` T.lines cont) `shouldBe` True
it "Tests pass env" $ do
Expand All @@ -67,10 +71,10 @@ spec =
]
(ret `isPrefixOf` T.lines cont) `shouldBe` True
it "Tests tf env" $ do
withTempTerraformConfig $ \d _ -> do
withTempTerraformConfig $ \d f -> do
setEnv "HOME" d
setCurrentDirectory d
_ <- mkTerraformEnv Prod
_ <- mkTerraformEnv f
cont <- TIO.readFile (d </> ".denv")
(testTerraformConfig `isPrefixOf` T.lines cont) `shouldBe` True
it "Tests deactivate env" $ do
Expand Down

0 comments on commit 5e774a8

Please sign in to comment.