Compare commits

..

1 Commits

Author SHA1 Message Date
Foysal Iqbal
763f59e042 load cr from file
Signed-off-by: Foysal Iqbal <mqb@qlik.com>
2020-03-21 11:48:09 -04:00
32 changed files with 185 additions and 571 deletions

View File

@@ -4,8 +4,8 @@ on:
branches:
- master
paths:
- 'docs/**'
- 'mkdocs.yml'
- docs/
- mkdocs.yml
jobs:
build:

View File

@@ -46,11 +46,11 @@ build: clean generate
.PHONY: test
test: clean generate
ifeq ($(shell ${WHICH} docker-registry 2>${DEVNUL}),)
$(eval TMP-docker-distribution := $(shell mktemp -d))
git clone https://github.com/docker/distribution.git $(TMP-docker-distribution)/docker-distribution
cd $(TMP-docker-distribution)/docker-distribution; git checkout -b v2.7.1; make
cp $(TMP-docker-distribution)/docker-distribution/bin/registry pkg/qliksense/docker-registry
-rm -rf $(TMP-docker-distribution)
$(eval TMP := $(shell mktemp -d))
git clone https://github.com/docker/distribution.git $(TMP)/docker-distribution
cd $(TMP)/docker-distribution; git checkout -b v2.7.1; make
cp $(TMP)/docker-distribution/bin/registry pkg/qliksense/docker-registry
-rm -rf $(TMP)/docker-distribution
endif
go test -short -count=1 -tags "$(BUILDTAGS)" -v ./...
$(MAKE) clean
@@ -70,7 +70,7 @@ $(BINDIR)/$(VERSION)/$(MIXIN)-$(CLIENT_PLATFORM)-$(CLIENT_ARCH)$(FILE_EXT):
GOOS=$(CLIENT_PLATFORM) GOARCH=$(CLIENT_ARCH) $(XBUILD) -o $@ ./cmd/$(MIXIN)
ifeq ($(CLIENT_PLATFORM),windows)
zip $(BINDIR)/$(VERSION)/$(MIXIN)-$(CLIENT_PLATFORM)-$(CLIENT_ARCH).zip $(BINDIR)/$(VERSION)/$(MIXIN)-$(CLIENT_PLATFORM)-$(CLIENT_ARCH)$(FILE_EXT)
zip $(BINDIR)/$(VERSION)/$(MIXIN)-$(CLIENT_PLATFORM)-$(CLIENT_ARCH).zip $(BINDIR)/$(VERSION)/ $(MIXIN)-$(CLIENT_PLATFORM)-$(CLIENT_ARCH)$(FILE_EXT)
else
tar -czvf $(BINDIR)/$(VERSION)/$(MIXIN)-$(CLIENT_PLATFORM)-$(CLIENT_ARCH).tar.gz -C $(BINDIR)/$(VERSION)/ $(MIXIN)-$(CLIENT_PLATFORM)-$(CLIENT_ARCH)$(FILE_EXT)
endif
@@ -91,16 +91,12 @@ clean-packr: packr2
cd pkg/qliksense && packr2 clean
get-crds:
ifeq ($(QLIKSENSE_OPERATOR_DIR),)
$(eval TMP-operator := $(shell mktemp -d))
git clone https://github.com/qlik-oss/qliksense-operator.git -b master $(TMP-operator)/operator
$(MAKE) QLIKSENSE_OPERATOR_DIR=$(TMP-operator)/operator get-crds
-rm -rf $(TMP-operator)
else
$(eval TMP := $(shell mktemp -d))
git clone https://github.com/qlik-oss/qliksense-operator.git -b master $(TMP)/operator
mkdir -p pkg/qliksense/crds/cr
mkdir -p pkg/qliksense/crds/crd
mkdir -p pkg/qliksense/crds/crd-deploy
cp $(QLIKSENSE_OPERATOR_DIR)/deploy/*.yaml pkg/qliksense/crds/crd-deploy
cp $(QLIKSENSE_OPERATOR_DIR)/deploy/crds/*_crd.yaml pkg/qliksense/crds/crd
cp $(QLIKSENSE_OPERATOR_DIR)/deploy/crds/*_cr.yaml pkg/qliksense/crds/cr
endif
cp $(TMP)/operator/deploy/*.yaml pkg/qliksense/crds/crd-deploy
cp $(TMP)/operator/deploy/crds/*_crd.yaml pkg/qliksense/crds/crd
cp $(TMP)/operator/deploy/crds/*_cr.yaml pkg/qliksense/crds/cr
-rm -rf $(TMP)/operator

View File

@@ -1,39 +0,0 @@
package main
import (
"os"
"github.com/pkg/errors"
"github.com/qlik-oss/sense-installer/pkg/qliksense"
"github.com/spf13/cobra"
)
func applyCmd(q *qliksense.Qliksense) *cobra.Command {
filePath := ""
c := &cobra.Command{
Use: "apply",
Short: "install qliksense based on provided cr file",
Long: `install qliksense based on provided cr file`,
Example: `qliksense apply -f file_name or cat cr_file | qliksense apply -f -`,
RunE: func(cmd *cobra.Command, args []string) error {
if filePath == "-" {
if !isInputFromPipe() {
return errors.New("No input pipe present")
}
return q.ApplyCRFromReader(os.Stdin)
}
file, e := os.Open(filePath)
if e != nil {
return errors.Wrapf(e,
"unable to read the file %s", filePath)
}
return q.ApplyCRFromReader(file)
},
}
f := c.Flags()
f.StringVarP(&filePath, "file", "f", "", "Install from a CR file")
c.MarkFlagRequired("file")
return c
}

View File

@@ -1,47 +0,0 @@
package main
import (
"bufio"
"fmt"
"os"
"strings"
qapi "github.com/qlik-oss/sense-installer/pkg/api"
"github.com/qlik-oss/sense-installer/pkg/qliksense"
)
var eulaEnforced = false
var eulaText = "EULA text goes here..."
var eulaPrompt = "Do you accept our EULA? (y/n): "
var eulaErrorInstruction = "You must enter y/yes to continue"
func isEulaEnforced() bool {
return eulaEnforced
}
func enforceEula(q *qliksense.Qliksense) {
if isEulaEnforced() {
if qConfig, err := qapi.NewQConfigE(q.QliksenseHome); err != nil {
doEnforceEula()
} else if qcr, err := qConfig.GetCurrentCR(); err != nil || !qcr.IsEULA() {
doEnforceEula()
}
}
}
func doEnforceEula() {
fmt.Println(eulaText)
fmt.Print(eulaPrompt)
scanner := bufio.NewScanner(os.Stdin)
scanSuccess := scanner.Scan()
if !scanSuccess {
fmt.Println(eulaErrorInstruction)
os.Exit(1)
}
line := scanner.Text()
answer := strings.ToLower(strings.TrimSpace(line))
if answer != "y" && answer != "yes" {
fmt.Println(eulaErrorInstruction)
os.Exit(1)
}
}

View File

@@ -16,9 +16,6 @@ func loadCrFile(q *qliksense.Qliksense) *cobra.Command {
Long: `load a CR a file and create necessary structure for future use`,
RunE: func(cmd *cobra.Command, args []string) error {
if filePath == "-" {
if !isInputFromPipe() {
return errors.New("No input pipe present")
}
return q.LoadCr(os.Stdin)
}
file, e := os.Open(filePath)

View File

@@ -42,6 +42,7 @@ func initAndExecute() error {
api.LogDebugMessage("QliksenseHomeDir: %s", qlikSenseHome)
qliksenseClient := qliksense.New(qlikSenseHome)
qliksenseClient.SetUpQliksenseDefaultContext()
cmd := rootCmd(qliksenseClient)
if err := cmd.Execute(); err != nil {
//levenstein checks (auto-suggestions)
@@ -84,37 +85,16 @@ var versionCmd = &cobra.Command{
},
}
func commandUsesContext(command string) bool {
return command != "" && command != "help" && command != "version"
}
func globalPreRun(cmd *cobra.Command, p *qliksense.Qliksense) {
if command := cmd.CalledAs(); commandUsesContext(command) {
if isEulaEnforced() {
enforceEula(p)
}
if err := p.SetUpQliksenseDefaultContext(); err != nil {
panic(err)
}
if isEulaEnforced() {
if err := p.SetEulaAccepted(); err != nil {
panic(err)
}
}
}
}
func rootCmd(p *qliksense.Qliksense) *cobra.Command {
cmd := &cobra.Command{
var (
cmd *cobra.Command
)
cmd = &cobra.Command{
Use: "qliksense",
Short: "Qliksense cli tool",
Long: `qliksense cli tool provides functionality to perform operations on qliksense-k8s, qliksense operator, and kubernetes cluster`,
Args: cobra.ArbitraryArgs,
PersistentPreRun: func(cmd *cobra.Command, args []string) {
globalPreRun(cmd, p)
},
}
cmd.Flags().SetInterspersed(false)
@@ -193,7 +173,6 @@ func rootCmd(p *qliksense.Qliksense) *cobra.Command {
cmd.AddCommand(preflightCmd)
cmd.AddCommand(loadCrFile(p))
cmd.AddCommand((applyCmd(p)))
return cmd
}

View File

@@ -1,6 +1,7 @@
package main
import (
qapi "github.com/qlik-oss/sense-installer/pkg/api"
"github.com/qlik-oss/sense-installer/pkg/qliksense"
"github.com/spf13/cobra"
)
@@ -8,7 +9,7 @@ import (
func uninstallCmd(q *qliksense.Qliksense) *cobra.Command {
c := &cobra.Command{
Use: "uninstall",
Short: "Uninstall the deployed qliksense.",
Short: "Uninstall the deployed qliksense with release name [ " + qapi.NewQConfig(q.QliksenseHome).Spec.CurrentContext + " ]",
Long: `Uninstall the deployed qliksense. By default uninstall the current context`,
Example: `qliksense uninstall <context-name>`,
RunE: func(cmd *cobra.Command, args []string) error {

View File

@@ -1,41 +0,0 @@
# qliksense command reference
## qliksense apply
`qliksense apply` command takes input a cr file or input from pipe
- `qliksense apply -f cr-file.yaml`
- `cat cr-file.yaml | qliksense apply -f -`
the content of `cr-file.yaml` should be something similar
```yaml
apiVersion: qlik.com/v1
kind: Qliksense
metadata:
name: qlik-test
labels:
version: v0.0.2
spec:
configs:
qliksense:
- name: acceptEULA
value: "yes"
secrets:
qliksense:
- name: mongoDbUri
value: mongodb://qlik-test-mongodb:27017/qliksense?ssl=false
profile: docker-desktop
rotateKeys: "yes"
```
after doing one of the above commands, cli will set the current context to the cr name and install the qliksense into the cluster. so make sure you dont have a context (cr name = context name) with the same name already. It will though error if it same context name already exist. It will encrypt the secrets from CR while writing CR into the disk.
## qliksense load
`qliksense load` command takes input a cr file or input from pipe.
- `qliksense load -f cr-file.yaml`
- `cat cr-file.yaml | qliksense load -f -`
It will load the cr into `~/.qliksense` folder and create context strcture with for the CR and set the current context with the cr name. In case of multiple documents in a single stream/file it will set the current context to the last one. It will encrypt the secrets from CR while writing the CR into the disk.

View File

@@ -76,55 +76,21 @@ When you perform `qliksense install` or `qliksene config apply`, qliksense opera
- Push generated patches into a new branch in the provided git repo. _Gives you ability to merge patches into your master branch_
- Create a CronJob to monitor master branch. Any changes pushed to master branch will be applied into the cluster. _This is a light weight `git-ops` model_
## GitOps
## Enable GitOps
To enable gitops, the following section should be in the CR
to enable gitops the following section should be in the CR
```yaml
....
spec:
git:
repository: https://github.com/<OWNER>/<REPO>
accessToken: "<git-token>"
userName: "<git-username>"
repository: https://github.com/ffoysal/qliksense-k8s
accessToken: git-token
userName: git-username
gitOps:
enabled: "yes"
schedule: "*/5 * * * *"
watchBranch: <myBranch>
watchBranch: pr-branch-24868a33
image: qlik-docker-oss.bintray.io/qliksense-repo-watcher
....
```
##Preflight checks
Preflight checks provide pre-installation cluster conformance testing and validation before we install qliksense on the cluster. We gather a suite of conformance tests that can be easily written and run on the target cluster to verify that cluster-specific requirements are met.
The suite consists of a set of `collectors` which run the specifications of every test and `analyzers` which analyze the results of every test run by the collector.
We support the following tests at the moment as part of preflight checks, and the range of the suite will be expanded in future.
### DNS check
Run the following command to view help about the commands supported by preflight at any moment:
```console
qliksense preflight
perform preflight checks on the cluster
Usage:
qliksense preflight [command]
Examples:
qliksense preflight <preflight_check_to_run>
Usage:
qliksense preflight dns
Available Commands:
dns perform preflight dns check
```
Run the following command to perform preflight DNS check. The expected output is also shown below.
```console
qliksense preflight dns
Running Preflight checks ⠧
--- PASS DNS check
--- DNS check passed
--- PASS cluster-preflight-checks
PASS
```

View File

@@ -17,7 +17,6 @@ markdown_extensions:
nav:
- Overview: index.md
- getting_started.md
- command_reference.md
- concepts.md
- air_gap.md
- Releases ⧉: https://github.com/qlik-oss/sense-installer/releases

View File

@@ -27,55 +27,46 @@ const (
// NewQConfig create QliksenseConfig object from file ~/.qliksense/config.yaml
func NewQConfig(qsHome string) *QliksenseConfig {
qc, err := NewQConfigE(qsHome)
if err != nil {
fmt.Println("yaml unmarshalling error ", err)
os.Exit(1)
}
return qc
}
func NewQConfigE(qsHome string) (*QliksenseConfig, error) {
configFile := filepath.Join(qsHome, "config.yaml")
qc := &QliksenseConfig{}
err := ReadFromFile(qc, configFile)
if err != nil {
return nil, err
fmt.Println("yaml unmarshalling error ", err)
os.Exit(1)
}
qc.QliksenseHomePath = qsHome
return qc, nil
}
func NewQConfigEmpty(qsHome string) *QliksenseConfig {
return &QliksenseConfig{
QliksenseHomePath: qsHome,
}
return qc
}
// GetCR create a QliksenseCR object for a particular context
// from file ~/.qliksense/contexts/<contx-name>/<contx-name>.yaml
func (qc *QliksenseConfig) GetCR(contextName string) (*QliksenseCR, error) {
crFilePath := qc.GetCRFilePath(contextName)
crFilePath := qc.getCRFilePath(contextName)
if crFilePath == "" {
return nil, errors.New("context name " + contextName + " not found")
}
return GetCRObject(crFilePath)
}
func getUnencryptedCR() {
}
// GetCurrentCR create a QliksenseCR object for current context
func (qc *QliksenseConfig) GetCurrentCR() (*QliksenseCR, error) {
return qc.GetCR(qc.Spec.CurrentContext)
}
// SetCrLocation sets the CR location for a context. Helpful during test
func (qc *QliksenseConfig) SetCrLocation(contextName, filePath string) (*QliksenseConfig, error) {
func (qc *QliksenseConfig) SetCrLocation(contextName, filepath string) (*QliksenseConfig, error) {
tempQc := &QliksenseConfig{}
copier.Copy(tempQc, qc)
found := false
tempQc.Spec.Contexts = []Context{}
for _, c := range qc.Spec.Contexts {
if c.Name == contextName {
c.CrFile = filePath
c.CrFile = filepath
found = true
}
tempQc.Spec.Contexts = append(tempQc.Spec.Contexts, []Context{c}...)
@@ -112,11 +103,11 @@ func CreateCRObjectFromString(crContent string) (*QliksenseCR, error) {
return cr, nil
}
func (qc *QliksenseConfig) GetCRFilePath(contextName string) string {
func (qc *QliksenseConfig) getCRFilePath(contextName string) string {
crFilePath := ""
for _, ctx := range qc.Spec.Contexts {
if ctx.Name == contextName {
crFilePath = filepath.Join(qc.QliksenseHomePath, ctx.CrFile)
crFilePath = ctx.CrFile
break
}
}
@@ -140,65 +131,22 @@ func (qc *QliksenseConfig) BuildRepoPath(version string) string {
return qc.BuildRepoPathForContext(qc.Spec.CurrentContext, version)
}
func (qc *QliksenseConfig) BuildRelativeRepoPath(version string) string {
return qc.BuildRelativeRepoPathForContext(qc.Spec.CurrentContext, version)
}
func (qc *QliksenseConfig) BuildRepoPathForContext(contextName, version string) string {
return filepath.Join(qc.QliksenseHomePath, qliksenseContextsDirName, contextName, "qlik-k8s", version)
}
//BuildRelativeRepoPathForContext to build relative from qliksense home, so that can be written into cr file
// and later easy to export to different computer
func (qc *QliksenseConfig) BuildRelativeRepoPathForContext(contextName, version string) string {
return filepath.Join(qliksenseContextsDirName, contextName, "qlik-k8s", version)
}
func (qc *QliksenseConfig) BuildCurrentManifestsRoot(version string) string {
return qc.BuildRepoPath(version)
}
func (qc *QliksenseConfig) BuildCurrentRelativeManifestsRoot(version string) string {
return qc.BuildRelativeRepoPath(version)
}
func (qc *QliksenseConfig) WriteCR(cr *QliksenseCR, contextName string) error {
crf := qc.GetCRFilePath(contextName)
crf := qc.getCRFilePath(contextName)
if crf == "" {
return errors.New("context name " + contextName + " not found")
}
return WriteToFile(cr, crf)
}
//CreateOrWriteCrAndContext create necessary folder structure, update config.yaml and context yaml files
func (qc *QliksenseConfig) CreateOrWriteCrAndContext(cr *QliksenseCR) error {
if qc.QliksenseHomePath == "" {
return errors.New("qliksense home is not set")
}
crf := qc.GetCRFilePath(cr.GetName())
if crf == "" {
// create direcotry structure for context
cDir := filepath.Join(qc.QliksenseHomePath, "contexts", cr.GetName())
if err := os.MkdirAll(cDir, os.ModePerm); err != nil {
return err
}
crf = filepath.Join(cDir, cr.GetName()+".yaml")
ctx := Context{
Name: cr.GetName(),
CrFile: filepath.Join("contexts", cr.GetName(), cr.GetName()+".yaml"),
}
qc.AddToContexts(ctx)
if err := WriteToFile(qc, filepath.Join(qc.QliksenseHomePath, "config.yaml")); err != nil {
return err
}
}
return WriteToFile(cr, crf)
}
func (qc *QliksenseConfig) AddToContexts(ctx Context) error {
//TODO: additional duplicate check may be added latter
qc.Spec.Contexts = append(qc.Spec.Contexts, ctx)
return nil
}
func (qc *QliksenseConfig) WriteCurrentContextCR(cr *QliksenseCR) error {
return qc.WriteCR(cr, qc.Spec.CurrentContext)
}
@@ -289,15 +237,6 @@ func (qc *QliksenseConfig) getDockerConfigJsonSecret(name string) (*DockerConfig
}
func (qc *QliksenseConfig) getCurrentContextEncryptionKeyPairLocation() (string, error) {
if qcr, err := qc.GetCurrentCR(); err != nil {
return "", err
} else {
return qc.getContextEncryptionKeyPairLocation(qcr.GetName())
}
}
func (qc *QliksenseConfig) getContextEncryptionKeyPairLocation(contextName string) (string, error) {
// Check env var: QLIKSENSE_KEY_LOCATION to determine location to store keypair
var secretKeyPairLocation string
if os.Getenv("QLIKSENSE_KEY_LOCATION") != "" {
@@ -306,9 +245,13 @@ func (qc *QliksenseConfig) getContextEncryptionKeyPairLocation(contextName strin
} else {
// QLIKSENSE_KEY_LOCATION has not been set, hence storing key pair in default location:
// /.qliksense/secrets/contexts/<current-context>/secrets/
secretKeyPairLocation = filepath.Join(qc.QliksenseHomePath, qliksenseSecretsDirName, qliksenseContextsDirName, contextName, qliksenseSecretsDirName)
if qcr, err := qc.GetCurrentCR(); err != nil {
return "", err
} else {
secretKeyPairLocation = filepath.Join(qc.QliksenseHomePath, qliksenseSecretsDirName, qliksenseContextsDirName, qcr.GetObjectMeta().GetName(), qliksenseSecretsDirName)
}
}
LogDebugMessage("SecretKeyLocation to store key pair: %s", secretKeyPairLocation)
return secretKeyPairLocation, nil
}
@@ -325,15 +268,7 @@ func (qc *QliksenseConfig) GetCurrentContextEjsonKeyDir() (string, error) {
}
func (qc *QliksenseConfig) GetCurrentContextEncryptionKeyPair() (*rsa.PublicKey, *rsa.PrivateKey, error) {
if qcr, err := qc.GetCurrentCR(); err != nil {
return nil, nil, err
} else {
return qc.GetContextEncryptionKeyPair(qcr.GetName())
}
}
func (qc *QliksenseConfig) GetContextEncryptionKeyPair(contextName string) (*rsa.PublicKey, *rsa.PrivateKey, error) {
secretKeyPairLocation, err := qc.getContextEncryptionKeyPairLocation(contextName)
secretKeyPairLocation, err := qc.getCurrentContextEncryptionKeyPairLocation()
if err != nil {
return nil, nil, err
}
@@ -422,10 +357,6 @@ func (cr *QliksenseCR) IsEULA() bool {
return false
}
func (cr *QliksenseCR) SetEULA(value string) {
cr.Spec.AddToConfigs("qliksense", "acceptEULA", value)
}
// GetDecryptedCr it decrypts all the encrypted value and return a new CR
func (qc *QliksenseConfig) GetDecryptedCr(cr *QliksenseCR) (*QliksenseCR, error) {
newCr := &QliksenseCR{}
@@ -470,18 +401,12 @@ func (qc *QliksenseConfig) CreateContextDirs(contextName string) {
os.MkdirAll(contexPath, os.ModePerm)
}
//BuildCrFileAbsolutePath build absolute path for a cr ie. ~/.qliksense/contexts/qlik-defautl/qlik-default.yaml
func (qc *QliksenseConfig) BuildCrFileAbsolutePath(contextName string) string {
func (qc *QliksenseConfig) BuildCrFilePath(contextName string) string {
return filepath.Join(qc.QliksenseHomePath, qliksenseContextsDirName, contextName, contextName+".yaml")
}
//BuildCrFilePath build cr file path i.e. contexts/qlik-default/qlik-default.yaml
func (qc *QliksenseConfig) BuildCrFilePath(contextName string) string {
return filepath.Join(qliksenseContextsDirName, contextName, contextName+".yaml")
}
//AddToContexts add the context into qc.Spec.Contexts
func (qc *QliksenseConfig) AddToContextsRaw(crName, crFile string) {
func (qc *QliksenseConfig) AddToContexts(crName, crFile string) {
qc.Spec.Contexts = append(qc.Spec.Contexts, []Context{
{CrFile: crFile,
Name: crName},
@@ -497,10 +422,3 @@ func (qc *QliksenseConfig) SetCurrentContextName(name string) {
func (qc *QliksenseConfig) Write() error {
return WriteToFile(qc, filepath.Join(qc.QliksenseHomePath, "config.yaml"))
}
func (qc *QliksenseConfig) GetCrManifestRoot(cr *QliksenseCR) string {
if filepath.IsAbs(cr.Spec.GetManifestsRoot()) {
return cr.Spec.GetManifestsRoot()
}
return filepath.Join(qc.QliksenseHomePath, cr.Spec.GetManifestsRoot())
}

View File

@@ -46,7 +46,7 @@ metadata:
version: v1.0.0
spec:
profile: docker-desktop
manifestsRoot: contexts/contx1/qlik-k8s/v0.0.1/manifests
manifestsRoot: /Users/mqb/.qliksense/contexts/contx1/qlik-k8s/v0.0.1/manifests
storageClassName: efs
configs:
qliksense:
@@ -74,7 +74,7 @@ func TestGetCR(t *testing.T) {
// create CR
createCRFile(dir)
crFile := filepath.Join("contexts", "contx1", "contx1.yaml")
crFile := filepath.Join(dir, "contexts", "contx1", "contx1.yaml")
qct, e := qc.SetCrLocation("contx1", crFile)
if e != nil {
t.Fail()
@@ -100,7 +100,7 @@ func TestGetDecryptedCr(t *testing.T) {
// create CR
createCRFile(dir)
crFile := filepath.Join("contexts", "contx1", "contx1.yaml")
crFile := filepath.Join(dir, "contexts", "contx1", "contx1.yaml")
qct, e := qc.SetCrLocation("contx1", crFile)
if e != nil {
t.Fail()

View File

@@ -63,7 +63,7 @@ func (qliksenseConfig *QliksenseConfig) SwitchCurrentCRToVersionAndProfile(versi
if qcr, err := qliksenseConfig.GetCurrentCR(); err != nil {
return err
} else {
versionManifestRoot := qliksenseConfig.BuildCurrentRelativeManifestsRoot(version)
versionManifestRoot := qliksenseConfig.BuildCurrentManifestsRoot(version)
if (qcr.Spec.ManifestsRoot != versionManifestRoot) || (profile != "" && qcr.Spec.Profile != profile) || (qcr.GetLabelFromCr("version") != version) {
qcr.Spec.ManifestsRoot = versionManifestRoot
if profile != "" {

View File

@@ -109,7 +109,6 @@ func KubectlDirectOps(opr []string, namespace string) error {
LogDebugMessage("Kubectl command: %s %v\n", "kubectl", arguments)
sterrBuffer := &bytes.Buffer{}
cmd.Stderr = sterrBuffer
cmd.Stdout = os.Stdout
if err := cmd.Run(); err != nil {
return fmt.Errorf("kubectl %v failed with: %v, %v\n", opr, err, sterrBuffer.String())
}

View File

@@ -232,6 +232,7 @@ func UntarGzFile(destination, fileToUntar string) error {
fileAtLoc.Chmod(os.ModePerm)
}
}
return nil
}
func UnZipFile(destination, fileToUnzip string) error {

View File

@@ -167,7 +167,7 @@ func (q *Qliksense) configExistsInCurrentContext() (exists bool, directory strin
} else if currentCr.Spec.ManifestsRoot == "" {
return false, "", "", nil
} else {
return true, q.GetCrManifestRoot(currentCr), currentCr.Spec.Profile, nil
return true, currentCr.Spec.GetManifestsRoot(), currentCr.Spec.Profile, nil
}
}

View File

@@ -1,23 +0,0 @@
package qliksense
import (
"io"
qapi "github.com/qlik-oss/sense-installer/pkg/api"
)
func (q *Qliksense) ApplyCRFromReader(r io.Reader) error {
if err := q.LoadCr(r); err != nil {
return err
}
qConfig := qapi.NewQConfig(q.QliksenseHome)
cr, err := qConfig.GetCurrentCR()
if err != nil {
return err
}
opts := &InstallCommandOptions{}
if err := q.InstallQK8s(cr.GetLabelFromCr("version"), opts, true); err != nil {
return err
}
return nil
}

View File

@@ -82,12 +82,12 @@ func (q *Qliksense) applyConfigToK8s(qcr *qapi.QliksenseCR) error {
fmt.Printf(`error fetching user's home directory: %v\n`, err)
return err
}
fmt.Println("Manifests root: " + q.GetCrManifestRoot(qcr))
fmt.Println("Manifests root: " + qcr.Spec.GetManifestsRoot())
qcr.SetNamespace(qapi.GetKubectlNamespace())
// generate patches
cr.GeneratePatches(&qcr.KApiCr, path.Join(userHomeDir, ".kube", "config"))
// apply generated manifests
profilePath := filepath.Join(q.GetCrManifestRoot(qcr), qcr.Spec.GetProfileDir())
profilePath := filepath.Join(qcr.Spec.GetManifestsRoot(), qcr.Spec.GetProfileDir())
mByte, err := executeKustomizeBuild(profilePath)
if err != nil {
fmt.Println("cannot generate manifests for "+profilePath, err)

View File

@@ -3,6 +3,7 @@ package qliksense
import (
"crypto/rsa"
"fmt"
"github.com/robfig/cron/v3"
"io/ioutil"
"log"
"os"
@@ -10,8 +11,6 @@ import (
"strings"
"text/tabwriter"
"github.com/robfig/cron/v3"
"github.com/qlik-oss/k-apis/pkg/config"
b64 "encoding/base64"
@@ -301,7 +300,7 @@ func (q *Qliksense) ListContextConfigs() error {
w.Flush()
if len(qliksenseConfig.Spec.Contexts) > 0 {
for _, cont := range qliksenseConfig.Spec.Contexts {
fmt.Fprintln(w, cont.Name, "\t", qliksenseConfig.GetCRFilePath(cont.Name), "\t")
fmt.Fprintln(w, cont.Name, "\t", cont.CrFile, "\t")
}
w.Flush()
fmt.Fprintln(out, "")
@@ -379,7 +378,6 @@ func (q *Qliksense) SetUpQliksenseDefaultContext() error {
// SetUpQliksenseContext - to setup qliksense context
func (q *Qliksense) SetUpQliksenseContext(contextName string, isDefaultContext bool) error {
fmt.Println(contextName)
if contextName == "" {
err := fmt.Errorf("Please enter a non-empty context-name")
log.Println(err)
@@ -393,28 +391,83 @@ func (q *Qliksense) SetUpQliksenseContext(contextName string, isDefaultContext b
}
qliksenseConfigFile := filepath.Join(q.QliksenseHome, QliksenseConfigFile)
qliksenseConfig := api.NewQConfigEmpty(q.QliksenseHome)
var qliksenseConfig api.QliksenseConfig
configFileTrack := false
if !api.FileExists(qliksenseConfigFile) {
qliksenseConfig.AddBaseQliksenseConfigs(contextName)
} else {
if err := api.ReadFromFile(qliksenseConfig, qliksenseConfigFile); err != nil {
if err := api.ReadFromFile(&qliksenseConfig, qliksenseConfigFile); err != nil {
log.Println(err)
return err
}
if isDefaultContext { // if config file exits but a default context is requested, we want to prevent writing to config file
configFileTrack = true
}
}
// creating a file in the name of the context if it does not exist/ opening it to append/modify content if it already exists
qliksenseContextsDir1 := filepath.Join(q.QliksenseHome, QliksenseContextsDir)
if !api.DirExists(qliksenseContextsDir1) {
if err := os.Mkdir(qliksenseContextsDir1, os.ModePerm); err != nil {
err = fmt.Errorf("Not able to create %s dir: %v", qliksenseContextsDir1, err)
log.Println(err)
return err
}
}
api.LogDebugMessage("%s exists", qliksenseContextsDir1)
if qliksenseConfig.IsContextExist(contextName) {
fmt.Println("context [ " + contextName + " ] already exist")
return nil
// creating contexts/qlik-default/qlik-default.yaml file
qliksenseContextFile := filepath.Join(qliksenseContextsDir1, contextName, contextName+".yaml")
//var qliksenseCR api.QliksenseCR
defaultContextsDir := filepath.Join(qliksenseContextsDir1, contextName)
if !api.DirExists(defaultContextsDir) {
if err := os.Mkdir(defaultContextsDir, os.ModePerm); err != nil {
err = fmt.Errorf("Not able to create %s: %v", defaultContextsDir, err)
log.Println(err)
return err
}
}
qliksenseCR := &api.QliksenseCR{}
qliksenseCR.AddCommonConfig(contextName)
if err := qliksenseConfig.CreateOrWriteCrAndContext(qliksenseCR); err != nil {
return err
api.LogDebugMessage("%s exists", defaultContextsDir)
if !api.FileExists(qliksenseContextFile) {
qliksenseCR := &api.QliksenseCR{}
qliksenseCR.AddCommonConfig(contextName)
api.WriteToFile(&qliksenseCR, qliksenseContextFile)
api.LogDebugMessage("Added Context: %s", contextName)
}
// else {
// if err := api.ReadFromFile(&qliksenseCR, qliksenseContextFile); err != nil {
// log.Println(err)
// return err
// }
// }
//api.WriteToFile(&qliksenseCR, qliksenseContextFile)
ctxTrack := false
if len(qliksenseConfig.Spec.Contexts) > 0 {
for _, ctx := range qliksenseConfig.Spec.Contexts {
if ctx.Name == contextName {
ctx.CrFile = qliksenseContextFile
ctxTrack = true
break
}
}
}
if !ctxTrack {
qliksenseConfig.Spec.Contexts = append(qliksenseConfig.Spec.Contexts, api.Context{
Name: contextName,
CrFile: qliksenseContextFile,
})
}
qliksenseConfig.Spec.CurrentContext = contextName
if !configFileTrack {
api.WriteToFile(&qliksenseConfig, qliksenseConfigFile)
}
// set the encrypted default mongo
return q.SetSecrets([]string{`qliksense.mongoDbUri="mongodb://qlik-default-mongodb:27017/qliksense?ssl=false"`}, false)
q.SetSecrets([]string{`qliksense.mongoDbUri="mongodb://qlik-default-mongodb:27017/qliksense?ssl=false"`}, false)
return nil
}
func validateInput(input string) (string, error) {
@@ -525,13 +578,3 @@ func (q *Qliksense) SetImageRegistry(registry, pushUsername, pushPassword, pullU
qliksenseCR.Spec.AddToConfigs("qliksense", imageRegistryConfigKey, registry)
return api.WriteToFile(&qliksenseCR, qliksenseContextsFile)
}
func (q *Qliksense) SetEulaAccepted() error {
qConfig := api.NewQConfig(q.QliksenseHome)
qcr, err := qConfig.GetCurrentCR()
if err != nil {
return err
}
qcr.SetEULA("yes")
return qConfig.WriteCurrentContextCR(qcr)
}

View File

@@ -165,7 +165,7 @@ metadata:
spec:
contexts:
- name: qlik-default
crFile: contexts/qlik-default/qlik-default.yaml
crFile: /root/.qliksense/contexts/qlik-default.yaml
currentContext: qlik-default
`
configFile := filepath.Join(testDir, "config.yaml")
@@ -397,7 +397,7 @@ func TestSetConfigs(t *testing.T) {
func TestSetImageRegistry(t *testing.T) {
getQlikSense := func(tmpQlikSenseHome string) (*Qliksense, error) {
if err := ioutil.WriteFile(path.Join(tmpQlikSenseHome, "config.yaml"), []byte(`
if err := ioutil.WriteFile(path.Join(tmpQlikSenseHome, "config.yaml"), []byte(fmt.Sprintf(`
apiVersion: config.qlik.com/v1
kind: QliksenseConfig
metadata:
@@ -405,9 +405,9 @@ metadata:
spec:
contexts:
- name: qlik-default
crFile: contexts/qlik-default/qlik-default.yaml
crFile: %s/contexts/qlik-default/qlik-default.yaml
currentContext: qlik-default
`), os.ModePerm); err != nil {
`, tmpQlikSenseHome)), os.ModePerm); err != nil {
return nil, err
}
@@ -799,11 +799,11 @@ metadata:
spec:
contexts:
- name: qlik-default
crFile: contexts/qlik-default.yaml
crFile: /root/.qliksense/contexts/qlik-default.yaml
- name: qlik1
crFile: contexts/qlik1.yaml
crFile: /root/.qliksense/contexts/qlik1.yaml
- name: qlik2
crFile: contexts/qlik2.yaml
crFile: /root/.qliksense/contexts/qlik2.yaml
currentContext: qlik1
`
configFile := filepath.Join(testDir, "config.yaml")

View File

@@ -19,7 +19,7 @@ func (q *Qliksense) ViewCrds(opts *CrdCommandOptions) error {
fmt.Println("cannot get the current-context cr", err)
return err
}
if engineCRD, err := q.getQliksenseInitCrd(qcr); err != nil {
if engineCRD, err := getQliksenseInitCrd(qcr); err != nil {
return err
} else if opts.All {
fmt.Printf("%s\n%s", q.GetOperatorCRDString(), engineCRD)
@@ -38,7 +38,7 @@ func (q *Qliksense) InstallCrds(opts *CrdCommandOptions) error {
return err
}
if engineCRD, err := q.getQliksenseInitCrd(qcr); err != nil {
if engineCRD, err := getQliksenseInitCrd(qcr); err != nil {
return err
} else if err = qapi.KubectlApply(engineCRD, ""); err != nil {
return err
@@ -52,12 +52,12 @@ func (q *Qliksense) InstallCrds(opts *CrdCommandOptions) error {
return nil
}
func (q *Qliksense) getQliksenseInitCrd(qcr *qapi.QliksenseCR) (string, error) {
func getQliksenseInitCrd(qcr *qapi.QliksenseCR) (string, error) {
var repoPath string
var err error
if q.GetCrManifestRoot(qcr) != "" {
repoPath = q.GetCrManifestRoot(qcr)
if qcr.Spec.GetManifestsRoot() != "" {
repoPath = qcr.Spec.GetManifestsRoot()
} else {
if repoPath, err = downloadFromGitRepoToTmpDir(defaultConfigRepoGitUrl, "master"); err != nil {
return "", err

View File

@@ -8,13 +8,12 @@ import (
)
func TestGetQliksenseInitCrd(t *testing.T) {
q := &Qliksense{}
someTmpRepoPath, err := downloadFromGitRepoToTmpDir(defaultConfigRepoGitUrl, "master")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
crdFromContextConfig, err := q.getQliksenseInitCrd(&qapi.QliksenseCR{
crdFromContextConfig, err := getQliksenseInitCrd(&qapi.QliksenseCR{
KApiCr: kapi_config.KApiCr{
Spec: &kapi_config.CRSpec{
ManifestsRoot: someTmpRepoPath,
@@ -25,7 +24,7 @@ func TestGetQliksenseInitCrd(t *testing.T) {
t.Fatalf("unexpected error: %v", err)
}
crdFromDownloadedConfig, err := q.getQliksenseInitCrd(&qapi.QliksenseCR{
crdFromDownloadedConfig, err := getQliksenseInitCrd(&qapi.QliksenseCR{
KApiCr: kapi_config.KApiCr{
Spec: &kapi_config.CRSpec{
ManifestsRoot: "",

View File

@@ -36,7 +36,7 @@ func (q *Qliksense) PullImagesForCurrentCR() error {
}
version := qcr.GetLabelFromCr("version")
profile := qcr.Spec.Profile
repoDir := q.GetCrManifestRoot(qcr)
repoDir := qcr.Spec.ManifestsRoot
imagesDir, err := setupImagesDir(q.QliksenseHome)
if err != nil {
@@ -125,7 +125,7 @@ func (q *Qliksense) PushImagesForCurrentCR() error {
}
version := qcr.GetLabelFromCr("version")
profile := qcr.Spec.Profile
repoDir := q.GetCrManifestRoot(qcr)
repoDir := qcr.Spec.ManifestsRoot
dockerConfigJsonSecret, err := qConfig.GetPushDockerConfigJsonSecret()
if err != nil {

View File

@@ -171,7 +171,7 @@ func Test_Pull_Push_ImagesForCurrentCR(t *testing.T) {
}
func setupQlikSenseHome(t *testing.T, tmpQlikSenseHome string, registry *testRegistryV2, clientAuth clientAuthType) error {
if err := ioutil.WriteFile(path.Join(tmpQlikSenseHome, "config.yaml"), []byte(`
if err := ioutil.WriteFile(path.Join(tmpQlikSenseHome, "config.yaml"), []byte(fmt.Sprintf(`
apiVersion: config.qlik.com/v1
kind: QliksenseConfig
metadata:
@@ -179,9 +179,9 @@ metadata:
spec:
contexts:
- name: qlik-default
crFile: contexts/qlik-default/qlik-default.yaml
crFile: %s/contexts/qlik-default/qlik-default.yaml
currentContext: qlik-default
`), os.ModePerm); err != nil {
`, tmpQlikSenseHome)), os.ModePerm); err != nil {
return err
}

View File

@@ -34,7 +34,7 @@ func fetchAndUpdateCR(qConfig *qapi.QliksenseConfig, version string) error {
} else if err = kapis_git.Checkout(repo, version, fmt.Sprintf("%v-by-operator-%v", version, uuid.New().String()), nil); err != nil {
return err
}
qcr.Spec.ManifestsRoot = qConfig.BuildCurrentRelativeManifestsRoot(version)
qcr.Spec.ManifestsRoot = qConfig.BuildCurrentManifestsRoot(version)
qcr.AddLabelToCr("version", version)
return qConfig.WriteCurrentContextCR(qcr)
}

View File

@@ -21,8 +21,8 @@ func (q *Qliksense) GetInstallableVersions(opts *LsRemoteCmdOptions) error {
}
var repoPath string
if q.GetCrManifestRoot(qcr) != "" {
repoPath = q.GetCrManifestRoot(qcr)
if qcr.Spec.GetManifestsRoot() != "" {
repoPath = qcr.Spec.GetManifestsRoot()
} else {
repoPath, err = downloadFromGitRepoToTmpDir(defaultConfigRepoGitUrl, "master")
if err != nil {

View File

@@ -42,7 +42,7 @@ func (q *Qliksense) InstallQK8s(version string, opts *InstallCommandOptions, kee
}
if opts.AcceptEULA != "" {
qcr.SetEULA(opts.AcceptEULA)
qcr.Spec.AddToConfigs("qliksense", "acceptEULA", opts.AcceptEULA)
}
if opts.MongoDbUri != "" {
qcr.Spec.AddToSecrets("qliksense", "mongoDbUri", opts.MongoDbUri, "")
@@ -107,7 +107,7 @@ func (q *Qliksense) InstallQK8s(version string, opts *InstallCommandOptions, kee
if err != nil {
fmt.Println("cannot get the current-context cr", err)
return err
} else if qConfig.GetCrManifestRoot(qcr) == "" {
} else if qcr.Spec.GetManifestsRoot() == "" {
return errors.New("cannot get the manifest root. Use qliksense fetch <version> or qliksense set manifestsRoot")
}

View File

@@ -1,65 +0,0 @@
package qliksense
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
qapi "github.com/qlik-oss/sense-installer/pkg/api"
)
func TestCreateK8sResoruceBeforePatch(t *testing.T) {
td := setup()
sampleCr := `
apiVersion: qlik.com/v1
kind: Qliksense
metadata:
name: qlik-test3
labels:
version: v0.0.2
spec:
git:
repository: https://github.com/ffoysal/qliksense-k8s
accessToken: abababababababaab
userName: "blblbl"
gitOps:
enabled: "no"
schedule: "*/1 * * * *"
watchBranch: pr-branch-db1d26d6
image: qlik-docker-oss.bintray.io/qliksense-repo-watcher
configs:
qliksense:
- name: acceptEULA
value: "yes"
secrets:
qliksense:
- name: mongoDbUri
value: mongodb://qlik-default-mongodb:27017/qliksense?ssl=false
profile: docker-desktop
rotateKeys: "yes"`
crFile := filepath.Join(testDir, "install_test.yaml")
ioutil.WriteFile(crFile, []byte(sampleCr), 0644)
q := New(testDir)
file, e := os.Open(crFile)
if e != nil {
t.Log(e)
t.FailNow()
}
if err := q.LoadCr(file); err != nil {
t.Log(err)
t.FailNow()
}
qConfig := qapi.NewQConfig(testDir)
cr, err := qConfig.GetCR("qlik-test3")
if err != nil {
t.Log(err)
t.FailNow()
}
if err = q.createK8sResoruceBeforePatch(cr); err != nil {
t.Log(err)
t.FailNow()
}
td()
}

View File

@@ -32,35 +32,12 @@ func (q *Qliksense) loadCrStringIntoFileSystem(crstr string) (string, error) {
}
qConfig.CreateContextDirs(cr.GetName())
// encrypt the secrets and do base64 then update the CR
rsaPublicKey, _, err := qConfig.GetContextEncryptionKeyPair(cr.GetName())
if err != nil {
if err = qapi.WriteToFile(cr, qConfig.BuildCrFilePath(cr.GetName())); err != nil {
return "", err
}
for svc, nvs := range cr.Spec.Secrets {
for _, nv := range nvs {
if nv.ValueFrom == nil {
skv := &qapi.ServiceKeyValue{
Key: nv.Name,
Value: nv.Value,
SvcName: svc,
}
if err := q.processSecret(skv, rsaPublicKey, cr, false); err != nil {
return cr.GetName(), err
}
}
}
}
// write to disk
if err = qConfig.CreateOrWriteCrAndContext(cr); err != nil {
return "", err
}
qConfig.AddToContextsRaw(cr.GetName(), qConfig.BuildCrFilePath(cr.GetName()))
qConfig.AddToContexts(cr.GetName(), qConfig.BuildCrFilePath(cr.GetName()))
qConfig.SetCurrentContextName(cr.GetName())
qConfig.Write()
return cr.GetName(), nil
}
@@ -73,7 +50,6 @@ func readMultipleYamlFromReader(reader io.Reader) []string {
if s == "---" {
docs = append(docs, adoc)
adoc = ""
s = ""
}
adoc = adoc + "\n" + s
}

View File

@@ -11,7 +11,6 @@ import (
func TestLoadCrFile(t *testing.T) {
td := setup()
setup()
sampleCr := `
apiVersion: qlik.com/v1
kind: Qliksense
@@ -19,33 +18,6 @@ metadata:
name: qlik-test
labels:
version: v0.0.2
spec:
git:
repository: https://github.com/ffoysal/qliksense-k8s
accessToken: abababababababaab
userName: "blblbl"
gitOps:
enabled: "no"
schedule: "*/1 * * * *"
watchBranch: pr-branch-db1d26d6
image: qlik-docker-oss.bintray.io/qliksense-repo-watcher
configs:
qliksense:
- name: acceptEULA
value: "yes"
secrets:
qliksense:
- name: mongoDbUri
value: mongodb://qlik-default-mongodb:27017/qliksense?ssl=false
profile: docker-desktop
rotateKeys: "yes"
---
apiVersion: qlik.com/v1
kind: Qliksense
metadata:
name: qlik-test3
labels:
version: v0.0.2
spec:
git:
repository: https://github.com/ffoysal/qliksense-k8s
@@ -104,17 +76,7 @@ spec:
if cr.GetName() != "qlik-test" {
t.FailNow()
}
cr, err = qConfig.GetCR("qlik-test3")
if err != nil {
t.Log(err)
t.FailNow()
}
if cr.GetName() != "qlik-test3" {
t.FailNow()
}
if qConfig.Spec.CurrentContext != "qlik-test3" {
if qConfig.Spec.CurrentContext != "qlik-test" {
t.FailNow()
}
file, e = os.Open(dupCrFile)

View File

@@ -163,8 +163,7 @@ func determinePlatformSpecificUrls(platform string) (string, string, error) {
func (q *Qliksense) CheckDns() error {
// retrieve namespace
namespace := api.GetKubectlNamespace()
api.LogDebugMessage("Namespace: %s\n", namespace)
api.LogDebugMessage("Namespace here: %s", namespace)
tmpl, err := template.New("test").Parse(dnsCheckYAML)
if err != nil {
@@ -192,8 +191,6 @@ func (q *Qliksense) CheckDns() error {
const PreflightChecksDirName = "preflight_checks"
const preflightFileName = "preflight"
fmt.Println("Creating resources to run preflight checks")
// kubectl create deployment
opr := fmt.Sprintf("create deployment %s --image=nginx", appName)
err = initiateK8sOps(opr, namespace)
@@ -201,6 +198,7 @@ func (q *Qliksense) CheckDns() error {
fmt.Println(err)
return err
}
api.LogDebugMessage("create deployment executed")
defer func() {
// Deleting deployment..
@@ -217,6 +215,7 @@ func (q *Qliksense) CheckDns() error {
fmt.Println(err)
return err
}
api.LogDebugMessage("create service executed")
defer func() {
// delete service
@@ -237,13 +236,18 @@ func (q *Qliksense) CheckDns() error {
// call preflight
preflightCommand := filepath.Join(q.QliksenseHome, PreflightChecksDirName, preflightFileName)
err = invokePreflight(preflightCommand, tempYaml)
trackSuccess, err := invokePreflight(preflightCommand, tempYaml)
if err != nil {
fmt.Println(err)
return err
}
if trackSuccess {
fmt.Println("PREFLIGHT DNS CHECK PASSED")
} else {
fmt.Println("PREFLIGHT DNS CHECK FAILED")
}
return nil
}
@@ -257,7 +261,7 @@ func initiateK8sOps(opr, namespace string) error {
return nil
}
func invokePreflight(preflightCommand string, yamlFile *os.File) error {
func invokePreflight(preflightCommand string, yamlFile *os.File) (bool, error) {
arguments := []string{}
arguments = append(arguments, yamlFile.Name(), "--interactive=false")
cmd := exec.Command(preflightCommand, arguments...)
@@ -266,7 +270,7 @@ func invokePreflight(preflightCommand string, yamlFile *os.File) error {
cmd.Stdout = sterrBuffer
cmd.Stderr = sterrBuffer
if err := cmd.Run(); err != nil {
return fmt.Errorf("Error when running preflight command: %v\n", err)
return false, fmt.Errorf("Error when running preflight command: %v\n", err)
}
ind := strings.Index(sterrBuffer.String(), "---")
output := sterrBuffer.String()
@@ -274,28 +278,25 @@ func invokePreflight(preflightCommand string, yamlFile *os.File) error {
output = fmt.Sprintf("%s\n%s", output[:ind], output[ind:])
}
fmt.Printf("%v\n", output)
outputArr := strings.Fields(strings.TrimSpace(output))
trackSuccess := false
trackPrg := false
// Maybe good to retain this part in case we need to process the output in future.
// We are only checking the overall "PASS" or "FAIL"
// We are going to look for the first occurance of PASS or FAIL from the end
// there are also some space-like deceiving characters which are being hard to get by
//outputArr := strings.Fields(strings.TrimSpace(output))
//trackSuccess := false
//trackPrg := false
//for i := len(outputArr) - 1; i >= 0; i-- {
// if strings.TrimSpace(outputArr[i]) != "" {
// if outputArr[i] == "PASS" {
// trackSuccess = true
// trackPrg = true
// } else if outputArr[i] == "FAIL" {
// trackPrg = true
// }
// }
// if trackPrg {
// break
// }
//}
fmt.Println("Preflight checks completed, cleaning up resources now")
return nil
// there are also some space-like deceiving characters
for i := len(outputArr) - 1; i >= 0; i-- {
if strings.TrimSpace(outputArr[i]) != "" {
if outputArr[i] == "PASS" {
trackSuccess = true
trackPrg = true
} else if outputArr[i] == "FAIL" {
trackPrg = true
}
}
if trackPrg {
break
}
}
return trackSuccess, nil
}

View File

@@ -2,7 +2,6 @@ package qliksense
import (
"errors"
"path/filepath"
kapis_git "github.com/qlik-oss/k-apis/pkg/git"
qapi "github.com/qlik-oss/sense-installer/pkg/api"
@@ -13,8 +12,8 @@ func (q *Qliksense) DiscardAllUnstagedChangesFromGitRepo(qConfig *qapi.Qliksense
return err
} else if version := qcr.GetLabelFromCr("version"); version == "" {
return errors.New("version label is not set in CR")
} else if qConfig.GetCrManifestRoot(qcr) == qConfig.BuildRepoPath(version) {
if repo, err := kapis_git.OpenRepository(qConfig.GetCrManifestRoot(qcr)); err != nil {
} else if qcr.Spec.ManifestsRoot == qConfig.BuildRepoPath(version) {
if repo, err := kapis_git.OpenRepository(qcr.Spec.ManifestsRoot); err != nil {
return err
} else if err = kapis_git.DiscardAllUnstagedChanges(repo); err != nil {
return err
@@ -22,10 +21,3 @@ func (q *Qliksense) DiscardAllUnstagedChangesFromGitRepo(qConfig *qapi.Qliksense
}
return nil
}
func (q *Qliksense) GetCrManifestRoot(cr *qapi.QliksenseCR) string {
if filepath.IsAbs(cr.Spec.GetManifestsRoot()) {
return cr.Spec.GetManifestsRoot()
}
return filepath.Join(q.QliksenseHome, cr.Spec.GetManifestsRoot())
}