Compare commits

...

7 Commits

Author SHA1 Message Date
Sanat Nayar
ffc0e5c062 go.sum 2020-03-15 23:06:28 -04:00
Sanat Nayar
9b2fec9987 go.sum 2020-03-15 22:46:42 -04:00
Sanat Nayar
bbecb56586 mod. go.sum 2020-03-13 16:34:19 -04:00
Andriy Bulynko
0b2fdae015 Scoping ejson keys and their rotations to the current context/CR (#214) 2020-03-13 16:28:06 -04:00
Sanat Nayar
ef595b4b3f added GitOps to spec 2020-03-13 12:59:17 -04:00
Ilir Bekteshi
d38852398e Merge pull request #212 from qlik-oss/ibiqlik/archiveignore
Ignore files/dirs on export
2020-03-12 14:06:33 +01:00
Ilir Bekteshi
e85636822d Ignore files/dirs on export 2020-03-12 14:03:20 +01:00
10 changed files with 81 additions and 44 deletions

5
.gitattributes vendored Normal file
View File

@@ -0,0 +1,5 @@
# Ignore all files and folders that start with .; .circleci, .github, .git, etc.
# Warning! This will ignore files in subfolders as well.
# If you needs files starting with . then change condition below to be specific
# for each file and folder that needs to be ignored
.* export-ignore

View File

@@ -42,10 +42,7 @@ func initAndExecute() error {
// create dirs and appropriate files for setting up contexts // create dirs and appropriate files for setting up contexts
api.LogDebugMessage("QliksenseHomeDir: %s", qlikSenseHome) api.LogDebugMessage("QliksenseHomeDir: %s", qlikSenseHome)
qliksenseClient, err := qliksense.New(qlikSenseHome) qliksenseClient := qliksense.New(qlikSenseHome)
if err != nil {
return err
}
qliksenseClient.SetUpQliksenseDefaultContext() qliksenseClient.SetUpQliksenseDefaultContext()
cmd := rootCmd(qliksenseClient) cmd := rootCmd(qliksenseClient)
//levenstein checks //levenstein checks
@@ -151,14 +148,12 @@ func rootCmd(p *qliksense.Qliksense) *cobra.Command {
// add the list config command as a sub-command to the app config sub-command // add the list config command as a sub-command to the app config sub-command
configCmd.AddCommand(listContextConfigCmd(p)) configCmd.AddCommand(listContextConfigCmd(p))
// add the delete-context config command as a sub-command to the app config command // add the delete-context config command as a sub-command to the app config command
configCmd.AddCommand(deleteContextConfigCmd(p)) configCmd.AddCommand(deleteContextConfigCmd(p))
// add set-image-registry command as a sub-command to the app config sub-command // add set-image-registry command as a sub-command to the app config sub-command
configCmd.AddCommand(setImageRegistryCmd(p)) configCmd.AddCommand(setImageRegistryCmd(p))
// add clean-config-repo-patches command as a sub-command to the app config sub-command // add clean-config-repo-patches command as a sub-command to the app config sub-command
configCmd.AddCommand(cleanConfigRepoPatchesCmd(p)) configCmd.AddCommand(cleanConfigRepoPatchesCmd(p))

2
go.mod
View File

@@ -39,7 +39,7 @@ require (
github.com/mattn/go-colorable v0.1.4 github.com/mattn/go-colorable v0.1.4
github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/go-homedir v1.1.0
github.com/morikuni/aec v1.0.0 // indirect github.com/morikuni/aec v1.0.0 // indirect
github.com/qlik-oss/k-apis v0.0.17 github.com/qlik-oss/k-apis v0.0.19
github.com/rogpeppe/go-internal v1.5.2 // indirect github.com/rogpeppe/go-internal v1.5.2 // indirect
github.com/spf13/cobra v0.0.6 github.com/spf13/cobra v0.0.6
github.com/spf13/viper v1.6.1 github.com/spf13/viper v1.6.1

3
go.sum
View File

@@ -843,8 +843,11 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa
github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8=
github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/qlik-oss/k-apis v0.0.16/go.mod h1:KOFzKVIdRqp47ytnHg3+9zb8fTlnrQjO6aKiwcrCJUE=
github.com/qlik-oss/k-apis v0.0.17 h1:tOdrEe9gfb9CXq0+uowFnXIsI781qz/zgeN8xqupXYw= github.com/qlik-oss/k-apis v0.0.17 h1:tOdrEe9gfb9CXq0+uowFnXIsI781qz/zgeN8xqupXYw=
github.com/qlik-oss/k-apis v0.0.17/go.mod h1:KOFzKVIdRqp47ytnHg3+9zb8fTlnrQjO6aKiwcrCJUE= github.com/qlik-oss/k-apis v0.0.17/go.mod h1:KOFzKVIdRqp47ytnHg3+9zb8fTlnrQjO6aKiwcrCJUE=
github.com/qlik-oss/k-apis v0.0.19 h1:yrMgALQ08vMDi5hN6fnvIfyNsEaXA5fZjB1YhyIdTfg=
github.com/qlik-oss/k-apis v0.0.19/go.mod h1:DNiWYqCqPIN216l7+1rccArNIYPb1Le7kYDcPSyNp+Q=
github.com/qlik-oss/kustomize/api v0.3.3-0.20200206224201-2e697eccbad9 h1:iqeqTS4zjp6rPEaxmFB7pemA2CMjOEN5dYSXZaQ82uw= github.com/qlik-oss/kustomize/api v0.3.3-0.20200206224201-2e697eccbad9 h1:iqeqTS4zjp6rPEaxmFB7pemA2CMjOEN5dYSXZaQ82uw=
github.com/qlik-oss/kustomize/api v0.3.3-0.20200206224201-2e697eccbad9/go.mod h1:OCt7FTrRVHj4kmR2xLJJUIqu00BTr6GeF09hSmM17Kw= github.com/qlik-oss/kustomize/api v0.3.3-0.20200206224201-2e697eccbad9/go.mod h1:OCt7FTrRVHj4kmR2xLJJUIqu00BTr6GeF09hSmM17Kw=
github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=

View File

@@ -22,6 +22,7 @@ const (
pullSecretFileName = "image-registry-pull-secret.yaml" pullSecretFileName = "image-registry-pull-secret.yaml"
qliksenseContextsDirName = "contexts" qliksenseContextsDirName = "contexts"
qliksenseSecretsDirName = "secrets" qliksenseSecretsDirName = "secrets"
qliksenseEjsonDirName = "ejson"
) )
// NewQConfig create QliksenseConfig object from file ~/.qliksense/config.yaml // NewQConfig create QliksenseConfig object from file ~/.qliksense/config.yaml
@@ -239,6 +240,18 @@ func (qc *QliksenseConfig) getCurrentContextEncryptionKeyPairLocation() (string,
return secretKeyPairLocation, nil return secretKeyPairLocation, nil
} }
func (qc *QliksenseConfig) GetCurrentContextEjsonKeyDir() (string, error) {
if qcr, err := qc.GetCurrentCR(); err != nil {
return "", err
} else {
ejsonKeyDir := filepath.Join(qc.QliksenseHomePath, qliksenseSecretsDirName, qliksenseContextsDirName, qcr.GetObjectMeta().GetName(), qliksenseEjsonDirName)
if err := os.MkdirAll(ejsonKeyDir, os.ModePerm); err != nil {
return "", err
}
return ejsonKeyDir, nil
}
}
func (qc *QliksenseConfig) GetCurrentContextEncryptionKeyPair() (*rsa.PublicKey, *rsa.PrivateKey, error) { func (qc *QliksenseConfig) GetCurrentContextEncryptionKeyPair() (*rsa.PublicKey, *rsa.PrivateKey, error) {
secretKeyPairLocation, err := qc.getCurrentContextEncryptionKeyPairLocation() secretKeyPairLocation, err := qc.getCurrentContextEncryptionKeyPairLocation()
if err != nil { if err != nil {

View File

@@ -59,14 +59,21 @@ func (q *Qliksense) ConfigApplyQK8s() error {
} }
} }
func (q *Qliksense) configEjson() error {
qConfig := qapi.NewQConfig(q.QliksenseHome)
if ejsonKeyDir, err := qConfig.GetCurrentContextEjsonKeyDir(); err != nil {
return err
} else if err := os.Unsetenv("EJSON_KEY"); err != nil {
return err
} else if err := os.Setenv("EJSON_KEYDIR", ejsonKeyDir); err != nil {
return err
}
return nil
}
func (q *Qliksense) applyConfigToK8s(qcr *qapi.QliksenseCR) error { func (q *Qliksense) applyConfigToK8s(qcr *qapi.QliksenseCR) error {
if qcr.Spec.RotateKeys != "None" { if qcr.Spec.RotateKeys != "None" {
if err := os.Unsetenv("EJSON_KEY"); err != nil { if err := q.configEjson(); err != nil {
fmt.Printf("error unsetting EJSON_KEY environment variable: %v\n", err)
return err
}
if err := os.Setenv("EJSON_KEYDIR", q.QliksenseEjsonKeyDir); err != nil {
fmt.Printf("error setting EJSON_KEYDIR environment variable: %v\n", err)
return err return err
} }
} }

View File

@@ -225,6 +225,38 @@ func (q *Qliksense) SetOtherConfigs(args []string) error {
} }
qliksenseCR.Spec.RotateKeys = rotateKeys qliksenseCR.Spec.RotateKeys = rotateKeys
api.LogDebugMessage("Current rotateKeys after modification: %s ", qliksenseCR.Spec.RotateKeys) api.LogDebugMessage("Current rotateKeys after modification: %s ", qliksenseCR.Spec.RotateKeys)
case "gitops.enabled":
if qliksenseCR.Spec.GitOps == nil {
qliksenseCR.Spec.GitOps = &config.GitOps{}
}
if strings.EqualFold(argsString[1], "false") {
qliksenseCR.Spec.GitOps.Enabled = false
} else if strings.EqualFold(argsString[1], "true") {
qliksenseCR.Spec.GitOps.Enabled = true
} else {
err := fmt.Errorf("Please use a boolean value")
log.Println(err)
return err
}
api.LogDebugMessage("Current gitOps enabled status : %s ", qliksenseCR.Spec.GitOps.Enabled)
case "gitops.schedule":
if qliksenseCR.Spec.GitOps == nil {
qliksenseCR.Spec.GitOps = &config.GitOps{}
}
qliksenseCR.Spec.GitOps.Schedule = argsString[1]
api.LogDebugMessage("Current gitOps schedule is : %s ", qliksenseCR.Spec.GitOps.Schedule)
case "gitops.watchbranch":
if qliksenseCR.Spec.GitOps == nil {
qliksenseCR.Spec.GitOps = &config.GitOps{}
}
qliksenseCR.Spec.GitOps.WatchBranch = argsString[1]
api.LogDebugMessage("Current gitOps watchbranch is : %s ", qliksenseCR.Spec.GitOps.WatchBranch)
case "gitops.image":
if qliksenseCR.Spec.GitOps == nil {
qliksenseCR.Spec.GitOps = &config.GitOps{}
}
qliksenseCR.Spec.GitOps.Image = argsString[1]
api.LogDebugMessage("Current gitOps watchbranch is : %s ", qliksenseCR.Spec.GitOps.Image)
default: default:
err := fmt.Errorf("Please enter one of: profile, storageClassName,rotateKeys, manifestRoot or git.repository arguments to configure the current context") err := fmt.Errorf("Please enter one of: profile, storageClassName,rotateKeys, manifestRoot or git.repository arguments to configure the current context")
log.Println(err) log.Println(err)

View File

@@ -273,11 +273,7 @@ func TestSetUpQliksenseContext(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
q, err := New(tt.args.qlikSenseHome) q := New(tt.args.qlikSenseHome)
if err != nil {
t.Errorf("unable to create a qliksense instance")
return
}
if err := q.SetUpQliksenseContext(tt.args.contextName, tt.args.isDefaultContext); (err != nil) != tt.wantErr { if err := q.SetUpQliksenseContext(tt.args.contextName, tt.args.isDefaultContext); (err != nil) != tt.wantErr {
t.Errorf("SetUpQliksenseContext() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("SetUpQliksenseContext() error = %v, wantErr %v", err, tt.wantErr)
} }
@@ -306,11 +302,7 @@ func TestSetUpQliksenseDefaultContext(t *testing.T) {
defer tearDown() defer tearDown()
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
q, err := New(tt.args.qlikSenseHome) q := New(tt.args.qlikSenseHome)
if err != nil {
t.Errorf("unable to create a qliksense instance")
return
}
if err := q.SetUpQliksenseDefaultContext(); (err != nil) != tt.wantErr { if err := q.SetUpQliksenseDefaultContext(); (err != nil) != tt.wantErr {
t.Errorf("SetUpQliksenseDefaultContext() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("SetUpQliksenseDefaultContext() error = %v, wantErr %v", err, tt.wantErr)
} }
@@ -836,7 +828,7 @@ spec:
log.Fatal(err) log.Fatal(err)
} }
contextYaml1 := contextYaml1 :=
` `
apiVersion: qlik.com/v1 apiVersion: qlik.com/v1
kind: Qliksense kind: Qliksense
metadata: metadata:
@@ -846,8 +838,8 @@ spec:
rotateKeys: "yes" rotateKeys: "yes"
releaseName: qlik1` releaseName: qlik1`
contextYaml2 := contextYaml2 :=
` `
apiVersion: qlik.com/v1 apiVersion: qlik.com/v1
kind: Qliksense kind: Qliksense
metadata: metadata:
@@ -932,11 +924,7 @@ func TestDeleteContexts(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
q, err := New(tt.args.qlikSenseHome) q := New(tt.args.qlikSenseHome)
if err != nil {
t.Errorf("unable to create a qliksense instance")
return
}
var arg []string var arg []string
arg = append(arg, tt.args.contextName) arg = append(arg, tt.args.contextName)
if err := q.DeleteContextConfig(arg); (err != nil) != tt.wantErr { if err := q.DeleteContextConfig(arg); (err != nil) != tt.wantErr {

View File

@@ -2,29 +2,21 @@
package qliksense package qliksense
import ( import (
"os"
"path"
"github.com/gobuffalo/packr/v2" "github.com/gobuffalo/packr/v2"
) )
// Qliksense is the logic behind the qliksense client // Qliksense is the logic behind the qliksense client
type Qliksense struct { type Qliksense struct {
QliksenseHome string QliksenseHome string
QliksenseEjsonKeyDir string CrdBox *packr.Box ``
CrdBox *packr.Box ``
} }
// New qliksense client, initialized with useful defaults. // New qliksense client, initialized with useful defaults.
func New(qliksenseHome string) (*Qliksense, error) { func New(qliksenseHome string) *Qliksense {
qliksenseClient := &Qliksense{ qliksenseClient := &Qliksense{
QliksenseHome: qliksenseHome, QliksenseHome: qliksenseHome,
CrdBox: packr.New("crds", "./crds"), CrdBox: packr.New("crds", "./crds"),
} }
qliksenseClient.QliksenseEjsonKeyDir = path.Join(qliksenseHome, "ejson", "keys") return qliksenseClient
if err := os.MkdirAll(qliksenseClient.QliksenseEjsonKeyDir, os.ModePerm); err != nil {
return nil, err
}
return qliksenseClient, nil
} }

View File

@@ -28,7 +28,9 @@ func (q *Qliksense) UpgradeQK8s(keepPatchFiles bool) error {
return err return err
} }
qcr.Spec.RotateKeys = "no" qcr.Spec.RotateKeys = "no"
if err := q.applyConfigToK8s(qcr); err != nil { if dcr, err := qConfig.GetDecryptedCr(qcr); err != nil {
return err
} else if err := q.applyConfigToK8s(dcr); err != nil {
fmt.Println("cannot do kubectl apply on manifests") fmt.Println("cannot do kubectl apply on manifests")
return err return err
} }