File openunison-control-0.0.13.obscpio of Package openunison-control

07070100000000000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000002200000000openunison-control-0.0.13/.vscode07070100000001000081A400000000000000000000000167FBDA050000036E000000000000000000000000000000000000002E00000000openunison-control-0.0.13/.vscode/launch.json{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch file",
            "type": "go",
            "request": "launch",
            "mode": "debug",
            "program": "${workspaceFolder}",
            "args":[
                "install-satelite",
                "/tmp/ou-test4.yaml", 
                "-q",
                "orchestra-cd8e9b8c", 
                
                "-w", 
                "sat-client-secrets",
                "openunison-cp", 
                "vcluster_test4_test4_openunison-kubernetes-dev"
            ],
            "env": {
                "KUBECONFIG": "/tmp/debugouctl"
            }
        }
    ]
}07070100000002000081A400000000000000000000000167FBDA0500002C5D000000000000000000000000000000000000002200000000openunison-control-0.0.13/LICENSE                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
07070100000003000081A400000000000000000000000167FBDA0500000F41000000000000000000000000000000000000002400000000openunison-control-0.0.13/README.md# ouctl

This utility automates the deployment of OpenUnison's helm charts into your cluster.  It has helm built in, so it doesn't need to use an external helm binary.  It has two commands, one for deploying a stand-alone OpenUnison instance and one for deploying a satelite instance.  Prior to using this tool, refer to the [OpenUnison deployment guide](https://openunison.github.io/deployauth/) for instructions on how to configure OpenUnison's values.yaml.

## install-auth-portal

This command will deploy a stand-alone OpenUnison instance.  It can deploy as both an [authentication portal](https://openunison.github.io/) and as a [Namespace as a Service (NaaS) portal](https://openunison.github.io/namespace_as_a_service/).  Prior to running this command, a values.yaml file will need to be created.  It is the only required argument for this command.  Optional flags:

```
  -m, --cluster-management-chart string       Helm chart for enabling cluster management (default "tremolo/openunison-k8s-cluster-management")
  -b, --database-secret-path string           Path to file containing the database password
  -h, --help                                  help for install-auth-portal
  -o, --operator-chart string                 Helm chart for OpenUnison's operator (default "tremolo/openunison-operator")
  -d, --operator-deploy-crds                  Deploy CRDs with the operator (default true)
  -p, --operator-image string                 Operator image name (default "docker.io/tremolosecurity/openunison-k8s-operator:latest")
  -c, --orchestra-chart string                Helm chart of the orchestra portal (default "tremolo/orchestra")
  -l, --orchestra-login-portal-chart string   Helm chart for the orchestra login portal (default "tremolo/orchestra-login-portal")
  -s, --secrets-file-path string              Path to file containing the authentication secret
  -t, --smtp-secret-path string               Path to file containing the smtp password`
```

If run on an existing cluster, this command will upgrade existing charts.  For authentication soltuions that require a secret, this command can be re-run without that secret safely.  

## install-satelite

To support [Multi cluster SSO](https://openunison.github.io/multi_cluster_sso/) This command installs a satelite instance of OpenUnison onto a remote instance.  It has three arguments:

1. The path to the new OpenUnison's values.yaml
2. The name of the context in your kubectl configuration file for the control plane Kubernetes cluster
3. The name of the context in your kubectl configuration file for the new satelite cluster

This command will make several changes to your values.yaml to automate the installation, such as configuring the `oidc` section for you.  There's no need to create a secret for this mode, the command will create it for you.

Optional flags:

```
 -a, --add-cluster-chart string              Helm chart fir adding a cluster to OpenUnison (default "tremolo/openunison-k8s-add-cluster")
  -h, --help                                  help for install-satelite
  -o, --operator-chart string                 Helm chart for OpenUnison's operator (default "tremolo/openunison-operator")
  -d, --operator-deploy-crds                  Deploy CRDs with the operator (default true)
  -p, --operator-image string                 Operator image name (default "docker.io/tremolosecurity/openunison-k8s-operator:latest")
  -c, --orchestra-chart string                Helm chart of the orchestra portal (default "tremolo/orchestra")
  -l, --orchestra-login-portal-chart string   Helm chart for the orchestra login portal (default "tremolo/orchestra-login-portal")
  -s, --save-satelite-values-path string      If specified, the values generated for the satelite integration on the control plane are saved to this path
```

This command can be re-run safely.  If charts have already been deployed, they'll be updated.
07070100000004000081ED00000000000000000000000167FBDA0500000985000000000000000000000000000000000000002300000000openunison-control-0.0.13/build.sh#!/bin/bash

export VERSION="0.0.13"

rm -rf target
mkdir -p target

env GOOS=darwin GOARCH=amd64 go build -ldflags "-s -w" -o ./target/ouctl-$VERSION-macos .
env GOOS=darwin GOARCH=arm64 go build -ldflags "-s -w" -o ./target/ouctl-$VERSION-macos-arm64 . 
env GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o ./target/ouctl-$VERSION-linux .
env GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -o ./target/ouctl-$VERSION-win.exe .

#upx ./target/ouctl-$VERSION-macos
#upx ./target/ouctl-$VERSION-linux
#upx ./target/ouctl-$VERSION-win.exe

echo "Creating MacOS Intel"
mkdir target/darwin
cp ./target/ouctl-$VERSION-macos target/darwin/ouctl
chmod +x target/darwin/ouctl
cp LICENSE target/darwin/
cd target/darwin/
zip ouctl-$VERSION-macos.zip ./ouctl LICENSE
cd ../../
mv target/darwin/ouctl-$VERSION-macos.zip target/
rm -rf target/darwin

echo "Creating MacOS ARM64"
mkdir target/darwin-arm64
cp ./target/ouctl-$VERSION-macos-arm64 target/darwin-arm64/ouctl
chmod +x target/darwin-arm64/ouctl
cp LICENSE target/darwin-arm64/
cd target/darwin-arm64/
zip ouctl-$VERSION-macos-arm64.zip ./ouctl LICENSE
cd ../../
mv target/darwin-arm64/ouctl-$VERSION-macos-arm64.zip target/
rm -rf target/darwin-arm64


echo "Creating Linux Intel"
mkdir target/linux
cp ./target/ouctl-$VERSION-linux target/linux/ouctl
chmod +x target/linux/ouctl
cp LICENSE target/linux/
cd target/linux/
zip ouctl-$VERSION-linux.zip ./ouctl LICENSE
cd ../../
mv target/linux/ouctl-$VERSION-linux.zip target/
rm -rf target/linux

echo "Creating Windows Intel"
mkdir target/win
cp ./target/ouctl-$VERSION-win.exe target/win/ouctl.exe
cp LICENSE target/win/
cd target/win/
zip ouctl-$VERSION-win.zip ./ouctl.exe ./LICENSE
cd ../../
mv target/win/ouctl-$VERSION-win.zip target/
rm -rf target/win





export MACOS_SHA256=$(sha256sum ./target/ouctl-$VERSION-macos.zip | awk '{print $1}')
export MACOS_ARM64_SHA256=$(sha256sum ./target/ouctl-$VERSION-macos-arm64.zip | awk '{print $1}')
export LINUX_SHA256=$(sha256sum ./target/ouctl-$VERSION-linux.zip | awk '{print $1}')
export WIN_SHA256=$(sha256sum ./target/ouctl-$VERSION-win.zip | awk '{print $1}')

cat ouctl.yaml | sed "s/_VERSION_/$VERSION/g" | sed "s/_MAC_ARM64_SHA_/$MACOS_ARM64_SHA256/g" | sed "s/_MAC_SHA_/$MACOS_SHA256/g" | sed "s/_LINUX_SHA_/$LINUX_SHA256/g" | sed "s/_WIN_SHA_/$WIN_SHA256/g" | sed "s/_REPO_/$1/g" > target/ouctl.yaml

aws s3 sync ./target/ s3://tremolosecurity-maven/repository/$1/



07070100000005000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000001E00000000openunison-control-0.0.13/cmd07070100000006000081A400000000000000000000000167FBDA05000010B4000000000000000000000000000000000000003300000000openunison-control-0.0.13/cmd/installAuthPortal.go/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd

import (
	"errors"

	"github.com/spf13/cobra"
	"github.com/tremolosecurity/openunison-control/openunison"
)

var secretFile string

// installAuthPortalCmd represents the installAuthPortal command
var installAuthPortalCmd = &cobra.Command{
	Use:   "install-auth-portal",
	Short: "Deploys the authentication portal for Kubernetes, requires one argument: The path to the values.yaml",
	Long:  ``,
	Args: func(cmd *cobra.Command, args []string) error {
		if len(args) < 1 {
			return errors.New("Requires one argument: The path to the values.yaml")
		}

		return nil
	},
	Run: func(cmd *cobra.Command, args []string) {

		pathToValuesYaml = args[0]

		openunisonDeployment, err := openunison.NewOpenUnisonDeployment(namespace, operatorChart, orchestraChart, orchestraLoginPortalChart, pathToValuesYaml, secretFile, clusterManagementChart, pathToDbPassword, pathToSmtpPassword, skipClusterManagement, parseChartSlices(&additionalCharts), parseChartSlices(&preCharts), parseNamespaceLabels(&namespaceLabels))

		if err != nil {
			panic(err)
		}

		if openunisonDeployment.IsNaas() {
			err = openunisonDeployment.DeployNaaSPortal()
			if err != nil {
				panic(err)
			}

			err = openunisonDeployment.DeployAdditionalCharts()
			if err != nil {
				panic(err)
			}

		} else {
			err = openunisonDeployment.DeployAuthPortal()
			if err != nil {
				panic(err)
			}

			err = openunisonDeployment.DeployAdditionalCharts()
			if err != nil {
				panic(err)
			}
		}

	},
}

func init() {
	rootCmd.AddCommand(installAuthPortalCmd)

	// Here you will define your flags and configuration settings.

	// Cobra supports Persistent Flags which will work for this command
	// and all subcommands, e.g.:

	installAuthPortalCmd.PersistentFlags().StringVarP(&operatorChart, "operator-chart", "o", "tremolo/openunison-operator", "Helm chart for OpenUnison's operator, adding '@version' installs the specific version")

	installAuthPortalCmd.PersistentFlags().StringVarP(&orchestraChart, "orchestra-chart", "c", "tremolo/orchestra", "Helm chart of the orchestra portal, adding '@version' installs the specific version")
	installAuthPortalCmd.PersistentFlags().StringVarP(&orchestraLoginPortalChart, "orchestra-login-portal-chart", "l", "tremolo/orchestra-login-portal", "Helm chart for the orchestra login portal, adding '@version' installs the specific version")
	installAuthPortalCmd.PersistentFlags().StringVarP(&secretFile, "secrets-file-path", "s", "", "Path to file containing the authentication secret")

	installAuthPortalCmd.PersistentFlags().StringVarP(&clusterManagementChart, "cluster-management-chart", "m", "tremolo/openunison-k8s-cluster-management", "Helm chart for enabling cluster management, adding '@version' installs the specific version")
	installAuthPortalCmd.PersistentFlags().StringVarP(&pathToDbPassword, "database-secret-path", "b", "", "Path to file containing the database password")
	installAuthPortalCmd.PersistentFlags().StringVarP(&pathToSmtpPassword, "smtp-secret-path", "t", "", "Path to file containing the smtp password")

	installAuthPortalCmd.PersistentFlags().BoolVarP(&skipClusterManagement, "skip-cluster-management", "k", false, "Set to true if skipping the cluster management chart when openunison.enable_provisioning is true")

	preCharts = make([]string, 0)
	additionalCharts = make([]string, 0)

	installAuthPortalCmd.PersistentFlags().StringSliceVarP(&preCharts, "prerun-helm-charts", "u", []string{}, "Comma separated list of chart=path to deploy charts before OpenUnison is deployed, adding '@version' installs the specific version")
	installAuthPortalCmd.PersistentFlags().StringSliceVarP(&additionalCharts, "additional-helm-charts", "r", []string{}, "Comma separated list of chart=path to deploy additional charts after OpenUnison is deployed, adding '@version' installs the specific version")

	installAuthPortalCmd.PersistentFlags().StringSliceVarP(&namespaceLabels, "namespace-labels", "j", []string{}, "Comma separated list of name=value of labels to add to the openunison namespace")
	// Cobra supports local flags which will only run when this command
	// is called directly, e.g.:
	// installAuthPortalCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
07070100000007000081A400000000000000000000000167FBDA0500001144000000000000000000000000000000000000003100000000openunison-control-0.0.13/cmd/installSatelite.go/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd

import (
	"errors"

	"github.com/spf13/cobra"
	"github.com/tremolosecurity/openunison-control/openunison"
)

// installSateliteCmd represents the installSatelite command
var installSateliteCmd = &cobra.Command{
	Use:   "install-satelite",
	Short: "Installs a satelite OpenUnison that relies on a control-plane openunison for authentication",
	Long: `This command will deploy an OpenUnison into a satelite cluster for authentication into that cluster using openid connect, using a control-plane OpenUnison as the identity provider.  It will:
	1.  Verify that a cluster with the same name isn't in use
	2.  Create the appropriate Secret in the control plane
	3.  Generate the correct oidc configuration for the satelite and write it to the values file supplied by this command
	4.  Deploy openunison into the satelite cluster
	5.  Deploy the add-cluster chart into the control-plane cluster`,
	Args: func(cmd *cobra.Command, args []string) error {
		if len(args) < 3 {
			return errors.New("requires three arguments: The path to the values.yaml, the control plane context name and the satelite context name")
		}

		return nil
	},
	Run: func(cmd *cobra.Command, args []string) {
		pathToValuesYaml = args[0]
		controlPlaneCtxName := args[1]
		sateliteCtxName := args[2]

		openunisonDeployment, err := openunison.NewSateliteDeployment(namespace, operatorChart, orchestraChart, orchestraLoginPortalChart, pathToValuesYaml, secretFile, controlPlaneCtxName, sateliteCtxName, addClusterChart, pathToSateliteYaml, parseChartSlices(&additionalCharts), parseChartSlices(&preCharts), parseNamespaceLabels(&namespaceLabels), controlPlaneOrchestraChartName, controlPlaneSecretName, skipCPIntegration)

		if err != nil {
			panic(err)
		}

		err = openunisonDeployment.DeployOpenUnisonSatelite()
		if err != nil {
			panic(err)
		}
	},
}

func init() {
	rootCmd.AddCommand(installSateliteCmd)

	installSateliteCmd.PersistentFlags().StringVarP(&operatorChart, "operator-chart", "o", "tremolo/openunison-operator", "Helm chart for OpenUnison's operator, adding '@version' installs the specific version")

	installSateliteCmd.PersistentFlags().StringVarP(&orchestraChart, "orchestra-chart", "c", "tremolo/orchestra", "Helm chart of the orchestra portal, adding '@version' installs the specific version")
	installSateliteCmd.PersistentFlags().StringVarP(&orchestraLoginPortalChart, "orchestra-login-portal-chart", "l", "tremolo/orchestra-login-portal", "Helm chart for the orchestra login portal, adding '@version' installs the specific version")
	installSateliteCmd.PersistentFlags().StringVarP(&addClusterChart, "add-cluster-chart", "a", "tremolo/openunison-k8s-add-cluster", "Helm chart for adding a cluster to OpenUnison, adding '@version' installs the specific version")

	installSateliteCmd.PersistentFlags().StringVarP(&pathToSateliteYaml, "save-satelite-values-path", "s", "", "If specified, the values generated for the satelite integration on the control plane are saved to this path")

	preCharts = make([]string, 0)
	additionalCharts = make([]string, 0)

	installSateliteCmd.PersistentFlags().StringSliceVarP(&preCharts, "prerun-helm-charts", "u", []string{}, "Comma separated list of chart=path to deploy charts before OpenUnison is deployed, adding '@version' installs the specific version")
	installSateliteCmd.PersistentFlags().StringSliceVarP(&additionalCharts, "additional-helm-charts", "r", []string{}, "Comma separated list of chart=path to deploy additional charts after OpenUnison is deployed, adding '@version' installs the specific version")

	installSateliteCmd.PersistentFlags().StringSliceVarP(&namespaceLabels, "namespace-labels", "j", []string{}, "Comma separated list of name=value of labels to add to the openunison namespace")
	installSateliteCmd.PersistentFlags().StringVarP(&controlPlaneOrchestraChartName, "control-plane-orchestra-chart-name", "q", "orchestra", "The name of the orchestra chart on the control plane")
	installSateliteCmd.PersistentFlags().StringVarP(&controlPlaneSecretName, "control-plane-secret-name", "w", "orchestra-secrets-source", "The name of the secret on the control plane to store client secrets in")

	installSateliteCmd.PersistentFlags().BoolVarP(&skipCPIntegration, "skip-controlplane-integration", "k", false, "Set to true if skipping the control plane integration step.  Used when upgrading a satelite.")
}
07070100000008000081A400000000000000000000000167FBDA0500000A6E000000000000000000000000000000000000002600000000openunison-control-0.0.13/cmd/root.go/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd

import (
	"os"
	"strings"

	"github.com/spf13/cobra"
	"github.com/tremolosecurity/openunison-control/openunison"
)

// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
	Use:   "openunison-control",
	Short: "Deploys OpenUnison into your cluster",
	Long:  `openunison-ctl automates the deployment of OpenUnison into your cluster.  This tool will create the appropriate Secrets and deploy the correct helm charts for you`,
	// Uncomment the following line if your bare application
	// has an action associated with it:
	// Run: func(cmd *cobra.Command, args []string) { },
}

// namespace for openunison
var namespace string

var operatorImage string
var operatorDeployCrd bool
var operatorChart string

var orchestraChart string
var orchestraLoginPortalChart string
var pathToValuesYaml string

var addClusterChart string

var clusterManagementChart string
var pathToDbPassword string
var pathToSmtpPassword string

var pathToSateliteYaml string

var skipClusterManagement bool

var additionalCharts []string
var preCharts []string

var namespaceLabels []string

var controlPlaneOrchestraChartName string
var controlPlaneSecretName string

var skipCPIntegration bool

// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
	err := rootCmd.Execute()
	if err != nil {
		os.Exit(1)
	}
}

func init() {
	// Here you will define your flags and configuration settings.
	// Cobra supports persistent flags, which, if defined here,
	// will be global for your application.

	rootCmd.PersistentFlags().StringVarP(&namespace, "namespace", "n", "openunison", "namespace to deploy openunison into")

	// Cobra also supports local flags, which will only run
	// when this action is called directly.
	rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

func parseNamespaceLabels(namespaceLabels *[]string) map[string]string {
	nsLabelsMap := make(map[string]string)

	for _, labelPair := range *namespaceLabels {
		split := strings.Split(labelPair, "=")
		nsLabelsMap[split[0]] = split[1]
	}

	return nsLabelsMap
}

func parseChartSlices(additionalCharts *[]string) []openunison.HelmChartInfo {
	var additionalChartsList []openunison.HelmChartInfo
	for _, chartPair := range *additionalCharts {
		split := strings.Split(chartPair, "=")
		chart := openunison.HelmChartInfo{
			Name:      split[0],
			ChartPath: split[1],
		}

		additionalChartsList = append(additionalChartsList, chart)
	}

	return additionalChartsList
}
07070100000009000081ED00000000000000000000000167FBDA0500000138000000000000000000000000000000000000002400000000openunison-control-0.0.13/depxml.sh#!/bin/bash

export VERSION="0.0.13"

rm -rf target
mkdir -p target


cat ouctl.yaml | sed "s/_VERSION_/$VERSION/g" | sed "s/_MAC_SHA_/$MACOS_SHA256/g" | sed "s/_LINUX_SHA_/$LINUX_SHA256/g" | sed "s/_WIN_SHA_/$WIN_SHA256/g" > target/ouctl.yaml

aws s3 sync ./target/ s3://tremolosecurity-maven/repository/$1/



0707010000000A000081A400000000000000000000000167FBDA0500001C4C000000000000000000000000000000000000002100000000openunison-control-0.0.13/go.modmodule github.com/tremolosecurity/openunison-control

go 1.23.0

toolchain go1.23.4

require k8s.io/client-go v0.32.3

require (
	dario.cat/mergo v1.0.1 // indirect
	github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 // indirect
	github.com/Microsoft/hcsshim v0.12.9 // indirect
	github.com/blang/semver/v4 v4.0.0 // indirect
	github.com/containerd/errdefs v0.3.0 // indirect
	github.com/containerd/log v0.1.0 // indirect
	github.com/containerd/platforms v0.2.1 // indirect
	github.com/distribution/reference v0.6.0 // indirect
	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
	github.com/felixge/httpsnoop v1.0.4 // indirect
	github.com/fxamacker/cbor/v2 v2.7.0 // indirect
	github.com/go-logr/stdr v1.2.2 // indirect
	github.com/google/gnostic-models v0.6.9 // indirect
	github.com/gorilla/websocket v1.5.0 // indirect
	github.com/hashicorp/errwrap v1.1.0 // indirect
	github.com/hashicorp/go-multierror v1.1.1 // indirect
	github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
	github.com/russross/blackfriday/v2 v2.1.0 // indirect
	github.com/x448/float16 v0.8.4 // indirect
	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
	go.opentelemetry.io/otel v1.35.0 // indirect
	go.opentelemetry.io/otel/metric v1.35.0 // indirect
	go.opentelemetry.io/otel/trace v1.35.0 // indirect
	google.golang.org/genproto/googleapis/rpc v0.0.0-20250409194420-de1ac958c67a // indirect
	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
	k8s.io/apiextensions-apiserver v0.32.3 // indirect
)

require (
	github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
	github.com/BurntSushi/toml v1.4.0 // indirect
	github.com/MakeNowJust/heredoc v1.0.0 // indirect
	github.com/Masterminds/goutils v1.1.1 // indirect
	github.com/Masterminds/semver/v3 v3.3.0 // indirect
	github.com/Masterminds/sprig/v3 v3.3.0 // indirect
	github.com/Masterminds/squirrel v1.5.4 // indirect
	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
	github.com/beorn7/perks v1.0.1 // indirect
	github.com/cespare/xxhash/v2 v2.3.0 // indirect
	github.com/chai2010/gettext-go v1.0.2 // indirect
	github.com/containerd/containerd v1.7.27 // indirect
	github.com/cyphar/filepath-securejoin v0.3.6 // indirect
	github.com/docker/cli v25.0.1+incompatible // indirect
	github.com/docker/distribution v2.8.3+incompatible // indirect
	github.com/docker/docker v27.1.1+incompatible // indirect
	github.com/docker/docker-credential-helpers v0.7.0 // indirect
	github.com/docker/go-connections v0.5.0 // indirect
	github.com/docker/go-metrics v0.0.1 // indirect
	github.com/evanphx/json-patch v5.9.0+incompatible // indirect
	github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect
	github.com/fatih/color v1.13.0 // indirect
	github.com/go-errors/errors v1.4.2 // indirect
	github.com/go-gorp/gorp/v3 v3.1.0 // indirect
	github.com/gobwas/glob v0.2.3 // indirect
	github.com/google/btree v1.0.1 // indirect
	github.com/google/go-cmp v0.7.0 // indirect
	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
	github.com/google/uuid v1.6.0 // indirect
	github.com/gorilla/mux v1.8.1 // indirect
	github.com/gosuri/uitable v0.0.4 // indirect
	github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
	github.com/huandu/xstrings v1.5.0 // indirect
	github.com/inconshreveable/mousetrap v1.1.0 // indirect
	github.com/jmoiron/sqlx v1.4.0 // indirect
	github.com/klauspost/compress v1.17.9 // indirect
	github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
	github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
	github.com/lib/pq v1.10.9 // indirect
	github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
	github.com/mattn/go-colorable v0.1.13 // indirect
	github.com/mattn/go-isatty v0.0.17 // indirect
	github.com/mattn/go-runewidth v0.0.9 // indirect
	github.com/mitchellh/copystructure v1.2.0 // indirect
	github.com/mitchellh/go-wordwrap v1.0.1 // indirect
	github.com/mitchellh/reflectwalk v1.0.2 // indirect
	github.com/moby/locker v1.0.1 // indirect
	github.com/moby/spdystream v0.5.0 // indirect
	github.com/moby/term v0.5.0 // indirect
	github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
	github.com/opencontainers/go-digest v1.0.0 // indirect
	github.com/opencontainers/image-spec v1.1.0 // indirect
	github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
	github.com/pkg/errors v0.9.1 // indirect
	github.com/prometheus/client_golang v1.20.2 // indirect
	github.com/prometheus/client_model v0.6.1 // indirect
	github.com/prometheus/common v0.55.0 // indirect
	github.com/prometheus/procfs v0.15.1 // indirect
	github.com/rubenv/sql-migrate v1.7.1 // indirect
	github.com/shopspring/decimal v1.4.0 // indirect
	github.com/sirupsen/logrus v1.9.3 // indirect
	github.com/spf13/cast v1.7.0 // indirect
	github.com/spf13/cobra v1.8.1
	github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
	github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
	github.com/xeipuuv/gojsonschema v1.2.0 // indirect
	github.com/xlab/treeprint v1.2.0 // indirect
	golang.org/x/crypto v0.36.0 // indirect
	golang.org/x/sync v0.12.0 // indirect
	google.golang.org/grpc v1.67.0 // indirect
	k8s.io/apiserver v0.32.3 // indirect
	k8s.io/cli-runtime v0.32.2 // indirect
	k8s.io/component-base v0.32.3 // indirect
	k8s.io/kubectl v0.32.2 // indirect
	oras.land/oras-go v1.2.5 // indirect
	sigs.k8s.io/kustomize/api v0.18.0 // indirect
	sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect
)

require (
	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
	github.com/go-logr/logr v1.4.2 // indirect
	github.com/go-openapi/jsonpointer v0.21.0 // indirect
	github.com/go-openapi/jsonreference v0.20.2 // indirect
	github.com/go-openapi/swag v0.23.0 // indirect
	github.com/gogo/protobuf v1.3.2 // indirect
	github.com/golang/protobuf v1.5.4 // indirect
	github.com/google/gofuzz v1.2.0 // indirect
	github.com/josharian/intern v1.0.0 // indirect
	github.com/json-iterator/go v1.1.12 // indirect
	github.com/mailru/easyjson v0.7.7 // indirect
	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
	github.com/modern-go/reflect2 v1.0.2 // indirect
	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
	github.com/spf13/pflag v1.0.5 // indirect
	golang.org/x/net v0.37.0 // indirect
	golang.org/x/oauth2 v0.23.0
	golang.org/x/sys v0.31.0 // indirect
	golang.org/x/term v0.30.0 // indirect
	golang.org/x/text v0.23.0 // indirect
	golang.org/x/time v0.7.0 // indirect
	google.golang.org/protobuf v1.36.6 // indirect
	gopkg.in/inf.v0 v0.9.1 // indirect
	gopkg.in/yaml.v3 v3.0.1
	helm.sh/helm/v3 v3.17.3
	k8s.io/api v0.32.3
	k8s.io/apimachinery v0.32.3
	k8s.io/klog/v2 v2.130.1 // indirect
	k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
	k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
	sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
	sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect
	sigs.k8s.io/yaml v1.4.0 // indirect
)
0707010000000B000081A400000000000000000000000167FBDA050000B583000000000000000000000000000000000000002100000000openunison-control-0.0.13/go.sumdario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs=
github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0=
github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM=
github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/Microsoft/hcsshim v0.12.9 h1:2zJy5KA+l0loz1HzEGqyNnjd3fyZA31ZBCGKacp6lLg=
github.com/Microsoft/hcsshim v0.12.9/go.mod h1:fJ0gkFAna6ukt0bLdKB8djt4XIJhF/vEPuoIWYVvZ8Y=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70=
github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng=
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ=
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o=
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk=
github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0=
github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0=
github.com/containerd/containerd v1.7.27 h1:yFyEyojddO3MIGVER2xJLWoCIn+Up4GaHFquP7hsFII=
github.com/containerd/containerd v1.7.27/go.mod h1:xZmPnl75Vc+BLGt4MIfu6bp+fy03gdHAn9bz+FreFR0=
github.com/containerd/continuity v0.4.4 h1:/fNVfTJ7wIl/YPMHjf+5H32uFhl63JucB34PlCpMKII=
github.com/containerd/continuity v0.4.4/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE=
github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4=
github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw=
github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY=
github.com/containerd/typeurl/v2 v2.2.0 h1:6NBDbQzr7I5LHgp34xAXYF5DOTQDn05X58lsPEmzLso=
github.com/containerd/typeurl/v2 v2.2.0/go.mod h1:8XOOxnyatxSWuG8OfsZXVnAF4iZfedjS/8UHSPJnX4g=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM=
github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aBfCb7iqHmDEIp6fBvC/hQUddQfg+3qdYjwzaiP9Hnc=
github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU=
github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY=
github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A=
github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0=
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4=
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls=
github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4=
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc=
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI=
github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs=
github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw=
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-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k=
github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY=
github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo=
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw=
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk=
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM=
github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU=
github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78=
github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI=
github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus=
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY=
github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg=
github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/rubenv/sql-migrate v1.7.1 h1:f/o0WgfO/GqNuVg+6801K/KW3WdDSupzSjDYODmiUq4=
github.com/rubenv/sql-migrate v1.7.1/go.mod h1:Ob2Psprc0/3ggbM6wCzyYVFFuc6FyZrb2AS+ezLDFb4=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI=
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE=
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY=
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
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=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250409194420-de1ac958c67a h1:GIqLhp/cYUkuGuiT+vJk8vhOP86L4+SP5j8yXgeVpvI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250409194420-de1ac958c67a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw=
google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g=
helm.sh/helm/v3 v3.17.3 h1:3n5rW3D0ArjFl0p4/oWO8IbY/HKaNNwJtOQFdH2AZHg=
helm.sh/helm/v3 v3.17.3/go.mod h1:+uJKMH/UiMzZQOALR3XUf3BLIoczI2RKKD6bMhPh4G8=
k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls=
k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k=
k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY=
k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss=
k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U=
k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
k8s.io/apiserver v0.32.3 h1:kOw2KBuHOA+wetX1MkmrxgBr648ksz653j26ESuWNY8=
k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc=
k8s.io/cli-runtime v0.32.2 h1:aKQR4foh9qeyckKRkNXUccP9moxzffyndZAvr+IXMks=
k8s.io/cli-runtime v0.32.2/go.mod h1:a/JpeMztz3xDa7GCyyShcwe55p8pbcCVQxvqZnIwXN8=
k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU=
k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY=
k8s.io/component-base v0.32.3 h1:98WJvvMs3QZ2LYHBzvltFSeJjEx7t5+8s71P7M74u8k=
k8s.io/component-base v0.32.3/go.mod h1:LWi9cR+yPAv7cu2X9rZanTiFKB2kHA+JjmhkKjCZRpI=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4=
k8s.io/kubectl v0.32.2 h1:TAkag6+XfSBgkqK9I7ZvwtF0WVtUAvK8ZqTt+5zi1Us=
k8s.io/kubectl v0.32.2/go.mod h1:+h/NQFSPxiDZYX/WZaWw9fwYezGLISP0ud8nQKg+3g8=
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo=
oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo=
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA=
sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
0707010000000C000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000002400000000openunison-control-0.0.13/helmmodel0707010000000D000081A400000000000000000000000167FBDA050000010A000000000000000000000000000000000000002F00000000openunison-control-0.0.13/helmmodel/.gitignore# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so

# Folders
_obj
_test

# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out

*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*

_testmain.go

*.exe
*.test
*.prof
0707010000000E000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000003500000000openunison-control-0.0.13/helmmodel/.swagger-codegen0707010000000F000081A400000000000000000000000167FBDA0500000406000000000000000000000000000000000000003C00000000openunison-control-0.0.13/helmmodel/.swagger-codegen-ignore# Swagger Codegen Ignore
# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen

# Use this file to prevent files from being overwritten by the generator.
# The patterns follow closely to .gitignore or .dockerignore.

# As an example, the C# client generator defines ApiClient.cs.
# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
#ApiClient.cs

# You can match any string of characters against a directory, file or extension with a single asterisk (*):
#foo/*/qux
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux

# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
#foo/**/qux
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux

# You can also negate patterns with an exclamation (!).
# For example, you can ignore all files in a docs folder with the file extension .md:
#docs/*.md
# Then explicitly reverse the ignore rule for a single file:
#!docs/README.md
07070100000010000081A400000000000000000000000167FBDA0500000006000000000000000000000000000000000000003D00000000openunison-control-0.0.13/helmmodel/.swagger-codegen/VERSION3.0.4207070100000011000081A400000000000000000000000167FBDA0500000047000000000000000000000000000000000000003000000000openunison-control-0.0.13/helmmodel/.travis.ymllanguage: go

install:
  - go get -d -v .

script:
  - go build -v ./

07070100000012000081A400000000000000000000000167FBDA0500000381000000000000000000000000000000000000002E00000000openunison-control-0.0.13/helmmodel/README.md# Go API client for helmmodel

OpenUnison Helm Objects

## Overview
This API client was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project.  By using the [swagger-spec](https://github.com/swagger-api/swagger-spec) from a remote server, you can easily generate an API client.

- API version: v1
- Package version: 1.0.0
- Build package: io.swagger.codegen.v3.generators.go.GoClientCodegen

## Installation
Put the package under your project folder and add the following in import:
```golang
import "./helmmodel"
```

## Documentation for API Endpoints

All URIs are relative to */*

Class | Method | HTTP request | Description
------------ | ------------- | ------------- | -------------

## Documentation For Models

 - [TrustedCertsInner](docs/TrustedCertsInner.md)

## Documentation For Authorization
 Endpoints do not require authorization.


## Author

07070100000013000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000002800000000openunison-control-0.0.13/helmmodel/api07070100000014000081A400000000000000000000000167FBDA05000001B3000000000000000000000000000000000000003500000000openunison-control-0.0.13/helmmodel/api/swagger.yamlopenapi: 3.0.1
info:
  title: OpenUnison Helm Objects
  description: OpenUnison Helm Objects
  version: v1
servers:
- url: /
paths: {}
components:
  schemas:
    TrustedCerts:
      type: array
      items:
        $ref: '#/components/schemas/TrustedCerts_inner'
    TrustedCerts_inner:
      type: object
      properties:
        name:
          type: string
        pem_b64:
          type: string
x-original-swagger-version: "2.0"
07070100000015000081A400000000000000000000000167FBDA0500002D56000000000000000000000000000000000000002E00000000openunison-control-0.0.13/helmmodel/client.go/*
 * OpenUnison Helm Objects
 *
 * OpenUnison Helm Objects
 *
 * API version: v1
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package helmmodel

import (
	"bytes"
	"context"
	"encoding/json"
	"encoding/xml"
	"errors"
	"fmt"
	"io"
	"mime/multipart"
	"net/http"
	"net/url"
	"os"
	"path/filepath"
	"reflect"
	"regexp"
	"strconv"
	"strings"
	"time"
	"unicode/utf8"

	"golang.org/x/oauth2"
)

var (
	jsonCheck = regexp.MustCompile("(?i:[application|text]/json)")
	xmlCheck  = regexp.MustCompile("(?i:[application|text]/xml)")
)

// APIClient manages communication with the OpenUnison Helm Objects API vv1
// In most cases there should be only one, shared, APIClient.
type APIClient struct {
	cfg    *Configuration
	common service // Reuse a single struct instead of allocating one for each service on the heap.

	// API Services
}

type service struct {
	client *APIClient
}

// NewAPIClient creates a new API client. Requires a userAgent string describing your application.
// optionally a custom http.Client to allow for advanced features such as caching.
func NewAPIClient(cfg *Configuration) *APIClient {
	if cfg.HTTPClient == nil {
		cfg.HTTPClient = http.DefaultClient
	}

	c := &APIClient{}
	c.cfg = cfg
	c.common.client = c

	// API Services

	return c
}

func atoi(in string) (int, error) {
	return strconv.Atoi(in)
}

// selectHeaderContentType select a content type from the available list.
func selectHeaderContentType(contentTypes []string) string {
	if len(contentTypes) == 0 {
		return ""
	}
	if contains(contentTypes, "application/json") {
		return "application/json"
	}
	return contentTypes[0] // use the first content type specified in 'consumes'
}

// selectHeaderAccept join all accept types and return
func selectHeaderAccept(accepts []string) string {
	if len(accepts) == 0 {
		return ""
	}

	if contains(accepts, "application/json") {
		return "application/json"
	}

	return strings.Join(accepts, ",")
}

// contains is a case insenstive match, finding needle in a haystack
func contains(haystack []string, needle string) bool {
	for _, a := range haystack {
		if strings.ToLower(a) == strings.ToLower(needle) {
			return true
		}
	}
	return false
}

// Verify optional parameters are of the correct type.
func typeCheckParameter(obj interface{}, expected string, name string) error {
	// Make sure there is an object.
	if obj == nil {
		return nil
	}

	// Check the type is as expected.
	if reflect.TypeOf(obj).String() != expected {
		return fmt.Errorf("Expected %s to be of type %s but received %s.", name, expected, reflect.TypeOf(obj).String())
	}
	return nil
}

// parameterToString convert interface{} parameters to string, using a delimiter if format is provided.
func parameterToString(obj interface{}, collectionFormat string) string {
	var delimiter string

	switch collectionFormat {
	case "pipes":
		delimiter = "|"
	case "ssv":
		delimiter = " "
	case "tsv":
		delimiter = "\t"
	case "csv":
		delimiter = ","
	}

	if reflect.TypeOf(obj).Kind() == reflect.Slice {
		return strings.Trim(strings.Replace(fmt.Sprint(obj), " ", delimiter, -1), "[]")
	}

	return fmt.Sprintf("%v", obj)
}

// callAPI do the request.
func (c *APIClient) callAPI(request *http.Request) (*http.Response, error) {
	return c.cfg.HTTPClient.Do(request)
}

// Change base path to allow switching to mocks
func (c *APIClient) ChangeBasePath(path string) {
	c.cfg.BasePath = path
}

// prepareRequest build the request
func (c *APIClient) prepareRequest(
	ctx context.Context,
	path string, method string,
	postBody interface{},
	headerParams map[string]string,
	queryParams url.Values,
	formParams url.Values,
	fileName string,
	fileBytes []byte) (localVarRequest *http.Request, err error) {

	var body *bytes.Buffer

	// Detect postBody type and post.
	if postBody != nil {
		contentType := headerParams["Content-Type"]
		if contentType == "" {
			contentType = detectContentType(postBody)
			headerParams["Content-Type"] = contentType
		}

		body, err = setBody(postBody, contentType)
		if err != nil {
			return nil, err
		}
	}

	// add form parameters and file if available.
	if strings.HasPrefix(headerParams["Content-Type"], "multipart/form-data") && len(formParams) > 0 || (len(fileBytes) > 0 && fileName != "") {
		if body != nil {
			return nil, errors.New("Cannot specify postBody and multipart form at the same time.")
		}
		body = &bytes.Buffer{}
		w := multipart.NewWriter(body)

		for k, v := range formParams {
			for _, iv := range v {
				if strings.HasPrefix(k, "@") { // file
					err = addFile(w, k[1:], iv)
					if err != nil {
						return nil, err
					}
				} else { // form value
					w.WriteField(k, iv)
				}
			}
		}
		if len(fileBytes) > 0 && fileName != "" {
			w.Boundary()
			//_, fileNm := filepath.Split(fileName)
			part, err := w.CreateFormFile("file", filepath.Base(fileName))
			if err != nil {
				return nil, err
			}
			_, err = part.Write(fileBytes)
			if err != nil {
				return nil, err
			}
			// Set the Boundary in the Content-Type
			headerParams["Content-Type"] = w.FormDataContentType()
		}

		// Set Content-Length
		headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len())
		w.Close()
	}

	if strings.HasPrefix(headerParams["Content-Type"], "application/x-www-form-urlencoded") && len(formParams) > 0 {
		if body != nil {
			return nil, errors.New("Cannot specify postBody and x-www-form-urlencoded form at the same time.")
		}
		body = &bytes.Buffer{}
		body.WriteString(formParams.Encode())
		// Set Content-Length
		headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len())
	}

	// Setup path and query parameters
	url, err := url.Parse(path)
	if err != nil {
		return nil, err
	}

	// Adding Query Param
	query := url.Query()
	for k, v := range queryParams {
		for _, iv := range v {
			query.Add(k, iv)
		}
	}

	// Encode the parameters.
	url.RawQuery = query.Encode()

	// Generate a new request
	if body != nil {
		localVarRequest, err = http.NewRequest(method, url.String(), body)
	} else {
		localVarRequest, err = http.NewRequest(method, url.String(), nil)
	}
	if err != nil {
		return nil, err
	}

	// add header parameters, if any
	if len(headerParams) > 0 {
		headers := http.Header{}
		for h, v := range headerParams {
			headers.Set(h, v)
		}
		localVarRequest.Header = headers
	}

	// Override request host, if applicable
	if c.cfg.Host != "" {
		localVarRequest.Host = c.cfg.Host
	}

	// Add the user agent to the request.
	localVarRequest.Header.Add("User-Agent", c.cfg.UserAgent)

	if ctx != nil {
		// add context to the request
		localVarRequest = localVarRequest.WithContext(ctx)

		// Walk through any authentication.

		// OAuth2 authentication
		if tok, ok := ctx.Value(ContextOAuth2).(oauth2.TokenSource); ok {
			// We were able to grab an oauth2 token from the context
			var latestToken *oauth2.Token
			if latestToken, err = tok.Token(); err != nil {
				return nil, err
			}

			latestToken.SetAuthHeader(localVarRequest)
		}

		// Basic HTTP Authentication
		if auth, ok := ctx.Value(ContextBasicAuth).(BasicAuth); ok {
			localVarRequest.SetBasicAuth(auth.UserName, auth.Password)
		}

		// AccessToken Authentication
		if auth, ok := ctx.Value(ContextAccessToken).(string); ok {
			localVarRequest.Header.Add("Authorization", "Bearer "+auth)
		}
	}

	for header, value := range c.cfg.DefaultHeader {
		localVarRequest.Header.Add(header, value)
	}

	return localVarRequest, nil
}

func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err error) {
		if strings.Contains(contentType, "application/xml") {
			if err = xml.Unmarshal(b, v); err != nil {
				return err
			}
			return nil
		} else if strings.Contains(contentType, "application/json") {
			if err = json.Unmarshal(b, v); err != nil {
				return err
			}
			return nil
		}
	return errors.New("undefined response type")
}

// Add a file to the multipart request
func addFile(w *multipart.Writer, fieldName, path string) error {
	file, err := os.Open(path)
	if err != nil {
		return err
	}
	defer file.Close()

	part, err := w.CreateFormFile(fieldName, filepath.Base(path))
	if err != nil {
		return err
	}
	_, err = io.Copy(part, file)

	return err
}

// Prevent trying to import "fmt"
func reportError(format string, a ...interface{}) error {
	return fmt.Errorf(format, a...)
}

// Set request body from an interface{}
func setBody(body interface{}, contentType string) (bodyBuf *bytes.Buffer, err error) {
	if bodyBuf == nil {
		bodyBuf = &bytes.Buffer{}
	}

	if reader, ok := body.(io.Reader); ok {
		_, err = bodyBuf.ReadFrom(reader)
	} else if b, ok := body.([]byte); ok {
		_, err = bodyBuf.Write(b)
	} else if s, ok := body.(string); ok {
		_, err = bodyBuf.WriteString(s)
	} else if s, ok := body.(*string); ok {
		_, err = bodyBuf.WriteString(*s)
	} else if jsonCheck.MatchString(contentType) {
		err = json.NewEncoder(bodyBuf).Encode(body)
	} else if xmlCheck.MatchString(contentType) {
		xml.NewEncoder(bodyBuf).Encode(body)
	}

	if err != nil {
		return nil, err
	}

	if bodyBuf.Len() == 0 {
		err = fmt.Errorf("Invalid body type %s\n", contentType)
		return nil, err
	}
	return bodyBuf, nil
}

// detectContentType method is used to figure out `Request.Body` content type for request header
func detectContentType(body interface{}) string {
	contentType := "text/plain; charset=utf-8"
	kind := reflect.TypeOf(body).Kind()

	switch kind {
	case reflect.Struct, reflect.Map, reflect.Ptr:
		contentType = "application/json; charset=utf-8"
	case reflect.String:
		contentType = "text/plain; charset=utf-8"
	default:
		if b, ok := body.([]byte); ok {
			contentType = http.DetectContentType(b)
		} else if kind == reflect.Slice {
			contentType = "application/json; charset=utf-8"
		}
	}

	return contentType
}

// Ripped from https://github.com/gregjones/httpcache/blob/master/httpcache.go
type cacheControl map[string]string

func parseCacheControl(headers http.Header) cacheControl {
	cc := cacheControl{}
	ccHeader := headers.Get("Cache-Control")
	for _, part := range strings.Split(ccHeader, ",") {
		part = strings.Trim(part, " ")
		if part == "" {
			continue
		}
		if strings.ContainsRune(part, '=') {
			keyval := strings.Split(part, "=")
			cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",")
		} else {
			cc[part] = ""
		}
	}
	return cc
}

// CacheExpires helper function to determine remaining time before repeating a request.
func CacheExpires(r *http.Response) time.Time {
	// Figure out when the cache expires.
	var expires time.Time
	now, err := time.Parse(time.RFC1123, r.Header.Get("date"))
	if err != nil {
		return time.Now()
	}
	respCacheControl := parseCacheControl(r.Header)

	if maxAge, ok := respCacheControl["max-age"]; ok {
		lifetime, err := time.ParseDuration(maxAge + "s")
		if err != nil {
			expires = now
		}
		expires = now.Add(lifetime)
	} else {
		expiresHeader := r.Header.Get("Expires")
		if expiresHeader != "" {
			expires, err = time.Parse(time.RFC1123, expiresHeader)
			if err != nil {
				expires = now
			}
		}
	}
	return expires
}

func strlen(s string) int {
	return utf8.RuneCountInString(s)
}

// GenericSwaggerError Provides access to the body, error and model on returned errors.
type GenericSwaggerError struct {
	body  []byte
	error string
	model interface{}
}

// Error returns non-empty string if there was an error.
func (e GenericSwaggerError) Error() string {
	return e.error
}

// Body returns the raw bytes of the response
func (e GenericSwaggerError) Body() []byte {
	return e.body
}

// Model returns the unpacked model of the error
func (e GenericSwaggerError) Model() interface{} {
	return e.model
}
07070100000016000081A400000000000000000000000167FBDA05000007F3000000000000000000000000000000000000003500000000openunison-control-0.0.13/helmmodel/configuration.go/*
 * OpenUnison Helm Objects
 *
 * OpenUnison Helm Objects
 *
 * API version: v1
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package helmmodel

import (
	"net/http"
)

// contextKeys are used to identify the type of value in the context.
// Since these are string, it is possible to get a short description of the
// context key for logging and debugging using key.String().

type contextKey string

func (c contextKey) String() string {
	return "auth " + string(c)
}

var (
	// ContextOAuth2 takes a oauth2.TokenSource as authentication for the request.
	ContextOAuth2 = contextKey("token")

	// ContextBasicAuth takes BasicAuth as authentication for the request.
	ContextBasicAuth = contextKey("basic")

	// ContextAccessToken takes a string oauth2 access token as authentication for the request.
	ContextAccessToken = contextKey("accesstoken")

	// ContextAPIKey takes an APIKey as authentication for the request
	ContextAPIKey = contextKey("apikey")
)

// BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth
type BasicAuth struct {
	UserName string `json:"userName,omitempty"`
	Password string `json:"password,omitempty"`
}

// APIKey provides API key based authentication to a request passed via context using ContextAPIKey
type APIKey struct {
	Key    string
	Prefix string
}

type Configuration struct {
	BasePath      string            `json:"basePath,omitempty"`
	Host          string            `json:"host,omitempty"`
	Scheme        string            `json:"scheme,omitempty"`
	DefaultHeader map[string]string `json:"defaultHeader,omitempty"`
	UserAgent     string            `json:"userAgent,omitempty"`
	HTTPClient    *http.Client
}

func NewConfiguration() *Configuration {
	cfg := &Configuration{
		BasePath:      "/",
		DefaultHeader: make(map[string]string),
		UserAgent:     "Swagger-Codegen/1.0.0/go",
	}
	return cfg
}

func (c *Configuration) AddDefaultHeader(key string, value string) {
	c.DefaultHeader[key] = value
}
07070100000017000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000002900000000openunison-control-0.0.13/helmmodel/docs07070100000018000081A400000000000000000000000167FBDA0500000198000000000000000000000000000000000000003E00000000openunison-control-0.0.13/helmmodel/docs/TrustedCertsInner.md# TrustedCertsInner

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Name** | **string** |  | [optional] [default to null]
**PemB64** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000019000081A400000000000000000000000167FBDA050000067F000000000000000000000000000000000000003000000000openunison-control-0.0.13/helmmodel/git_push.sh#!/bin/sh
# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
#
# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update"

git_user_id=$1
git_repo_id=$2
release_note=$3

if [ "$git_user_id" = "" ]; then
    git_user_id="GIT_USER_ID"
    echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
fi

if [ "$git_repo_id" = "" ]; then
    git_repo_id="GIT_REPO_ID"
    echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
fi

if [ "$release_note" = "" ]; then
    release_note="Minor update"
    echo "[INFO] No command line input provided. Set \$release_note to $release_note"
fi

# Initialize the local directory as a Git repository
git init

# Adds the files in the local repository and stages them for commit.
git add .

# Commits the tracked changes and prepares them to be pushed to a remote repository. 
git commit -m "$release_note"

# Sets the new remote
git_remote=`git remote`
if [ "$git_remote" = "" ]; then # git remote not defined

    if [ "$GIT_TOKEN" = "" ]; then
        echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
        git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git
    else
        git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git
    fi

fi

git pull origin master

# Pushes (Forces) the changes in the local repository up to the remote repository
echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git"
git push origin master 2>&1 | grep -v 'To https'

0707010000001A000081A400000000000000000000000167FBDA0500000124000000000000000000000000000000000000003200000000openunison-control-0.0.13/helmmodel/helm-api.yamlswagger: "2.0"
info:
  description: "OpenUnison Helm Objects"
  version: "v1"
  title: "OpenUnison Helm Objects"
paths: {}
definitions:
  TrustedCerts:
    type: array
    items:
      type: object
      properties:
        name:
          type: string
        pem_b64:
          type: string0707010000001B000081A400000000000000000000000167FBDA0500000130000000000000000000000000000000000000004100000000openunison-control-0.0.13/helmmodel/model_trusted_certs_inner.go/*
 * OpenUnison Helm Objects
 *
 * OpenUnison Helm Objects
 *
 * API version: v1
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package helmmodel

type TrustedCertsInner struct {
	Name string `json:"name,omitempty"`
	PemB64 string `json:"pem_b64,omitempty"`
}
0707010000001C000081A400000000000000000000000167FBDA05000004B2000000000000000000000000000000000000003000000000openunison-control-0.0.13/helmmodel/response.go/*
 * OpenUnison Helm Objects
 *
 * OpenUnison Helm Objects
 *
 * API version: v1
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package helmmodel

import (
	"net/http"
)

type APIResponse struct {
	*http.Response `json:"-"`
	Message        string `json:"message,omitempty"`
	// Operation is the name of the swagger operation.
	Operation string `json:"operation,omitempty"`
	// RequestURL is the request URL. This value is always available, even if the
	// embedded *http.Response is nil.
	RequestURL string `json:"url,omitempty"`
	// Method is the HTTP method used for the request.  This value is always
	// available, even if the embedded *http.Response is nil.
	Method string `json:"method,omitempty"`
	// Payload holds the contents of the response body (which may be nil or empty).
	// This is provided here as the raw response.Body() reader will have already
	// been drained.
	Payload []byte `json:"-"`
}

func NewAPIResponse(r *http.Response) *APIResponse {

	response := &APIResponse{Response: r}
	return response
}

func NewAPIResponseWithError(errorMessage string) *APIResponse {

	response := &APIResponse{Message: errorMessage}
	return response
}
0707010000001D000081A400000000000000000000000167FBDA05000000D9000000000000000000000000000000000000002200000000openunison-control-0.0.13/main.go/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>

*/
package main

import (
	"math/rand"
	"time"

	"github.com/tremolosecurity/openunison-control/cmd"
)

func main() {
	rand.Seed(time.Now().UnixNano())
	cmd.Execute()
}
0707010000001E000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000002500000000openunison-control-0.0.13/openunison0707010000001F000081A400000000000000000000000167FBDA050000B9A7000000000000000000000000000000000000003100000000openunison-control-0.0.13/openunison/deployer.gopackage openunison

import (
	"bytes"
	"context"
	"encoding/base64"
	"encoding/json"
	"flag"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"math/rand"
	"os"
	"path/filepath"
	"strings"
	"time"

	"github.com/tremolosecurity/openunison-control/helmmodel"
	"github.com/tremolosecurity/openunison-control/openunisonmodel"
	"gopkg.in/yaml.v3"

	v1 "k8s.io/api/core/v1"

	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"

	"helm.sh/helm/v3/pkg/action"
	"helm.sh/helm/v3/pkg/chart"
	"helm.sh/helm/v3/pkg/chart/loader"
	"helm.sh/helm/v3/pkg/cli"

	"helm.sh/helm/v3/pkg/registry"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	_ "k8s.io/client-go/plugin/pkg/client/auth"
)

var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")

func randSeq(n int) string {
	b := make([]rune, n)
	for i := range b {
		b[i] = letters[rand.Intn(len(letters))]
	}
	return string(b)
}

type OperatorDeployment struct {
	chart string
}

// for sting info about additional helm charts
type HelmChartInfo struct {
	Name      string
	ChartPath string
}

// tracks the information about the deployment
type OpenUnisonDeployment struct {
	namespace                 string
	operator                  OperatorDeployment
	orchestraChart            string
	orchestraLoginPortalChart string
	pathToValuesYaml          string
	secretFile                string
	secret                    string
	clientset                 *kubernetes.Clientset

	controlPlaneContextName string
	satelateContextName     string
	addClusterChart         string

	clusterManagementChart string
	pathToDbPassword       string
	pathToSmtpPassword     string

	pathToSaveSateliteValues string

	skipClusterManagement bool

	helmValues map[string]interface{}

	additionalCharts []HelmChartInfo
	preCharts        []HelmChartInfo

	namespaceLabels map[string]string

	cpOrchestraName string
	cpSecretName    string

	skipCpIntegration bool
}

// creates a new deployment structure
func NewOpenUnisonDeployment(namespace string, operatorChart string, orchestraChart string, orchestraLoginPortalChart string, pathToValuesYaml string, secretFile string, clusterManagementChart string, pathToDbPassword string, pathToSmtpPassword string, skipClusterManagement bool, additionalCharts []HelmChartInfo, preCharts []HelmChartInfo, namespaceLabels map[string]string) (*OpenUnisonDeployment, error) {
	ou, err := NewSateliteDeployment(namespace, operatorChart, orchestraChart, orchestraLoginPortalChart, pathToValuesYaml, secretFile, "", "", "", "", additionalCharts, preCharts, namespaceLabels, "orchestra", "orchestra-secrets-source", false)

	if err != nil {
		return nil, err
	}

	ou.clusterManagementChart = clusterManagementChart
	ou.pathToDbPassword = pathToDbPassword
	ou.pathToSmtpPassword = pathToSmtpPassword
	ou.skipClusterManagement = skipClusterManagement

	return ou, nil
}

// creates a new deployment structure
func NewSateliteDeployment(namespace string, operatorChart string, orchestraChart string, orchestraLoginPortalChart string, pathToValuesYaml string, secretFile string, controlPlanContextName string, sateliteContextName string, addClusterChart string, pathToSateliteYaml string, additionalCharts []HelmChartInfo, preCharts []HelmChartInfo, namespaceLabels map[string]string, cpOrchestraName string, cpSecretName string, skipCpIntegration bool) (*OpenUnisonDeployment, error) {
	ou := &OpenUnisonDeployment{}

	ou.namespace = namespace

	ou.operator.chart = operatorChart

	ou.orchestraChart = orchestraChart
	ou.orchestraLoginPortalChart = orchestraLoginPortalChart
	ou.pathToValuesYaml = pathToValuesYaml
	ou.secretFile = secretFile

	ou.controlPlaneContextName = controlPlanContextName
	ou.satelateContextName = sateliteContextName
	ou.addClusterChart = addClusterChart

	ou.pathToSaveSateliteValues = pathToSateliteYaml

	ou.additionalCharts = additionalCharts
	ou.preCharts = preCharts

	err := ou.loadKubernetesConfiguration()
	if err != nil {
		return nil, err
	}

	err = ou.loadHelmValues()

	if err != nil {
		return nil, err
	}

	ou.namespaceLabels = namespaceLabels

	ou.cpOrchestraName = cpOrchestraName
	ou.cpSecretName = cpSecretName
	ou.skipCpIntegration = skipCpIntegration

	return ou, nil
}

func (ou *OpenUnisonDeployment) loadHelmValues() error {
	fmt.Printf("Loading values from %s...\n", ou.pathToValuesYaml)

	yamlValues, err := ioutil.ReadFile(ou.pathToValuesYaml)

	if err != nil {
		return err
	}

	ou.helmValues = make(map[string]interface{})

	err = yaml.Unmarshal(yamlValues, &ou.helmValues)

	if err != nil {
		return err
	}

	fmt.Printf("...loaded\n")

	return nil
}

func (ou *OpenUnisonDeployment) IsNaas() bool {
	return isNaasFromHelm(ou.helmValues)
}

func isNaasFromHelm(helm map[string]interface{}) bool {
	openunison, ok := helm["openunison"].(map[string]interface{})

	if !ok {
		return false
	}

	enableProvisioning := openunison["enable_provisioning"].(bool)

	return enableProvisioning
}

// set the current k8s context
func (ou *OpenUnisonDeployment) setCurrentContext(ctxName string) (string, error) {
	flag.Parse()

	currentContextName := ctxName

	pathOptions := clientcmd.NewDefaultPathOptions()
	curCfg, err := pathOptions.GetStartingConfig()

	if err != nil {
		return "", err
	}

	if curCfg.CurrentContext != ctxName {

		_, ok := curCfg.Contexts[ctxName]

		if !ok {
			return "", fmt.Errorf("context %s does not exist", ctxName)
		}

		currentContextName = curCfg.CurrentContext
		curCfg.CurrentContext = ctxName

		clientConfig := clientcmd.NewDefaultClientConfig(*curCfg, nil)
		clientcmd.ModifyConfig(clientConfig.ConfigAccess(), *curCfg, false)
	}

	return currentContextName, nil
}

// get the current k8s configuration

func (ou *OpenUnisonDeployment) loadKubernetesConfiguration() error {
	loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
	configOverrides := &clientcmd.ConfigOverrides{}
	kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides)

	config, err := kubeConfig.ClientConfig()
	if err != nil {
		return err
	}

	ou.clientset, err = kubernetes.NewForConfig(config)
	if err != nil {
		return err
	}

	return nil
}

// deploy a NaaS Portal

func (ou *OpenUnisonDeployment) DeployNaaSPortal() error {

	openunison := ou.helmValues["openunison"].(map[string]interface{})
	enableProvisioning := openunison["enable_provisioning"].(bool)

	if !enableProvisioning {
		return fmt.Errorf("openunison.enableProvisioning MUST be true")
	}

	externalEnabled := false
	internalEnabled := false

	externalSuffix := ""
	internalSuffix := ""

	naas, found := openunison["naas"].(map[string]interface{})
	if found {
		groups, found := naas["groups"].(map[string]interface{})
		if found {
			external, found := groups["external"].(map[string]interface{})
			if found {
				externalEnabled, found = external["enabled"].(bool)
			}
		}
	}

	useStdJit, found := openunison["use_standard_jit_workflow"].(bool)

	if !found {
		useStdJit = true
	}

	if externalEnabled && useStdJit {
		return fmt.Errorf("openunison.naas.groups.external is true, openunison.use_standard_jit_workflow MUST be false")
	}

	_, ok := ou.helmValues["database"]

	if !ok {
		return fmt.Errorf("no database section to your values.yaml")
	}

	_, ok = ou.helmValues["smtp"]

	if !ok {
		return fmt.Errorf("no smtp section to your values.yaml")
	}

	// deploy the operator
	settings := cli.New()
	actionConfig := new(action.Configuration)

	if err := actionConfig.Init(settings.RESTClientGetter(), ou.namespace, os.Getenv("HELM_DRIVER"), log.Printf); err != nil {
		return err
	}

	listClient := action.NewList(actionConfig)

	clusterManagementChartDeployed := false

	listClient.All = true
	releases, err := listClient.Run()

	for _, release := range releases {
		if release.Name == "cluster-management" && release.Namespace == ou.namespace {
			clusterManagementChartDeployed = true
		}
	}

	// add standard groups to NaaS based on roles defined
	client := action.NewInstall(actionConfig)

	client.Namespace = ou.namespace
	client.ReleaseName = "cluster-management"

	chartReq, err := ou.locateChart(ou.clusterManagementChart, &client.ChartPathOptions, settings)

	if err != nil {
		return err
	}

	mergedValues := mergeMaps(chartReq.Values, ou.helmValues)

	openunisonCfg, ok := mergedValues["openunison"]

	if !ok {
		return fmt.Errorf("When configuring NaaS groups, no openunison section")
	}

	naasCfg, ok := openunisonCfg.(map[string]interface{})["naas"]

	if !ok {
		return fmt.Errorf("When configuring NaaS groups, no openunison.naas section")
	}

	groupsCfg, ok := naasCfg.(map[string]interface{})["groups"]
	if !ok {
		return fmt.Errorf("When configuring NaaS groups, no openunison.naas.groups section")
	}

	external, found := groupsCfg.(map[string]interface{})["external"].(map[string]interface{})
	if found {
		externalEnabled, found = external["enabled"].(bool)
		if externalEnabled {
			externalSuffix = external["suffix"].(string)
		}
	}

	internal, found := groupsCfg.(map[string]interface{})["internal"].(map[string]interface{})
	if found {
		internalEnabled, found = internal["enabled"].(bool)
		if internalEnabled {
			internalSuffix = internal["suffix"].(string)
		}
	}

	defaultGroups, ok := groupsCfg.(map[string]interface{})["default"]
	if !ok {
		return fmt.Errorf("When configuring NaaS groups, no openunison.naas.groups.default section")
	}

	naasRoles := make([]string, 0)

	for _, group := range defaultGroups.([]interface{}) {
		groupName := group.(map[string]interface{})["name"].(string)
		naasRoles = append(naasRoles, groupName)
	}

	azRules := make([]interface{}, len(naasRoles))

	for i, role := range naasRoles {
		azRules[i] = fmt.Sprintf("k8s-namespace-%v-k8s-%v-*", role, "k8s")
	}

	if internalEnabled {
		azRules = append(azRules, fmt.Sprintf("k8s-cluster-k8s-%v-administrators%v", "k8s", internalSuffix))
	}

	if externalEnabled {
		azRules = append(azRules, fmt.Sprintf("k8s-cluster-k8s-%v-administrators%v", "k8s", externalSuffix))
	}

	ou.helmValues["openunison"].(map[string]interface{})["az_groups"] = azRules

	// with merged values, create azRules

	err = ou.DeployAuthPortal()

	if err != nil {
		return err
	}

	//if !openunisonDeployed {
	fmt.Print("Deploying the Cluster Management chart\n")

	if ou.skipClusterManagement {
		fmt.Println("Skipping cluster management chart")
	} else {

		if !clusterManagementChartDeployed {
			fmt.Println("Chart not deployed, installing")
			client := action.NewInstall(actionConfig)

			client.Namespace = ou.namespace
			client.ReleaseName = "cluster-management"

			chartReq, err := ou.locateChart(ou.clusterManagementChart, &client.ChartPathOptions, settings)
			if err != nil {
				return err
			}

			mergedValues := mergeMaps(chartReq.Values, ou.helmValues)

			//_, err = client.Run(chartReq, mergedValues)
			_, err = ou.runChartInstall(client, client.ReleaseName, chartReq, mergedValues, actionConfig)

			if err != nil {
				return err
			}
		} else {
			fmt.Println("Chart deployed, upgrading")
			client := action.NewUpgrade(actionConfig)

			client.Namespace = ou.namespace

			chartReq, err := ou.locateChart(ou.clusterManagementChart, &client.ChartPathOptions, settings)

			if err != nil {
				return err
			}

			mergedValues := mergeMaps(chartReq.Values, ou.helmValues)
			//_, err = client.Run("cluster-management", chartReq, mergedValues)
			_, err = ou.runChartUpgrade(client, "cluster-management", chartReq, mergedValues)

			if err != nil {
				return err
			}
		}
	}

	return nil
}

// deploys an OpenUnison satelite
func (ou *OpenUnisonDeployment) DeployOpenUnisonSatelite() error {

	originalContextName, err := ou.setCurrentContext(ou.controlPlaneContextName)

	if err != nil {
		return err
	}

	ou.loadKubernetesConfiguration()

	// get the satelite cluster name

	clusterName, ok := ou.helmValues["k8s_cluster_name"].(string)

	if !ok {
		return fmt.Errorf("k8s_cluster_name must be defined in the satalite values.yaml")
	}

	satelateReleaseName := "satellite-" + clusterName

	settings := cli.New()
	actionConfig := new(action.Configuration)

	if err := actionConfig.Init(settings.RESTClientGetter(), ou.namespace, os.Getenv("HELM_DRIVER"), log.Printf); err != nil {
		return err
	}

	listClient := action.NewList(actionConfig)

	listClient.All = true
	releases, err := listClient.Run()

	sateliteIntegrated := false

	for _, release := range releases {
		if release.Namespace == ou.namespace && release.Name == satelateReleaseName {
			sateliteIntegrated = true
		}
	}

	ouSecret, err := ou.clientset.CoreV1().Secrets(ou.namespace).Get(context.TODO(), ou.cpSecretName, metav1.GetOptions{})
	foundSecret := false
	if err != nil {
		ouSecret = &v1.Secret{
			ObjectMeta: metav1.ObjectMeta{
				Name:      ou.cpSecretName,
				Namespace: ou.namespace,
			},
			Data: map[string][]byte{},
		}
	} else {
		foundSecret = true
	}

	sateliteClientSecret, ok := ouSecret.Data["cluster-idp-"+clusterName]

	if !ok {
		fmt.Println("SSO Client Secret doesn't exist, creating")
		ou.secret = string(randSeq((64)))
		ouSecret.Data["cluster-idp-"+clusterName] = []byte(ou.secret)

		if foundSecret {
			ou.clientset.CoreV1().Secrets(ou.namespace).Update(context.TODO(), ouSecret, metav1.UpdateOptions{})
		} else {
			_, err = ou.clientset.CoreV1().Secrets(ou.namespace).Create(context.TODO(), ouSecret, metav1.CreateOptions{})
			if err != nil {
				return err
			}
		}

		fmt.Println("Created")
	} else {
		fmt.Println("SSO client secret already created, retrieving")
		ou.secret = string(sateliteClientSecret)
	}

	respBytes, err := ou.clientset.RESTClient().Get().RequestURI("/apis/apiextensions.k8s.io/v1/customresourcedefinitions/openunisons.openunison.tremolo.io").DoRaw(context.TODO())
	if err != nil {
		return err
	}

	ouCrd := make(map[string]interface{})
	json.Unmarshal(respBytes, &ouCrd)

	spec := ouCrd["spec"].(map[string]interface{})
	versions, ok := spec["versions"].([]interface{})

	if !ok {
		return fmt.Errorf("no spec in openunison crd")
	}

	ouVersion := ""

	for _, v := range versions {
		version := v.(map[string]interface{})
		served := version["served"].(bool)
		stored := version["storage"].(bool)

		if served && stored {
			ouVersion = version["name"].(string)
		}
	}

	if ouVersion == "" {
		return fmt.Errorf("could not find version of openunisons")
	}

	fmt.Printf("OpenUnison CRD Version : %v\n", ouVersion)

	respBytes, err = ou.clientset.RESTClient().Get().RequestURI("/apis/openunison.tremolo.io/" + ouVersion + "/namespaces/" + ou.namespace + "/openunisons/" + ou.cpOrchestraName).DoRaw(context.TODO())
	if err != nil {
		return err
	}

	orchestra := make(map[string]interface{})
	json.Unmarshal(respBytes, &orchestra)

	var orchestraObj openunisonmodel.OpenUnison
	json.Unmarshal(respBytes, &orchestraObj)

	specObj := orchestraObj.Spec
	hosts := specObj.Hosts
	host := hosts[0]
	names := host.Names

	nonSecretData := specObj.NonSecretData

	naasEnabled := false
	naasGroupsInternal := false
	naasGroupsExternal := false

	naasInternalSuffix := ""
	naasExternalSuffix := ""

	naasRoles := make([]map[string]interface{}, 0)

	for _, nsd := range nonSecretData {

		nsdName := nsd.Name

		if nsdName == "OPENUNISON_PROVISIONING_ENABLED" {
			naasEnabled = nsd.Value == "true"
		} else if nsdName == "openunison.naas.external" {
			naasGroupsExternal = nsd.Value == "true"
		} else if nsdName == "openunison.naas.internal" {
			naasGroupsInternal = nsd.Value == "true"
		} else if nsdName == "openunison.naas.external-suffix" {
			naasExternalSuffix = nsd.Value
		} else if nsdName == "openunison.naas.internal-suffix" {
			naasInternalSuffix = nsd.Value
		} else if nsdName == "openunison.naas.default-groups" {
			enc, err := base64.StdEncoding.DecodeString(nsd.Value)
			if err != nil {
				return err
			}

			var localRoles []map[string]interface{}

			err = json.Unmarshal(enc, &localRoles)

			if err != nil {
				return err
			}

			naasRoles = append(naasRoles, localRoles...)

		} else if nsdName == "openunison.naas.roles" {
			enc, err := base64.StdEncoding.DecodeString(nsd.Value)
			if err != nil {
				return err
			}

			var localRoles []map[string]interface{}

			err = json.Unmarshal(enc, &localRoles)

			if err != nil {
				return err
			}

			naasRoles = append(naasRoles, localRoles...)

		}

	}

	idpHostName := ""

	for _, name := range names {

		if name.EnvVar == "OU_HOST" {
			idpHostName = name.Name
		}
	}

	if idpHostName == "" {
		return fmt.Errorf("could not find OU_HOST name in orchestra CRD")
	}

	fmt.Printf("Control Plane IdP host name: %v\n", idpHostName)

	keyStore := specObj.KeyStore
	keyPairs := keyStore.KeyPairs
	keys := keyPairs.Keys

	isLocalGeneratedCert := false

	for _, key := range keys {

		if key.Name == "unison-ca" {
			isLocalGeneratedCert = true
		}
	}

	fmt.Printf("Is the operator generating the TLS certificate? : %t\n", isLocalGeneratedCert)

	idpCert := ""

	if isLocalGeneratedCert {
		ouTlsKey, err := ou.clientset.CoreV1().Secrets(ou.namespace).Get(context.TODO(), "ou-tls-certificate", metav1.GetOptions{})

		if err != nil {
			return err
		}

		idpCert = string(ouTlsKey.Data["tls.crt"])
	} else {
		trustedCerts := keyStore.TrustedCertificates

		for _, cert := range trustedCerts {

			if cert.Name == "unison-ca" {
				bytes, err := base64.StdEncoding.DecodeString(cert.PemData)
				if err != nil {
					return err
				}

				idpCert = string(bytes)
			}
		}

	}

	fmt.Printf("IdP Certificate : %v\n", idpCert)

	// create updates to yaml

	// setup OIDC
	oidcConfig := make(map[string]interface{})

	oidcConfig["client_id"] = "cluster-idp-" + clusterName
	oidcConfig["issuer"] = "https://" + idpHostName + "/auth/idp/cluster-idp-" + clusterName
	oidcConfig["user_in_idtoken"] = true
	oidcConfig["domain"] = ""
	oidcConfig["scopes"] = "openid email profile groups"

	claims := make(map[string]string)
	claims["sub"] = "sub"
	claims["email"] = "email"
	claims["given_name"] = "given_name"
	claims["family_name"] = "family_name"
	claims["display_name"] = "display_name"
	claims["groups"] = "groups"

	oidcConfig["claims"] = claims

	ou.helmValues["oidc"] = oidcConfig

	trustedCertAlias := "trusted-idp"

	//add the idp's certificate
	if idpCert != "" {

		trustCertsJson, err := json.Marshal(ou.helmValues["trusted_certs"])

		if err != nil {
			panic(err)
		}

		var trustedCerts []helmmodel.TrustedCertsInner

		json.Unmarshal(trustCertsJson, &trustedCerts)

		// trustedCerts, ok := ou.helmValues["trusted_certs"].([]interface{})
		// if !ok {
		// 	trustedCerts = make([]interface{}, 0)
		// }

		foundCert := false

		b64Cert := base64.StdEncoding.EncodeToString([]byte(idpCert))

		for _, cert := range trustedCerts {

			if cert.Name == "trusted-idp" {
				cert.PemB64 = b64Cert
				foundCert = true
				break
			} else if cert.PemB64 == b64Cert {
				foundCert = true
				trustedCertAlias = cert.Name
				break
			}
		}

		if !foundCert {
			trustedCert := &helmmodel.TrustedCertsInner{}
			trustedCert.Name = "trusted-idp"
			trustedCert.PemB64 = b64Cert

			trustedCerts = append(trustedCerts, *trustedCert)

			tcjson, err := json.Marshal(trustedCerts)

			if err != nil {
				panic(err)
			}

			var tcarray []map[string]string
			json.Unmarshal(tcjson, &tcarray)

			ou.helmValues["trusted_certs"] = tcarray
		}

	}

	managementProxyUrl := ""
	externalNaasGroupName := ""
	sateliteManagementEnabled := false
	mgmtProxy := make(map[string]interface{})

	if naasEnabled {
		openunison := ou.helmValues["openunison"].(map[string]interface{})
		mgmtProxy, sateliteManagementEnabled = openunison["management_proxy"].(map[string]interface{})

		if sateliteManagementEnabled {
			fmt.Printf("Management proxy enabled\n")
			mgmtEnabled, ok := mgmtProxy["enabled"]
			if ok && mgmtEnabled == true {
				// set remote configuration
				managementProxyUrl = mgmtProxy["host"].(string)
				remote := make(map[string]string)
				remote["issuer"] = fmt.Sprintf("https://%v/auth/idp/remotek8s", idpHostName)
				if idpCert != "" {
					remote["cert_alias"] = trustedCertAlias
				}
				mgmtProxy["remote"] = remote

				azRules := make([]interface{}, len(naasRoles))

				for i, role := range naasRoles {
					azRules[i] = fmt.Sprintf("k8s-namespace-%v-k8s-%v-*", role["name"].(string), clusterName)
				}

				if naasGroupsInternal {
					azRules = append(azRules, fmt.Sprintf("k8s-cluster-k8s-%v-administrators%v", clusterName, naasInternalSuffix))
				}

				if naasGroupsExternal {
					azRules = append(azRules, fmt.Sprintf("k8s-cluster-k8s-%v-administrators%v", clusterName, naasExternalSuffix))
					externalNaasGroupName = mgmtProxy["external_admin_group"].(string)
					mgmtProxy["external_suffix"] = naasExternalSuffix
				}

				// if there are pre-set az_groups, they should be honored

				if openunison["az_groups"] != nil {
					sateliteAzGroups := openunison["az_groups"].([]interface{})
					openunison["az_groups"] = append(sateliteAzGroups, azRules...)
				} else {
					openunison["az_groups"] = azRules
				}

			}
		}
	}

	dataToWrite, err := yaml.Marshal(&ou.helmValues)

	if err != nil {
		return err
	}

	ioutil.WriteFile(ou.pathToValuesYaml, dataToWrite, 0644)

	if !ou.skipCpIntegration {
		shouldReturn, returnValue := ou.integrateSatelite(ou.helmValues, clusterName, err, sateliteIntegrated, actionConfig, satelateReleaseName, settings, nil, "", "", naasRoles)
		if shouldReturn {
			return returnValue
		}
	}

	// deploy the satelte
	fmt.Printf("Switching to %v\n", ou.satelateContextName)
	_, err = ou.setCurrentContext(ou.satelateContextName)

	if err != nil {
		return err
	}
	fmt.Printf("Deploying the satelite")
	ou.loadKubernetesConfiguration()
	err = ou.DeployAuthPortal()

	if err != nil {
		return err
	}

	err = ou.DeployAdditionalCharts()
	if err != nil {
		return err
	}

	if !ou.skipCpIntegration {
		if naasEnabled && sateliteManagementEnabled {
			// if the naas is enabled, need to deploy management
			targetCert := ""
			var trustedCerts []helmmodel.TrustedCertsInner
			trustCertsJson, err := json.Marshal(ou.helmValues["trusted_certs"])

			if err != nil {
				panic(err)
			}

			json.Unmarshal(trustCertsJson, &trustedCerts)

			for _, trustedCert := range trustedCerts {
				certName := trustedCert.Name
				if certName == "unison-ca" {
					targetCert = trustedCert.PemB64
				}
			}

			// trustedCerts, ok := ou.helmValues["trusted_certs"].([]interface{})
			// if ok {
			// 	for _, t := range trustedCerts {
			// 		trustedCert := t.(map[string]interface{})
			// 		certName := trustedCert["name"].(string)
			// 		if certName == "unison-ca" {
			// 			targetCert = trustedCert["pem_b64"].(string)
			// 		}
			// 	}
			// }

			if targetCert == "" {
				// not found, load the ou-tls-certificate secret
				tlsSecret, err := ou.clientset.CoreV1().Secrets(ou.namespace).Get(context.TODO(), "ou-tls-certificate", metav1.GetOptions{})
				if err == nil {
					targetCert = base64.StdEncoding.EncodeToString(tlsSecret.Data["tls.crt"])
				}
			}

			management := make(map[string]interface{})
			management["enabled"] = true
			target := make(map[string]interface{})
			management["target"] = target

			target["url"] = managementProxyUrl
			target["tokenType"] = "oidc"
			target["useToken"] = true

			if targetCert != "" {
				target["base64_certificate"] = targetCert
			}

			// redeployment satelite integration
			ou.setCurrentContext(ou.controlPlaneContextName)
			ou.loadKubernetesConfiguration()
			shouldReturn, returnValue := ou.integrateSatelite(ou.helmValues, clusterName, err, sateliteIntegrated, actionConfig, satelateReleaseName, settings, management, naasExternalSuffix, externalNaasGroupName, naasRoles)
			if shouldReturn {
				return returnValue
			}

		}

	}

	// leave the kubeconfig the way we found it
	ou.setCurrentContext(originalContextName)

	fmt.Println(sateliteIntegrated)
	fmt.Println(originalContextName)
	return nil
}

func (ou *OpenUnisonDeployment) integrateSatelite(helmValues map[string]interface{}, clusterName string, err error, sateliteIntegrated bool, actionConfig *action.Configuration, satelateReleaseName string, settings *cli.EnvSettings, management map[string]interface{}, externalGroupNameSuffix string, externalGroupName string, naasRoles []map[string]interface{}) (bool, error) {
	cpYaml := `{
		"cluster": {
		  "name": "%v",
		  "label": "%v",
		  "description": "Cluster %v",
		  "parent": "%v",
		  "sso": {
			"enabled": true,
			"inactivityTimeoutSeconds": 900,
			"client_secret": "%v"
		  },
		  "hosts": {
			"portal": "%v",
			"dashboard": "%v"
		  },
		  "az_groups": [
	  
		  ]
		  
		}
	  }`

	parentOrg := ""

	openunison := helmValues["openunison"].(map[string]interface{})

	if openunison != nil {

		if openunison["control_plane"] != nil {
			controlPlane := openunison["control_plane"].(map[string]interface{})
			parentOrg = controlPlane["parent"].(string)
		}
	}

	if parentOrg == "" {
		parentOrg = "B158BD40-0C1B-11E3-8FFD-0800200C9A66"
	}

	sateliteNetwork := helmValues["network"].(map[string]interface{})

	cpYaml = fmt.Sprintf(cpYaml,
		clusterName,
		clusterName,
		clusterName,
		parentOrg,
		ou.cpSecretName,
		sateliteNetwork["openunison_host"].(string),
		sateliteNetwork["dashboard_host"].(string))

	fmt.Printf("Integrating satelite into the control plane with yaml: \n%v\n", cpYaml)

	cpValues := make(map[string]interface{})
	err = json.Unmarshal([]byte(cpYaml), &cpValues)

	if err != nil {
		return true, err
	}

	if management != nil {
		cluster := cpValues["cluster"].(map[string]interface{})
		cluster["management"] = management

		if externalGroupName != "" {
			cluster["external_group_name"] = externalGroupName
			cluster["external_group_name_suffix"] = externalGroupNameSuffix
		}
	}

	if helmValues["openunison"].(map[string]interface{})["az_groups"] != nil {
		satelateAzGroups := helmValues["openunison"].(map[string]interface{})["az_groups"].([]interface{})
		cpAzGroups := make([]string, len(satelateAzGroups))

		for i, group := range satelateAzGroups {
			cpAzGroups[i] = string(group.(string))
		}

		cpValues["cluster"].(map[string]interface{})["az_groups"] = cpAzGroups
	}

	if openunison != nil {

		if openunison["control_plane"] != nil {
			controlPlane := openunison["control_plane"].(map[string]interface{})
			additionalBadges := controlPlane["additional_badges"].([]interface{})
			if additionalBadges != nil {
				cpValues["cluster"].(map[string]interface{})["additional_badges"] = additionalBadges
			}
		}
	}

	cpValues["naasRoles"] = naasRoles

	if ou.pathToSaveSateliteValues != "" {
		dataToWrite, err := yaml.Marshal(&cpValues)

		if err != nil {
			return false, err
		}

		ioutil.WriteFile(ou.pathToSaveSateliteValues, dataToWrite, 0644)
	}

	_, err = ou.setCurrentContext(ou.controlPlaneContextName)

	if err != nil {
		return true, err
	}

	err = ou.loadKubernetesConfiguration()
	if err != nil {
		return true, err
	}

	if !sateliteIntegrated {
		fmt.Print("Satelite not integrated yet, deploying")
		client := action.NewInstall(actionConfig)

		client.Namespace = ou.namespace
		client.ReleaseName = satelateReleaseName

		chartReq, err := ou.locateChart(ou.addClusterChart, &client.ChartPathOptions, settings)

		if err != nil {
			return true, err
		}

		//_, err = client.Run(chartReq, cpValues)
		_, err = ou.runChartInstall(client, client.ReleaseName, chartReq, cpValues, actionConfig)
		if err != nil {
			return true, err
		}
	} else {
		fmt.Println("Satelite already integrated, upgrading")
		client := action.NewUpgrade(actionConfig)

		client.Namespace = ou.namespace

		chartReq, err := ou.locateChart(ou.addClusterChart, &client.ChartPathOptions, settings)

		if err != nil {
			return true, err
		}

		//_, err = client.Run(satelateReleaseName, chartReq, cpValues)
		_, err = ou.runChartUpgrade(client, satelateReleaseName, chartReq, cpValues)
		if err != nil {
			return true, err
		}
	}

	return false, nil
}

func (ou *OpenUnisonDeployment) runChartInstall(client *action.Install, name string, chartReq *chart.Chart, cpValues map[string]interface{}, actionConfig *action.Configuration) (bool, error) {
	for i := 0; i <= 5; i++ {
		_, err := client.Run(chartReq, cpValues)
		if err != nil {
			fmt.Printf("Error installing chart %s - %s, deleting and retrying\n", name, err.Error())

			del := action.NewUninstall(actionConfig)
			_, err := del.Run(name)
			if err != nil {
				return true, err
			}
			fmt.Println("Waiting a few seconds...")
			time.Sleep(5 * time.Second)
			fmt.Printf("Try #%i\n", i)
		} else {
			return false, nil
		}
	}

	return true, fmt.Errorf("Failed to install chart %s after five tries", name)
}

func (ou *OpenUnisonDeployment) runChartUpgrade(client *action.Upgrade, name string, chartReq *chart.Chart, cpValues map[string]interface{}) (bool, error) {
	for i := 0; i <= 5; i++ {
		_, err := client.Run(name, chartReq, cpValues)
		if err != nil {
			fmt.Printf("Error installing chart %s - %s, retrying\n", name, err.Error())

			fmt.Println("Waiting a few seconds...")
			time.Sleep(5 * time.Second)
			fmt.Printf("Try #%i\n", i)
		} else {
			return false, nil
		}
	}

	return true, fmt.Errorf("Failed to install chart %s after five tries", name)
}

// set the secret
func (ou *OpenUnisonDeployment) setupSecret(helmValues map[string]interface{}) error {
	if ou.skipCpIntegration {
		return nil
	}

	secret, err := ou.clientset.CoreV1().Secrets(ou.namespace).Get(context.TODO(), "orchestra-secrets-source", metav1.GetOptions{})
	foundSecret := false
	if err != nil {
		secret = &v1.Secret{
			ObjectMeta: metav1.ObjectMeta{
				Name:      "orchestra-secrets-source",
				Namespace: ou.namespace,
			},
			Data: map[string][]byte{},
		}

		// generate the standard keys
		secret.Data["unisonKeystorePassword"] = []byte(randSeq((64)))
		secret.Data["K8S_DB_SECRET"] = []byte(randSeq((64)))
	} else {
		foundSecret = true
	}

	hasSecret := ou.secretFile != "" || ou.secret != ""

	var authSecret []byte

	if hasSecret {
		if ou.secret != "" {
			authSecret = []byte(ou.secret)
		} else {
			authSecret, err = ioutil.ReadFile(ou.secretFile)
			if err != nil {
				return err
			}

			authSecret = []byte(strings.TrimSpace(string(authSecret)))
		}

	}

	authNeedsSecret := false
	authSecretLabel := ""
	foundAuth := false

	_, ok := helmValues["oidc"]

	if ok {
		authNeedsSecret = true
		foundAuth = true
		authSecretLabel = "OIDC_CLIENT_SECRET"
	} else {
		_, ok = helmValues["github"]

		if ok {
			foundAuth = true
			authNeedsSecret = true
			authSecretLabel = "GITHUB_SECRET_ID"
		} else {
			_, ok = helmValues["active_directory"]

			if ok {
				authNeedsSecret = true
				foundAuth = true
				authSecretLabel = "AD_BIND_PASSWORD"
			} else {
				_, ok = helmValues["saml"]
				authNeedsSecret = false
				foundAuth = true

			}
		}
	}

	if !foundAuth {
		return fmt.Errorf("No authentication found, one of active_directory, github, oidc, saml required")
	}

	_, ok = secret.Data[authSecretLabel]

	if !ok {
		// there's not already a secret
		if authNeedsSecret && !hasSecret {
			return fmt.Errorf("Authentication type requires a secret in a file specified in -s or --secrets-file-path")
		}
	}

	if authNeedsSecret && hasSecret {
		secret.Data[authSecretLabel] = authSecret
	}

	openunison := helmValues["openunison"].(map[string]interface{})
	enableNaaS := openunison["enable_provisioning"].(bool)

	if enableNaaS {
		//check for the database password
		_, hasJdbcPassword := secret.Data["OU_JDBC_PASSWORD"]
		if ou.pathToDbPassword != "" {
			dbSecret, err := ioutil.ReadFile(ou.pathToDbPassword)
			if err != nil {
				return err
			}

			dbSecret = []byte(strings.TrimSpace(string(dbSecret)))

			fmt.Println("Setting database password\n")

			secret.Data["OU_JDBC_PASSWORD"] = dbSecret
		} else if !hasJdbcPassword {
			return fmt.Errorf("if openunison.enable_provisioning is true, -b or --database-secret-path must be set")
		}

		// check for SMTP
		_, hasSmtpPassword := secret.Data["SMTP_PASSWORD"]
		if ou.pathToSmtpPassword != "" {
			smtpSecret, err := ioutil.ReadFile(ou.pathToSmtpPassword)
			if err != nil {
				return err
			}

			smtpSecret = []byte(strings.TrimSpace(string(smtpSecret)))

			fmt.Println("Setting SMTP password")
			secret.Data["SMTP_PASSWORD"] = smtpSecret
		} else if !hasSmtpPassword {
			return fmt.Errorf("if openunison.enable_provisioning is true, -t or --smtp-secret-path must be set")
		}
	}

	if !foundSecret {
		fmt.Printf("Creating secret\n")
		secret, err = ou.clientset.CoreV1().Secrets(ou.namespace).Create(context.TODO(), secret, metav1.CreateOptions{})
		if err != nil {
			return err
		}
	} else {
		fmt.Printf("Updating secret\n")
		secret, err = ou.clientset.CoreV1().Secrets(ou.namespace).Update(context.TODO(), secret, metav1.UpdateOptions{})
		if err != nil {
			return err
		}
	}

	return nil

}

// deploys all extra charts
func (ou *OpenUnisonDeployment) DeployAdditionalCharts() error {
	fmt.Printf("Deploying additional charts: %d\n", len(ou.additionalCharts))
	for _, chart := range ou.additionalCharts {
		err := ou.deployChart(chart)
		if err != nil {
			return err
		}
	}

	return nil
}

// deploys all extra charts
func (ou *OpenUnisonDeployment) DeployPreCharts() error {
	for _, chart := range ou.preCharts {
		err := ou.deployChart(chart)
		if err != nil {
			return err
		}
	}

	return nil
}

// deploys additional charts after OpenUnison is running
func (ou *OpenUnisonDeployment) deployChart(chart HelmChartInfo) error {
	fmt.Printf("Deploying chart %s, %s\n", chart.Name, chart.ChartPath)

	settings := cli.New()
	actionConfig := new(action.Configuration)

	if err := actionConfig.Init(settings.RESTClientGetter(), ou.namespace, os.Getenv("HELM_DRIVER"), log.Printf); err != nil {
		return err
	}

	listClient := action.NewList(actionConfig)

	found := false

	listClient.All = true
	listClient.Failed = true
	releases, err := listClient.Run()

	if err != nil {
		return err
	}

	for _, release := range releases {
		if release.Name == chart.Name && release.Namespace == ou.namespace {
			found = true
		}
	}

	if !found {
		fmt.Println("Chart not deployed, installing")
		client := action.NewInstall(actionConfig)

		client.Namespace = ou.namespace
		client.ReleaseName = chart.Name

		chartReq, err := ou.locateChart(chart.ChartPath, &client.ChartPathOptions, settings)

		if err != nil {
			return err
		}

		//_, err = client.Run(chartReq, ou.helmValues)
		_, err = ou.runChartInstall(client, client.ReleaseName, chartReq, ou.helmValues, actionConfig)

		if err != nil {
			return err
		}

	} else {
		fmt.Println("Chart deployed, upgrading")
		client := action.NewUpgrade(actionConfig)

		client.Namespace = ou.namespace

		chartReq, err := ou.locateChart(chart.ChartPath, &client.ChartPathOptions, settings)

		if err != nil {
			return err
		}

		//_, err = client.Run(chart.Name, chartReq, ou.helmValues)

		_, err = ou.runChartUpgrade(client, chart.Name, chartReq, ou.helmValues)

		if err != nil {
			return err
		}
	}

	fmt.Printf("Chart %s, %s deployed\n", chart.Name, chart.ChartPath)

	return nil

}

// specifies chart version

func (ou *OpenUnisonDeployment) locateChart(configChartName string, chartPathOptions *action.ChartPathOptions, settings *cli.EnvSettings) (*chart.Chart, error) {
	chartName := configChartName
	chartVersion := ""
	if strings.Contains(configChartName, "@") {
		chartName = configChartName[0:strings.Index(configChartName, "@")]
		chartVersion = configChartName[strings.Index(configChartName, "@")+1:]

		fmt.Printf("Chart version specified for %s: %s\n", chartName, chartVersion)

		chartPathOptions.Version = chartVersion

	} else {
		fmt.Printf("No chart version specified for %s\n", chartName)
	}

	// Check if the chart is using OCI
	if strings.HasPrefix(chartName, "oci://") {
		fmt.Printf("OCI chart detected: %s\n", chartName)

		// Step 1: Initialize OCI client
		ociClient, err := registry.NewClient(
			registry.ClientOptEnableCache(true),
			registry.ClientOptDebug(true),
		)
		if err != nil {
			return nil, fmt.Errorf("failed to initialize OCI client: %v", err)
		}

		// Step 2: Create a temporary directory
		tempDir, err := os.MkdirTemp("", "helm-oci-*")
		if err != nil {
			return nil, fmt.Errorf("failed to create temporary directory: %v", err)
		}
		fmt.Printf("Temporary directory created: %s\n", tempDir)

		debugLog := func(format string, v ...interface{}) {
			fmt.Printf(format+"\n", v...)
		}

		actionConfig := new(action.Configuration)
		if err := actionConfig.Init(settings.RESTClientGetter(), "", os.Getenv("HELM_DRIVER"), debugLog); err != nil {
			return nil, fmt.Errorf("failed to initialize Helm action configuration: %v", err)
		}

		actionConfig.RegistryClient = ociClient

		// Step 3: Pull the chart from the OCI registry
		pull := action.NewPullWithOpts(action.WithConfig(actionConfig))
		pull.DestDir = tempDir
		pull.Version = chartVersion
		pull.Settings = &cli.EnvSettings{}

		_, err = pull.Run(chartName)
		if err != nil {
			return nil, fmt.Errorf("failed to pull OCI chart %s: %v", chartName, err)
		}

		// Step 4: Load the chart from the temporary directory
		chartFilePath := filepath.Join(tempDir, filepath.Base(chartName)+"-"+chartVersion+".tgz")
		chartReq, err := loader.Load(chartFilePath)
		if err != nil {
			return nil, fmt.Errorf("failed to load OCI chart from %s: %v", chartFilePath, err)
		}

		return chartReq, nil
	}

	cp, err := chartPathOptions.LocateChart(chartName, settings)

	if err != nil {
		return nil, err
	}

	chartReq, err := loader.Load(cp)

	if err != nil {
		return nil, err
	}

	return chartReq, nil

}

// deploys OpenUnison into the cluster
func (ou *OpenUnisonDeployment) DeployAuthPortal() error {
	// check the kubernetes dashboard ns exists

	dashboardNamespace := "kubernetes-dashboard"

	dashboardConfig, ok := ou.helmValues["dashboard"].(map[interface{}]interface{})
	if ok {

		dashboardNamespace = dashboardConfig["namespace"].(string)
	}

	ou.checkNamespace("Dashboard", dashboardNamespace)

	// check the openunison namespace exists, if not, create it

	ou.checkNamespace("OpenUnison", ou.namespace)

	network := ou.helmValues["network"].(map[string]interface{})
	ingressType := network["ingress_type"].(string)

	if ingressType == "istio" {
		fmt.Println("Enabling Istio on the openunison namespace")
		ouNs, err := ou.clientset.CoreV1().Namespaces().Get(context.TODO(), ou.namespace, metav1.GetOptions{})
		if err != nil {
			return err
		}

		ouNs.Labels["istio-injection"] = "enabled"
		ou.clientset.CoreV1().Namespaces().Update(context.TODO(), ouNs, metav1.UpdateOptions{})

	}

	err := ou.setupSecret(ou.helmValues)

	if err != nil {
		return err
	}

	// run pre-charts
	err = ou.DeployPreCharts()

	if err != nil {
		return err
	}

	// deploy the operator
	settings := cli.New()
	actionConfig := new(action.Configuration)

	if err := actionConfig.Init(settings.RESTClientGetter(), ou.namespace, os.Getenv("HELM_DRIVER"), log.Printf); err != nil {
		return err
	}

	listClient := action.NewList(actionConfig)

	openunisonDeployed := false
	orchestraDeployed := false
	orchestraLoginPortalDeployed := false

	listClient.All = true
	listClient.Failed = true
	releases, err := listClient.Run()

	for _, release := range releases {
		if release.Name == "openunison" && release.Namespace == ou.namespace {
			openunisonDeployed = true
		}

		if release.Name == "orchestra" && release.Namespace == ou.namespace {
			orchestraDeployed = true
		}

		if release.Name == "orchestra-login-portal" && release.Namespace == ou.namespace {
			orchestraLoginPortalDeployed = true
		}
	}

	//if !openunisonDeployed {
	fmt.Print("Deploying the OpenUnison Operator\n")

	if !openunisonDeployed {
		fmt.Println("Chart not deployed, installing")
		client := action.NewInstall(actionConfig)

		client.Namespace = ou.namespace
		client.ReleaseName = "openunison"

		chartReq, err := ou.locateChart(ou.operator.chart, &client.ChartPathOptions, settings)

		if err != nil {
			return err
		}

		//_, err = client.Run(chartReq, vals)
		_, err = ou.runChartInstall(client, client.ReleaseName, chartReq, ou.helmValues, actionConfig)

		if err != nil {
			return err
		}
	} else {
		fmt.Println("Chart deployed, upgrading")
		client := action.NewUpgrade(actionConfig)

		client.Namespace = ou.namespace

		chartReq, err := ou.locateChart(ou.operator.chart, &client.ChartPathOptions, settings)

		if err != nil {
			return err
		}

		_, err = ou.runChartUpgrade(client, "openunison", chartReq, ou.helmValues)

		if err != nil {
			return err
		}
	}

	// wait until the operator is up and running

	err = waitForDeployment(ou, "openunison-operator")
	if err != nil {
		return err
	}

	fmt.Println("Checking for a previously failed run")

	_, err = ou.clientset.CoreV1().Pods(ou.namespace).Get(context.TODO(), "test-orchestra-orchestra", metav1.GetOptions{})

	if err == nil {
		fmt.Println("test-orchestra-orchestra Pod exists, deleting")

		err = ou.clientset.CoreV1().Pods(ou.namespace).Delete(context.TODO(), "test-orchestra-orchestra", metav1.DeleteOptions{})

		if err != nil {
			return err
		}

		fmt.Println("Deleted test-orchestra-orchestra")
	}

	fmt.Println("Deploying the orchestra chart")

	var deployErr error

	if !orchestraDeployed {
		// deploy orchestra, make sure that it deploys

		fmt.Println("Orchestra doesn't exist, installing")

		client := action.NewInstall(actionConfig)

		client.Namespace = ou.namespace
		client.ReleaseName = "orchestra"

		chartReq, err := ou.locateChart(ou.orchestraChart, &client.ChartPathOptions, settings)

		if err != nil {
			return err
		}

		mergedValues := mergeMaps(chartReq.Values, ou.helmValues)

		//_, deployErr = client.Run(chartReq, mergedValues)
		_, deployErr = ou.runChartInstall(client, client.ReleaseName, chartReq, mergedValues, actionConfig)

	} else {
		// deploy orchestra, make sure that it deploys

		fmt.Println("Orchestra exists, upgrading")

		client := action.NewUpgrade(actionConfig)

		client.Namespace = ou.namespace

		chartReq, err := ou.locateChart(ou.orchestraChart, &client.ChartPathOptions, settings)

		if err != nil {
			return err
		}

		mergedValues := mergeMaps(chartReq.Values, ou.helmValues)

		//_, deployErr = client.Run("orchestra", chartReq, mergedValues)
		_, deployErr = ou.runChartUpgrade(client, "orchestra", chartReq, mergedValues)
	}

	if deployErr != nil {

		_, err = ou.clientset.CoreV1().Pods(ou.namespace).Get(context.TODO(), "test-orchestra-orchestra", metav1.GetOptions{})

		if err == nil {
			fmt.Println("Failed prechecks:")

			req := ou.clientset.CoreV1().Pods(ou.namespace).GetLogs("test-orchestra-orchestra", &v1.PodLogOptions{})
			podLogs, err := req.Stream(context.TODO())
			if err != nil {
				return err
			}
			defer podLogs.Close()

			buf := new(bytes.Buffer)
			_, err = io.Copy(buf, podLogs)
			if err != nil {
				return err
			}
			str := buf.String()

			fmt.Println(str)
			return nil
		} else {
			return deployErr
		}

		return err
	}

	// wait until the orchestra container is running
	fmt.Printf("Waiting for a few seconds for the operator to run")
	time.Sleep(5 * time.Second)
	err = waitForDeployment(ou, "openunison-orchestra")
	if err != nil {
		return err
	}

	fmt.Printf("Waiting for a few seconds for the webhooks to settle to run")
	time.Sleep(10 * time.Second)

	fmt.Println("Deploying the orchestra-login-portal chart")

	if !orchestraLoginPortalDeployed {

		// deploy the orchestra-login-portal charts
		fmt.Println("orchestra-login-portal not deployed, installing")

		client := action.NewInstall(actionConfig)

		client.Namespace = ou.namespace
		client.ReleaseName = "orchestra-login-portal"

		chartReq, err := ou.locateChart(ou.orchestraLoginPortalChart, &client.ChartPathOptions, settings)

		if err != nil {
			return err
		}

		mergedValues := mergeMaps(chartReq.Values, ou.helmValues)

		//_, err = client.Run(chartReq, mergedValues)
		_, err = ou.runChartInstall(client, client.ReleaseName, chartReq, mergedValues, actionConfig)

		if err != nil {
			return err
		}

		// wait until the orchestra container is running

		err = waitForDeployment(ou, "ouhtml-orchestra-login-portal")
		if err != nil {
			return err
		}

		network := mergedValues["network"].(map[string]interface{})
		ouHost := network["openunison_host"]

		fmt.Printf("OpenUnison is deployed!  Visit https://%v/ to login to your cluster!\n", ouHost)
	} else {
		// deploy the orchestra-login-portal charts
		fmt.Println("orchestra-login-portal deployed, upgrading")

		client := action.NewUpgrade(actionConfig)

		client.Namespace = ou.namespace

		chartReq, err := ou.locateChart(ou.orchestraLoginPortalChart, &client.ChartPathOptions, settings)

		if err != nil {
			return err
		}

		mergedValues := mergeMaps(chartReq.Values, ou.helmValues)

		//_, err = client.Run("orchestra-login-portal", chartReq, mergedValues)
		_, err = ou.runChartUpgrade(client, "orchestra-login-portal", chartReq, mergedValues)

		if err != nil {
			return err
		}

		// wait until the orchestra container is running

		err = waitForDeployment(ou, "ouhtml-orchestra-login-portal")
		if err != nil {
			return err
		}

		network := mergedValues["network"].(map[string]interface{})
		ouHost := network["openunison_host"]

		fmt.Printf("OpenUnison is deployed!  Visit https://%v/ to login to your cluster!\n", ouHost)
	}
	// all done!

	return nil
}

func waitForDeployment(ou *OpenUnisonDeployment, deploymentName string) error {

	running := false

	for i := 0; i < 200; i++ {
		fmt.Printf("Checking for the %s %v\n", deploymentName, i)

		dep, err := ou.clientset.AppsV1().Deployments(ou.namespace).Get(context.TODO(), deploymentName, metav1.GetOptions{})

		if err != nil {
			return err
		}

		labels := ""

		for key, value := range dep.Spec.Selector.MatchLabels {
			labels = labels + key + "=" + value + ","
		}

		labels = labels[0 : len(labels)-1]
		fmt.Printf("Looking for labels '%v'\n", labels)
		options := metav1.ListOptions{
			LabelSelector: labels,
		}

		pods, err := ou.clientset.CoreV1().Pods(ou.namespace).List(context.TODO(), options)

		if err != nil {
			return err
		}

		numPods := len(pods.Items)

		fmt.Printf("Total Pods : %v, Ready Pods : %v\n", numPods, dep.Status.ReadyReplicas)

		if *dep.Spec.Replicas <= dep.Status.ReadyReplicas && int32(numPods) == *dep.Spec.Replicas {
			running = true
			break
		}

		time.Sleep(1 * time.Second)
	}

	if !running {
		return fmt.Errorf("Timed out waiting for the openunison operator chart to be deployed")
	} else {
		fmt.Printf("Deployment %v is Running\n", deploymentName)
	}
	return nil
}

func (ou *OpenUnisonDeployment) checkNamespace(label string, name string) error {

	fmt.Printf("Checking for the %s namespace %s\n", label, name)

	_, err := ou.clientset.CoreV1().Namespaces().Get(context.TODO(), name, metav1.GetOptions{})

	if err != nil {
		fmt.Printf("%s namespace %s does not exist, creating\n", label, name)

		openUnisonNamespace := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: name, Labels: ou.namespaceLabels}}

		_, err = ou.clientset.CoreV1().Namespaces().Create(context.TODO(), openUnisonNamespace, metav1.CreateOptions{})
		if err != nil {
			return err
		}
		fmt.Printf("%s namespace %s created\n", label, name)
	} else {
		fmt.Printf("%s namespace %s already exists\n", label, name)
	}

	return nil
}

func mergeMaps(base, overlay map[string]interface{}) map[string]interface{} {
	out := make(map[string]interface{}, len(base))
	for key, value := range base {
		out[key] = value
	}

	for k, v := range overlay {
		if v, ok := v.(map[string]interface{}); ok {
			if bv, ok := out[k]; ok {
				if bv, ok := bv.(map[string]interface{}); ok {
					out[k] = mergeMaps(bv, v)
					continue
				}
			}
		}
		out[k] = v
	}
	return out
}
07070100000020000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000002A00000000openunison-control-0.0.13/openunisonmodel07070100000021000081A400000000000000000000000167FBDA050000010A000000000000000000000000000000000000003500000000openunison-control-0.0.13/openunisonmodel/.gitignore# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so

# Folders
_obj
_test

# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out

*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*

_testmain.go

*.exe
*.test
*.prof
07070100000022000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000003B00000000openunison-control-0.0.13/openunisonmodel/.swagger-codegen07070100000023000081A400000000000000000000000167FBDA0500000406000000000000000000000000000000000000004200000000openunison-control-0.0.13/openunisonmodel/.swagger-codegen-ignore# Swagger Codegen Ignore
# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen

# Use this file to prevent files from being overwritten by the generator.
# The patterns follow closely to .gitignore or .dockerignore.

# As an example, the C# client generator defines ApiClient.cs.
# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
#ApiClient.cs

# You can match any string of characters against a directory, file or extension with a single asterisk (*):
#foo/*/qux
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux

# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
#foo/**/qux
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux

# You can also negate patterns with an exclamation (!).
# For example, you can ignore all files in a docs folder with the file extension .md:
#docs/*.md
# Then explicitly reverse the ignore rule for a single file:
#!docs/README.md
07070100000024000081A400000000000000000000000167FBDA0500000006000000000000000000000000000000000000004300000000openunison-control-0.0.13/openunisonmodel/.swagger-codegen/VERSION3.0.4207070100000025000081A400000000000000000000000167FBDA0500000047000000000000000000000000000000000000003600000000openunison-control-0.0.13/openunisonmodel/.travis.ymllanguage: go

install:
  - go get -d -v .

script:
  - go build -v ./

07070100000026000081A400000000000000000000000167FBDA0500000CB9000000000000000000000000000000000000003400000000openunison-control-0.0.13/openunisonmodel/README.md# Go API client for openunisonmodel

OpenUnison ScaleJS Register API

## Overview
This API client was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project.  By using the [swagger-spec](https://github.com/swagger-api/swagger-spec) from a remote server, you can easily generate an API client.

- API version: v6
- Package version: 1.0.0
- Build package: io.swagger.codegen.v3.generators.go.GoClientCodegen

## Installation
Put the package under your project folder and add the following in import:
```golang
import "./openunisonmodel"
```

## Documentation for API Endpoints

All URIs are relative to */*

Class | Method | HTTP request | Description
------------ | ------------- | ------------- | -------------

## Documentation For Models

 - [OpenUnison](docs/OpenUnison.md)
 - [OpenUnisonSpec](docs/OpenUnisonSpec.md)
 - [OpenUnisonSpecAnnotations](docs/OpenUnisonSpecAnnotations.md)
 - [OpenUnisonSpecDeploymentData](docs/OpenUnisonSpecDeploymentData.md)
 - [OpenUnisonSpecDeploymentDataResources](docs/OpenUnisonSpecDeploymentDataResources.md)
 - [OpenUnisonSpecDeploymentDataResourcesRequests](docs/OpenUnisonSpecDeploymentDataResourcesRequests.md)
 - [OpenUnisonSpecDeploymentDataTokenrequestApi](docs/OpenUnisonSpecDeploymentDataTokenrequestApi.md)
 - [OpenUnisonSpecHosts](docs/OpenUnisonSpecHosts.md)
 - [OpenUnisonSpecKeyStore](docs/OpenUnisonSpecKeyStore.md)
 - [OpenUnisonSpecKeyStoreKeyPairs](docs/OpenUnisonSpecKeyStoreKeyPairs.md)
 - [OpenUnisonSpecKeyStoreKeyPairsCreateData](docs/OpenUnisonSpecKeyStoreKeyPairsCreateData.md)
 - [OpenUnisonSpecKeyStoreKeyPairsCreateDataPatchInfo](docs/OpenUnisonSpecKeyStoreKeyPairsCreateDataPatchInfo.md)
 - [OpenUnisonSpecKeyStoreKeyPairsCreateDataSecretInfo](docs/OpenUnisonSpecKeyStoreKeyPairsCreateDataSecretInfo.md)
 - [OpenUnisonSpecKeyStoreKeyPairsKeys](docs/OpenUnisonSpecKeyStoreKeyPairsKeys.md)
 - [OpenUnisonSpecKeyStoreStaticKeys](docs/OpenUnisonSpecKeyStoreStaticKeys.md)
 - [OpenUnisonSpecKeyStoreTrustedCertificates](docs/OpenUnisonSpecKeyStoreTrustedCertificates.md)
 - [OpenUnisonSpecKeyStoreUpdateController](docs/OpenUnisonSpecKeyStoreUpdateController.md)
 - [OpenUnisonSpecMapping](docs/OpenUnisonSpecMapping.md)
 - [OpenUnisonSpecNames](docs/OpenUnisonSpecNames.md)
 - [OpenUnisonSpecOpenshift](docs/OpenUnisonSpecOpenshift.md)
 - [OpenUnisonSpecOpenshiftGit](docs/OpenUnisonSpecOpenshiftGit.md)
 - [OpenUnisonSpecOpenunisonNetworkConfiguration](docs/OpenUnisonSpecOpenunisonNetworkConfiguration.md)
 - [OpenUnisonSpecOpenunisonNetworkConfigurationErrorPages](docs/OpenUnisonSpecOpenunisonNetworkConfigurationErrorPages.md)
 - [OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfiguration](docs/OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfiguration.md)
 - [OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfigurationParams](docs/OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfigurationParams.md)
 - [OpenUnisonSpecSamlRemoteIdp](docs/OpenUnisonSpecSamlRemoteIdp.md)
 - [OpenUnisonSpecSource](docs/OpenUnisonSpecSource.md)
 - [OpenUnisonStatus](docs/OpenUnisonStatus.md)
 - [OpenUnisonStatusConditions](docs/OpenUnisonStatusConditions.md)

## Documentation For Authorization
 Endpoints do not require authorization.


## Author

07070100000027000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000002E00000000openunison-control-0.0.13/openunisonmodel/api07070100000028000081A400000000000000000000000167FBDA0500002CBD000000000000000000000000000000000000003B00000000openunison-control-0.0.13/openunisonmodel/api/swagger.yamlopenapi: 3.0.1
info:
  title: OpenUnison CRD
  description: OpenUnison ScaleJS Register API
  version: v6
servers:
- url: /
paths: {}
components:
  schemas:
    OpenUnison:
      type: object
      properties:
        spec:
          $ref: '#/components/schemas/OpenUnison_spec'
        status:
          $ref: '#/components/schemas/OpenUnison_status'
    OpenUnison_spec_openshift_git:
      type: object
      properties:
        repo:
          type: string
        branch:
          type: string
        dir:
          type: string
    OpenUnison_spec_openshift:
      type: object
      properties:
        git:
          $ref: '#/components/schemas/OpenUnison_spec_openshift_git'
        builder_image:
          type: string
    OpenUnison_spec_names:
      type: object
      properties:
        name:
          type: string
        service_name:
          type: string
        env_var:
          type: string
    OpenUnison_spec_annotations:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
    OpenUnison_spec_hosts:
      type: object
      properties:
        names:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_names'
        ingress_name:
          type: string
        ingress_type:
          type: string
        secret_name:
          type: string
        annotations:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_annotations'
    OpenUnison_spec_deployment_data_tokenrequest_api:
      type: object
      properties:
        enabled:
          type: boolean
        audience:
          type: string
        expirationSeconds:
          type: integer
    OpenUnison_spec_deployment_data_resources_requests:
      type: object
      properties:
        memory:
          type: string
        cpu:
          type: string
    OpenUnison_spec_deployment_data_resources:
      type: object
      properties:
        requests:
          $ref: '#/components/schemas/OpenUnison_spec_deployment_data_resources_requests'
        limits:
          $ref: '#/components/schemas/OpenUnison_spec_deployment_data_resources_requests'
    OpenUnison_spec_deployment_data:
      type: object
      properties:
        tokenrequest_api:
          $ref: '#/components/schemas/OpenUnison_spec_deployment_data_tokenrequest_api'
        readiness_probe_command:
          type: array
          items:
            type: string
        liveness_probe_command:
          type: array
          items:
            type: string
        node_selectors:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_annotations'
        pull_secret:
          type: string
        resources:
          $ref: '#/components/schemas/OpenUnison_spec_deployment_data_resources'
    OpenUnison_spec_openunison_network_configuration_error_pages:
      type: object
      properties:
        code:
          type: integer
        location:
          type: string
    OpenUnison_spec_openunison_network_configuration_queue_configuration_params:
      type: object
      properties:
        name:
          type: string
        source_type:
          type: string
          enum:
          - static
          - environment
        value:
          type: string
    OpenUnison_spec_openunison_network_configuration_queue_configuration:
      type: object
      properties:
        use_internal_queue:
          type: boolean
        max_producers:
          type: integer
        connection_factory:
          type: string
        max_consumers:
          type: integer
        max_sessions_per_connection:
          type: integer
        task_queue_name:
          type: string
        smtp_queue_name:
          type: string
        encryption_key_name:
          type: string
        num_queues:
          type: integer
        multi_task_queues:
          type: boolean
        keep_alive_millis:
          type: integer
        params:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_openunison_network_configuration_queue_configuration_params'
    OpenUnison_spec_openunison_network_configuration:
      type: object
      properties:
        force_to_lower_case:
          type: boolean
        open_port:
          type: integer
        open_external_port:
          type: integer
        secure_port:
          type: integer
        secure_external_port:
          type: integer
        ldap_port:
          type: integer
        ldaps_port:
          type: integer
        ldaps_key_name:
          type: string
        force_to_secure:
          type: boolean
        activemq_dir:
          type: string
        client_auth:
          type: string
        allowed_client_names:
          type: array
          items:
            type: string
        ciphers:
          type: array
          items:
            type: string
        path_to_deployment:
          type: string
        path_to_env_file:
          type: string
        secure_key_alias:
          type: string
        allowed_tls_protocols:
          type: array
          items:
            type: string
        quartz_dir:
          type: string
        context_root:
          type: string
        disable_http2:
          type: boolean
        allow_un_escaped_chars:
          type: string
        welecome_pages:
          type: array
          items:
            type: string
        error_pages:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_openunison_network_configuration_error_pages'
        redirect_to_context_root:
          type: boolean
        queue_configuration:
          $ref: '#/components/schemas/OpenUnison_spec_openunison_network_configuration_queue_configuration'
    OpenUnison_spec_source:
      type: object
      properties:
        url:
          type: string
        xml:
          type: string
    OpenUnison_spec_mapping:
      type: object
      properties:
        entity_id:
          type: string
        post_url:
          type: string
        redirect_url:
          type: string
        logout_url:
          type: string
        signing_cert_alias:
          type: string
        encryption_cert_alias:
          type: string
    OpenUnison_spec_saml_remote_idp:
      type: object
      properties:
        source:
          $ref: '#/components/schemas/OpenUnison_spec_source'
        mapping:
          $ref: '#/components/schemas/OpenUnison_spec_mapping'
    OpenUnison_spec_key_store_update_controller:
      type: object
      properties:
        image:
          type: string
        schedule:
          type: string
        days_to_expire:
          type: integer
    OpenUnison_spec_key_store_static_keys:
      type: object
      properties:
        name:
          type: string
        version:
          type: integer
    OpenUnison_spec_key_store_trusted_certificates:
      type: object
      properties:
        name:
          type: string
        pem_data:
          type: string
    OpenUnison_spec_key_store_key_pairs_create_data_patch_info:
      type: object
      properties:
        url:
          type: string
        annotation_name:
          type: string
    OpenUnison_spec_key_store_key_pairs_create_data_secret_info:
      type: object
      properties:
        type_of_secret:
          type: string
        cert_name:
          type: string
        key_name:
          type: string
    OpenUnison_spec_key_store_key_pairs_create_data:
      type: object
      properties:
        target_namespace:
          type: string
        sign_by_k8s_ca:
          type: boolean
        server_name:
          type: string
        subject_alternative_names:
          type: array
          items:
            type: string
        key_size:
          type: integer
        ca_cert:
          type: boolean
        delete_pods_labels:
          type: array
          items:
            type: string
        patch_info:
          $ref: '#/components/schemas/OpenUnison_spec_key_store_key_pairs_create_data_patch_info'
        secret_info:
          $ref: '#/components/schemas/OpenUnison_spec_key_store_key_pairs_create_data_secret_info'
    OpenUnison_spec_key_store_key_pairs_keys:
      type: object
      properties:
        name:
          type: string
        tls_secret_name:
          type: string
        import_into_ks:
          type: string
          enum:
          - keypair
          - certificate
          - none
        replace_if_exists:
          type: boolean
        create_data:
          $ref: '#/components/schemas/OpenUnison_spec_key_store_key_pairs_create_data'
    OpenUnison_spec_key_store_key_pairs:
      type: object
      properties:
        create_keypair_template:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_annotations'
        keys:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_key_store_key_pairs_keys'
    OpenUnison_spec_key_store:
      type: object
      properties:
        update_controller:
          $ref: '#/components/schemas/OpenUnison_spec_key_store_update_controller'
        static_keys:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_key_store_static_keys'
        trusted_certificates:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_key_store_trusted_certificates'
        key_pairs:
          $ref: '#/components/schemas/OpenUnison_spec_key_store_key_pairs'
    OpenUnison_spec:
      type: object
      properties:
        image:
          type: string
        replicas:
          type: integer
        enable_activemq:
          type: boolean
        activemq_image:
          type: string
        dest_secret:
          type: string
        source_secret:
          type: string
        secret_data:
          type: array
          items:
            type: string
        myvd_configmap:
          type: string
        openshift:
          $ref: '#/components/schemas/OpenUnison_spec_openshift'
        hosts:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_hosts'
        deployment_data:
          $ref: '#/components/schemas/OpenUnison_spec_deployment_data'
        non_secret_data:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_annotations'
        openunison_network_configuration:
          $ref: '#/components/schemas/OpenUnison_spec_openunison_network_configuration'
        saml_remote_idp:
          type: array
          items:
            $ref: '#/components/schemas/OpenUnison_spec_saml_remote_idp'
        run_sql:
          type: string
        sql_check_query:
          type: string
        key_store:
          $ref: '#/components/schemas/OpenUnison_spec_key_store'
    OpenUnison_status_conditions:
      type: object
      properties:
        lastTransitionTime:
          type: string
        status:
          type: string
        type:
          type: string
    OpenUnison_status:
      type: object
      properties:
        conditions:
          $ref: '#/components/schemas/OpenUnison_status_conditions'
        digest:
          type: string
        idpCertificateFingerprints:
          type: object
          additionalProperties: true
x-original-swagger-version: "2.0"
07070100000029000081A400000000000000000000000167FBDA0500002D52000000000000000000000000000000000000003400000000openunison-control-0.0.13/openunisonmodel/client.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

import (
	"bytes"
	"context"
	"encoding/json"
	"encoding/xml"
	"errors"
	"fmt"
	"io"
	"mime/multipart"
	"net/http"
	"net/url"
	"os"
	"path/filepath"
	"reflect"
	"regexp"
	"strconv"
	"strings"
	"time"
	"unicode/utf8"

	"golang.org/x/oauth2"
)

var (
	jsonCheck = regexp.MustCompile("(?i:[application|text]/json)")
	xmlCheck  = regexp.MustCompile("(?i:[application|text]/xml)")
)

// APIClient manages communication with the OpenUnison CRD API vv6
// In most cases there should be only one, shared, APIClient.
type APIClient struct {
	cfg    *Configuration
	common service // Reuse a single struct instead of allocating one for each service on the heap.

	// API Services
}

type service struct {
	client *APIClient
}

// NewAPIClient creates a new API client. Requires a userAgent string describing your application.
// optionally a custom http.Client to allow for advanced features such as caching.
func NewAPIClient(cfg *Configuration) *APIClient {
	if cfg.HTTPClient == nil {
		cfg.HTTPClient = http.DefaultClient
	}

	c := &APIClient{}
	c.cfg = cfg
	c.common.client = c

	// API Services

	return c
}

func atoi(in string) (int, error) {
	return strconv.Atoi(in)
}

// selectHeaderContentType select a content type from the available list.
func selectHeaderContentType(contentTypes []string) string {
	if len(contentTypes) == 0 {
		return ""
	}
	if contains(contentTypes, "application/json") {
		return "application/json"
	}
	return contentTypes[0] // use the first content type specified in 'consumes'
}

// selectHeaderAccept join all accept types and return
func selectHeaderAccept(accepts []string) string {
	if len(accepts) == 0 {
		return ""
	}

	if contains(accepts, "application/json") {
		return "application/json"
	}

	return strings.Join(accepts, ",")
}

// contains is a case insenstive match, finding needle in a haystack
func contains(haystack []string, needle string) bool {
	for _, a := range haystack {
		if strings.ToLower(a) == strings.ToLower(needle) {
			return true
		}
	}
	return false
}

// Verify optional parameters are of the correct type.
func typeCheckParameter(obj interface{}, expected string, name string) error {
	// Make sure there is an object.
	if obj == nil {
		return nil
	}

	// Check the type is as expected.
	if reflect.TypeOf(obj).String() != expected {
		return fmt.Errorf("Expected %s to be of type %s but received %s.", name, expected, reflect.TypeOf(obj).String())
	}
	return nil
}

// parameterToString convert interface{} parameters to string, using a delimiter if format is provided.
func parameterToString(obj interface{}, collectionFormat string) string {
	var delimiter string

	switch collectionFormat {
	case "pipes":
		delimiter = "|"
	case "ssv":
		delimiter = " "
	case "tsv":
		delimiter = "\t"
	case "csv":
		delimiter = ","
	}

	if reflect.TypeOf(obj).Kind() == reflect.Slice {
		return strings.Trim(strings.Replace(fmt.Sprint(obj), " ", delimiter, -1), "[]")
	}

	return fmt.Sprintf("%v", obj)
}

// callAPI do the request.
func (c *APIClient) callAPI(request *http.Request) (*http.Response, error) {
	return c.cfg.HTTPClient.Do(request)
}

// Change base path to allow switching to mocks
func (c *APIClient) ChangeBasePath(path string) {
	c.cfg.BasePath = path
}

// prepareRequest build the request
func (c *APIClient) prepareRequest(
	ctx context.Context,
	path string, method string,
	postBody interface{},
	headerParams map[string]string,
	queryParams url.Values,
	formParams url.Values,
	fileName string,
	fileBytes []byte) (localVarRequest *http.Request, err error) {

	var body *bytes.Buffer

	// Detect postBody type and post.
	if postBody != nil {
		contentType := headerParams["Content-Type"]
		if contentType == "" {
			contentType = detectContentType(postBody)
			headerParams["Content-Type"] = contentType
		}

		body, err = setBody(postBody, contentType)
		if err != nil {
			return nil, err
		}
	}

	// add form parameters and file if available.
	if strings.HasPrefix(headerParams["Content-Type"], "multipart/form-data") && len(formParams) > 0 || (len(fileBytes) > 0 && fileName != "") {
		if body != nil {
			return nil, errors.New("Cannot specify postBody and multipart form at the same time.")
		}
		body = &bytes.Buffer{}
		w := multipart.NewWriter(body)

		for k, v := range formParams {
			for _, iv := range v {
				if strings.HasPrefix(k, "@") { // file
					err = addFile(w, k[1:], iv)
					if err != nil {
						return nil, err
					}
				} else { // form value
					w.WriteField(k, iv)
				}
			}
		}
		if len(fileBytes) > 0 && fileName != "" {
			w.Boundary()
			//_, fileNm := filepath.Split(fileName)
			part, err := w.CreateFormFile("file", filepath.Base(fileName))
			if err != nil {
				return nil, err
			}
			_, err = part.Write(fileBytes)
			if err != nil {
				return nil, err
			}
			// Set the Boundary in the Content-Type
			headerParams["Content-Type"] = w.FormDataContentType()
		}

		// Set Content-Length
		headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len())
		w.Close()
	}

	if strings.HasPrefix(headerParams["Content-Type"], "application/x-www-form-urlencoded") && len(formParams) > 0 {
		if body != nil {
			return nil, errors.New("Cannot specify postBody and x-www-form-urlencoded form at the same time.")
		}
		body = &bytes.Buffer{}
		body.WriteString(formParams.Encode())
		// Set Content-Length
		headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len())
	}

	// Setup path and query parameters
	url, err := url.Parse(path)
	if err != nil {
		return nil, err
	}

	// Adding Query Param
	query := url.Query()
	for k, v := range queryParams {
		for _, iv := range v {
			query.Add(k, iv)
		}
	}

	// Encode the parameters.
	url.RawQuery = query.Encode()

	// Generate a new request
	if body != nil {
		localVarRequest, err = http.NewRequest(method, url.String(), body)
	} else {
		localVarRequest, err = http.NewRequest(method, url.String(), nil)
	}
	if err != nil {
		return nil, err
	}

	// add header parameters, if any
	if len(headerParams) > 0 {
		headers := http.Header{}
		for h, v := range headerParams {
			headers.Set(h, v)
		}
		localVarRequest.Header = headers
	}

	// Override request host, if applicable
	if c.cfg.Host != "" {
		localVarRequest.Host = c.cfg.Host
	}

	// Add the user agent to the request.
	localVarRequest.Header.Add("User-Agent", c.cfg.UserAgent)

	if ctx != nil {
		// add context to the request
		localVarRequest = localVarRequest.WithContext(ctx)

		// Walk through any authentication.

		// OAuth2 authentication
		if tok, ok := ctx.Value(ContextOAuth2).(oauth2.TokenSource); ok {
			// We were able to grab an oauth2 token from the context
			var latestToken *oauth2.Token
			if latestToken, err = tok.Token(); err != nil {
				return nil, err
			}

			latestToken.SetAuthHeader(localVarRequest)
		}

		// Basic HTTP Authentication
		if auth, ok := ctx.Value(ContextBasicAuth).(BasicAuth); ok {
			localVarRequest.SetBasicAuth(auth.UserName, auth.Password)
		}

		// AccessToken Authentication
		if auth, ok := ctx.Value(ContextAccessToken).(string); ok {
			localVarRequest.Header.Add("Authorization", "Bearer "+auth)
		}
	}

	for header, value := range c.cfg.DefaultHeader {
		localVarRequest.Header.Add(header, value)
	}

	return localVarRequest, nil
}

func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err error) {
		if strings.Contains(contentType, "application/xml") {
			if err = xml.Unmarshal(b, v); err != nil {
				return err
			}
			return nil
		} else if strings.Contains(contentType, "application/json") {
			if err = json.Unmarshal(b, v); err != nil {
				return err
			}
			return nil
		}
	return errors.New("undefined response type")
}

// Add a file to the multipart request
func addFile(w *multipart.Writer, fieldName, path string) error {
	file, err := os.Open(path)
	if err != nil {
		return err
	}
	defer file.Close()

	part, err := w.CreateFormFile(fieldName, filepath.Base(path))
	if err != nil {
		return err
	}
	_, err = io.Copy(part, file)

	return err
}

// Prevent trying to import "fmt"
func reportError(format string, a ...interface{}) error {
	return fmt.Errorf(format, a...)
}

// Set request body from an interface{}
func setBody(body interface{}, contentType string) (bodyBuf *bytes.Buffer, err error) {
	if bodyBuf == nil {
		bodyBuf = &bytes.Buffer{}
	}

	if reader, ok := body.(io.Reader); ok {
		_, err = bodyBuf.ReadFrom(reader)
	} else if b, ok := body.([]byte); ok {
		_, err = bodyBuf.Write(b)
	} else if s, ok := body.(string); ok {
		_, err = bodyBuf.WriteString(s)
	} else if s, ok := body.(*string); ok {
		_, err = bodyBuf.WriteString(*s)
	} else if jsonCheck.MatchString(contentType) {
		err = json.NewEncoder(bodyBuf).Encode(body)
	} else if xmlCheck.MatchString(contentType) {
		xml.NewEncoder(bodyBuf).Encode(body)
	}

	if err != nil {
		return nil, err
	}

	if bodyBuf.Len() == 0 {
		err = fmt.Errorf("Invalid body type %s\n", contentType)
		return nil, err
	}
	return bodyBuf, nil
}

// detectContentType method is used to figure out `Request.Body` content type for request header
func detectContentType(body interface{}) string {
	contentType := "text/plain; charset=utf-8"
	kind := reflect.TypeOf(body).Kind()

	switch kind {
	case reflect.Struct, reflect.Map, reflect.Ptr:
		contentType = "application/json; charset=utf-8"
	case reflect.String:
		contentType = "text/plain; charset=utf-8"
	default:
		if b, ok := body.([]byte); ok {
			contentType = http.DetectContentType(b)
		} else if kind == reflect.Slice {
			contentType = "application/json; charset=utf-8"
		}
	}

	return contentType
}

// Ripped from https://github.com/gregjones/httpcache/blob/master/httpcache.go
type cacheControl map[string]string

func parseCacheControl(headers http.Header) cacheControl {
	cc := cacheControl{}
	ccHeader := headers.Get("Cache-Control")
	for _, part := range strings.Split(ccHeader, ",") {
		part = strings.Trim(part, " ")
		if part == "" {
			continue
		}
		if strings.ContainsRune(part, '=') {
			keyval := strings.Split(part, "=")
			cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",")
		} else {
			cc[part] = ""
		}
	}
	return cc
}

// CacheExpires helper function to determine remaining time before repeating a request.
func CacheExpires(r *http.Response) time.Time {
	// Figure out when the cache expires.
	var expires time.Time
	now, err := time.Parse(time.RFC1123, r.Header.Get("date"))
	if err != nil {
		return time.Now()
	}
	respCacheControl := parseCacheControl(r.Header)

	if maxAge, ok := respCacheControl["max-age"]; ok {
		lifetime, err := time.ParseDuration(maxAge + "s")
		if err != nil {
			expires = now
		}
		expires = now.Add(lifetime)
	} else {
		expiresHeader := r.Header.Get("Expires")
		if expiresHeader != "" {
			expires, err = time.Parse(time.RFC1123, expiresHeader)
			if err != nil {
				expires = now
			}
		}
	}
	return expires
}

func strlen(s string) int {
	return utf8.RuneCountInString(s)
}

// GenericSwaggerError Provides access to the body, error and model on returned errors.
type GenericSwaggerError struct {
	body  []byte
	error string
	model interface{}
}

// Error returns non-empty string if there was an error.
func (e GenericSwaggerError) Error() string {
	return e.error
}

// Body returns the raw bytes of the response
func (e GenericSwaggerError) Body() []byte {
	return e.body
}

// Model returns the unpacked model of the error
func (e GenericSwaggerError) Model() interface{} {
	return e.model
}
0707010000002A000081A400000000000000000000000167FBDA05000007F8000000000000000000000000000000000000003B00000000openunison-control-0.0.13/openunisonmodel/configuration.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

import (
	"net/http"
)

// contextKeys are used to identify the type of value in the context.
// Since these are string, it is possible to get a short description of the
// context key for logging and debugging using key.String().

type contextKey string

func (c contextKey) String() string {
	return "auth " + string(c)
}

var (
	// ContextOAuth2 takes a oauth2.TokenSource as authentication for the request.
	ContextOAuth2 = contextKey("token")

	// ContextBasicAuth takes BasicAuth as authentication for the request.
	ContextBasicAuth = contextKey("basic")

	// ContextAccessToken takes a string oauth2 access token as authentication for the request.
	ContextAccessToken = contextKey("accesstoken")

	// ContextAPIKey takes an APIKey as authentication for the request
	ContextAPIKey = contextKey("apikey")
)

// BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth
type BasicAuth struct {
	UserName string `json:"userName,omitempty"`
	Password string `json:"password,omitempty"`
}

// APIKey provides API key based authentication to a request passed via context using ContextAPIKey
type APIKey struct {
	Key    string
	Prefix string
}

type Configuration struct {
	BasePath      string            `json:"basePath,omitempty"`
	Host          string            `json:"host,omitempty"`
	Scheme        string            `json:"scheme,omitempty"`
	DefaultHeader map[string]string `json:"defaultHeader,omitempty"`
	UserAgent     string            `json:"userAgent,omitempty"`
	HTTPClient    *http.Client
}

func NewConfiguration() *Configuration {
	cfg := &Configuration{
		BasePath:      "/",
		DefaultHeader: make(map[string]string),
		UserAgent:     "Swagger-Codegen/1.0.0/go",
	}
	return cfg
}

func (c *Configuration) AddDefaultHeader(key string, value string) {
	c.DefaultHeader[key] = value
}
0707010000002B000041ED00000000000000000000000267FBDA0500000000000000000000000000000000000000000000002F00000000openunison-control-0.0.13/openunisonmodel/docs0707010000002C000081A400000000000000000000000167FBDA05000001D3000000000000000000000000000000000000003D00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnison.md# OpenUnison

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Spec** | [***OpenUnisonSpec**](OpenUnison_spec.md) |  | [optional] [default to null]
**Status** | [***OpenUnisonStatus**](OpenUnison_status.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

0707010000002D000081A400000000000000000000000167FBDA05000006F7000000000000000000000000000000000000004100000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpec.md# OpenUnisonSpec

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Image** | **string** |  | [optional] [default to null]
**Replicas** | **int32** |  | [optional] [default to null]
**EnableActivemq** | **bool** |  | [optional] [default to null]
**ActivemqImage** | **string** |  | [optional] [default to null]
**DestSecret** | **string** |  | [optional] [default to null]
**SourceSecret** | **string** |  | [optional] [default to null]
**SecretData** | **[]string** |  | [optional] [default to null]
**MyvdConfigmap** | **string** |  | [optional] [default to null]
**Openshift** | [***OpenUnisonSpecOpenshift**](OpenUnison_spec_openshift.md) |  | [optional] [default to null]
**Hosts** | [**[]OpenUnisonSpecHosts**](OpenUnison_spec_hosts.md) |  | [optional] [default to null]
**DeploymentData** | [***OpenUnisonSpecDeploymentData**](OpenUnison_spec_deployment_data.md) |  | [optional] [default to null]
**NonSecretData** | [**[]OpenUnisonSpecAnnotations**](OpenUnison_spec_annotations.md) |  | [optional] [default to null]
**OpenunisonNetworkConfiguration** | [***OpenUnisonSpecOpenunisonNetworkConfiguration**](OpenUnison_spec_openunison_network_configuration.md) |  | [optional] [default to null]
**SamlRemoteIdp** | [**[]OpenUnisonSpecSamlRemoteIdp**](OpenUnison_spec_saml_remote_idp.md) |  | [optional] [default to null]
**RunSql** | **string** |  | [optional] [default to null]
**SqlCheckQuery** | **string** |  | [optional] [default to null]
**KeyStore** | [***OpenUnisonSpecKeyStore**](OpenUnison_spec_key_store.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

0707010000002E000081A400000000000000000000000167FBDA050000019F000000000000000000000000000000000000004C00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecAnnotations.md# OpenUnisonSpecAnnotations

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Name** | **string** |  | [optional] [default to null]
**Value** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

0707010000002F000081A400000000000000000000000167FBDA05000003A9000000000000000000000000000000000000004F00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecDeploymentData.md# OpenUnisonSpecDeploymentData

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**TokenrequestApi** | [***OpenUnisonSpecDeploymentDataTokenrequestApi**](OpenUnison_spec_deployment_data_tokenrequest_api.md) |  | [optional] [default to null]
**ReadinessProbeCommand** | **[]string** |  | [optional] [default to null]
**LivenessProbeCommand** | **[]string** |  | [optional] [default to null]
**NodeSelectors** | [**[]OpenUnisonSpecAnnotations**](OpenUnison_spec_annotations.md) |  | [optional] [default to null]
**PullSecret** | **string** |  | [optional] [default to null]
**Resources** | [***OpenUnisonSpecDeploymentDataResources**](OpenUnison_spec_deployment_data_resources.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000030000081A400000000000000000000000167FBDA0500000272000000000000000000000000000000000000005800000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecDeploymentDataResources.md# OpenUnisonSpecDeploymentDataResources

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Requests** | [***OpenUnisonSpecDeploymentDataResourcesRequests**](OpenUnison_spec_deployment_data_resources_requests.md) |  | [optional] [default to null]
**Limits** | [***OpenUnisonSpecDeploymentDataResourcesRequests**](OpenUnison_spec_deployment_data_resources_requests.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000031000081A400000000000000000000000167FBDA05000001B3000000000000000000000000000000000000006000000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecDeploymentDataResourcesRequests.md# OpenUnisonSpecDeploymentDataResourcesRequests

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Memory** | **string** |  | [optional] [default to null]
**Cpu** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000032000081A400000000000000000000000167FBDA05000001F9000000000000000000000000000000000000005E00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecDeploymentDataTokenrequestApi.md# OpenUnisonSpecDeploymentDataTokenrequestApi

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Enabled** | **bool** |  | [optional] [default to null]
**Audience** | **string** |  | [optional] [default to null]
**ExpirationSeconds** | **int32** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000033000081A400000000000000000000000167FBDA05000002BE000000000000000000000000000000000000004600000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecHosts.md# OpenUnisonSpecHosts

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Names** | [**[]OpenUnisonSpecNames**](OpenUnison_spec_names.md) |  | [optional] [default to null]
**IngressName** | **string** |  | [optional] [default to null]
**IngressType** | **string** |  | [optional] [default to null]
**SecretName** | **string** |  | [optional] [default to null]
**Annotations** | [**[]OpenUnisonSpecAnnotations**](OpenUnison_spec_annotations.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000034000081A400000000000000000000000167FBDA0500000368000000000000000000000000000000000000004900000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecKeyStore.md# OpenUnisonSpecKeyStore

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**UpdateController** | [***OpenUnisonSpecKeyStoreUpdateController**](OpenUnison_spec_key_store_update_controller.md) |  | [optional] [default to null]
**StaticKeys** | [**[]OpenUnisonSpecKeyStoreStaticKeys**](OpenUnison_spec_key_store_static_keys.md) |  | [optional] [default to null]
**TrustedCertificates** | [**[]OpenUnisonSpecKeyStoreTrustedCertificates**](OpenUnison_spec_key_store_trusted_certificates.md) |  | [optional] [default to null]
**KeyPairs** | [***OpenUnisonSpecKeyStoreKeyPairs**](OpenUnison_spec_key_store_key_pairs.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000035000081A400000000000000000000000167FBDA0500000238000000000000000000000000000000000000005100000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecKeyStoreKeyPairs.md# OpenUnisonSpecKeyStoreKeyPairs

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**CreateKeypairTemplate** | [**[]OpenUnisonSpecAnnotations**](OpenUnison_spec_annotations.md) |  | [optional] [default to null]
**Keys** | [**[]OpenUnisonSpecKeyStoreKeyPairsKeys**](OpenUnison_spec_key_store_key_pairs_keys.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000036000081A400000000000000000000000167FBDA0500000457000000000000000000000000000000000000005B00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecKeyStoreKeyPairsCreateData.md# OpenUnisonSpecKeyStoreKeyPairsCreateData

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**TargetNamespace** | **string** |  | [optional] [default to null]
**SignByK8sCa** | **bool** |  | [optional] [default to null]
**ServerName** | **string** |  | [optional] [default to null]
**SubjectAlternativeNames** | **[]string** |  | [optional] [default to null]
**KeySize** | **int32** |  | [optional] [default to null]
**CaCert** | **bool** |  | [optional] [default to null]
**DeletePodsLabels** | **[]string** |  | [optional] [default to null]
**PatchInfo** | [***OpenUnisonSpecKeyStoreKeyPairsCreateDataPatchInfo**](OpenUnison_spec_key_store_key_pairs_create_data_patch_info.md) |  | [optional] [default to null]
**SecretInfo** | [***OpenUnisonSpecKeyStoreKeyPairsCreateDataSecretInfo**](OpenUnison_spec_key_store_key_pairs_create_data_secret_info.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000037000081A400000000000000000000000167FBDA05000001BF000000000000000000000000000000000000006400000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecKeyStoreKeyPairsCreateDataPatchInfo.md# OpenUnisonSpecKeyStoreKeyPairsCreateDataPatchInfo

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Url** | **string** |  | [optional] [default to null]
**AnnotationName** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000038000081A400000000000000000000000167FBDA05000001FE000000000000000000000000000000000000006500000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecKeyStoreKeyPairsCreateDataSecretInfo.md# OpenUnisonSpecKeyStoreKeyPairsCreateDataSecretInfo

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**TypeOfSecret** | **string** |  | [optional] [default to null]
**CertName** | **string** |  | [optional] [default to null]
**KeyName** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000039000081A400000000000000000000000167FBDA05000002C8000000000000000000000000000000000000005500000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecKeyStoreKeyPairsKeys.md# OpenUnisonSpecKeyStoreKeyPairsKeys

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Name** | **string** |  | [optional] [default to null]
**TlsSecretName** | **string** |  | [optional] [default to null]
**ImportIntoKs** | **string** |  | [optional] [default to null]
**ReplaceIfExists** | **bool** |  | [optional] [default to null]
**CreateData** | [***OpenUnisonSpecKeyStoreKeyPairsCreateData**](OpenUnison_spec_key_store_key_pairs_create_data.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

0707010000003A000081A400000000000000000000000167FBDA05000001A7000000000000000000000000000000000000005300000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecKeyStoreStaticKeys.md# OpenUnisonSpecKeyStoreStaticKeys

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Name** | **string** |  | [optional] [default to null]
**Version** | **int32** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

0707010000003B000081A400000000000000000000000167FBDA05000001B1000000000000000000000000000000000000005C00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecKeyStoreTrustedCertificates.md# OpenUnisonSpecKeyStoreTrustedCertificates

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Name** | **string** |  | [optional] [default to null]
**PemData** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

0707010000003C000081A400000000000000000000000167FBDA05000001EF000000000000000000000000000000000000005900000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecKeyStoreUpdateController.md# OpenUnisonSpecKeyStoreUpdateController

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Image** | **string** |  | [optional] [default to null]
**Schedule** | **string** |  | [optional] [default to null]
**DaysToExpire** | **int32** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

0707010000003D000081A400000000000000000000000167FBDA05000002A8000000000000000000000000000000000000004800000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecMapping.md# OpenUnisonSpecMapping

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**EntityId** | **string** |  | [optional] [default to null]
**PostUrl** | **string** |  | [optional] [default to null]
**RedirectUrl** | **string** |  | [optional] [default to null]
**LogoutUrl** | **string** |  | [optional] [default to null]
**SigningCertAlias** | **string** |  | [optional] [default to null]
**EncryptionCertAlias** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

0707010000003E000081A400000000000000000000000167FBDA05000001D9000000000000000000000000000000000000004600000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecNames.md# OpenUnisonSpecNames

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Name** | **string** |  | [optional] [default to null]
**ServiceName** | **string** |  | [optional] [default to null]
**EnvVar** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

0707010000003F000081A400000000000000000000000167FBDA05000001DC000000000000000000000000000000000000004A00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecOpenshift.md# OpenUnisonSpecOpenshift

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Git** | [***OpenUnisonSpecOpenshiftGit**](OpenUnison_spec_openshift_git.md) |  | [optional] [default to null]
**BuilderImage** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000040000081A400000000000000000000000167FBDA05000001D8000000000000000000000000000000000000004D00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecOpenshiftGit.md# OpenUnisonSpecOpenshiftGit

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Repo** | **string** |  | [optional] [default to null]
**Branch** | **string** |  | [optional] [default to null]
**Dir** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000041000081A400000000000000000000000167FBDA0500000893000000000000000000000000000000000000005F00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecOpenunisonNetworkConfiguration.md# OpenUnisonSpecOpenunisonNetworkConfiguration

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**ForceToLowerCase** | **bool** |  | [optional] [default to null]
**OpenPort** | **int32** |  | [optional] [default to null]
**OpenExternalPort** | **int32** |  | [optional] [default to null]
**SecurePort** | **int32** |  | [optional] [default to null]
**SecureExternalPort** | **int32** |  | [optional] [default to null]
**LdapPort** | **int32** |  | [optional] [default to null]
**LdapsPort** | **int32** |  | [optional] [default to null]
**LdapsKeyName** | **string** |  | [optional] [default to null]
**ForceToSecure** | **bool** |  | [optional] [default to null]
**ActivemqDir** | **string** |  | [optional] [default to null]
**ClientAuth** | **string** |  | [optional] [default to null]
**AllowedClientNames** | **[]string** |  | [optional] [default to null]
**Ciphers** | **[]string** |  | [optional] [default to null]
**PathToDeployment** | **string** |  | [optional] [default to null]
**PathToEnvFile** | **string** |  | [optional] [default to null]
**SecureKeyAlias** | **string** |  | [optional] [default to null]
**AllowedTlsProtocols** | **[]string** |  | [optional] [default to null]
**QuartzDir** | **string** |  | [optional] [default to null]
**ContextRoot** | **string** |  | [optional] [default to null]
**DisableHttp2** | **bool** |  | [optional] [default to null]
**AllowUnEscapedChars** | **string** |  | [optional] [default to null]
**WelecomePages** | **[]string** |  | [optional] [default to null]
**ErrorPages** | [**[]OpenUnisonSpecOpenunisonNetworkConfigurationErrorPages**](OpenUnison_spec_openunison_network_configuration_error_pages.md) |  | [optional] [default to null]
**RedirectToContextRoot** | **bool** |  | [optional] [default to null]
**QueueConfiguration** | [***OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfiguration**](OpenUnison_spec_openunison_network_configuration_queue_configuration.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000042000081A400000000000000000000000167FBDA05000001BE000000000000000000000000000000000000006900000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecOpenunisonNetworkConfigurationErrorPages.md# OpenUnisonSpecOpenunisonNetworkConfigurationErrorPages

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Code** | **int32** |  | [optional] [default to null]
**Location** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000043000081A400000000000000000000000167FBDA05000004F5000000000000000000000000000000000000007100000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfiguration.md# OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfiguration

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**UseInternalQueue** | **bool** |  | [optional] [default to null]
**MaxProducers** | **int32** |  | [optional] [default to null]
**ConnectionFactory** | **string** |  | [optional] [default to null]
**MaxConsumers** | **int32** |  | [optional] [default to null]
**MaxSessionsPerConnection** | **int32** |  | [optional] [default to null]
**TaskQueueName** | **string** |  | [optional] [default to null]
**SmtpQueueName** | **string** |  | [optional] [default to null]
**EncryptionKeyName** | **string** |  | [optional] [default to null]
**NumQueues** | **int32** |  | [optional] [default to null]
**MultiTaskQueues** | **bool** |  | [optional] [default to null]
**KeepAliveMillis** | **int32** |  | [optional] [default to null]
**Params** | [**[]OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfigurationParams**](OpenUnison_spec_openunison_network_configuration_queue_configuration_params.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000044000081A400000000000000000000000167FBDA0500000208000000000000000000000000000000000000007700000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfigurationParams.md# OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfigurationParams

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Name** | **string** |  | [optional] [default to null]
**SourceType** | **string** |  | [optional] [default to null]
**Value** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000045000081A400000000000000000000000167FBDA05000001FF000000000000000000000000000000000000004E00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecSamlRemoteIdp.md# OpenUnisonSpecSamlRemoteIdp

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Source** | [***OpenUnisonSpecSource**](OpenUnison_spec_source.md) |  | [optional] [default to null]
**Mapping** | [***OpenUnisonSpecMapping**](OpenUnison_spec_mapping.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000046000081A400000000000000000000000167FBDA0500000197000000000000000000000000000000000000004700000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonSpecSource.md# OpenUnisonSpecSource

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Url** | **string** |  | [optional] [default to null]
**Xml** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000047000081A400000000000000000000000167FBDA0500000237000000000000000000000000000000000000004300000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonStatus.md# OpenUnisonStatus

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**Conditions** | [***OpenUnisonStatusConditions**](OpenUnison_status_conditions.md) |  | [optional] [default to null]
**Digest** | **string** |  | [optional] [default to null]
**IdpCertificateFingerprints** | [**ModelMap**](interface{}.md) |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000048000081A400000000000000000000000167FBDA05000001E8000000000000000000000000000000000000004D00000000openunison-control-0.0.13/openunisonmodel/docs/OpenUnisonStatusConditions.md# OpenUnisonStatusConditions

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**LastTransitionTime** | **string** |  | [optional] [default to null]
**Status** | **string** |  | [optional] [default to null]
**Type_** | **string** |  | [optional] [default to null]

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

07070100000049000081A400000000000000000000000167FBDA050000067F000000000000000000000000000000000000003600000000openunison-control-0.0.13/openunisonmodel/git_push.sh#!/bin/sh
# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
#
# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update"

git_user_id=$1
git_repo_id=$2
release_note=$3

if [ "$git_user_id" = "" ]; then
    git_user_id="GIT_USER_ID"
    echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
fi

if [ "$git_repo_id" = "" ]; then
    git_repo_id="GIT_REPO_ID"
    echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
fi

if [ "$release_note" = "" ]; then
    release_note="Minor update"
    echo "[INFO] No command line input provided. Set \$release_note to $release_note"
fi

# Initialize the local directory as a Git repository
git init

# Adds the files in the local repository and stages them for commit.
git add .

# Commits the tracked changes and prepares them to be pushed to a remote repository. 
git commit -m "$release_note"

# Sets the new remote
git_remote=`git remote`
if [ "$git_remote" = "" ]; then # git remote not defined

    if [ "$GIT_TOKEN" = "" ]; then
        echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
        git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git
    else
        git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git
    fi

fi

git pull origin master

# Pushes (Forces) the changes in the local repository up to the remote repository
echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git"
git push origin master 2>&1 | grep -v 'To https'

0707010000004A000081A400000000000000000000000167FBDA0500000141000000000000000000000000000000000000003F00000000openunison-control-0.0.13/openunisonmodel/model_open_unison.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnison struct {
	Spec *OpenUnisonSpec `json:"spec,omitempty"`
	Status *OpenUnisonStatus `json:"status,omitempty"`
}
0707010000004B000081A400000000000000000000000167FBDA0500000504000000000000000000000000000000000000004400000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpec struct {
	Image string `json:"image,omitempty"`
	Replicas int32 `json:"replicas,omitempty"`
	EnableActivemq bool `json:"enable_activemq,omitempty"`
	ActivemqImage string `json:"activemq_image,omitempty"`
	DestSecret string `json:"dest_secret,omitempty"`
	SourceSecret string `json:"source_secret,omitempty"`
	SecretData []string `json:"secret_data,omitempty"`
	MyvdConfigmap string `json:"myvd_configmap,omitempty"`
	Openshift *OpenUnisonSpecOpenshift `json:"openshift,omitempty"`
	Hosts []OpenUnisonSpecHosts `json:"hosts,omitempty"`
	DeploymentData *OpenUnisonSpecDeploymentData `json:"deployment_data,omitempty"`
	NonSecretData []OpenUnisonSpecAnnotations `json:"non_secret_data,omitempty"`
	OpenunisonNetworkConfiguration *OpenUnisonSpecOpenunisonNetworkConfiguration `json:"openunison_network_configuration,omitempty"`
	SamlRemoteIdp []OpenUnisonSpecSamlRemoteIdp `json:"saml_remote_idp,omitempty"`
	RunSql string `json:"run_sql,omitempty"`
	SqlCheckQuery string `json:"sql_check_query,omitempty"`
	KeyStore *OpenUnisonSpecKeyStore `json:"key_store,omitempty"`
}
0707010000004C000081A400000000000000000000000167FBDA050000013A000000000000000000000000000000000000005000000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_annotations.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecAnnotations struct {
	Name string `json:"name,omitempty"`
	Value string `json:"value,omitempty"`
}
0707010000004D000081A400000000000000000000000167FBDA05000002B5000000000000000000000000000000000000005400000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_deployment_data.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecDeploymentData struct {
	TokenrequestApi *OpenUnisonSpecDeploymentDataTokenrequestApi `json:"tokenrequest_api,omitempty"`
	ReadinessProbeCommand []string `json:"readiness_probe_command,omitempty"`
	LivenessProbeCommand []string `json:"liveness_probe_command,omitempty"`
	NodeSelectors []OpenUnisonSpecAnnotations `json:"node_selectors,omitempty"`
	PullSecret string `json:"pull_secret,omitempty"`
	Resources *OpenUnisonSpecDeploymentDataResources `json:"resources,omitempty"`
}
0707010000004E000081A400000000000000000000000167FBDA05000001A0000000000000000000000000000000000000005E00000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_deployment_data_resources.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecDeploymentDataResources struct {
	Requests *OpenUnisonSpecDeploymentDataResourcesRequests `json:"requests,omitempty"`
	Limits *OpenUnisonSpecDeploymentDataResourcesRequests `json:"limits,omitempty"`
}
0707010000004F000081A400000000000000000000000167FBDA050000014E000000000000000000000000000000000000006700000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_deployment_data_resources_requests.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecDeploymentDataResourcesRequests struct {
	Memory string `json:"memory,omitempty"`
	Cpu string `json:"cpu,omitempty"`
}
07070100000050000081A400000000000000000000000167FBDA0500000194000000000000000000000000000000000000006500000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_deployment_data_tokenrequest_api.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecDeploymentDataTokenrequestApi struct {
	Enabled bool `json:"enabled,omitempty"`
	Audience string `json:"audience,omitempty"`
	ExpirationSeconds int32 `json:"expirationSeconds,omitempty"`
}
07070100000051000081A400000000000000000000000167FBDA0500000200000000000000000000000000000000000000004A00000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_hosts.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecHosts struct {
	Names []OpenUnisonSpecNames `json:"names,omitempty"`
	IngressName string `json:"ingress_name,omitempty"`
	IngressType string `json:"ingress_type,omitempty"`
	SecretName string `json:"secret_name,omitempty"`
	Annotations []OpenUnisonSpecAnnotations `json:"annotations,omitempty"`
}
07070100000052000081A400000000000000000000000167FBDA0500000248000000000000000000000000000000000000004E00000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_key_store.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecKeyStore struct {
	UpdateController *OpenUnisonSpecKeyStoreUpdateController `json:"update_controller,omitempty"`
	StaticKeys []OpenUnisonSpecKeyStoreStaticKeys `json:"static_keys,omitempty"`
	TrustedCertificates []OpenUnisonSpecKeyStoreTrustedCertificates `json:"trusted_certificates,omitempty"`
	KeyPairs *OpenUnisonSpecKeyStoreKeyPairs `json:"key_pairs,omitempty"`
}
07070100000053000081A400000000000000000000000167FBDA0500000194000000000000000000000000000000000000005800000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_key_store_key_pairs.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecKeyStoreKeyPairs struct {
	CreateKeypairTemplate []OpenUnisonSpecAnnotations `json:"create_keypair_template,omitempty"`
	Keys []OpenUnisonSpecKeyStoreKeyPairsKeys `json:"keys,omitempty"`
}
07070100000054000081A400000000000000000000000167FBDA050000033D000000000000000000000000000000000000006400000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_key_store_key_pairs_create_data.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecKeyStoreKeyPairsCreateData struct {
	TargetNamespace string `json:"target_namespace,omitempty"`
	SignByK8sCa bool `json:"sign_by_k8s_ca,omitempty"`
	ServerName string `json:"server_name,omitempty"`
	SubjectAlternativeNames []string `json:"subject_alternative_names,omitempty"`
	KeySize int32 `json:"key_size,omitempty"`
	CaCert bool `json:"ca_cert,omitempty"`
	DeletePodsLabels []string `json:"delete_pods_labels,omitempty"`
	PatchInfo *OpenUnisonSpecKeyStoreKeyPairsCreateDataPatchInfo `json:"patch_info,omitempty"`
	SecretInfo *OpenUnisonSpecKeyStoreKeyPairsCreateDataSecretInfo `json:"secret_info,omitempty"`
}
07070100000055000081A400000000000000000000000167FBDA0500000163000000000000000000000000000000000000006F00000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_key_store_key_pairs_create_data_patch_info.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecKeyStoreKeyPairsCreateDataPatchInfo struct {
	Url string `json:"url,omitempty"`
	AnnotationName string `json:"annotation_name,omitempty"`
}
07070100000056000081A400000000000000000000000167FBDA0500000198000000000000000000000000000000000000007000000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_key_store_key_pairs_create_data_secret_info.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecKeyStoreKeyPairsCreateDataSecretInfo struct {
	TypeOfSecret string `json:"type_of_secret,omitempty"`
	CertName string `json:"cert_name,omitempty"`
	KeyName string `json:"key_name,omitempty"`
}
07070100000057000081A400000000000000000000000167FBDA050000021C000000000000000000000000000000000000005D00000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_key_store_key_pairs_keys.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecKeyStoreKeyPairsKeys struct {
	Name string `json:"name,omitempty"`
	TlsSecretName string `json:"tls_secret_name,omitempty"`
	ImportIntoKs string `json:"import_into_ks,omitempty"`
	ReplaceIfExists bool `json:"replace_if_exists,omitempty"`
	CreateData *OpenUnisonSpecKeyStoreKeyPairsCreateData `json:"create_data,omitempty"`
}
07070100000058000081A400000000000000000000000167FBDA0500000144000000000000000000000000000000000000005A00000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_key_store_static_keys.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecKeyStoreStaticKeys struct {
	Name string `json:"name,omitempty"`
	Version int32 `json:"version,omitempty"`
}
07070100000059000081A400000000000000000000000167FBDA050000014F000000000000000000000000000000000000006300000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_key_store_trusted_certificates.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecKeyStoreTrustedCertificates struct {
	Name string `json:"name,omitempty"`
	PemData string `json:"pem_data,omitempty"`
}
0707010000005A000081A400000000000000000000000167FBDA0500000185000000000000000000000000000000000000006000000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_key_store_update_controller.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecKeyStoreUpdateController struct {
	Image string `json:"image,omitempty"`
	Schedule string `json:"schedule,omitempty"`
	DaysToExpire int32 `json:"days_to_expire,omitempty"`
}
0707010000005B000081A400000000000000000000000167FBDA050000022C000000000000000000000000000000000000004C00000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_mapping.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecMapping struct {
	EntityId string `json:"entity_id,omitempty"`
	PostUrl string `json:"post_url,omitempty"`
	RedirectUrl string `json:"redirect_url,omitempty"`
	LogoutUrl string `json:"logout_url,omitempty"`
	SigningCertAlias string `json:"signing_cert_alias,omitempty"`
	EncryptionCertAlias string `json:"encryption_cert_alias,omitempty"`
}
0707010000005C000081A400000000000000000000000167FBDA050000016B000000000000000000000000000000000000004A00000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_names.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecNames struct {
	Name string `json:"name,omitempty"`
	ServiceName string `json:"service_name,omitempty"`
	EnvVar string `json:"env_var,omitempty"`
}
0707010000005D000081A400000000000000000000000167FBDA050000015A000000000000000000000000000000000000004E00000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_openshift.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecOpenshift struct {
	Git *OpenUnisonSpecOpenshiftGit `json:"git,omitempty"`
	BuilderImage string `json:"builder_image,omitempty"`
}
0707010000005E000081A400000000000000000000000167FBDA0500000160000000000000000000000000000000000000005200000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_openshift_git.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecOpenshiftGit struct {
	Repo string `json:"repo,omitempty"`
	Branch string `json:"branch,omitempty"`
	Dir string `json:"dir,omitempty"`
}
0707010000005F000081A400000000000000000000000167FBDA05000006F9000000000000000000000000000000000000006500000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_openunison_network_configuration.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecOpenunisonNetworkConfiguration struct {
	ForceToLowerCase bool `json:"force_to_lower_case,omitempty"`
	OpenPort int32 `json:"open_port,omitempty"`
	OpenExternalPort int32 `json:"open_external_port,omitempty"`
	SecurePort int32 `json:"secure_port,omitempty"`
	SecureExternalPort int32 `json:"secure_external_port,omitempty"`
	LdapPort int32 `json:"ldap_port,omitempty"`
	LdapsPort int32 `json:"ldaps_port,omitempty"`
	LdapsKeyName string `json:"ldaps_key_name,omitempty"`
	ForceToSecure bool `json:"force_to_secure,omitempty"`
	ActivemqDir string `json:"activemq_dir,omitempty"`
	ClientAuth string `json:"client_auth,omitempty"`
	AllowedClientNames []string `json:"allowed_client_names,omitempty"`
	Ciphers []string `json:"ciphers,omitempty"`
	PathToDeployment string `json:"path_to_deployment,omitempty"`
	PathToEnvFile string `json:"path_to_env_file,omitempty"`
	SecureKeyAlias string `json:"secure_key_alias,omitempty"`
	AllowedTlsProtocols []string `json:"allowed_tls_protocols,omitempty"`
	QuartzDir string `json:"quartz_dir,omitempty"`
	ContextRoot string `json:"context_root,omitempty"`
	DisableHttp2 bool `json:"disable_http2,omitempty"`
	AllowUnEscapedChars string `json:"allow_un_escaped_chars,omitempty"`
	WelecomePages []string `json:"welecome_pages,omitempty"`
	ErrorPages []OpenUnisonSpecOpenunisonNetworkConfigurationErrorPages `json:"error_pages,omitempty"`
	RedirectToContextRoot bool `json:"redirect_to_context_root,omitempty"`
	QueueConfiguration *OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfiguration `json:"queue_configuration,omitempty"`
}
07070100000060000081A400000000000000000000000167FBDA050000015C000000000000000000000000000000000000007100000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_openunison_network_configuration_error_pages.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecOpenunisonNetworkConfigurationErrorPages struct {
	Code int32 `json:"code,omitempty"`
	Location string `json:"location,omitempty"`
}
07070100000061000081A400000000000000000000000167FBDA050000040B000000000000000000000000000000000000007900000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_openunison_network_configuration_queue_configuration.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfiguration struct {
	UseInternalQueue bool `json:"use_internal_queue,omitempty"`
	MaxProducers int32 `json:"max_producers,omitempty"`
	ConnectionFactory string `json:"connection_factory,omitempty"`
	MaxConsumers int32 `json:"max_consumers,omitempty"`
	MaxSessionsPerConnection int32 `json:"max_sessions_per_connection,omitempty"`
	TaskQueueName string `json:"task_queue_name,omitempty"`
	SmtpQueueName string `json:"smtp_queue_name,omitempty"`
	EncryptionKeyName string `json:"encryption_key_name,omitempty"`
	NumQueues int32 `json:"num_queues,omitempty"`
	MultiTaskQueues bool `json:"multi_task_queues,omitempty"`
	KeepAliveMillis int32 `json:"keep_alive_millis,omitempty"`
	Params []OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfigurationParams `json:"params,omitempty"`
}
07070100000062000081A400000000000000000000000167FBDA0500000197000000000000000000000000000000000000008000000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_openunison_network_configuration_queue_configuration_params.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecOpenunisonNetworkConfigurationQueueConfigurationParams struct {
	Name string `json:"name,omitempty"`
	SourceType string `json:"source_type,omitempty"`
	Value string `json:"value,omitempty"`
}
07070100000063000081A400000000000000000000000167FBDA0500000163000000000000000000000000000000000000005400000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_saml_remote_idp.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecSamlRemoteIdp struct {
	Source *OpenUnisonSpecSource `json:"source,omitempty"`
	Mapping *OpenUnisonSpecMapping `json:"mapping,omitempty"`
}
07070100000064000081A400000000000000000000000167FBDA050000012F000000000000000000000000000000000000004B00000000openunison-control-0.0.13/openunisonmodel/model_open_unison_spec_source.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonSpecSource struct {
	Url string `json:"url,omitempty"`
	Xml string `json:"xml,omitempty"`
}
07070100000065000081A400000000000000000000000167FBDA0500000227000000000000000000000000000000000000004600000000openunison-control-0.0.13/openunisonmodel/model_open_unison_status.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type Model struct{}
type ModelMap map[string]Model

type OpenUnisonStatus struct {
	Conditions                 *OpenUnisonStatusConditions `json:"conditions,omitempty"`
	Digest                     string                      `json:"digest,omitempty"`
	IdpCertificateFingerprints ModelMap                    `json:"idpCertificateFingerprints,omitempty"`
}
07070100000066000081A400000000000000000000000167FBDA050000017F000000000000000000000000000000000000005100000000openunison-control-0.0.13/openunisonmodel/model_open_unison_status_conditions.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

type OpenUnisonStatusConditions struct {
	LastTransitionTime string `json:"lastTransitionTime,omitempty"`
	Status string `json:"status,omitempty"`
	Type_ string `json:"type,omitempty"`
}
07070100000067000081A400000000000000000000000167FBDA05000004B7000000000000000000000000000000000000003600000000openunison-control-0.0.13/openunisonmodel/response.go/*
 * OpenUnison CRD
 *
 * OpenUnison ScaleJS Register API
 *
 * API version: v6
 * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
 */
package openunisonmodel

import (
	"net/http"
)

type APIResponse struct {
	*http.Response `json:"-"`
	Message        string `json:"message,omitempty"`
	// Operation is the name of the swagger operation.
	Operation string `json:"operation,omitempty"`
	// RequestURL is the request URL. This value is always available, even if the
	// embedded *http.Response is nil.
	RequestURL string `json:"url,omitempty"`
	// Method is the HTTP method used for the request.  This value is always
	// available, even if the embedded *http.Response is nil.
	Method string `json:"method,omitempty"`
	// Payload holds the contents of the response body (which may be nil or empty).
	// This is provided here as the raw response.Body() reader will have already
	// been drained.
	Payload []byte `json:"-"`
}

func NewAPIResponse(r *http.Response) *APIResponse {

	response := &APIResponse{Response: r}
	return response
}

func NewAPIResponseWithError(errorMessage string) *APIResponse {

	response := &APIResponse{Message: errorMessage}
	return response
}
07070100000068000081ED00000000000000000000000167FBDA0500000637000000000000000000000000000000000000002500000000openunison-control-0.0.13/ouctl.yamlapiVersion: krew.googlecontainertools.github.com/v1alpha2
kind: Plugin
metadata:
  name: ouctl
spec:
  version: "v_VERSION_"
  homepage: https://github.com/tremolosecurity/openunison-control
  shortDescription: "Deploy OpenUnison for authentication and automation"
  description: Deploys OpenUnison, see https://openunison.github.io/deployauth/ for details
  platforms:
  - selector:
      matchLabels:
        os: darwin
        arch: amd64
    uri: https://nexus.tremolo.io/repository/_REPO_/ouctl-_VERSION_-macos.zip
    sha256: _MAC_SHA_
    files:
    - from: "ouctl"
      to: "ouctl"
    - from: "LICENSE"
      to: "LICENSE"
    bin: ouctl
  - selector:
        matchLabels:
          os: darwin
          arch: arm64
    uri: https://nexus.tremolo.io/repository/_REPO_/ouctl-_VERSION_-macos-arm64.zip
    sha256: _MAC_ARM64_SHA_
    files:
    - from: "ouctl"
      to: "ouctl"
    - from: "LICENSE"
      to: "LICENSE"
    bin: ouctl
  - selector:
      matchExpressions:
      - key: "os"
        operator: "In"
        values:
        - linux
    uri: https://nexus.tremolo.io/repository/_REPO_/ouctl-_VERSION_-linux.zip
    sha256: _LINUX_SHA_
    files:
    - from: "ouctl"
      to: "ouctl"
    - from: "LICENSE"
      to: "LICENSE"
    bin: ouctl
  - selector:
      matchExpressions:
      - key: "os"
        operator: "In"
        values:
        - windows
    uri: https://nexus.tremolo.io/repository/_REPO_/ouctl-_VERSION_-win.zip
    sha256: _WIN_SHA_
    files:
    - from: "ouctl.exe"
      to: "ouctl.exe"
    - from: "LICENSE"
      to: "LICENSE"
    bin: ouctl.exe07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!470 blocks
openSUSE Build Service is sponsored by