Compare commits

..

5 Commits

Author SHA1 Message Date
Foysal Iqbal
54d0972e85 uprev mixin (#13) 2020-01-08 13:20:51 -05:00
renovate[bot]
2839e5b77b Add renovate.json (#1)
Co-authored-by: Renovate Bot <renovatebot@gmail.com>
2020-01-03 10:45:33 -05:00
Jacob Martin
3608f9693c reconfigure auth to work (#3)
* reconfigure auth to work
2020-01-03 10:44:25 -05:00
Ashwathi Shiva
60a328d69f Added version and tag (#6)
* Added tag and version
2019-12-20 14:17:46 -05:00
Ashwathi Shiva
ee02016f16 Added code to support qliksense way to do preflight checks (#5)
* Added code to support qliksense way to do preflight checks
2019-12-20 13:28:10 -05:00
6 changed files with 110 additions and 58 deletions

View File

@@ -9,6 +9,13 @@ Download the appropriate executable for your platform from the [releases page](h
To make sure everything is order, you can fetch the Qlik Sense bundle version and corresponding image list from:
- `qliksense about --tag qlik/qliksense-cnab-bundle:latest `
## Running Preflight checks
You can run preflight checks to ensure that the cluster is in a healthy state before installing Qliksense.
- `qliksense preflight -c <credential_name> `
The above command runs the checks in the default namespace. If you want to specify the namespace to run preflight checks on:
- `qliksense preflight --param namespace=<value> -c <credential_name> `
## Qliksense Packaging
Packaging of Qlik Sense on Kubernetes is done through a [Porter](https://porter.sh/) definition in the [Qlik Sense on Kubernetes configuration repository](https://github.com/qlik-oss/qliksense-k8s/blob/master/porter.yaml), the resulting bundle published on DockerHub as a [Cloud Natvie Application Bundle](https://cnab.io/) called [qliksense-cnab-bundle](https://hub.docker.com/r/qlik/qliksense-cnab-bundle).
### Versioning

View File

@@ -15,6 +15,7 @@ func buildAliasCommands(porterCmd *cobra.Command, q *qliksense.Qliksense) []*cob
buildBuildAlias(porterCmd),
buildInstallAlias(porterCmd, q),
buildAboutAlias(porterCmd),
buildPreflightAlias(porterCmd, q),
}
}
@@ -172,6 +173,40 @@ func buildAboutAlias(porterCmd *cobra.Command) *cobra.Command {
return c
}
func buildPreflightAlias(porterCmd *cobra.Command, q *qliksense.Qliksense) *cobra.Command {
var (
c *cobra.Command
opts *paramOptions
)
opts = &paramOptions{}
c = &cobra.Command{
Use: "preflight",
Short: "Preflight Checks",
Long: "Perform Preflight Checks",
RunE: func(cmd *cobra.Command, args []string) error {
args = append(os.Args[1:], opts.getTagDefaults(args)...)
return porterCmd.RunE(porterCmd, append([]string{"invoke", "--action", "preflight"}, args...))
},
Annotations: map[string]string{
"group": "alias",
},
}
f := c.Flags()
f.StringSliceVar(&opts.Params, "param", nil,
"Define an individual parameter in the form NAME=VALUE. Overrides parameters set with the same name using --param-file. May be specified multiple times.")
f.StringSliceVar(&opts.ParamFiles, "param-file", nil,
"Path to a parameters definition file for the bundle, each line in the form of NAME=VALUE. May be specified multiple times.")
f.StringVarP(&opts.Tag, "tag", "t", "",
"Use a bundle in an OCI registry specified by the given tag")
f.StringVarP(&opts.Version, "version", "v", "latest",
"Version of Qlik Sense to install")
f.StringSliceVarP(&opts.CredentialIdentifiers, "cred", "c", nil,
"Credential to use when installing the bundle. May be either a named set of credentials or a filepath, and specified multiple times.")
return c
}
func (o *paramOptions) findKey(param string) *string {
var (
value *string

View File

@@ -49,7 +49,7 @@ func installPorter() (string, error) {
destination, homeDir, mixin, mixinOpts, qlikSenseHome, porterExe, ext string
mixinsVar = map[string]string{
"kustomize": "-v 0.2-beta-3-0e19ca4 --url https://github.com/donmstewart/porter-kustomize/releases/download",
"qliksense": "-v v0.11.0 --url https://github.com/qlik-oss/porter-qliksense/releases/download",
"qliksense": "-v v0.14.0 --url https://github.com/qlik-oss/porter-qliksense/releases/download",
"exec": "-v latest",
"kubernetes": "-v latest",
"helm": "-v latest",

View File

@@ -8,10 +8,12 @@ import (
"github.com/docker/cli/cli/command"
cliflags "github.com/docker/cli/cli/flags"
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/pkg/jsonmessage"
"github.com/docker/docker/pkg/term"
"github.com/docker/docker/registry"
"strings"
@@ -53,7 +55,6 @@ func (p *Qliksense) PullImages() error {
if err = yaml.Unmarshal([]byte(yamlVersion), &images); err != nil {
return err
}
for _, image = range images.Images {
if err = p.PullImage(image); err != nil {
fmt.Print(err)
@@ -72,12 +73,12 @@ func (p *Qliksense) PullImage(imageName string) error {
response io.ReadCloser
pullOptions types.ImagePullOptions
ctx context.Context
// ref reference.Named
// repoInfo *registry.RepositoryInfo
// authConfig types.AuthConfig
// encodedAuth string
termFd uintptr
err error
ref reference.Named
repoInfo *registry.RepositoryInfo
authConfig types.AuthConfig
encodedAuth string
termFd uintptr
err error
)
// TODO: Create a real cli config context
ctx = context.Background()
@@ -85,24 +86,26 @@ func (p *Qliksense) PullImage(imageName string) error {
return err
}
// if ref, err = reference.ParseNormalizedNamed(imageName); err != nil {
// return err
// }
// if repoInfo, err = registry.ParseRepositoryInfo(ref); err != nil {
// return err
// }
// authConfig = command.ResolveAuthConfig(ctx, cli, repoInfo.Index)
// if encodedAuth, err = command.EncodeAuthToBase64(authConfig); err != nil {
// return err
// }
pullOptions = types.ImagePullOptions{
// RegistryAuth: encodedAuth,
}
if err = cli.Initialize(cliflags.NewClientOptions()); err != nil {
return err
}
if ref, err = reference.ParseNormalizedNamed(imageName); err != nil {
return err
}
if repoInfo, err = registry.ParseRepositoryInfo(ref); err != nil {
return err
}
authConfig = command.ResolveAuthConfig(ctx, cli, repoInfo.Index)
if encodedAuth, err = command.EncodeAuthToBase64(authConfig); err != nil {
return err
}
pullOptions = types.ImagePullOptions{
RegistryAuth: encodedAuth,
}
if response, err = cli.Client().ImagePull(ctx, imageName, pullOptions); err != nil {
return err
}
@@ -164,7 +167,7 @@ func (p *Qliksense) TagAndPushImages(registry string) error {
}
// PullImage ...
func (p *Qliksense) TagAndPush(image string, registry string) error {
func (p *Qliksense) TagAndPush(image string, registryName string) error {
var (
cli *command.DockerCli
dockerOutput io.Writer
@@ -176,11 +179,12 @@ func (p *Qliksense) TagAndPush(image string, registry string) error {
imageList []types.ImageSummary
imageListOptions types.ImageListOptions
filterArgs filters.Args
// repoInfo *registry.RepositoryInfo
// authConfig types.AuthConfig
// encodedAuth string
termFd uintptr
err error
ref reference.Named
repoInfo *registry.RepositoryInfo
authConfig types.AuthConfig
encodedAuth string
termFd uintptr
err error
)
// TODO: Create a real cli config context
ctx = context.Background()
@@ -194,7 +198,7 @@ func (p *Qliksense) TagAndPush(image string, registry string) error {
if segments[0] == "docker.io" {
image = strings.Join(segments[1:], "/")
}
newName = registry + "/" + segments[len(segments)-1]
newName = registryName + "/" + segments[len(segments)-1]
filterArgs = filters.NewArgs()
filterArgs.Add("reference", image)
@@ -213,20 +217,19 @@ func (p *Qliksense) TagAndPush(image string, registry string) error {
return err
}
// if ref, err = reference.ParseNormalizedNamed(imageName); err != nil {
// return err
// }
// if repoInfo, err = registry.ParseRepositoryInfo(ref); err != nil {
// return err
// }
// authConfig = command.ResolveAuthConfig(ctx, cli, repoInfo.Index)
// if encodedAuth, err = command.EncodeAuthToBase64(authConfig); err != nil {
// return err
// }
if ref, err = reference.ParseNormalizedNamed(image); err != nil {
return err
}
if repoInfo, err = registry.ParseRepositoryInfo(ref); err != nil {
return err
}
authConfig = command.ResolveAuthConfig(ctx, cli, repoInfo.Index)
if encodedAuth, err = command.EncodeAuthToBase64(authConfig); err != nil {
return err
}
pushOptions = types.ImagePushOptions{
All: true,
RegistryAuth: "temp",
// RegistryAuth: encodedAuth,
RegistryAuth: encodedAuth,
}
if response, err = cli.Client().ImagePush(ctx, newName, pushOptions); err != nil {

View File

@@ -1,30 +1,33 @@
package qliksense
import (
"io"
"fmt"
"bufio"
"fmt"
"io"
"os"
"os/exec"
)
// ProcessLine ...
type ProcessLine func(string) *string
// CallPorter ...
func (p *Qliksense) CallPorter(args []string, processor ProcessLine) (string,error) {
func (p *Qliksense) CallPorter(args []string, processor ProcessLine) (string, error) {
var (
outText string
cmd *exec.Cmd
err error
output io.ReadCloser
scanner *bufio.Scanner
done chan struct{}
output io.ReadCloser
scanner *bufio.Scanner
done chan struct{}
)
cmd = exec.Command(p.porterExe,args[:]...)
if output,err = cmd.StdoutPipe(); err !=nil {
return "",err
cmd = exec.Command(p.porterExe, args[:]...)
if output, err = cmd.StdoutPipe(); err != nil {
return "", err
}
cmd.Stderr = os.Stderr
done = make(chan struct{})
scanner = bufio.NewScanner(output)
go func() {
@@ -35,24 +38,23 @@ func (p *Qliksense) CallPorter(args []string, processor ProcessLine) (string,err
if processor != nil {
newText = processor(text)
if newText != nil {
outText = outText + fmt.Sprintln(*newText)
outText = outText + fmt.Sprintln(*newText)
}
} else {
outText = outText + fmt.Sprintln(text)
outText = outText + fmt.Sprintln(text)
}
}
done <- struct{}{}
}()
if err = cmd.Start(); err != nil {
return "",err
return "", err
}
<-done
if err = cmd.Wait(); err != nil {
return "",err
return "", err
}
if err = scanner.Err(); err != nil {
return "",err
return "", err
}
return outText,nil
return outText, nil
}

5
renovate.json Normal file
View File

@@ -0,0 +1,5 @@
{
"extends": [
"config:base"
]
}