From f8d0a56bdb155811004cd660abf504b863d4be4f Mon Sep 17 00:00:00 2001 From: andrewlecuyer <43458182+andrewlecuyer@users.noreply.github.com> Date: Tue, 13 Oct 2020 08:30:08 -0500 Subject: [PATCH 001/129] PGBACKREST_REPO_TYPE to PGBACKREST_REPO1_TYPE Changes PGBACKREST_REPO_TYPE to PGBACKREST_REPO1_TYPE in the pgbackrest-env-vars.json template as used to define pgBackRest environment variables for PG deployments, pgBackRest repository deployments, database bootstrap jobs and database restore jobs. This prevents duplicate pgBackRest "repo type" environment variables from being set when the environment is being set to run a 'pgbackrest' command within the 'crunchy-postgres-ha' container (specifically using the pgbackrest-set-env.sh script). Issue: #1953 --- .../pgo-operator/files/pgo-configs/pgbackrest-env-vars.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgbackrest-env-vars.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgbackrest-env-vars.json index fcf64b9679..8391309154 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgbackrest-env-vars.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgbackrest-env-vars.json @@ -39,7 +39,7 @@ "value": "{{.PgbackrestPGPort}}" }, { - "name": "PGBACKREST_REPO_TYPE", + "name": "PGBACKREST_REPO1_TYPE", "value": "{{.PgbackrestRepo1Type}}" }, { From d27676c587d0eaf4f67457c68e81498bbfeb19fa Mon Sep 17 00:00:00 2001 From: andrewlecuyer <43458182+andrewlecuyer@users.noreply.github.com> Date: Tue, 13 Oct 2020 08:31:04 -0500 Subject: [PATCH 002/129] Logger no Longer Defaults to "debug" Log Level The logger utilized by the various Go applications comprising the PostgreSQL Operator no longer defaults to a "debug" logging level. Instead, by default the "info" logging level will be utilized (per the default set by the Logrus logging package), and the "debug" log level will now only be set if the 'CRUNCHY_DEBUG' environment variable is set to 'true'. Issue: [ch9476] --- internal/logging/loglib.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/internal/logging/loglib.go b/internal/logging/loglib.go index c109d435f5..b443e47b4d 100644 --- a/internal/logging/loglib.go +++ b/internal/logging/loglib.go @@ -88,7 +88,4 @@ func CrunchyLogger(logDetails LogValues) { // Output to stdout instead of the default stderr // Can be any io.Writer, see below for File example log.SetOutput(os.Stdout) - - // Only log the debug severity or above. - log.SetLevel(log.DebugLevel) } From f7ef47342d51fcb1598cdd8cc13cfad2aca44ddc Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 15 Oct 2020 17:06:11 -0400 Subject: [PATCH 003/129] Add clarifying comment about the API server root URL Clearly Indicate in the documentation that this URL should not end in a `/`. Issue: #807 --- docs/content/installation/configuration.md | 2 +- docs/content/pgo-client/_index.md | 4 ++-- pgo/cmd/root.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/content/installation/configuration.md b/docs/content/installation/configuration.md index 1a09b4afaa..e3d535f2ba 100644 --- a/docs/content/installation/configuration.md +++ b/docs/content/installation/configuration.md @@ -58,7 +58,7 @@ Operator. | `pgo_admin_role_name` | pgoadmin | **Required** | Sets the name of the PostgreSQL Operator role that is utilized for administrative operations performed by the PostgreSQL Operator. | | `pgo_admin_username` | admin | **Required** | Configures the pgo administrator username. | | `pgo_apiserver_port` | 8443 | | Set to configure the port used by the Crunchy PostgreSQL Operator apiserver. | -| `pgo_apiserver_url` | https://postgres-operator | | Sets the `pgo_apiserver_url` for the `pgo-client` deployment. | +| `pgo_apiserver_url` | https://postgres-operator | | Sets the `pgo_apiserver_url` for the `pgo-client` deployment. Note that the URL should **not** end in a `/`. | | `pgo_client_cert_secret` | pgo.tls | | Sets the secret that the `pgo-client` will use when connecting to the PostgreSQL Operator. | | `pgo_client_container_install` | false | | Run the `pgo-client` deployment with the PostgreSQL Operator. | | `pgo_client_install` | true | | Enable to download the `pgo` client binary as part of the Ansible install | diff --git a/docs/content/pgo-client/_index.md b/docs/content/pgo-client/_index.md index 99c1040882..b155e3a3e8 100644 --- a/docs/content/pgo-client/_index.md +++ b/docs/content/pgo-client/_index.md @@ -134,7 +134,7 @@ There are several global flags available to the `pgo` client. | Flag | Description | | :-- | :-- | -| `--apiserver-url` | The URL for the PostgreSQL Operator apiserver that will process the request from the pgo client. | +| `--apiserver-url` | The URL for the PostgreSQL Operator apiserver that will process the request from the pgo client. Note that the URL should **not** end in a `/`. | | `--debug` | Enable additional output for debugging. | | `--disable-tls` | Disable TLS authentication to the Postgres Operator. | | `--exclude-os-trust` | Exclude CA certs from OS default trust store. | @@ -156,7 +156,7 @@ client. | :-- | :-- | | `EXCLUDE_OS_TRUST` | Exclude CA certs from OS default trust store. | | `GENERATE_BASH_COMPLETION` | If set, will allow `pgo` to leverage "bash completion" to help complete commands as they are typed. | -| `PGO_APISERVER_URL` | The URL for the PostgreSQL Operator apiserver that will process the request from the pgo client. | +| `PGO_APISERVER_URL` | The URL for the PostgreSQL Operator apiserver that will process the request from the pgo client. Note that the URL should **not** end in a `/`. | | `PGO_CA_CERT` | The CA certificate file path for authenticating to the PostgreSQL Operator apiserver. | | `PGO_CLIENT_CERT` | The client certificate file path for authenticating to the PostgreSQL Operator apiserver. | | `PGO_CLIENT_KEY` | The client key file path for authenticating to the PostgreSQL Operator apiserver. | diff --git a/pgo/cmd/root.go b/pgo/cmd/root.go index 075a9f13e8..ec3cdd5f32 100644 --- a/pgo/cmd/root.go +++ b/pgo/cmd/root.go @@ -61,7 +61,7 @@ func init() { defExclOSTrust := (runtime.GOOS == "windows") RootCmd.PersistentFlags().StringVarP(&Namespace, "namespace", "n", "", "The namespace to use for pgo requests.") - RootCmd.PersistentFlags().StringVar(&APIServerURL, "apiserver-url", "", "The URL for the PostgreSQL Operator apiserver that will process the request from the pgo client.") + RootCmd.PersistentFlags().StringVar(&APIServerURL, "apiserver-url", "", "The URL for the PostgreSQL Operator apiserver that will process the request from the pgo client. Note that the URL should **not** end in a `/`.") RootCmd.PersistentFlags().StringVar(&PGO_CA_CERT, "pgo-ca-cert", "", "The CA Certificate file path for authenticating to the PostgreSQL Operator apiserver.") RootCmd.PersistentFlags().StringVar(&PGO_CLIENT_KEY, "pgo-client-key", "", "The Client Key file path for authenticating to the PostgreSQL Operator apiserver.") RootCmd.PersistentFlags().StringVar(&PGO_CLIENT_CERT, "pgo-client-cert", "", "The Client Certificate file path for authenticating to the PostgreSQL Operator apiserver.") From f2eaf5f3bdbc8287bec682692d6c59c1ec070683 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Sat, 17 Oct 2020 23:06:20 +0000 Subject: [PATCH 004/129] Recreate All Database PVCs on PG Cluster Restore All database PVCs are now removed and then recreated when restoring a PostgreSQL cluster. Therefore, in addition to recreating the PVCs for all PGDATA volumes across all primary and replica databases comprising the cluster, any external WAL and/or tablespace volumes are now recreated as well. This ensures proper restore behavior when restoring clusters utilizing external WAL and/or tablespace volumes. Issue: #1973 Issue: [ch9568] --- internal/operator/backrest/restore.go | 71 +++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/internal/operator/backrest/restore.go b/internal/operator/backrest/restore.go index 9cb0ebae1c..97b6449dd2 100644 --- a/internal/operator/backrest/restore.go +++ b/internal/operator/backrest/restore.go @@ -36,6 +36,13 @@ import ( "k8s.io/apimachinery/pkg/util/wait" ) +const ( + // tablespacePVCSuffixPattern represents the pattern of the suffix for a tablespace PVC name + tablespacePVCSuffixPattern = "%s-tablespace-" + // walPVCPattern represents the pattern of a WAL PVC name + walPVCPattern = "%s-wal" +) + // restoreTargetRegex defines a regex to detect if a restore target has been specified // for pgBackRest using the '--target' option var restoreTargetRegex = regexp.MustCompile("--target(=| +)") @@ -168,24 +175,31 @@ func PrepareClusterForRestore(clientset kubeapi.Interface, cluster *crv1.Pgclust } log.Debugf("restore workflow: deleted all existing jobs for cluster %s", clusterName) + // find all database PVCs for the entire PostgreSQL cluster. Includes the PVCs for all PGDATA + // volumes, as well as the PVCs for any WAL and/or tablespace volumes + databasePVCList, err := getPGDatabasePVCNames(clientset, replicas, clusterName, namespace) + if err != nil { + return nil, err + } + log.Debugf("restore workflow: found PVCs %v for cluster %s", databasePVCList, clusterName) + // delete all PostgreSQL PVCs (the primary and all replica PVCs) - for _, deployment := range pgInstances.Items { - err := clientset. - CoreV1().PersistentVolumeClaims(namespace). - Delete(deployment.GetName(), &metav1.DeleteOptions{}) - if err != nil && !kerrors.IsNotFound(err) { + for _, pvcName := range databasePVCList { + err := clientset.CoreV1().PersistentVolumeClaims(namespace). + Delete(pvcName, &metav1.DeleteOptions{}) + if err != nil { return nil, err } - log.Debugf("restore workflow: deleted primary or replica PVC %s", deployment.GetName()) + log.Debugf("restore workflow: deleted primary or replica PVC %s", pvcName) } // Wait for all PG PVCs to be removed. If unable to verify that all PVCs have been - // removed, then the restore cannot proceed the function returns. + // removed, then the restore cannot proceed and the function returns. if err := wait.Poll(time.Second/2, time.Minute*3, func() (bool, error) { notFound := true - for _, deployment := range pgInstances.Items { + for _, pvcName := range databasePVCList { if _, err := clientset.CoreV1().PersistentVolumeClaims(namespace). - Get(deployment.GetName(), metav1.GetOptions{}); err == nil { + Get(pvcName, metav1.GetOptions{}); err == nil { notFound = false } } @@ -267,3 +281,42 @@ func PublishRestore(id, clusterName, username, namespace string) { } } + +// getPGDatabasePVCNames returns the names of all PostgreSQL database PVCs for a specific +// PostgreSQL cluster. This includes the PVCs for the PGDATA volumes for all database +// instances comprising the cluster, in addition to any additional volumes used by those +// instances, e.g. PVCs for external WAL and/or tablespace volumes. +func getPGDatabasePVCNames(clientset kubeapi.Interface, replicas *crv1.PgreplicaList, + clusterName, namespace string) ([]string, error) { + + // create a slice with the names of all database instances in the cluster. Even though the + // original primary database (with a name matching the cluster name) might no longer exist, + // add the cluster name to this list in the event that it does, along with the names of any + // pgreplica's. + instances := []string{clusterName} + for _, replica := range replicas.Items { + instances = append(instances, replica.GetName()) + } + + // find all current PVCs for the cluster + clusterPVCList, err := clientset.CoreV1().PersistentVolumeClaims(namespace). + List(metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", config.LABEL_PG_CLUSTER, clusterName), + }) + if err != nil { + return nil, err + } + + var databasePVCList []string + for _, instance := range instances { + for _, clusterPVC := range clusterPVCList.Items { + pvcName := clusterPVC.GetName() + if pvcName == instance || pvcName == fmt.Sprintf(walPVCPattern, instance) || + strings.HasPrefix(pvcName, fmt.Sprintf(tablespacePVCSuffixPattern, instance)) { + databasePVCList = append(databasePVCList, pvcName) + } + } + } + + return databasePVCList, nil +} From da50cb27cead196284c00733ce70cde9012e9b10 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Wed, 21 Oct 2020 22:06:25 +0000 Subject: [PATCH 005/129] Remove Invalid pgcluster Already Processed Checks Within the pgcluster controller, the check for an existing Kubernetes Deployment matching the name of the pgcluster, as well as the check to determine whether or not a pgcluster custom resource is in a 'processed' status prior to enqueuing it from the pgcluster controller's 'onAdd' function, have been removed, since both are no longer valid methods for determining whether or not to process a pgcluster. For instance, a Deployment matching the pgcluster name (i.e. the original primary for the cluster) might no longer exist if it was since scaled down and removed, while the 'processed' status does not properly indicate whether or not the various Kubernetes resources (e.g. Deployments) for the initial primary utilized to bootstrap the cluster have been created, nor does it properly indicate whether or not the PG cluster has been fully initialized. Issue: [ch9574] --- .../pgcluster/pgclustercontroller.go | 34 ++++--------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/internal/controller/pgcluster/pgclustercontroller.go b/internal/controller/pgcluster/pgclustercontroller.go index a3d0973906..f0b83607ad 100644 --- a/internal/controller/pgcluster/pgclustercontroller.go +++ b/internal/controller/pgcluster/pgclustercontroller.go @@ -17,7 +17,6 @@ limitations under the License. import ( "encoding/json" - "fmt" "io/ioutil" "reflect" "strconv" @@ -48,22 +47,11 @@ type Controller struct { // onAdd is called when a pgcluster is added func (c *Controller) onAdd(obj interface{}) { - cluster := obj.(*crv1.Pgcluster) - log.Debugf("[pgcluster Controller] ns %s onAdd %s", cluster.ObjectMeta.Namespace, cluster.ObjectMeta.SelfLink) - - //handle the case when the operator restarts and don't - //process already processed pgclusters - if cluster.Status.State == crv1.PgclusterStateProcessed { - log.Debug("pgcluster " + cluster.ObjectMeta.Name + " already processed") - return - } - key, err := cache.MetaNamespaceKeyFunc(obj) if err == nil { log.Debugf("cluster putting key in queue %s", key) c.Queue.Add(key) } - } // RunWorker is a long-running function that will continually call the @@ -106,17 +94,6 @@ func (c *Controller) processNextItem() bool { // parallel. defer c.Queue.Done(key) - // Invoke the method containing the business logic - // in this case, the de-dupe logic is to test whether a cluster - // deployment exists , if so, then we don't create another - _, err := c.Client.AppsV1().Deployments(keyNamespace).Get(keyResourceName, metav1.GetOptions{}) - - if err == nil { - log.Debugf("cluster add - dep already found, not creating again") - c.Queue.Forget(key) - return true - } - //get the pgcluster cluster, err := c.Client.CrunchydataV1().Pgclusters(keyNamespace).Get(keyResourceName, metav1.GetOptions{}) if err != nil { @@ -124,13 +101,14 @@ func (c *Controller) processNextItem() bool { c.Queue.Forget(key) // NB(cbandy): This should probably be a retry. return true } + log.Debugf("[pgcluster Controller] ns %s onAdd %s", cluster.ObjectMeta.Namespace, cluster.ObjectMeta.SelfLink) if cluster.Spec.Status == crv1.CompletedStatus || - cluster.Status.State == crv1.PgclusterStateBootstrapping { - errorMsg := fmt.Sprintf("pgcluster Contoller: onAdd event received for cluster %s but "+ - "will not process because it either has a 'completed' status or is currently in a "+ - "'bootstrapping' state", cluster.GetName()) - log.Warn(errorMsg) + cluster.Status.State == crv1.PgclusterStateBootstrapping || + cluster.Status.State == crv1.PgclusterStateInitialized { + log.Debugf("pgcluster Contoller: onAdd event received for cluster %s but "+ + "will not process because it either has a 'completed' status or is currently in an "+ + "'initialized' or 'bootstrapping' state", cluster.GetName()) return true } From fbe152c049356556c4e094920608d58199a2d77a Mon Sep 17 00:00:00 2001 From: tjmoore4 <42497036+tjmoore4@users.noreply.github.com> Date: Mon, 26 Oct 2020 09:58:34 -0400 Subject: [PATCH 006/129] pgo show backup Command Update Currently, the 'pgo show backup' functionality requires the Primary pod to be in a Ready state. This is not technically required because the relevant command is executed within the 'backrest-repo' pod. As such, this PR separates out the check for the Primary pod from the 'show backup' functionality so that the backup information can be shown regardless of the Primary pod's status. Issue: [ch9402] Issue: #1927 --- .../apiserver/backrestservice/backrestimpl.go | 86 +++++++++---------- 1 file changed, 40 insertions(+), 46 deletions(-) diff --git a/internal/apiserver/backrestservice/backrestimpl.go b/internal/apiserver/backrestservice/backrestimpl.go index 5f6d5644c5..5ce194a337 100644 --- a/internal/apiserver/backrestservice/backrestimpl.go +++ b/internal/apiserver/backrestservice/backrestimpl.go @@ -191,9 +191,9 @@ func CreateBackup(request *msgs.CreateBackrestBackupRequest, ns, pgouser string) } - //get pod name from cluster + // get pod name from cluster var podname string - podname, err = getPrimaryPodName(cluster, ns) + podname, err = getBackrestRepoPodName(cluster, ns) if err != nil { log.Error(err) @@ -202,6 +202,14 @@ func CreateBackup(request *msgs.CreateBackrestBackupRequest, ns, pgouser string) return resp } + // check if primary is ready + if err := isPrimaryReady(cluster, ns); err != nil { + log.Error(err) + resp.Status.Code = msgs.Error + resp.Status.Msg = err.Error() + return resp + } + jobName := "backrest-" + crv1.PgtaskBackrestBackup + "-" + clusterName log.Debugf("setting jobName to %s", jobName) @@ -254,30 +262,9 @@ func getBackupParams(identifier, clusterName, taskName, action, podName, contain return newInstance } -func getDeployName(cluster *crv1.Pgcluster, ns string) (string, error) { - var depName string - - selector := config.LABEL_PG_CLUSTER + "=" + cluster.Spec.Name + "," + config.LABEL_SERVICE_NAME + "=" + cluster.Spec.Name - - deps, err := apiserver.Clientset. - AppsV1().Deployments(ns). - List(metav1.ListOptions{LabelSelector: selector}) - if err != nil { - return depName, err - } - - if len(deps.Items) != 1 { - return depName, errors.New("error: deployment count is wrong for backrest backup " + cluster.Spec.Name) - } - for _, d := range deps.Items { - return d.Name, err - } - - return depName, errors.New("unknown error in backrest backup") -} - -func getPrimaryPodName(cluster *crv1.Pgcluster, ns string) (string, error) { - +// getBackrestRepoPodName goes through the pod list to identify the +// pgBackRest repo pod and then returns the pod name. +func getBackrestRepoPodName(cluster *crv1.Pgcluster, ns string) (string, error) { //look up the backrest-repo pod name selector := "pg-cluster=" + cluster.Spec.Name + ",pgo-backrest-repo=true" @@ -298,25 +285,6 @@ func getPrimaryPodName(cluster *crv1.Pgcluster, ns string) (string, error) { repopodName := repopods.Items[0].Name - primaryReady := false - - //make sure the primary pod is in the ready state - selector = config.LABEL_SERVICE_NAME + "=" + cluster.Spec.Name - - pods, err := apiserver.Clientset.CoreV1().Pods(ns).List(metav1.ListOptions{LabelSelector: selector}) - if err != nil { - return "", err - } - for _, p := range pods.Items { - if isPrimary(&p, cluster.Spec.Name) && isReady(&p) { - primaryReady = true - } - } - - if primaryReady == false { - return "", errors.New("primary pod is not in Ready state") - } - return repopodName, err } @@ -344,6 +312,32 @@ func isReady(pod *v1.Pod) bool { } +// isPrimaryReady goes through the pod list to first identify the +// Primary pod and, once identified, determine if it is in a +// ready state. If not, it returns an error, otherwise it returns +// a nil value +func isPrimaryReady(cluster *crv1.Pgcluster, ns string) error { + primaryReady := false + + selector := fmt.Sprintf("%s=%s,%s=%s", config.LABEL_PG_CLUSTER, cluster.Name, + config.LABEL_PGHA_ROLE, config.LABEL_PGHA_ROLE_PRIMARY) + + pods, err := apiserver.Clientset.CoreV1().Pods(ns).List(metav1.ListOptions{LabelSelector: selector}) + if err != nil { + return err + } + for _, p := range pods.Items { + if isPrimary(&p, cluster.Spec.Name) && isReady(&p) { + primaryReady = true + } + } + + if primaryReady == false { + return errors.New("primary pod is not in Ready state") + } + return nil +} + // ShowBackrest ... func ShowBackrest(name, selector, ns string) msgs.ShowBackrestResponse { var err error @@ -372,7 +366,7 @@ func ShowBackrest(name, selector, ns string) msgs.ShowBackrestResponse { log.Debugf("clusters found len is %d\n", len(clusterList.Items)) for _, c := range clusterList.Items { - podname, err := getPrimaryPodName(&c, ns) + podname, err := getBackrestRepoPodName(&c, ns) if err != nil { log.Error(err) From d98a35424d169abc9d5b5bfa916a843961e3ed76 Mon Sep 17 00:00:00 2001 From: tjmoore4 <42497036+tjmoore4@users.noreply.github.com> Date: Mon, 26 Oct 2020 11:52:12 -0400 Subject: [PATCH 007/129] Update standard image tag when using a GIS enabled cluster Currently, the image tag value used by GIS enabled pgclusters is being used when creating sidecontainers. Since the standard and GIS enable PostgreSQL containers use different tags, this causes an image pull error. This update takes the current image name and the image tag value stored in the pgcluster CRD and, if the image being used is the crunchy-postgres-gis-ha container with the corresponding tag, it uses an updated tag without the addition of the GIS version when provisioning sidecars containers for the cluster. Issue: [ch9393] Issue: #1749 --- internal/operator/cluster/pgadmin.go | 2 +- internal/operator/cluster/pgbouncer.go | 2 +- internal/operator/clusterutilities.go | 2 +- internal/util/util.go | 19 +++++++ internal/util/util_test.go | 75 ++++++++++++++++++++++++++ 5 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 internal/util/util_test.go diff --git a/internal/operator/cluster/pgadmin.go b/internal/operator/cluster/pgadmin.go index 86ea0129cc..c7170ce541 100644 --- a/internal/operator/cluster/pgadmin.go +++ b/internal/operator/cluster/pgadmin.go @@ -348,7 +348,7 @@ func createPgAdminDeployment(clientset kubernetes.Interface, cluster *crv1.Pgclu Name: pgAdminDeploymentName, ClusterName: cluster.Name, CCPImagePrefix: operator.Pgo.Cluster.CCPImagePrefix, - CCPImageTag: cluster.Spec.CCPImageTag, + CCPImageTag: util.GetStandardImageTag(cluster.Spec.CCPImage, cluster.Spec.CCPImageTag), DisableFSGroup: operator.Pgo.Cluster.DisableFSGroup, Port: defPgAdminPort, InitUser: defSetupUsername, diff --git a/internal/operator/cluster/pgbouncer.go b/internal/operator/cluster/pgbouncer.go index 7737198480..4b964d2aaf 100644 --- a/internal/operator/cluster/pgbouncer.go +++ b/internal/operator/cluster/pgbouncer.go @@ -554,7 +554,7 @@ func createPgBouncerDeployment(clientset kubernetes.Interface, cluster *crv1.Pgc Name: pgbouncerDeploymentName, ClusterName: cluster.Name, CCPImagePrefix: util.GetValueOrDefault(cluster.Spec.CCPImagePrefix, operator.Pgo.Cluster.CCPImagePrefix), - CCPImageTag: cluster.Spec.CCPImageTag, + CCPImageTag: util.GetStandardImageTag(cluster.Spec.CCPImage, cluster.Spec.CCPImageTag), Port: cluster.Spec.Port, PGBouncerConfigMap: util.GeneratePgBouncerConfigMapName(cluster.Name), PGBouncerSecret: util.GeneratePgBouncerSecretName(cluster.Name), diff --git a/internal/operator/clusterutilities.go b/internal/operator/clusterutilities.go index 42d97e336d..46d6cdc5ee 100644 --- a/internal/operator/clusterutilities.go +++ b/internal/operator/clusterutilities.go @@ -335,7 +335,7 @@ func GetBadgerAddon(clientset kubernetes.Interface, namespace string, cluster *c if cluster.Labels[config.LABEL_BADGER] == "true" { log.Debug("crunchy_badger was found as a label on cluster create") badgerTemplateFields := badgerTemplateFields{} - badgerTemplateFields.CCPImageTag = spec.CCPImageTag + badgerTemplateFields.CCPImageTag = util.GetStandardImageTag(spec.CCPImage, spec.CCPImageTag) badgerTemplateFields.BadgerTarget = pgbadger_target badgerTemplateFields.PGBadgerPort = spec.PGBadgerPort badgerTemplateFields.CCPImagePrefix = util.GetValueOrDefault(spec.CCPImagePrefix, Pgo.Cluster.CCPImagePrefix) diff --git a/internal/util/util.go b/internal/util/util.go index bff3802c63..094cec77f4 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "math/rand" + "regexp" "strings" "time" @@ -45,6 +46,10 @@ type JSONPatchOperation struct { Value interface{} `json:"value"` } +// gisImageTagRegex is a regular expression designed to match the standard image tag for +// the crunchy-postgres-gis-ha container +var gisImageTagRegex = regexp.MustCompile(`(.+-[\d|\.]+)-[\d|\.]+?(-[\d|\.]+.*)`) + func init() { rand.Seed(time.Now().UnixNano()) @@ -203,6 +208,20 @@ func GetSecretPassword(clientset kubernetes.Interface, db, suffix, Namespace str } +// GetStandardImageTag takes the current image name and the image tag value +// stored in the pgcluster CRD and, if the image being used is the +// crunchy-postgres-gis-ha container with the corresponding tag, it returns +// the tag without the addition of the GIS version. This tag value can then +// be used when provisioning containers using the standard containers tag. +func GetStandardImageTag(imageName, imageTag string) string { + + if imageName == "crunchy-postgres-gis-ha" && strings.Count(imageTag, "-") > 2 { + return gisImageTagRegex.ReplaceAllString(imageTag, "$1$2") + } + + return imageTag +} + // RandStringBytesRmndr ... func RandStringBytesRmndr(n int) string { b := make([]byte, n) diff --git a/internal/util/util_test.go b/internal/util/util_test.go new file mode 100644 index 0000000000..30d6d8b65d --- /dev/null +++ b/internal/util/util_test.go @@ -0,0 +1,75 @@ +package util + +import "testing" + +func TestGetStandardImageTag(t *testing.T) { + + assertCorrectMessage := func(t testing.TB, got, want string) { + t.Helper() + if got != want { + t.Errorf("got %q want %q", got, want) + } + } + + imageTagTests := []struct { + description string + imageName string + imageTag string + expected string + }{ + { + "image: crunchy-postgres-ha, tag: centos7-12.4-4.5.0", + "crunchy-postgres-ha", + "centos7-12.4-4.5.0", + "centos7-12.4-4.5.0", + }, { + "image: crunchy-postgres-gis-ha, tag: centos7-12.4-3.0-4.5.0", + "crunchy-postgres-gis-ha", + "centos7-12.4-3.0-4.5.0", + "centos7-12.4-4.5.0", + }, { + "image: crunchy-postgres-ha, tag: centos7-12.4-4.5.0-beta.1", + "crunchy-postgres-ha", + "centos7-12.4-4.5.0-beta.1", + "centos7-12.4-4.5.0-beta.1", + }, { + "image: crunchy-postgres-gis-ha, tag: centos7-12.4-3.0-4.5.0-beta.2", + "crunchy-postgres-gis-ha", + "centos7-12.4-3.0-4.5.0-beta.2", + "centos7-12.4-4.5.0-beta.2", + }, { + "image: crunchy-postgres-ha, tag: centos8-9.5.23-4.5.0-rc.1", + "crunchy-postgres-ha", + "centos8-9.5.23-4.5.0-rc.1", + "centos8-9.5.23-4.5.0-rc.1", + }, { + "image: crunchy-postgres-gis-ha, tag: centos8-9.5.23-2.4-4.5.0-rc.1", + "crunchy-postgres-gis-ha", + "centos8-9.5.23-2.4-4.5.0-rc.1", + "centos8-9.5.23-4.5.0-rc.1", + }, { + "image: crunchy-postgres-gis-ha, tag: centos8-13.0-3.0-4.5.0-rc.1", + "crunchy-postgres-gis-ha", + "centos8-13.0-3.0-4.5.0-rc.1", + "centos8-13.0-4.5.0-rc.1", + }, { + "image: crunchy-postgres-gis-ha, tag: centos8-custom123", + "crunchy-postgres-gis-ha", + "centos8-custom123", + "centos8-custom123", + }, { + "image: crunchy-postgres-gis-ha, tag: centos8-custom123-moreinfo-789", + "crunchy-postgres-gis-ha", + "centos8-custom123-moreinfo-789", + "centos8-custom123-moreinfo-789", + }, + } + + for _, itt := range imageTagTests { + t.Run(itt.description, func(t *testing.T) { + got := GetStandardImageTag(itt.imageName, itt.imageTag) + want := itt.expected + assertCorrectMessage(t, got, want) + }) + } +} From b68873e8fbabb771bfbe3322ed4f45884f09f53f Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 26 Oct 2020 18:04:52 -0400 Subject: [PATCH 008/129] Update logic for pgbouncer password modification on creation If the AddPgBouncer call is invoked as the Operator attempts to add a new pgBouncer and it is determined that a pgBouncer Secret already exists, do not attempt to update the password within PostgreSQL. This also ensures that an existing Secret storing the pgbouncer user credential is synchronized to be the password represented for the pgbouncer user in the database itself. Issue: [ch9457] --- internal/operator/cluster/pgbouncer.go | 38 ++++++++++++++++---------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/internal/operator/cluster/pgbouncer.go b/internal/operator/cluster/pgbouncer.go index 4b964d2aaf..4eaa54828c 100644 --- a/internal/operator/cluster/pgbouncer.go +++ b/internal/operator/cluster/pgbouncer.go @@ -156,15 +156,30 @@ func AddPgbouncer(clientset kubernetes.Interface, restconfig *rest.Config, clust } } - // set the password that will be used for the "pgbouncer" PostgreSQL account - pgBouncerPassword, err := generatePassword() - - if err != nil { - return err - } - // only attempt to set the password if the cluster is not in standby mode + // and the secret does not already exist. If GetPasswordFromSecret returns + // no errors, then we can assume that the Secret does not exist if !cluster.Spec.Standby { + secretName := util.GeneratePgBouncerSecretName(cluster.Name) + pgBouncerPassword, err := util.GetPasswordFromSecret(clientset, cluster.Namespace, secretName) + + if err != nil { + // set the password that will be used for the "pgbouncer" PostgreSQL account + newPassword, err := generatePassword() + + if err != nil { + return err + } + + pgBouncerPassword = newPassword + + // create the secret that pgbouncer will include the pgBouncer + // credentials + if err := createPgbouncerSecret(clientset, cluster, pgBouncerPassword); err != nil { + return err + } + } + // attempt to update the password in PostgreSQL, as this is how pgBouncer // will properly interface with PostgreSQL if err := setPostgreSQLPassword(clientset, restconfig, pod, cluster.Spec.Port, pgBouncerPassword); err != nil { @@ -178,12 +193,6 @@ func AddPgbouncer(clientset kubernetes.Interface, restconfig *rest.Config, clust return err } - // next, create the secret that pgbouncer will include the pgBouncer - // credentials - if err := createPgbouncerSecret(clientset, cluster, pgBouncerPassword); err != nil { - return err - } - // next, create the pgBouncer deployment if err := createPgBouncerDeployment(clientset, cluster); err != nil { return err @@ -227,7 +236,8 @@ func DeletePgbouncer(clientset kubernetes.Interface, restconfig *rest.Config, cl } // next, delete the various Kubernetes objects associated with the pgbouncer - // these include the Service, Deployment, and the pgBouncer secret + // these include the Service, Deployment, Secret and ConfigMap associated with + // pgbouncer // If these fail, we'll just pass through // // First, delete the Service and Deployment, which share the same naem From ca650eefec1394abdb705d8dbba713cc92f8e561 Mon Sep 17 00:00:00 2001 From: tjmoore4 <42497036+tjmoore4@users.noreply.github.com> Date: Thu, 29 Oct 2020 09:39:53 -0400 Subject: [PATCH 009/129] Update pgMonitor version to v4.4-RC7 Updates pgMonitor library references to v4.4-RC7. Issue: [ch9602] --- bin/get-pgmonitor.sh | 2 +- installers/metrics/ansible/roles/pgo-metrics/defaults/main.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/get-pgmonitor.sh b/bin/get-pgmonitor.sh index 6bfb720b3e..cfc178e77d 100755 --- a/bin/get-pgmonitor.sh +++ b/bin/get-pgmonitor.sh @@ -14,7 +14,7 @@ # limitations under the License. echo "Getting pgMonitor..." -PGMONITOR_COMMIT='v4.4-RC6' +PGMONITOR_COMMIT='v4.4-RC7' # pgMonitor Setup if [[ -d ${PGOROOT?}/tools/pgmonitor ]] diff --git a/installers/metrics/ansible/roles/pgo-metrics/defaults/main.yml b/installers/metrics/ansible/roles/pgo-metrics/defaults/main.yml index 600d57d6bf..775d6691f5 100644 --- a/installers/metrics/ansible/roles/pgo-metrics/defaults/main.yml +++ b/installers/metrics/ansible/roles/pgo-metrics/defaults/main.yml @@ -9,7 +9,7 @@ delete_metrics_namespace: "false" metrics_namespace: "pgo" metrics_image_pull_secret: "" metrics_image_pull_secret_manifest: "" -pgmonitor_version: "v4.4-RC6" +pgmonitor_version: "v4.4-RC7" alertmanager_configmap: "alertmanager-config" alertmanager_rules_configmap: "alertmanager-rules-config" From 12a62ce4d16e75417f60c85e094d490be8fdf260 Mon Sep 17 00:00:00 2001 From: tjmoore4 <42497036+tjmoore4@users.noreply.github.com> Date: Thu, 29 Oct 2020 09:41:52 -0400 Subject: [PATCH 010/129] Preserve cluster-level resources in a multi-Operator environment Currently, uninstalling an instance of the PostgreSQL Operator from one namespace will remove all Kubernetes/Openshift cluster- level resources as well. This impairs the functionality of any other Operators that may be installed. This update adds a check to see if there are any other PostgreSQL Operators installed on the cluster and, if so, adds a flag to skip the removal of cluster-level resources. Issue: [ch9389] --- .../roles/pgo-operator/tasks/cleanup.yml | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/installers/ansible/roles/pgo-operator/tasks/cleanup.yml b/installers/ansible/roles/pgo-operator/tasks/cleanup.yml index ffe9626c56..2f7925afd2 100644 --- a/installers/ansible/roles/pgo-operator/tasks/cleanup.yml +++ b/installers/ansible/roles/pgo-operator/tasks/cleanup.yml @@ -6,6 +6,20 @@ - uninstall - update +- name: Get number of Operator instances in this cluster + shell: | + {{ kubectl_or_oc }} get deployment --field-selector=metadata.name=postgres-operator --selector=vendor=crunchydata --all-namespaces -o name | wc -l + register: num_operators + tags: + - uninstall + - update + +- name: Set boolean for multi-operator environment + set_fact: multi_operator_env="{{ 'true' if num_operators.stdout | int > 1 else 'false' }}" + tags: + - uninstall + - update + - name: Find watched namespaces shell: | {{ kubectl_or_oc }} get namespaces -o json --selector=vendor=crunchydata,pgo-installation-name={{ pgo_installation_name }} @@ -152,7 +166,8 @@ tags: - uninstall - update - when: create_rbac|bool + when: not multi_operator_env|bool and + create_rbac|bool - name: Delete cluster-admin Cluster Role Binding for PGO Service Account command: "{{ kubectl_or_oc }} delete clusterrolebinding pgo-cluster-admin" @@ -161,7 +176,8 @@ tags: - uninstall - update - when: create_rbac|bool + when: not multi_operator_env|bool and + create_rbac|bool - name: Delete existing Cluster Roles shell: | @@ -173,7 +189,8 @@ tags: - uninstall - update - when: create_rbac|bool + when: not multi_operator_env|bool and + create_rbac|bool - name: Delete existing PGO Role Bindings (Watched Namespaces) shell: | @@ -233,6 +250,7 @@ pgpolicies.crunchydata.com pgreplicas.crunchydata.com pgtasks.crunchydata.com ignore_errors: yes no_log: false + when: not multi_operator_env|bool tags: uninstall - name: Remove Labels from Watched Namespaces @@ -276,7 +294,8 @@ file: state: absent path: "/usr/local/bin/pgo" - when: pgo_client_install == "true" + when: pgo_client_install == "true" and + not multi_operator_env|bool ignore_errors: yes no_log: false tags: uninstall From 8719ac7607f77c22edeb7b35d187f2c38a80edad Mon Sep 17 00:00:00 2001 From: tjmoore4 <42497036+tjmoore4@users.noreply.github.com> Date: Fri, 30 Oct 2020 16:19:24 -0400 Subject: [PATCH 011/129] Use autogenerated pgouser password if not set Currently, the PostgreSQL Operator requires a pgouser's password to be set during the installation process. This update allows for the password to be unset during installation, and, during Operator initialization, any pgouser that currently has an empty password will be given an autogenerated password, stored in the relevant pgouser secret. Issue: [ch9510] --- docs/content/installation/configuration.md | 2 +- .../templates/pgouser-admin.yaml.j2 | 6 +- .../roles/pgo-preflight/tasks/check_vars.yml | 1 - internal/apiserver/root.go | 59 ++++++++++++++++++- 4 files changed, 62 insertions(+), 6 deletions(-) diff --git a/docs/content/installation/configuration.md b/docs/content/installation/configuration.md index e3d535f2ba..ce097d2753 100644 --- a/docs/content/installation/configuration.md +++ b/docs/content/installation/configuration.md @@ -53,7 +53,7 @@ Operator. | `namespace_mode` | dynamic | | Determines which namespace permissions are assigned to the PostgreSQL Operator using a ClusterRole. Options: `dynamic`, `readonly`, and `disabled` | | `pgbadgerport` | 10000 | **Required** | Set to configure the default port used to connect to pgbadger. | | `pgo_add_os_ca_store` | false | **Required** | When true, includes system default certificate authorities. | -| `pgo_admin_password` | examplepassword | **Required** | Configures the pgo administrator password. | +| `pgo_admin_password` | examplepassword | | Configures the pgo administrator password. When blank, a random password is generated. | | `pgo_admin_perms` | * | **Required** | Sets the access control rules provided by the PostgreSQL Operator RBAC resources for the PostgreSQL Operator administrative account that is created by this installer. Defaults to allowing all of the permissions, which is represented with the * | | `pgo_admin_role_name` | pgoadmin | **Required** | Sets the name of the PostgreSQL Operator role that is utilized for administrative operations performed by the PostgreSQL Operator. | | `pgo_admin_username` | admin | **Required** | Configures the pgo administrator username. | diff --git a/installers/ansible/roles/pgo-operator/templates/pgouser-admin.yaml.j2 b/installers/ansible/roles/pgo-operator/templates/pgouser-admin.yaml.j2 index ca6d6eb4ed..c861fdc220 100644 --- a/installers/ansible/roles/pgo-operator/templates/pgouser-admin.yaml.j2 +++ b/installers/ansible/roles/pgo-operator/templates/pgouser-admin.yaml.j2 @@ -10,6 +10,6 @@ metadata: namespace: {{ pgo_operator_namespace }} type: Opaque data: - password: {{ pgo_admin_password | b64encode }} - username: {{ pgo_admin_username | b64encode }} - roles: {{ pgo_admin_role_name | b64encode }} + password: '{{ pgo_admin_password | b64encode }}' + username: '{{ pgo_admin_username | b64encode }}' + roles: '{{ pgo_admin_role_name | b64encode }}' diff --git a/installers/ansible/roles/pgo-preflight/tasks/check_vars.yml b/installers/ansible/roles/pgo-preflight/tasks/check_vars.yml index 3424c43151..e6d375affe 100644 --- a/installers/ansible/roles/pgo-preflight/tasks/check_vars.yml +++ b/installers/ansible/roles/pgo-preflight/tasks/check_vars.yml @@ -8,7 +8,6 @@ - pgo_operator_namespace - pgo_installation_name - pgo_admin_username - - pgo_admin_password - pgo_admin_role_name - pgo_admin_perms - ccp_image_prefix diff --git a/internal/apiserver/root.go b/internal/apiserver/root.go index 2ced3eaca7..7cd28033f2 100644 --- a/internal/apiserver/root.go +++ b/internal/apiserver/root.go @@ -31,9 +31,11 @@ import ( "github.com/crunchydata/postgres-operator/internal/kubeapi" "github.com/crunchydata/postgres-operator/internal/ns" "github.com/crunchydata/postgres-operator/internal/tlsutil" + "github.com/crunchydata/postgres-operator/internal/util" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) @@ -133,6 +135,11 @@ func Initialize() { initConfig() + // look through all the pgouser secrets in the Operator's + // namespace and set a generated password for any that currently + // have an empty password set + setRandomPgouserPasswords() + if err := setNamespaceOperatingMode(); err != nil { log.Error(err) os.Exit(2) @@ -160,7 +167,6 @@ func connectToKube() { } func initConfig() { - AuditFlag = Pgo.Pgo.Audit if AuditFlag { log.Info("audit flag is set to true") @@ -305,6 +311,7 @@ func Authn(perm string, w http.ResponseWriter, r *http.Request) (string, error) // this function currently encapsulates authorization as well, and this is // the call where we get the username to check the RBAC settings username, password, authOK := r.BasicAuth() + if AuditFlag { log.Infof("[audit] %s username=[%s] method=[%s] ip=[%s] ok=[%t] ", perm, username, r.Method, r.RemoteAddr, authOK) } @@ -500,6 +507,56 @@ func setNamespaceOperatingMode() error { return nil } +// setRandomPgouserPasswords looks through the pgouser secrets in the Operator's +// namespace. If any have an empty password, it generates a random password, +// Base64 encodes it, then stores it in the relevant PGO user's secret +func setRandomPgouserPasswords() { + ctx := context.TODO() + + selector := "pgo-pgouser=true,vendor=crunchydata" + secrets, err := Clientset.CoreV1().Secrets(PgoNamespace). + List(ctx, metav1.ListOptions{LabelSelector: selector}) + if err != nil { + log.Warnf("Could not get pgouser secrets in namespace: %s", PgoNamespace) + return + } + + for _, secret := range secrets.Items { + // check if password is set. if it is, continue. + if len(secret.Data["password"]) > 0 { + continue + } + + log.Infof("Password in pgouser secret %s for operator installation %s in namespace %s is empty. "+ + "Setting a generated password.", secret.Name, InstallationName, PgoNamespace) + + // generate the password using the default password length + generatedPassword, err := util.GeneratePassword(util.DefaultGeneratedPasswordLength) + + if err != nil { + log.Errorf("Could not generate password for pgouser secret %s for operator installation %s in "+ + "namespace %s", secret.Name, InstallationName, PgoNamespace) + continue + } + + // create the password patch + patch, err := kubeapi.NewMergePatch().Add("stringData", "password")(generatedPassword).Bytes() + + if err != nil { + log.Errorf("Could not generate password patch for pgouser secret %s for operator installation "+ + "%s in namespace %s", secret.Name, InstallationName, PgoNamespace) + continue + } + + // patch the pgouser secret with the new password + if _, err := Clientset.CoreV1().Secrets(PgoNamespace).Patch(ctx, secret.Name, types.MergePatchType, + patch, metav1.PatchOptions{}); err != nil { + log.Errorf("Could not patch pgouser secret %s with generated password for operator installation "+ + "%s in namespace %s", secret.Name, InstallationName, PgoNamespace) + } + } +} + // NamespaceOperatingMode returns the namespace operating mode for the current Operator // installation, which is stored in the "namespaceOperatingMode" variable func NamespaceOperatingMode() ns.NamespaceOperatingMode { From 9e75d666e151ef42a250bc09461bd3137b8c4ba6 Mon Sep 17 00:00:00 2001 From: tjmoore4 <42497036+tjmoore4@users.noreply.github.com> Date: Mon, 2 Nov 2020 19:36:19 -0500 Subject: [PATCH 012/129] Add ports to pgo show cluster output This update adds the service port and protocol information to the 'pgo show cluster' output. Issue: [ch9563] --- internal/apiserver/clusterservice/clusterimpl.go | 3 +++ pgo/cmd/cluster.go | 6 ++++-- pkg/apiservermsgs/clustermsgs.go | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index 6163b4b45d..b6bfefc9d2 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -308,6 +308,9 @@ func getServices(cluster *crv1.Pgcluster, ns string) ([]msgs.ShowClusterService, d.ClusterName = cluster.Name } d.ClusterIP = p.Spec.ClusterIP + for _, port := range p.Spec.Ports { + d.ClusterPorts = append(d.ClusterPorts, strconv.Itoa(int(port.Port))+"/"+string(port.Protocol)) + } if len(p.Spec.ExternalIPs) > 0 { d.ExternalIP = p.Spec.ExternalIPs[0] } diff --git a/pgo/cmd/cluster.go b/pgo/cmd/cluster.go index 3ee443fcd8..d3c63f9445 100644 --- a/pgo/cmd/cluster.go +++ b/pgo/cmd/cluster.go @@ -220,9 +220,11 @@ func printCluster(detail *msgs.ShowClusterDetail) { for _, service := range detail.Services { if service.ExternalIP == "" { - fmt.Println(TreeBranch + "service : " + service.Name + " - ClusterIP (" + service.ClusterIP + ")") + fmt.Println(TreeBranch + "service : " + service.Name + " - ClusterIP (" + service.ClusterIP + ")" + " - Ports (" + + strings.Trim(strings.Join(strings.Fields(fmt.Sprint(service.ClusterPorts)), ", "), "[]") + ")") } else { - fmt.Println(TreeBranch + "service : " + service.Name + " - ClusterIP (" + service.ClusterIP + ") ExternalIP (" + service.ExternalIP + ")") + fmt.Println(TreeBranch + "service : " + service.Name + " - ClusterIP (" + service.ClusterIP + ") ExternalIP (" + service.ExternalIP + + ")" + " - Ports (" + strings.Trim(strings.Join(strings.Fields(fmt.Sprint(service.ClusterPorts)), ", "), "[]") + ")") } } diff --git a/pkg/apiservermsgs/clustermsgs.go b/pkg/apiservermsgs/clustermsgs.go index cfe07dfdd7..e8983613c4 100644 --- a/pkg/apiservermsgs/clustermsgs.go +++ b/pkg/apiservermsgs/clustermsgs.go @@ -243,6 +243,7 @@ type ShowClusterService struct { Name string Data string ClusterIP string + ClusterPorts []string ExternalIP string ClusterName string Pgbouncer bool From b4b2d8f4d2e5c0bb7dab6929e8f3a3ed19ae6517 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 27 Oct 2020 14:58:52 -0400 Subject: [PATCH 013/129] Do not require pgBackRest Secret for cluster creation This changes the methodology for how a pgBackRest Secret is generated such that it is no longer required at the time a cluster is created vis-a-vis the pgcluster custom resource. Instead, the Operator follows this heuristic: - If a pgBackRest Secret is provided, this Secret is used - If the pgBackRest Secret is partially filled out, the missing pieces are filled in - If no Secret is provided, a Secret is generated. Note that if you want to use S3 or a S3-like storage system, you will need to still create the Secret with the appropriate S3 credentials. This also updates various documentation to show the easier workflow. Issue: [ch9451] --- docs/content/custom-resources/_index.md | 65 +-------- examples/create-by-resource/run.sh | 39 ----- examples/helm/README.md | 79 ++++++++++ .../apiserver/clusterservice/clusterimpl.go | 30 ++-- internal/operator/backrest/repo.go | 13 ++ internal/operator/cluster/cluster.go | 8 ++ internal/util/cluster.go | 135 ++++++++++++------ 7 files changed, 210 insertions(+), 159 deletions(-) create mode 100644 examples/helm/README.md diff --git a/docs/content/custom-resources/_index.md b/docs/content/custom-resources/_index.md index e27adfd3e6..af913755e9 100644 --- a/docs/content/custom-resources/_index.md +++ b/docs/content/custom-resources/_index.md @@ -255,68 +255,7 @@ create additional secrets. The following guide goes through how to create a PostgreSQL cluster called `hippo` by creating a new custom resource. -#### Step 1: Create the pgBackRest Secret - -pgBackRest is a fundamental part of a PostgreSQL deployment with the PostgreSQL -Operator: not only is it a backup and archive repository, but it also helps with -operations such as self-healing. A PostgreSQL instance a pgBackRest communicate -using ssh, and as such, we need to generate a unique ssh keypair for -communication for each PostgreSQL cluster we deploy. - -In this example, we generate a ssh keypair using ED25519 keys, but if your -environment requires it, you can also use RSA keys. - -In your working directory, run the following commands: - -
-# this variable is the name of the cluster being created
-export pgo_cluster_name=hippo
-# this variable is the namespace the cluster is being deployed into
-export cluster_namespace=pgo
-
-# generate a SSH public/private keypair for use by pgBackRest
-ssh-keygen -t ed25519 -N '' -f "${pgo_cluster_name}-key"
-
-# base64 encoded the keys for the generation of the Kubernetes secret, and place
-# them into variables temporarily
-public_key_temp=$(cat "${pgo_cluster_name}-key.pub" | base64)
-private_key_temp=$(cat "${pgo_cluster_name}-key" | base64)
-export pgbackrest_public_key="${public_key_temp//[$'\n']}" pgbackrest_private_key="${private_key_temp//[$'\n']}"
-
-# create the backrest-repo-config example file and substitute in the newly
-# created keys
-#
-# (Note: that the "config" / "sshd_config" entries contain configuration to
-# ensure that PostgreSQL instances are able to communicate with the pgBackRest
-# repository, which houses backups and archives, and vice versa. Most of the
-# settings follow the sshd defaults, with a few overrides. Edit at your own
-# discretion.)
-cat <<-EOF > "${pgo_cluster_name}-backrest-repo-config.yaml"
-apiVersion: v1
-kind: Secret
-type: Opaque
-metadata:
-  labels:
-    pg-cluster: ${pgo_cluster_name}
-    pgo-backrest-repo: "true"
-  name: ${pgo_cluster_name}-backrest-repo-config
-  namespace: ${cluster_namespace}
-data:
-  authorized_keys: ${pgbackrest_public_key}
-  id_ed25519: ${pgbackrest_private_key}
-  ssh_host_ed25519_key: ${pgbackrest_private_key}
-  config: SG9zdCAqClN0cmljdEhvc3RLZXlDaGVja2luZyBubwpJZGVudGl0eUZpbGUgL3RtcC9pZF9lZDI1NTE5ClBvcnQgMjAyMgpVc2VyIHBnYmFja3Jlc3QK
-  sshd_config: IwkkT3BlbkJTRDogc3NoZF9jb25maWcsdiAxLjEwMCAyMDE2LzA4LzE1IDEyOjMyOjA0IG5hZGR5IEV4cCAkCgojIFRoaXMgaXMgdGhlIHNzaGQgc2VydmVyIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZQojIHNzaGRfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKIyBUaGlzIHNzaGQgd2FzIGNvbXBpbGVkIHdpdGggUEFUSD0vdXNyL2xvY2FsL2JpbjovdXNyL2JpbgoKIyBUaGUgc3RyYXRlZ3kgdXNlZCBmb3Igb3B0aW9ucyBpbiB0aGUgZGVmYXVsdCBzc2hkX2NvbmZpZyBzaGlwcGVkIHdpdGgKIyBPcGVuU1NIIGlzIHRvIHNwZWNpZnkgb3B0aW9ucyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2hlcmUKIyBwb3NzaWJsZSwgYnV0IGxlYXZlIHRoZW0gY29tbWVudGVkLiAgVW5jb21tZW50ZWQgb3B0aW9ucyBvdmVycmlkZSB0aGUKIyBkZWZhdWx0IHZhbHVlLgoKIyBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHBvcnQgb24gYSBTRUxpbnV4IHN5c3RlbSwgeW91IGhhdmUgdG8gdGVsbAojIFNFTGludXggYWJvdXQgdGhpcyBjaGFuZ2UuCiMgc2VtYW5hZ2UgcG9ydCAtYSAtdCBzc2hfcG9ydF90IC1wIHRjcCAjUE9SVE5VTUJFUgojClBvcnQgMjAyMgojQWRkcmVzc0ZhbWlseSBhbnkKI0xpc3RlbkFkZHJlc3MgMC4wLjAuMAojTGlzdGVuQWRkcmVzcyA6OgoKSG9zdEtleSAvc3NoZC9zc2hfaG9zdF9lZDI1NTE5X2tleQoKIyBDaXBoZXJzIGFuZCBrZXlpbmcKI1Jla2V5TGltaXQgZGVmYXVsdCBub25lCgojIExvZ2dpbmcKI1N5c2xvZ0ZhY2lsaXR5IEFVVEgKU3lzbG9nRmFjaWxpdHkgQVVUSFBSSVYKI0xvZ0xldmVsIElORk8KCiMgQXV0aGVudGljYXRpb246CgojTG9naW5HcmFjZVRpbWUgMm0KUGVybWl0Um9vdExvZ2luIG5vClN0cmljdE1vZGVzIG5vCiNNYXhBdXRoVHJpZXMgNgojTWF4U2Vzc2lvbnMgMTAKClB1YmtleUF1dGhlbnRpY2F0aW9uIHllcwoKIyBUaGUgZGVmYXVsdCBpcyB0byBjaGVjayBib3RoIC5zc2gvYXV0aG9yaXplZF9rZXlzIGFuZCAuc3NoL2F1dGhvcml6ZWRfa2V5czIKIyBidXQgdGhpcyBpcyBvdmVycmlkZGVuIHNvIGluc3RhbGxhdGlvbnMgd2lsbCBvbmx5IGNoZWNrIC5zc2gvYXV0aG9yaXplZF9rZXlzCiNBdXRob3JpemVkS2V5c0ZpbGUJL3BnY29uZi9hdXRob3JpemVkX2tleXMKQXV0aG9yaXplZEtleXNGaWxlCS9zc2hkL2F1dGhvcml6ZWRfa2V5cwoKI0F1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSBub25lCgojQXV0aG9yaXplZEtleXNDb21tYW5kIG5vbmUKI0F1dGhvcml6ZWRLZXlzQ29tbWFuZFVzZXIgbm9ib2R5CgojIEZvciB0aGlzIHRvIHdvcmsgeW91IHdpbGwgYWxzbyBuZWVkIGhvc3Qga2V5cyBpbiAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMKI0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIG5vCiMgQ2hhbmdlIHRvIHllcyBpZiB5b3UgZG9uJ3QgdHJ1c3Qgfi8uc3NoL2tub3duX2hvc3RzIGZvcgojIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCiNJZ25vcmVVc2VyS25vd25Ib3N0cyBubwojIERvbid0IHJlYWQgdGhlIHVzZXIncyB+Ly5yaG9zdHMgYW5kIH4vLnNob3N0cyBmaWxlcwojSWdub3JlUmhvc3RzIHllcwoKIyBUbyBkaXNhYmxlIHR1bm5lbGVkIGNsZWFyIHRleHQgcGFzc3dvcmRzLCBjaGFuZ2UgdG8gbm8gaGVyZSEKI1Bhc3N3b3JkQXV0aGVudGljYXRpb24geWVzCiNQZXJtaXRFbXB0eVBhc3N3b3JkcyBubwpQYXNzd29yZEF1dGhlbnRpY2F0aW9uIG5vCgojIENoYW5nZSB0byBubyB0byBkaXNhYmxlIHMva2V5IHBhc3N3b3JkcwpDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHllcwojQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiBubwoKIyBLZXJiZXJvcyBvcHRpb25zCiNLZXJiZXJvc0F1dGhlbnRpY2F0aW9uIG5vCiNLZXJiZXJvc09yTG9jYWxQYXNzd2QgeWVzCiNLZXJiZXJvc1RpY2tldENsZWFudXAgeWVzCiNLZXJiZXJvc0dldEFGU1Rva2VuIG5vCiNLZXJiZXJvc1VzZUt1c2Vyb2sgeWVzCgojIEdTU0FQSSBvcHRpb25zCiNHU1NBUElBdXRoZW50aWNhdGlvbiB5ZXMKI0dTU0FQSUNsZWFudXBDcmVkZW50aWFscyBubwojR1NTQVBJU3RyaWN0QWNjZXB0b3JDaGVjayB5ZXMKI0dTU0FQSUtleUV4Y2hhbmdlIG5vCiNHU1NBUElFbmFibGVrNXVzZXJzIG5vCgojIFNldCB0aGlzIHRvICd5ZXMnIHRvIGVuYWJsZSBQQU0gYXV0aGVudGljYXRpb24sIGFjY291bnQgcHJvY2Vzc2luZywKIyBhbmQgc2Vzc2lvbiBwcm9jZXNzaW5nLiBJZiB0aGlzIGlzIGVuYWJsZWQsIFBBTSBhdXRoZW50aWNhdGlvbiB3aWxsCiMgYmUgYWxsb3dlZCB0aHJvdWdoIHRoZSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIGFuZAojIFBhc3N3b3JkQXV0aGVudGljYXRpb24uICBEZXBlbmRpbmcgb24geW91ciBQQU0gY29uZmlndXJhdGlvbiwKIyBQQU0gYXV0aGVudGljYXRpb24gdmlhIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gbWF5IGJ5cGFzcwojIHRoZSBzZXR0aW5nIG9mICJQZXJtaXRSb290TG9naW4gd2l0aG91dC1wYXNzd29yZCIuCiMgSWYgeW91IGp1c3Qgd2FudCB0aGUgUEFNIGFjY291bnQgYW5kIHNlc3Npb24gY2hlY2tzIHRvIHJ1biB3aXRob3V0CiMgUEFNIGF1dGhlbnRpY2F0aW9uLCB0aGVuIGVuYWJsZSB0aGlzIGJ1dCBzZXQgUGFzc3dvcmRBdXRoZW50aWNhdGlvbgojIGFuZCBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHRvICdubycuCiMgV0FSTklORzogJ1VzZVBBTSBubycgaXMgbm90IHN1cHBvcnRlZCBpbiBSZWQgSGF0IEVudGVycHJpc2UgTGludXggYW5kIG1heSBjYXVzZSBzZXZlcmFsCiMgcHJvYmxlbXMuClVzZVBBTSB5ZXMKCiNBbGxvd0FnZW50Rm9yd2FyZGluZyB5ZXMKI0FsbG93VGNwRm9yd2FyZGluZyB5ZXMKI0dhdGV3YXlQb3J0cyBubwpYMTFGb3J3YXJkaW5nIHllcwojWDExRGlzcGxheU9mZnNldCAxMAojWDExVXNlTG9jYWxob3N0IHllcwojUGVybWl0VFRZIHllcwojUHJpbnRNb3RkIHllcwojUHJpbnRMYXN0TG9nIHllcwojVENQS2VlcEFsaXZlIHllcwojVXNlTG9naW4gbm8KI1Blcm1pdFVzZXJFbnZpcm9ubWVudCBubwojQ29tcHJlc3Npb24gZGVsYXllZAojQ2xpZW50QWxpdmVJbnRlcnZhbCAwCiNDbGllbnRBbGl2ZUNvdW50TWF4IDMKI1Nob3dQYXRjaExldmVsIG5vCiNVc2VETlMgeWVzCiNQaWRGaWxlIC92YXIvcnVuL3NzaGQucGlkCiNNYXhTdGFydHVwcyAxMDozMDoxMDAKI1Blcm1pdFR1bm5lbCBubwojQ2hyb290RGlyZWN0b3J5IG5vbmUKI1ZlcnNpb25BZGRlbmR1bSBub25lCgojIG5vIGRlZmF1bHQgYmFubmVyIHBhdGgKI0Jhbm5lciBub25lCgojIEFjY2VwdCBsb2NhbGUtcmVsYXRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKQWNjZXB0RW52IExBTkcgTENfQ1RZUEUgTENfTlVNRVJJQyBMQ19USU1FIExDX0NPTExBVEUgTENfTU9ORVRBUlkgTENfTUVTU0FHRVMKQWNjZXB0RW52IExDX1BBUEVSIExDX05BTUUgTENfQUREUkVTUyBMQ19URUxFUEhPTkUgTENfTUVBU1VSRU1FTlQKQWNjZXB0RW52IExDX0lERU5USUZJQ0FUSU9OIExDX0FMTCBMQU5HVUFHRQpBY2NlcHRFbnYgWE1PRElGSUVSUwoKIyBvdmVycmlkZSBkZWZhdWx0IG9mIG5vIHN1YnN5c3RlbXMKU3Vic3lzdGVtCXNmdHAJL3Vzci9saWJleGVjL29wZW5zc2gvc2Z0cC1zZXJ2ZXIKCiMgRXhhbXBsZSBvZiBvdmVycmlkaW5nIHNldHRpbmdzIG9uIGEgcGVyLXVzZXIgYmFzaXMKI01hdGNoIFVzZXIgYW5vbmN2cwojCVgxMUZvcndhcmRpbmcgbm8KIwlBbGxvd1RjcEZvcndhcmRpbmcgbm8KIwlQZXJtaXRUVFkgbm8KIwlGb3JjZUNvbW1hbmQgY3ZzIHNlcnZlcgo=
-EOF
-
-# remove the pgBackRest ssh keypair from the shell session
-unset pgbackrest_public_key pgbackrest_private_key
-
-# create the pgBackRest secret
-kubectl apply -f "${pgo_cluster_name}-backrest-repo-config.yaml"
-
- -#### Step 2: Creating the PostgreSQL User Secrets +#### Step 1: Creating the PostgreSQL User Secrets As mentioned above, there are a minimum of three PostgreSQL user accounts that you must create in order to bootstrap a PostgreSQL cluster. These are: @@ -354,7 +293,7 @@ kubectl label secrets -n "${cluster_namespace}" "${pgo_cluster_name}-primaryuser kubectl label secrets -n "${cluster_namespace}" "${pgo_cluster_name}-hippo-secret" "pg-cluster=${pgo_cluster_name}" ``` -#### Step 3: Create the PostgreSQL Cluster +#### Step 2: Create the PostgreSQL Cluster With the Secrets in place. It is now time to create the PostgreSQL cluster. diff --git a/examples/create-by-resource/run.sh b/examples/create-by-resource/run.sh index 1cdefdda77..ea034a4fe2 100755 --- a/examples/create-by-resource/run.sh +++ b/examples/create-by-resource/run.sh @@ -41,49 +41,10 @@ rm $DIR/fromcrd-key $DIR/fromcrd-key.pub # EXAMPLE RUN # ############### -# generate a SSH public/private keypair for use by pgBackRest -ssh-keygen -t ed25519 -N '' -f $DIR/fromcrd-key - -# base64 encoded the keys for the generation of the Kube secret, and place -# them into variables temporarily -PUBLIC_KEY_TEMP=$(cat $DIR/fromcrd-key.pub | base64) -PRIVATE_KEY_TEMP=$(cat $DIR/fromcrd-key | base64) - -export PUBLIC_KEY="${PUBLIC_KEY_TEMP//[$'\n']}" -export PRIVATE_KEY="${PRIVATE_KEY_TEMP//[$'\n']}" - -unset PUBLIC_KEY_TEMP -unset PRIVATE_KEY_TEMP - -# create the backrest-repo-config example file and substitute in the newly -# created keys -cat <<-EOF > $DIR/backrest-repo-config.yaml -apiVersion: v1 -data: - authorized_keys: ${PUBLIC_KEY} - id_ed25519: ${PRIVATE_KEY} - ssh_host_ed25519_key: ${PRIVATE_KEY} - config: SG9zdCAqClN0cmljdEhvc3RLZXlDaGVja2luZyBubwpJZGVudGl0eUZpbGUgL3RtcC9pZF9lZDI1NTE5ClBvcnQgMjAyMgpVc2VyIHBnYmFja3Jlc3QK - sshd_config: IwkkT3BlbkJTRDogc3NoZF9jb25maWcsdiAxLjEwMCAyMDE2LzA4LzE1IDEyOjMyOjA0IG5hZGR5IEV4cCAkCgojIFRoaXMgaXMgdGhlIHNzaGQgc2VydmVyIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZQojIHNzaGRfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKIyBUaGlzIHNzaGQgd2FzIGNvbXBpbGVkIHdpdGggUEFUSD0vdXNyL2xvY2FsL2JpbjovdXNyL2JpbgoKIyBUaGUgc3RyYXRlZ3kgdXNlZCBmb3Igb3B0aW9ucyBpbiB0aGUgZGVmYXVsdCBzc2hkX2NvbmZpZyBzaGlwcGVkIHdpdGgKIyBPcGVuU1NIIGlzIHRvIHNwZWNpZnkgb3B0aW9ucyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2hlcmUKIyBwb3NzaWJsZSwgYnV0IGxlYXZlIHRoZW0gY29tbWVudGVkLiAgVW5jb21tZW50ZWQgb3B0aW9ucyBvdmVycmlkZSB0aGUKIyBkZWZhdWx0IHZhbHVlLgoKIyBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHBvcnQgb24gYSBTRUxpbnV4IHN5c3RlbSwgeW91IGhhdmUgdG8gdGVsbAojIFNFTGludXggYWJvdXQgdGhpcyBjaGFuZ2UuCiMgc2VtYW5hZ2UgcG9ydCAtYSAtdCBzc2hfcG9ydF90IC1wIHRjcCAjUE9SVE5VTUJFUgojClBvcnQgMjAyMgojQWRkcmVzc0ZhbWlseSBhbnkKI0xpc3RlbkFkZHJlc3MgMC4wLjAuMAojTGlzdGVuQWRkcmVzcyA6OgoKSG9zdEtleSAvc3NoZC9zc2hfaG9zdF9lZDI1NTE5X2tleQoKIyBDaXBoZXJzIGFuZCBrZXlpbmcKI1Jla2V5TGltaXQgZGVmYXVsdCBub25lCgojIExvZ2dpbmcKI1N5c2xvZ0ZhY2lsaXR5IEFVVEgKU3lzbG9nRmFjaWxpdHkgQVVUSFBSSVYKI0xvZ0xldmVsIElORk8KCiMgQXV0aGVudGljYXRpb246CgojTG9naW5HcmFjZVRpbWUgMm0KUGVybWl0Um9vdExvZ2luIG5vClN0cmljdE1vZGVzIG5vCiNNYXhBdXRoVHJpZXMgNgojTWF4U2Vzc2lvbnMgMTAKClB1YmtleUF1dGhlbnRpY2F0aW9uIHllcwoKIyBUaGUgZGVmYXVsdCBpcyB0byBjaGVjayBib3RoIC5zc2gvYXV0aG9yaXplZF9rZXlzIGFuZCAuc3NoL2F1dGhvcml6ZWRfa2V5czIKIyBidXQgdGhpcyBpcyBvdmVycmlkZGVuIHNvIGluc3RhbGxhdGlvbnMgd2lsbCBvbmx5IGNoZWNrIC5zc2gvYXV0aG9yaXplZF9rZXlzCkF1dGhvcml6ZWRLZXlzRmlsZQkvc3NoZC9hdXRob3JpemVkX2tleXMKCiNBdXRob3JpemVkUHJpbmNpcGFsc0ZpbGUgbm9uZQoKI0F1dGhvcml6ZWRLZXlzQ29tbWFuZCBub25lCiNBdXRob3JpemVkS2V5c0NvbW1hbmRVc2VyIG5vYm9keQoKIyBGb3IgdGhpcyB0byB3b3JrIHlvdSB3aWxsIGFsc28gbmVlZCBob3N0IGtleXMgaW4gL2V0Yy9zc2gvc3NoX2tub3duX2hvc3RzCiNIb3N0YmFzZWRBdXRoZW50aWNhdGlvbiBubwojIENoYW5nZSB0byB5ZXMgaWYgeW91IGRvbid0IHRydXN0IH4vLnNzaC9rbm93bl9ob3N0cyBmb3IKIyBIb3N0YmFzZWRBdXRoZW50aWNhdGlvbgojSWdub3JlVXNlcktub3duSG9zdHMgbm8KIyBEb24ndCByZWFkIHRoZSB1c2VyJ3Mgfi8ucmhvc3RzIGFuZCB+Ly5zaG9zdHMgZmlsZXMKI0lnbm9yZVJob3N0cyB5ZXMKCiMgVG8gZGlzYWJsZSB0dW5uZWxlZCBjbGVhciB0ZXh0IHBhc3N3b3JkcywgY2hhbmdlIHRvIG5vIGhlcmUhCiNQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHllcwojUGVybWl0RW1wdHlQYXNzd29yZHMgbm8KUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBubwoKIyBDaGFuZ2UgdG8gbm8gdG8gZGlzYWJsZSBzL2tleSBwYXNzd29yZHMKQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiB5ZXMKI0NoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gbm8KCiMgS2VyYmVyb3Mgb3B0aW9ucwojS2VyYmVyb3NBdXRoZW50aWNhdGlvbiBubwojS2VyYmVyb3NPckxvY2FsUGFzc3dkIHllcwojS2VyYmVyb3NUaWNrZXRDbGVhbnVwIHllcwojS2VyYmVyb3NHZXRBRlNUb2tlbiBubwojS2VyYmVyb3NVc2VLdXNlcm9rIHllcwoKIyBHU1NBUEkgb3B0aW9ucwojR1NTQVBJQXV0aGVudGljYXRpb24geWVzCiNHU1NBUElDbGVhbnVwQ3JlZGVudGlhbHMgbm8KI0dTU0FQSVN0cmljdEFjY2VwdG9yQ2hlY2sgeWVzCiNHU1NBUElLZXlFeGNoYW5nZSBubwojR1NTQVBJRW5hYmxlazV1c2VycyBubwoKIyBTZXQgdGhpcyB0byAneWVzJyB0byBlbmFibGUgUEFNIGF1dGhlbnRpY2F0aW9uLCBhY2NvdW50IHByb2Nlc3NpbmcsCiMgYW5kIHNlc3Npb24gcHJvY2Vzc2luZy4gSWYgdGhpcyBpcyBlbmFibGVkLCBQQU0gYXV0aGVudGljYXRpb24gd2lsbAojIGJlIGFsbG93ZWQgdGhyb3VnaCB0aGUgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiBhbmQKIyBQYXNzd29yZEF1dGhlbnRpY2F0aW9uLiAgRGVwZW5kaW5nIG9uIHlvdXIgUEFNIGNvbmZpZ3VyYXRpb24sCiMgUEFNIGF1dGhlbnRpY2F0aW9uIHZpYSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIG1heSBieXBhc3MKIyB0aGUgc2V0dGluZyBvZiAiUGVybWl0Um9vdExvZ2luIHdpdGhvdXQtcGFzc3dvcmQiLgojIElmIHlvdSBqdXN0IHdhbnQgdGhlIFBBTSBhY2NvdW50IGFuZCBzZXNzaW9uIGNoZWNrcyB0byBydW4gd2l0aG91dAojIFBBTSBhdXRoZW50aWNhdGlvbiwgdGhlbiBlbmFibGUgdGhpcyBidXQgc2V0IFBhc3N3b3JkQXV0aGVudGljYXRpb24KIyBhbmQgQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiB0byAnbm8nLgojIFdBUk5JTkc6ICdVc2VQQU0gbm8nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4IGFuZCBtYXkgY2F1c2Ugc2V2ZXJhbAojIHByb2JsZW1zLgpVc2VQQU0geWVzIAoKI0FsbG93QWdlbnRGb3J3YXJkaW5nIHllcwojQWxsb3dUY3BGb3J3YXJkaW5nIHllcwojR2F0ZXdheVBvcnRzIG5vClgxMUZvcndhcmRpbmcgeWVzCiNYMTFEaXNwbGF5T2Zmc2V0IDEwCiNYMTFVc2VMb2NhbGhvc3QgeWVzCiNQZXJtaXRUVFkgeWVzCiNQcmludE1vdGQgeWVzCiNQcmludExhc3RMb2cgeWVzCiNUQ1BLZWVwQWxpdmUgeWVzCiNVc2VMb2dpbiBubwpVc2VQcml2aWxlZ2VTZXBhcmF0aW9uIG5vCiNQZXJtaXRVc2VyRW52aXJvbm1lbnQgbm8KI0NvbXByZXNzaW9uIGRlbGF5ZWQKI0NsaWVudEFsaXZlSW50ZXJ2YWwgMAojQ2xpZW50QWxpdmVDb3VudE1heCAzCiNTaG93UGF0Y2hMZXZlbCBubwojVXNlRE5TIHllcwojUGlkRmlsZSAvdmFyL3J1bi9zc2hkLnBpZAojTWF4U3RhcnR1cHMgMTA6MzA6MTAwCiNQZXJtaXRUdW5uZWwgbm8KI0Nocm9vdERpcmVjdG9yeSBub25lCiNWZXJzaW9uQWRkZW5kdW0gbm9uZQoKIyBubyBkZWZhdWx0IGJhbm5lciBwYXRoCiNCYW5uZXIgbm9uZQoKIyBBY2NlcHQgbG9jYWxlLXJlbGF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCkFjY2VwdEVudiBMQU5HIExDX0NUWVBFIExDX05VTUVSSUMgTENfVElNRSBMQ19DT0xMQVRFIExDX01PTkVUQVJZIExDX01FU1NBR0VTCkFjY2VwdEVudiBMQ19QQVBFUiBMQ19OQU1FIExDX0FERFJFU1MgTENfVEVMRVBIT05FIExDX01FQVNVUkVNRU5UCkFjY2VwdEVudiBMQ19JREVOVElGSUNBVElPTiBMQ19BTEwgTEFOR1VBR0UKQWNjZXB0RW52IFhNT0RJRklFUlMKCiMgb3ZlcnJpZGUgZGVmYXVsdCBvZiBubyBzdWJzeXN0ZW1zClN1YnN5c3RlbQlzZnRwCS91c3IvbGliZXhlYy9vcGVuc3NoL3NmdHAtc2VydmVyCgojIEV4YW1wbGUgb2Ygb3ZlcnJpZGluZyBzZXR0aW5ncyBvbiBhIHBlci11c2VyIGJhc2lzCiNNYXRjaCBVc2VyIGFub25jdnMKIwlYMTFGb3J3YXJkaW5nIG5vCiMJQWxsb3dUY3BGb3J3YXJkaW5nIG5vCiMJUGVybWl0VFRZIG5vCiMJRm9yY2VDb21tYW5kIGN2cyBzZXJ2ZXI= -kind: Secret -metadata: - labels: - pg-cluster: fromcrd - pgo-backrest-repo: "true" - name: fromcrd-backrest-repo-config - namespace: ${NS} -type: Opaque -EOF - -# unset the *_KEY environmental variables -unset PUBLIC_KEY -unset PRIVATE_KEY - # create the required postgres credentials for the fromcrd cluster $PGO_CMD -n $NS create -f $DIR/postgres-secret.yaml $PGO_CMD -n $NS create -f $DIR/primaryuser-secret.yaml $PGO_CMD -n $NS create -f $DIR/testuser-secret.yaml -$PGO_CMD -n $NS create -f $DIR/backrest-repo-config.yaml # create the pgcluster CRD for the fromcrd cluster $PGO_CMD -n $NS create -f $DIR/fromcrd.json diff --git a/examples/helm/README.md b/examples/helm/README.md new file mode 100644 index 0000000000..390bfbbaae --- /dev/null +++ b/examples/helm/README.md @@ -0,0 +1,79 @@ +# create-cluster + +This is a working example of how to create a cluster via the crd workflow +using a [Helm](https://helm.sh/) chart. + +## Prerequisites + +### Postgres Operator + +This example assumes you have the Crunchy PostgreSQL Operator installed +in a namespace called `pgo`. + +### Helm + +Helm will also need to be installed for this example to run + +## Documentation + +Please see the documentation for more guidance using custom resources: + +https://access.crunchydata.com/documentation/postgres-operator/latest/custom-resources/ + +## Setup + +If you are running Postgres Operator 4.5.1 or later, you can skip the below +step. + +### Before 4.5.1 + +``` +cd postgres-operator/examples/helm/create-cluster + +mkdir certs +cd certs + +# this variable is the name of the cluster being created +export pgo_cluster_name=hippo + +# generate a SSH public/private keypair for use by pgBackRest +ssh-keygen -t ed25519 -N '' -f "${pgo_cluster_name}-key" +``` + +## Running the Example + +For this example we will deploy the cluster into the `pgo` namespace where the +Postgres Operator is installed and running. + +Return to the `create-cluster` directory: + +``` +cd postgres-operator/examples/helm/create-cluster +``` + +The following commands will allow you to execute a dry run first with debug +if you want to verify everything is set correctly. Then after everything looks +good run the install command with out the flags: + +``` +helm install --dry-run --debug postgres-operator-create-cluster . -n pgo +helm install postgres-operator-create-cluster . -n pgo +``` + +## Verify + +Now you can your Hippo cluster has deployed into the pgo namespace by running +these few commands: + +``` +kubectl get all -n pgo + +pgo test hippo -n pgo + +pgo show cluster hippo -n pgo +``` + +## NOTE + +As of operator version 4.5.0 when using helm uninstall you will have to manually +clean up some left over artifacts after running the uninstall. diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index b6bfefc9d2..5d887eee60 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -994,17 +994,25 @@ func CreateCluster(request *msgs.CreateClusterRequest, ns, pgouser string) msgs. backrestS3CACert = backrestSecret.Data[util.BackRestRepoSecretKeyAWSS3KeyAWSS3CACert] } - err := util.CreateBackrestRepoSecrets(apiserver.Clientset, - util.BackrestRepoConfig{ - BackrestS3CA: backrestS3CACert, - BackrestS3Key: request.BackrestS3Key, - BackrestS3KeySecret: request.BackrestS3KeySecret, - ClusterName: clusterName, - ClusterNamespace: request.Namespace, - OperatorNamespace: apiserver.PgoNamespace, - }) - - if err != nil { + // set up the secret for the cluster that contains the pgBackRest + // information + secret := &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: secretName, + Labels: map[string]string{ + config.LABEL_VENDOR: config.LABEL_CRUNCHY, + config.LABEL_PG_CLUSTER: clusterName, + config.LABEL_PGO_BACKREST_REPO: "true", + }, + }, + Data: map[string][]byte{ + util.BackRestRepoSecretKeyAWSS3KeyAWSS3CACert: backrestS3CACert, + util.BackRestRepoSecretKeyAWSS3KeyAWSS3Key: []byte(request.BackrestS3Key), + util.BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret: []byte(request.BackrestS3KeySecret), + }, + } + + if _, err := apiserver.Clientset.CoreV1().Secrets(ns).Create(ctx, secret, metav1.CreateOptions{}); err != nil && !kubeapi.IsAlreadyExists(err) { resp.Status.Code = msgs.Error resp.Status.Msg = fmt.Sprintf("could not create backrest repo secret: %s", err) return resp diff --git a/internal/operator/backrest/repo.go b/internal/operator/backrest/repo.go index ea2e5100b0..65466232b9 100644 --- a/internal/operator/backrest/repo.go +++ b/internal/operator/backrest/repo.go @@ -157,6 +157,19 @@ func CreateRepoDeployment(clientset kubernetes.Interface, cluster *crv1.Pgcluste return nil } +// CreateRepoSecret allows for the creation of the Secret used to populate +// some (mostly) sensitive fields for managing the pgBackRest repository. +// +// If the Secret already exists, then missing fields will be overwritten. +func CreateRepoSecret(clientset kubernetes.Interface, cluster *crv1.Pgcluster) error { + return util.CreateBackrestRepoSecrets(clientset, + util.BackrestRepoConfig{ + ClusterName: cluster.Name, + ClusterNamespace: cluster.Namespace, + OperatorNamespace: operator.PgoNamespace, + }) +} + // setBootstrapRepoOverrides overrides certain fields used to populate the pgBackRest repository template // as needed to support the creation of a bootstrap repository need to bootstrap a new cluster from an // existing data source. diff --git a/internal/operator/cluster/cluster.go b/internal/operator/cluster/cluster.go index eef521107f..81cf6cbbcd 100644 --- a/internal/operator/cluster/cluster.go +++ b/internal/operator/cluster/cluster.go @@ -87,6 +87,14 @@ func AddClusterBase(clientset kubeapi.Interface, cl *crv1.Pgcluster, namespace s return } + // ensure the the pgBackRest Secret is created. If this fails, we have to + // abort + if err := backrest.CreateRepoSecret(clientset, cl); err != nil { + log.Error(err) + publishClusterCreateFailure(cl, err.Error()) + return + } + if err := annotateBackrestSecret(clientset, cl); err != nil { log.Error(err) publishClusterCreateFailure(cl, err.Error()) diff --git a/internal/util/cluster.go b/internal/util/cluster.go index 91c7cfec95..6e05a0f71f 100644 --- a/internal/util/cluster.go +++ b/internal/util/cluster.go @@ -27,6 +27,7 @@ import ( log "github.com/sirupsen/logrus" v1 "k8s.io/api/core/v1" + kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" @@ -115,70 +116,112 @@ var ( func CreateBackrestRepoSecrets(clientset kubernetes.Interface, backrestRepoConfig BackrestRepoConfig) error { - keys, err := NewPrivatePublicKeyPair() - if err != nil { - return err + // first: determine if a Secret already exists. If it does, we are going to + // work on modifying that Secret. + secretName := fmt.Sprintf("%s-%s", backrestRepoConfig.ClusterName, + config.LABEL_BACKREST_REPO_SECRET) + secret, secretErr := clientset.CoreV1().Secrets(backrestRepoConfig.ClusterNamespace).Get( + secretName, metav1.GetOptions{}) + + // only return an error if this is a **not** a not found error + if secretErr != nil && !kerrors.IsNotFound(secretErr) { + log.Error(secretErr) + return secretErr + } + + // determine if we need to create a new secret, i.e. this is a not found error + newSecret := secretErr != nil + if newSecret { + // set up the secret for the cluster that contains the pgBackRest information + secret = &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: secretName, + Labels: map[string]string{ + config.LABEL_VENDOR: config.LABEL_CRUNCHY, + config.LABEL_PG_CLUSTER: backrestRepoConfig.ClusterName, + config.LABEL_PGO_BACKREST_REPO: "true", + }, + }, + Data: map[string][]byte{}, + } } - // Retrieve the S3/SSHD configuration files from secret - configs, err := clientset. + // next, load the Operator level pgBackRest secret templates, which contain + // SSHD(...?) and possible S3 credentials + configs, configErr := clientset. CoreV1().Secrets(backrestRepoConfig.OperatorNamespace). Get("pgo-backrest-repo-config", metav1.GetOptions{}) - if err != nil { - log.Error(err) - return err + if configErr != nil { + log.Error(configErr) + return configErr + } + + // set the SSH/SSHD configuration, if it is not presently set + for _, key := range []string{backRestRepoSecretKeySSHConfig, backRestRepoSecretKeySSHDConfig} { + if len(secret.Data[key]) == 0 { + secret.Data[key] = configs.Data[key] + } } - // if an S3 key has been provided via the request, then use key and key secret - // included in the request instead of the default credentials that are - // available in the Operator pgBackRest secret - backrestS3Key := []byte(backrestRepoConfig.BackrestS3Key) + // set the SSH keys if any appear to be unset + if len(secret.Data[backRestRepoSecretKeyAuthorizedKeys]) == 0 || + len(secret.Data[backRestRepoSecretKeySSHPrivateKey]) == 0 || + len(secret.Data[backRestRepoSecretKeySSHHostPrivateKey]) == 0 { + // generate the keypair and then assign it to the values in the Secret + keys, keyErr := NewPrivatePublicKeyPair() + + if keyErr != nil { + log.Error(keyErr) + return keyErr + } + + secret.Data[backRestRepoSecretKeyAuthorizedKeys] = keys.Public + secret.Data[backRestRepoSecretKeySSHPrivateKey] = keys.Private + secret.Data[backRestRepoSecretKeySSHHostPrivateKey] = keys.Private + } - if backrestRepoConfig.BackrestS3Key == "" { - backrestS3Key = configs.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3Key] + // Set the S3 credentials + // If explicit S3 credentials are passed in, use those. + // If the Secret already has S3 credentials, use those. + // Otherwise, try to load in the default credentials from the Operator Secret. + if len(backrestRepoConfig.BackrestS3CA) != 0 { + secret.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3CACert] = backrestRepoConfig.BackrestS3CA } - backrestS3KeySecret := []byte(backrestRepoConfig.BackrestS3KeySecret) + if len(secret.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3CACert]) == 0 && + len(configs.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3CACert]) != 0 { + secret.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3CACert] = configs.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3CACert] + } - if backrestRepoConfig.BackrestS3KeySecret == "" { - backrestS3KeySecret = configs.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret] + if backrestRepoConfig.BackrestS3Key != "" { + secret.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3Key] = []byte(backrestRepoConfig.BackrestS3Key) } - // determine if there is a CA override provided, and if not, use the default - // from the configuration - caCert := backrestRepoConfig.BackrestS3CA - if len(caCert) == 0 { - caCert = configs.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3CACert] + if len(secret.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3Key]) == 0 && + len(configs.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3Key]) != 0 { + secret.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3Key] = configs.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3Key] } - // set up the secret for the cluster that contains the pgBackRest information - secret := v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s-%s", backrestRepoConfig.ClusterName, - config.LABEL_BACKREST_REPO_SECRET), - Labels: map[string]string{ - config.LABEL_VENDOR: config.LABEL_CRUNCHY, - config.LABEL_PG_CLUSTER: backrestRepoConfig.ClusterName, - config.LABEL_PGO_BACKREST_REPO: "true", - }, - }, - Data: map[string][]byte{ - BackRestRepoSecretKeyAWSS3KeyAWSS3CACert: caCert, - BackRestRepoSecretKeyAWSS3KeyAWSS3Key: backrestS3Key, - BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret: backrestS3KeySecret, - backRestRepoSecretKeyAuthorizedKeys: keys.Public, - backRestRepoSecretKeySSHConfig: configs.Data[backRestRepoSecretKeySSHConfig], - backRestRepoSecretKeySSHDConfig: configs.Data[backRestRepoSecretKeySSHDConfig], - backRestRepoSecretKeySSHPrivateKey: keys.Private, - backRestRepoSecretKeySSHHostPrivateKey: keys.Private, - }, + if backrestRepoConfig.BackrestS3KeySecret != "" { + secret.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret] = []byte(backrestRepoConfig.BackrestS3KeySecret) } - _, err = clientset.CoreV1().Secrets(backrestRepoConfig.ClusterNamespace).Create(&secret) - if kubeapi.IsAlreadyExists(err) { - _, err = clientset.CoreV1().Secrets(backrestRepoConfig.ClusterNamespace).Update(&secret) + if len(secret.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret]) == 0 && + len(configs.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret]) != 0 { + secret.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret] = configs.Data[BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret] } + + // time to create or update the secret! + if newSecret { + _, err := clientset.CoreV1().Secrets(backrestRepoConfig.ClusterNamespace).Create( + secret) + return err + } + + _, err := clientset.CoreV1().Secrets(backrestRepoConfig.ClusterNamespace).Update( + secret) + return err } From 14dc9c80423efefd1bf47b9bd96484193b98b7ea Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 27 Oct 2020 15:03:32 -0400 Subject: [PATCH 014/129] Reorder custom resource documentation Move the attributes to the latter half of the page, and showcase the workflows at the top. --- docs/content/custom-resources/_index.md | 396 ++++++++++++------------ 1 file changed, 198 insertions(+), 198 deletions(-) diff --git a/docs/content/custom-resources/_index.md b/docs/content/custom-resources/_index.md index af913755e9..7e024900f4 100644 --- a/docs/content/custom-resources/_index.md +++ b/docs/content/custom-resources/_index.md @@ -35,204 +35,6 @@ need to interface through the [`pgo` client]({{< relref "/pgo-client/_index.md" The following sections will describe the functionality that is available today when manipulating the PostgreSQL Operator Custom Resources directly. -## PostgreSQL Operator Custom Resource Definitions - -There are several PostgreSQL Operator Custom Resource Definitions (CRDs) that -are installed in order for the PostgreSQL Operator to successfully function: - -- `pgclusters.crunchydata.com`: Stores information required to manage a -PostgreSQL cluster. This includes things like the cluster name, what storage and -resource classes to use, which version of PostgreSQL to run, information about -how to maintain a high-availability cluster, etc. -- `pgreplicas.crunchydata.com`: Stores information required to manage the -replicas within a PostgreSQL cluster. This includes things like the number of -replicas, what storage and resource classes to use, special affinity rules, etc. -- `pgtasks.crunchydata.com`: A general purpose CRD that accepts a type of task -that is needed to run against a cluster (e.g. take a backup) and tracks the -state of said task through its workflow. -- `pgpolicies.crunchydata.com`: Stores a reference to a SQL file that can be -executed against a PostgreSQL cluster. In the past, this was used to manage RLS -policies on PostgreSQL clusters. - -Below takes an in depth look for what each attribute does in a Custom Resource -Definition, and how they can be used in the creation and update workflow. - -### Glossary - -- `create`: if an attribute is listed as `create`, it means it can affect what -happens when a new Custom Resource is created. -- `update`: if an attribute is listed as `update`, it means it can affect the -Custom Resource, and by extension the objects it manages, when the attribute is -updated. - -### `pgclusters.crunchydata.com` - -The `pgclusters.crunchydata.com` Custom Resource Definition is the fundamental -definition of a PostgreSQL cluster. Most attributes only affect the deployment -of a PostgreSQL cluster at the time the PostgreSQL cluster is created. Some -attributes can be modified during the lifetime of the PostgreSQL cluster and -make changes, as described below. - -#### Specification (`Spec`) - -| Attribute | Action | Description | -|-----------|--------|-------------| -| Annotations | `create`, `update` | Specify Kubernetes [Annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) that can be applied to the different deployments managed by the PostgreSQL Operator (PostgreSQL, pgBackRest, pgBouncer). For more information, please see the "Annotations Specification" below. | -| BackrestConfig | `create` | Optional references to pgBackRest configuration files -| BackrestLimits | `create`, `update` | Specify the container resource limits that the pgBackRest repository should use. Follows the [Kubernetes definitions of resource limits](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | -| BackrestResources | `create`, `update` | Specify the container resource requests that the pgBackRest repository should use. Follows the [Kubernetes definitions of resource requests](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | -| BackrestS3Bucket | `create` | An optional parameter that specifies a S3 bucket that pgBackRest should use. | -| BackrestS3Endpoint | `create` | An optional parameter that specifies the S3 endpoint pgBackRest should use. | -| BackrestS3Region | `create` | An optional parameter that specifies a cloud region that pgBackRest should use. | -| BackrestS3URIStyle | `create` | An optional parameter that specifies if pgBackRest should use the `path` or `host` S3 URI style. | -| BackrestS3VerifyTLS | `create` | An optional parameter that specifies if pgBackRest should verify the TLS endpoint. | -| BackrestStorage | `create` | A specification that gives information about the storage attributes for the pgBackRest repository, which stores backups and archives, of the PostgreSQL cluster. For details, please see the `Storage Specification` section below. This is required. | -| CCPImage | `create` | The name of the PostgreSQL container image to use, e.g. `crunchy-postgres-ha` or `crunchy-postgres-ha-gis`. | -| CCPImagePrefix | `create` | If provided, the image prefix (or registry) of the PostgreSQL container image, e.g. `registry.developers.crunchydata.com/crunchydata`. The default is to use the image prefix set in the PostgreSQL Operator configuration. | -| CCPImageTag | `create` | The tag of the PostgreSQL container image to use, e.g. `{{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}}`. | -| CollectSecretName | `create` | An optional attribute unless `crunchy-postgres-exporter` is specified in the `UserLabels`; contains the name of a Kubernetes Secret that contains the credentials for a PostgreSQL user that is used for metrics collection, and is created when the PostgreSQL cluster is first bootstrapped. For more information, please see `User Secret Specification`.| -| ClusterName | `create` | The name of the PostgreSQL cluster, e.g. `hippo`. This is used to group PostgreSQL instances (primary, replicas) together. | -| CustomConfig | `create` | If specified, references a custom ConfigMap to use when bootstrapping a PostgreSQL cluster. For the shape of this file, please see the section on [Custom Configuration]({{< relref "/advanced/custom-configuration.md" >}}) | -| Database | `create` | The name of a database that the PostgreSQL user can log into after the PostgreSQL cluster is created. | -| ExporterLimits | `create`, `update` | Specify the container resource limits that the `crunchy-postgres-exporter` sidecar uses when it is deployed with a PostgreSQL instance. Follows the [Kubernetes definitions of resource limits](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | -| ExporterPort | `create` | If the `"crunchy-postgres-exporter"` label is set in `UserLabels`, then this specifies the port that the metrics sidecar runs on (e.g. `9187`) | -| ExporterResources | `create`, `update` | Specify the container resource requests that the `crunchy-postgres-exporter` sidecar uses when it is deployed with a PostgreSQL instance. Follows the [Kubernetes definitions of resource requests](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | -| Limits | `create`, `update` | Specify the container resource limits that the PostgreSQL cluster should use. Follows the [Kubernetes definitions of resource limits](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | -| Name | `create` | The name of the PostgreSQL instance that is the primary. On creation, this should be set to be the same as `ClusterName`. | -| Namespace | `create` | The Kubernetes Namespace that the PostgreSQL cluster is deployed in. | -| PGBadgerPort | `create` | If the `"crunchy-pgbadger"` label is set in `UserLabels`, then this specifies the port that the pgBadger sidecar runs on (e.g. `10000`) | -| PGDataSource | `create` | Used to indicate if a PostgreSQL cluster should bootstrap its data from a pgBackRest repository. This uses the PostgreSQL Data Source Specification, described below. | -| PGOImagePrefix | `create` | If provided, the image prefix (or registry) of any PostgreSQL Operator images that are used for jobs, e.g. `registry.developers.crunchydata.com/crunchydata`. The default is to use the image prefix set in the PostgreSQL Operator configuration. | -| PgBouncer | `create`, `update` | If specified, defines the attributes to use for the pgBouncer connection pooling deployment that can be used in conjunction with this PostgreSQL cluster. Please see the specification defined below. | -| PodAntiAffinity | `create` | A required section. Sets the [pod anti-affinity rules]({{< relref "/architecture/high-availability/_index.md#how-the-crunchy-postgresql-operator-uses-pod-anti-affinity" >}}) for the PostgreSQL cluster and associated deployments. Please see the `Pod Anti-Affinity Specification` section below. | -| Policies | `create` | If provided, a comma-separated list referring to `pgpolicies.crunchydata.com.Spec.Name` that should be run once the PostgreSQL primary is first initialized. | -| Port | `create` | The port that PostgreSQL will run on, e.g. `5432`. | -| PrimaryStorage | `create` | A specification that gives information about the storage attributes for the primary instance in the PostgreSQL cluster. For details, please see the `Storage Specification` section below. This is required. | -| RootSecretName | `create` | The name of a Kubernetes Secret that contains the credentials for a PostgreSQL _replication user_ that is created when the PostgreSQL cluster is first bootstrapped. For more information, please see `User Secret Specification`.| -| ReplicaStorage | `create` | A specification that gives information about the storage attributes for any replicas in the PostgreSQL cluster. For details, please see the `Storage Specification` section below. This will likely be changed in the future based on the nature of the high-availability system, but presently it is still required that you set it. It is recommended you use similar settings to that of `PrimaryStorage`. | -| Replicas | `create` | The number of replicas to create after a PostgreSQL primary is first initialized. This only works on create; to scale a cluster after it is initialized, please use the [`pgo scale`]({{< relref "/pgo-client/reference/pgo_scale.md" >}}) command. | -| Resources | `create`, `update` | Specify the container resource requests that the PostgreSQL cluster should use. Follows the [Kubernetes definitions of resource requests](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | -| RootSecretName | `create` | The name of a Kubernetes Secret that contains the credentials for a PostgreSQL superuser that is created when the PostgreSQL cluster is first bootstrapped. For more information, please see `User Secret Specification`.| -| SyncReplication | `create` | If set to `true`, specifies the PostgreSQL cluster to use [synchronous replication]({{< relref "/architecture/high-availability/_index.md#how-the-crunchy-postgresql-operator-uses-pod-anti-affinity#synchronous-replication-guarding-against-transactions-loss" >}}).| -| User | `create` | The name of the PostgreSQL user that is created when the PostgreSQL cluster is first created. | -| UserLabels | `create` | A set of key-value string pairs that are used as a sort of "catch-all" for things that really should be modeled in the CRD. These values do get copied to the actually CR labels. If you want to set up metrics collection or pgBadger, you would specify `"crunchy-postgres-exporter": "true"` and `"crunchy-pgbadger": "true"` here, respectively. However, this structure does need to be set, so just follow whatever is in the example. | -| UserSecretName | `create` | The name of a Kubernetes Secret that contains the credentials for a standard PostgreSQL user that is created when the PostgreSQL cluster is first bootstrapped. For more information, please see `User Secret Specification`.| -| TablespaceMounts | `create`,`update` | Lists any tablespaces that are attached to the PostgreSQL cluster. Tablespaces can be added at a later time by updating the `TablespaceMounts` entry, but they cannot be removed. Stores a map of information, with the key being the name of the tablespace, and the value being a Storage Specification, defined below. | -| TLS | `create` | Defines the attributes for enabling TLS for a PostgreSQL cluster. See TLS Specification below. | -| TLSOnly | `create` | If set to true, requires client connections to use only TLS to connect to the PostgreSQL database. | -| Standby | `create`, `update` | If set to true, indicates that the PostgreSQL cluster is a "standby" cluster, i.e. is in read-only mode entirely. Please see [Kubernetes Multi-Cluster Deployments]({{< relref "/architecture/high-availability/multi-cluster-kubernetes.md" >}}) for more information. | -| Shutdown | `create`, `update` | If set to true, indicates that a PostgreSQL cluster should shutdown. If set to false, indicates that a PostgreSQL cluster should be up and running. | - -##### Storage Specification - -The storage specification is a spec that defines attributes about the storage to -be used for a particular function of a PostgreSQL cluster (e.g. a primary -instance or for the pgBackRest backup repository). The below describes each -attribute and how it works. - -| Attribute | Action | Description | -|-----------|--------|-------------| -| AccessMode| `create` | The name of the Kubernetes Persistent Volume [Access Mode](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) to use. | -| MatchLabels | `create` | Only used with `StorageType` of `create`, used to match a particular subset of provisioned Persistent Volumes. | -| Name | `create` | Only needed for `PrimaryStorage` in `pgclusters.crunchydata.com`.Used to identify the name of the PostgreSQL cluster. Should match `ClusterName`. | -| Size | `create` | The size of the [Persistent Volume Claim](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) (PVC). Must use a Kubernetes resource value, e.g. `20Gi`. | -| StorageClass | `create` | The name of the Kubernetes [StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/) to use. | -| StorageType | `create` | Set to `create` if storage is provisioned (e.g. using `hostpath`). Set to `dynamic` if using a dynamic storage provisioner, e.g. via a `StorageClass`. | -| SupplementalGroups | `create` | If provided, a comma-separated list of group IDs to use in case it is needed to interface with a particular storage system. Typically used with NFS or hostpath storage. | - -##### Pod Anti-Affinity Specification - -Sets the [pod anti-affinity]({{< relref "/architecture/high-availability/_index.md#how-the-crunchy-postgresql-operator-uses-pod-anti-affinity" >}}) -for the PostgreSQL cluster and associated deployments. Each attribute can -contain one of the following values: - -- `required` -- `preferred` (which is also the recommended default) -- `disabled` - -For a detailed explanation for how this works. Please see the [high-availability]({{< relref "/architecture/high-availability/_index.md#how-the-crunchy-postgresql-operator-uses-pod-anti-affinity" >}}) -documentation. - -| Attribute | Action | Description | -|-----------|--------|-------------| -| Default | `create` | The default pod anti-affinity to use for all Pods managed in a given PostgreSQL cluster. | -| PgBackRest | `create` | If set to a value that differs from `Default`, specifies the pod anti-affinity to use for just the pgBackRest repository. | -| PgBouncer | `create` | If set to a value that differs from `Default`, specifies the pod anti-affinity to use for just the pgBouncer Pods. | - -##### PostgreSQL Data Source Specification - -This specification is used when one wants to bootstrap the data in a PostgreSQL -cluster from a pgBackRest repository. This can be a pgBackRest repository that -is attached to an active PostgreSQL cluster or is kept around to be used for -spawning new PostgreSQL clusters. - -| Attribute | Action | Description | -|-----------|--------|-------------| -| RestoreFrom | `create` | The name of a PostgreSQL cluster, active or former, that will be used for bootstrapping the data of a new PostgreSQL cluster. | -| RestoreOpts | `create` | Additional pgBackRest [restore options](https://pgbackrest.org/command.html#command-restore) that can be used as part of the bootstrapping operation, for example, point-in-time-recovery options. | - -##### TLS Specification - -The TLS specification makes a reference to the various secrets that are required -to enable TLS in a PostgreSQL cluster. For more information on how these secrets -should be structured, please see [Enabling TLS in a PostgreSQL Cluster]({{< relref "/pgo-client/common-tasks.md#enable-tls" >}}). - -| Attribute | Action | Description | -|-----------|--------|-------------| -| CASecret | `create` | A reference to the name of a Kubernetes Secret that specifies a certificate authority for the PostgreSQL cluster to trust. | -| ReplicationTLSSecret | `create` | A reference to the name of a Kubernetes TLS Secret that contains a keypair for authenticating the replication user. Must be used with `CASecret` and `TLSSecret`. | -| TLSSecret | `create` | A reference to the name of a Kubernetes TLS Secret that contains a keypair that is used for the PostgreSQL instance to identify itself and perform TLS communications with PostgreSQL clients. Must be used with `CASecret`. | - -##### pgBouncer Specification - -The pgBouncer specification defines how a pgBouncer deployment can be deployed -alongside the PostgreSQL cluster. pgBouncer is a PostgreSQL connection pooler -that can also help manage connection state, and is helpful to deploy alongside -a PostgreSQL cluster to help with failover scenarios too. - -| Attribute | Action | Description | -|-----------|--------|-------------| -| Limits | `create`, `update` | Specify the container resource limits that the pgBouncer Pods should use. Follows the [Kubernetes definitions of resource limits](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | -| Replicas | `create`, `update` | The number of pgBouncer instances to deploy. Must be set to at least `1` to deploy pgBouncer. Setting to `0` removes an existing pgBouncer deployment for the PostgreSQL cluster. | -| Resources | `create`, `update` | Specify the container resource requests that the pgBouncer Pods should use. Follows the [Kubernetes definitions of resource requests](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | - -##### Annotations Specification - -The `pgcluster.crunchydata.com` specification contains a block that allows for -custom [Annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) -to be applied to the Deployments that are managed by the PostgreSQL Operator, -including: - -- PostgreSQL -- pgBackRest -- pgBouncer - -This also includes the option to apply Annotations globally across the three -different deployment groups. - -| Attribute | Action | Description | -|-----------|--------|-------------| -| Backrest | `create`, `update` | Specify annotations that are only applied to the pgBackRest deployments | -| Global | `create`, `update` | Specify annotations that are applied to the PostgreSQL, pgBackRest, and pgBouncer deployments | -| PgBouncer | `create`, `update` | Specify annotations that are only applied to the pgBouncer deployments | -| Postgres | `create`, `update` | Specify annotations that are only applied to the PostgreSQL deployments | - -### `pgreplicas.crunchydata.com` - -The `pgreplicas.crunchydata.com` Custom Resource Definition contains information -pertaning to the structure of PostgreSQL replicas associated within a PostgreSQL -cluster. All of the attributes only affect the replica when it is created. - -#### Specification (`Spec`) - -| Attribute | Action | Description | -|-----------|--------|-------------| -| ClusterName | `create` | The name of the PostgreSQL cluster, e.g. `hippo`. This is used to group PostgreSQL instances (primary, replicas) together. | -| Name | `create` | The name of this PostgreSQL replica. It should be unique within a `ClusterName`. | -| Namespace | `create` | The Kubernetes Namespace that the PostgreSQL cluster is deployed in. | -| ReplicaStorage | `create` | A specification that gives information about the storage attributes for any replicas in the PostgreSQL cluster. For details, please see the `Storage Specification` section in the `pgclusters.crunchydata.com` description. This will likely be changed in the future based on the nature of the high-availability system, but presently it is still required that you set it. It is recommended you use similar settings to that of `PrimaryStorage`. | -| UserLabels | `create` | A set of key-value string pairs that are used as a sort of "catch-all" for things that really should be modeled in the CRD. These values do get copied to the actually CR labels. If you want to set up metrics collection, you would specify `"crunchy-postgres-exporter": "true"` here. This also allows for node selector pinning using `NodeLabelKey` and `NodeLabelValue`. However, this structure does need to be set, so just follow whatever is in the example. | - ## Custom Resource Workflows ### Create a PostgreSQL Cluster @@ -629,3 +431,201 @@ spec: Save your edits, and in a short period of time, you should see these annotations applied to the managed Deployments. + +## PostgreSQL Operator Custom Resource Definitions + +There are several PostgreSQL Operator Custom Resource Definitions (CRDs) that +are installed in order for the PostgreSQL Operator to successfully function: + +- `pgclusters.crunchydata.com`: Stores information required to manage a +PostgreSQL cluster. This includes things like the cluster name, what storage and +resource classes to use, which version of PostgreSQL to run, information about +how to maintain a high-availability cluster, etc. +- `pgreplicas.crunchydata.com`: Stores information required to manage the +replicas within a PostgreSQL cluster. This includes things like the number of +replicas, what storage and resource classes to use, special affinity rules, etc. +- `pgtasks.crunchydata.com`: A general purpose CRD that accepts a type of task +that is needed to run against a cluster (e.g. take a backup) and tracks the +state of said task through its workflow. +- `pgpolicies.crunchydata.com`: Stores a reference to a SQL file that can be +executed against a PostgreSQL cluster. In the past, this was used to manage RLS +policies on PostgreSQL clusters. + +Below takes an in depth look for what each attribute does in a Custom Resource +Definition, and how they can be used in the creation and update workflow. + +### Glossary + +- `create`: if an attribute is listed as `create`, it means it can affect what +happens when a new Custom Resource is created. +- `update`: if an attribute is listed as `update`, it means it can affect the +Custom Resource, and by extension the objects it manages, when the attribute is +updated. + +### `pgclusters.crunchydata.com` + +The `pgclusters.crunchydata.com` Custom Resource Definition is the fundamental +definition of a PostgreSQL cluster. Most attributes only affect the deployment +of a PostgreSQL cluster at the time the PostgreSQL cluster is created. Some +attributes can be modified during the lifetime of the PostgreSQL cluster and +make changes, as described below. + +#### Specification (`Spec`) + +| Attribute | Action | Description | +|-----------|--------|-------------| +| Annotations | `create`, `update` | Specify Kubernetes [Annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) that can be applied to the different deployments managed by the PostgreSQL Operator (PostgreSQL, pgBackRest, pgBouncer). For more information, please see the "Annotations Specification" below. | +| BackrestConfig | `create` | Optional references to pgBackRest configuration files +| BackrestLimits | `create`, `update` | Specify the container resource limits that the pgBackRest repository should use. Follows the [Kubernetes definitions of resource limits](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | +| BackrestResources | `create`, `update` | Specify the container resource requests that the pgBackRest repository should use. Follows the [Kubernetes definitions of resource requests](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | +| BackrestS3Bucket | `create` | An optional parameter that specifies a S3 bucket that pgBackRest should use. | +| BackrestS3Endpoint | `create` | An optional parameter that specifies the S3 endpoint pgBackRest should use. | +| BackrestS3Region | `create` | An optional parameter that specifies a cloud region that pgBackRest should use. | +| BackrestS3URIStyle | `create` | An optional parameter that specifies if pgBackRest should use the `path` or `host` S3 URI style. | +| BackrestS3VerifyTLS | `create` | An optional parameter that specifies if pgBackRest should verify the TLS endpoint. | +| BackrestStorage | `create` | A specification that gives information about the storage attributes for the pgBackRest repository, which stores backups and archives, of the PostgreSQL cluster. For details, please see the `Storage Specification` section below. This is required. | +| CCPImage | `create` | The name of the PostgreSQL container image to use, e.g. `crunchy-postgres-ha` or `crunchy-postgres-ha-gis`. | +| CCPImagePrefix | `create` | If provided, the image prefix (or registry) of the PostgreSQL container image, e.g. `registry.developers.crunchydata.com/crunchydata`. The default is to use the image prefix set in the PostgreSQL Operator configuration. | +| CCPImageTag | `create` | The tag of the PostgreSQL container image to use, e.g. `{{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}}`. | +| CollectSecretName | `create` | An optional attribute unless `crunchy-postgres-exporter` is specified in the `UserLabels`; contains the name of a Kubernetes Secret that contains the credentials for a PostgreSQL user that is used for metrics collection, and is created when the PostgreSQL cluster is first bootstrapped. For more information, please see `User Secret Specification`.| +| ClusterName | `create` | The name of the PostgreSQL cluster, e.g. `hippo`. This is used to group PostgreSQL instances (primary, replicas) together. | +| CustomConfig | `create` | If specified, references a custom ConfigMap to use when bootstrapping a PostgreSQL cluster. For the shape of this file, please see the section on [Custom Configuration]({{< relref "/advanced/custom-configuration.md" >}}) | +| Database | `create` | The name of a database that the PostgreSQL user can log into after the PostgreSQL cluster is created. | +| ExporterLimits | `create`, `update` | Specify the container resource limits that the `crunchy-postgres-exporter` sidecar uses when it is deployed with a PostgreSQL instance. Follows the [Kubernetes definitions of resource limits](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | +| ExporterPort | `create` | If the `"crunchy-postgres-exporter"` label is set in `UserLabels`, then this specifies the port that the metrics sidecar runs on (e.g. `9187`) | +| ExporterResources | `create`, `update` | Specify the container resource requests that the `crunchy-postgres-exporter` sidecar uses when it is deployed with a PostgreSQL instance. Follows the [Kubernetes definitions of resource requests](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | +| Limits | `create`, `update` | Specify the container resource limits that the PostgreSQL cluster should use. Follows the [Kubernetes definitions of resource limits](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | +| Name | `create` | The name of the PostgreSQL instance that is the primary. On creation, this should be set to be the same as `ClusterName`. | +| Namespace | `create` | The Kubernetes Namespace that the PostgreSQL cluster is deployed in. | +| PGBadgerPort | `create` | If the `"crunchy-pgbadger"` label is set in `UserLabels`, then this specifies the port that the pgBadger sidecar runs on (e.g. `10000`) | +| PGDataSource | `create` | Used to indicate if a PostgreSQL cluster should bootstrap its data from a pgBackRest repository. This uses the PostgreSQL Data Source Specification, described below. | +| PGOImagePrefix | `create` | If provided, the image prefix (or registry) of any PostgreSQL Operator images that are used for jobs, e.g. `registry.developers.crunchydata.com/crunchydata`. The default is to use the image prefix set in the PostgreSQL Operator configuration. | +| PgBouncer | `create`, `update` | If specified, defines the attributes to use for the pgBouncer connection pooling deployment that can be used in conjunction with this PostgreSQL cluster. Please see the specification defined below. | +| PodAntiAffinity | `create` | A required section. Sets the [pod anti-affinity rules]({{< relref "/architecture/high-availability/_index.md#how-the-crunchy-postgresql-operator-uses-pod-anti-affinity" >}}) for the PostgreSQL cluster and associated deployments. Please see the `Pod Anti-Affinity Specification` section below. | +| Policies | `create` | If provided, a comma-separated list referring to `pgpolicies.crunchydata.com.Spec.Name` that should be run once the PostgreSQL primary is first initialized. | +| Port | `create` | The port that PostgreSQL will run on, e.g. `5432`. | +| PrimaryStorage | `create` | A specification that gives information about the storage attributes for the primary instance in the PostgreSQL cluster. For details, please see the `Storage Specification` section below. This is required. | +| RootSecretName | `create` | The name of a Kubernetes Secret that contains the credentials for a PostgreSQL _replication user_ that is created when the PostgreSQL cluster is first bootstrapped. For more information, please see `User Secret Specification`.| +| ReplicaStorage | `create` | A specification that gives information about the storage attributes for any replicas in the PostgreSQL cluster. For details, please see the `Storage Specification` section below. This will likely be changed in the future based on the nature of the high-availability system, but presently it is still required that you set it. It is recommended you use similar settings to that of `PrimaryStorage`. | +| Replicas | `create` | The number of replicas to create after a PostgreSQL primary is first initialized. This only works on create; to scale a cluster after it is initialized, please use the [`pgo scale`]({{< relref "/pgo-client/reference/pgo_scale.md" >}}) command. | +| Resources | `create`, `update` | Specify the container resource requests that the PostgreSQL cluster should use. Follows the [Kubernetes definitions of resource requests](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | +| RootSecretName | `create` | The name of a Kubernetes Secret that contains the credentials for a PostgreSQL superuser that is created when the PostgreSQL cluster is first bootstrapped. For more information, please see `User Secret Specification`.| +| SyncReplication | `create` | If set to `true`, specifies the PostgreSQL cluster to use [synchronous replication]({{< relref "/architecture/high-availability/_index.md#how-the-crunchy-postgresql-operator-uses-pod-anti-affinity#synchronous-replication-guarding-against-transactions-loss" >}}).| +| User | `create` | The name of the PostgreSQL user that is created when the PostgreSQL cluster is first created. | +| UserLabels | `create` | A set of key-value string pairs that are used as a sort of "catch-all" for things that really should be modeled in the CRD. These values do get copied to the actually CR labels. If you want to set up metrics collection or pgBadger, you would specify `"crunchy-postgres-exporter": "true"` and `"crunchy-pgbadger": "true"` here, respectively. However, this structure does need to be set, so just follow whatever is in the example. | +| UserSecretName | `create` | The name of a Kubernetes Secret that contains the credentials for a standard PostgreSQL user that is created when the PostgreSQL cluster is first bootstrapped. For more information, please see `User Secret Specification`.| +| TablespaceMounts | `create`,`update` | Lists any tablespaces that are attached to the PostgreSQL cluster. Tablespaces can be added at a later time by updating the `TablespaceMounts` entry, but they cannot be removed. Stores a map of information, with the key being the name of the tablespace, and the value being a Storage Specification, defined below. | +| TLS | `create` | Defines the attributes for enabling TLS for a PostgreSQL cluster. See TLS Specification below. | +| TLSOnly | `create` | If set to true, requires client connections to use only TLS to connect to the PostgreSQL database. | +| Standby | `create`, `update` | If set to true, indicates that the PostgreSQL cluster is a "standby" cluster, i.e. is in read-only mode entirely. Please see [Kubernetes Multi-Cluster Deployments]({{< relref "/architecture/high-availability/multi-cluster-kubernetes.md" >}}) for more information. | +| Shutdown | `create`, `update` | If set to true, indicates that a PostgreSQL cluster should shutdown. If set to false, indicates that a PostgreSQL cluster should be up and running. | + +##### Storage Specification + +The storage specification is a spec that defines attributes about the storage to +be used for a particular function of a PostgreSQL cluster (e.g. a primary +instance or for the pgBackRest backup repository). The below describes each +attribute and how it works. + +| Attribute | Action | Description | +|-----------|--------|-------------| +| AccessMode| `create` | The name of the Kubernetes Persistent Volume [Access Mode](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes) to use. | +| MatchLabels | `create` | Only used with `StorageType` of `create`, used to match a particular subset of provisioned Persistent Volumes. | +| Name | `create` | Only needed for `PrimaryStorage` in `pgclusters.crunchydata.com`.Used to identify the name of the PostgreSQL cluster. Should match `ClusterName`. | +| Size | `create` | The size of the [Persistent Volume Claim](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) (PVC). Must use a Kubernetes resource value, e.g. `20Gi`. | +| StorageClass | `create` | The name of the Kubernetes [StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/) to use. | +| StorageType | `create` | Set to `create` if storage is provisioned (e.g. using `hostpath`). Set to `dynamic` if using a dynamic storage provisioner, e.g. via a `StorageClass`. | +| SupplementalGroups | `create` | If provided, a comma-separated list of group IDs to use in case it is needed to interface with a particular storage system. Typically used with NFS or hostpath storage. | + +##### Pod Anti-Affinity Specification + +Sets the [pod anti-affinity]({{< relref "/architecture/high-availability/_index.md#how-the-crunchy-postgresql-operator-uses-pod-anti-affinity" >}}) +for the PostgreSQL cluster and associated deployments. Each attribute can +contain one of the following values: + +- `required` +- `preferred` (which is also the recommended default) +- `disabled` + +For a detailed explanation for how this works. Please see the [high-availability]({{< relref "/architecture/high-availability/_index.md#how-the-crunchy-postgresql-operator-uses-pod-anti-affinity" >}}) +documentation. + +| Attribute | Action | Description | +|-----------|--------|-------------| +| Default | `create` | The default pod anti-affinity to use for all Pods managed in a given PostgreSQL cluster. | +| PgBackRest | `create` | If set to a value that differs from `Default`, specifies the pod anti-affinity to use for just the pgBackRest repository. | +| PgBouncer | `create` | If set to a value that differs from `Default`, specifies the pod anti-affinity to use for just the pgBouncer Pods. | + +##### PostgreSQL Data Source Specification + +This specification is used when one wants to bootstrap the data in a PostgreSQL +cluster from a pgBackRest repository. This can be a pgBackRest repository that +is attached to an active PostgreSQL cluster or is kept around to be used for +spawning new PostgreSQL clusters. + +| Attribute | Action | Description | +|-----------|--------|-------------| +| RestoreFrom | `create` | The name of a PostgreSQL cluster, active or former, that will be used for bootstrapping the data of a new PostgreSQL cluster. | +| RestoreOpts | `create` | Additional pgBackRest [restore options](https://pgbackrest.org/command.html#command-restore) that can be used as part of the bootstrapping operation, for example, point-in-time-recovery options. | + +##### TLS Specification + +The TLS specification makes a reference to the various secrets that are required +to enable TLS in a PostgreSQL cluster. For more information on how these secrets +should be structured, please see [Enabling TLS in a PostgreSQL Cluster]({{< relref "/pgo-client/common-tasks.md#enable-tls" >}}). + +| Attribute | Action | Description | +|-----------|--------|-------------| +| CASecret | `create` | A reference to the name of a Kubernetes Secret that specifies a certificate authority for the PostgreSQL cluster to trust. | +| ReplicationTLSSecret | `create` | A reference to the name of a Kubernetes TLS Secret that contains a keypair for authenticating the replication user. Must be used with `CASecret` and `TLSSecret`. | +| TLSSecret | `create` | A reference to the name of a Kubernetes TLS Secret that contains a keypair that is used for the PostgreSQL instance to identify itself and perform TLS communications with PostgreSQL clients. Must be used with `CASecret`. | + +##### pgBouncer Specification + +The pgBouncer specification defines how a pgBouncer deployment can be deployed +alongside the PostgreSQL cluster. pgBouncer is a PostgreSQL connection pooler +that can also help manage connection state, and is helpful to deploy alongside +a PostgreSQL cluster to help with failover scenarios too. + +| Attribute | Action | Description | +|-----------|--------|-------------| +| Limits | `create`, `update` | Specify the container resource limits that the pgBouncer Pods should use. Follows the [Kubernetes definitions of resource limits](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | +| Replicas | `create`, `update` | The number of pgBouncer instances to deploy. Must be set to at least `1` to deploy pgBouncer. Setting to `0` removes an existing pgBouncer deployment for the PostgreSQL cluster. | +| Resources | `create`, `update` | Specify the container resource requests that the pgBouncer Pods should use. Follows the [Kubernetes definitions of resource requests](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-requests-and-limits-of-pod-and-container). | + +##### Annotations Specification + +The `pgcluster.crunchydata.com` specification contains a block that allows for +custom [Annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) +to be applied to the Deployments that are managed by the PostgreSQL Operator, +including: + +- PostgreSQL +- pgBackRest +- pgBouncer + +This also includes the option to apply Annotations globally across the three +different deployment groups. + +| Attribute | Action | Description | +|-----------|--------|-------------| +| Backrest | `create`, `update` | Specify annotations that are only applied to the pgBackRest deployments | +| Global | `create`, `update` | Specify annotations that are applied to the PostgreSQL, pgBackRest, and pgBouncer deployments | +| PgBouncer | `create`, `update` | Specify annotations that are only applied to the pgBouncer deployments | +| Postgres | `create`, `update` | Specify annotations that are only applied to the PostgreSQL deployments | + +### `pgreplicas.crunchydata.com` + +The `pgreplicas.crunchydata.com` Custom Resource Definition contains information +pertaning to the structure of PostgreSQL replicas associated within a PostgreSQL +cluster. All of the attributes only affect the replica when it is created. + +#### Specification (`Spec`) + +| Attribute | Action | Description | +|-----------|--------|-------------| +| ClusterName | `create` | The name of the PostgreSQL cluster, e.g. `hippo`. This is used to group PostgreSQL instances (primary, replicas) together. | +| Name | `create` | The name of this PostgreSQL replica. It should be unique within a `ClusterName`. | +| Namespace | `create` | The Kubernetes Namespace that the PostgreSQL cluster is deployed in. | +| ReplicaStorage | `create` | A specification that gives information about the storage attributes for any replicas in the PostgreSQL cluster. For details, please see the `Storage Specification` section in the `pgclusters.crunchydata.com` description. This will likely be changed in the future based on the nature of the high-availability system, but presently it is still required that you set it. It is recommended you use similar settings to that of `PrimaryStorage`. | +| UserLabels | `create` | A set of key-value string pairs that are used as a sort of "catch-all" for things that really should be modeled in the CRD. These values do get copied to the actually CR labels. If you want to set up metrics collection, you would specify `"crunchy-postgres-exporter": "true"` here. This also allows for node selector pinning using `NodeLabelKey` and `NodeLabelValue`. However, this structure does need to be set, so just follow whatever is in the example. | From 6622060af37d1d85a4dbc748c792e05b06a7b9b2 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 27 Oct 2020 15:24:17 -0400 Subject: [PATCH 015/129] Add custom resource example for pgBackRest repo in S3 This examples shows how one can create a new PostgreSQL cluster where the pgBackRest backups and archives exist in a S3 repository via creating a custom resource. --- docs/content/custom-resources/_index.md | 192 ++++++++++++++++++++++++ 1 file changed, 192 insertions(+) diff --git a/docs/content/custom-resources/_index.md b/docs/content/custom-resources/_index.md index 7e024900f4..f4384e311e 100644 --- a/docs/content/custom-resources/_index.md +++ b/docs/content/custom-resources/_index.md @@ -212,6 +212,198 @@ EOF kubectl apply -f "${pgo_cluster_name}-pgcluster.yaml" ``` +### Create a PostgreSQL Cluster With Backups in S3 + +A frequent use case is to create a PostgreSQL cluster with S3 or a S3-like +storage system for storing backups. This requires adding a Secret that contains +the S3 key and key secret for your account, and adding some additional +information into the custom resource. + +#### Step 1: Create the pgBackRest S3 Secrets + +As mentioned above, it is necessary to create a Secret containing the S3 key and +key secret that will allow a user to create backups in S3. + +The below code will help you set up this Secret. + +``` +# this variable is the name of the cluster being created +pgo_cluster_name=hippo +# this variable is the namespace the cluster is being deployed into +cluster_namespace=pgo +# the following variables are your S3 key and key secret +backrest_s3_key=yours3key +backrest_s3_key_secret=yours3keysecret + +kubectl -n "${cluster_namespace}" create secret generic "${pgo_cluster_name}-backrest-repo-config" \ + --from-literal="aws-s3-key=${backrest_s3_key}" \ + --from-literal="aws-s3-key-secret=${backrest_s3_key_secret}" + +unset backrest_s3_key +unset backrest_s3_key_secret +``` + +#### Step 2: Creating the PostgreSQL User Secrets + +Similar to the basic create cluster example, there are a minimum of three +PostgreSQL user accounts that you must create in order to bootstrap a PostgreSQL +cluster. These are: + +- A PostgreSQL superuser +- A replication user +- A standard PostgreSQL user + +The below code will help you set up these Secrets. + +``` +# this variable is the name of the cluster being created +pgo_cluster_name=hippo +# this variable is the namespace the cluster is being deployed into +cluster_namespace=pgo + +# this is the superuser secret +kubectl create secret generic -n "${cluster_namespace}" "${pgo_cluster_name}-postgres-secret" \ + --from-literal=username=postgres \ + --from-literal=password=Supersecurepassword* + +# this is the replication user secret +kubectl create secret generic -n "${cluster_namespace}" "${pgo_cluster_name}-primaryuser-secret" \ + --from-literal=username=primaryuser \ + --from-literal=password=Anothersecurepassword* + +# this is the standard user secret +kubectl create secret generic -n "${cluster_namespace}" "${pgo_cluster_name}-hippo-secret" \ + --from-literal=username=hippo \ + --from-literal=password=Moresecurepassword* + + +kubectl label secrets -n "${cluster_namespace}" "${pgo_cluster_name}-postgres-secret" "pg-cluster=${pgo_cluster_name}" +kubectl label secrets -n "${cluster_namespace}" "${pgo_cluster_name}-primaryuser-secret" "pg-cluster=${pgo_cluster_name}" +kubectl label secrets -n "${cluster_namespace}" "${pgo_cluster_name}-hippo-secret" "pg-cluster=${pgo_cluster_name}" +``` + +#### Step 3: Create the PostgreSQL Cluster + +With the Secrets in place. It is now time to create the PostgreSQL cluster. + +The below manifest references the Secrets created in the previous step to add a +custom resource to the `pgclusters.crunchydata.com` custom resource definition. +There are some additions in this example specifically for storing backups in S3. + +``` +# this variable is the name of the cluster being created +export pgo_cluster_name=hippo +# this variable is the namespace the cluster is being deployed into +export cluster_namespace=pgo +# the following variables store the information for your S3 cluster. You may +# need to adjust them for your actual settings +export backrest_s3_bucket=your-bucket +export backrest_s3_endpoint=s3.region-name.amazonaws.com +export backrest_s3_region=region-name + +cat <<-EOF > "${pgo_cluster_name}-pgcluster.yaml" +apiVersion: crunchydata.com/v1 +kind: Pgcluster +metadata: + annotations: + current-primary: ${pgo_cluster_name} + labels: + autofail: "true" + backrest-storage-type: "s3" + crunchy-pgbadger: "false" + crunchy-pgha-scope: ${pgo_cluster_name} + crunchy-postgres-exporter: "false" + deployment-name: ${pgo_cluster_name} + name: ${pgo_cluster_name} + pg-cluster: ${pgo_cluster_name} + pg-pod-anti-affinity: "" + pgo-backrest: "true" + pgo-version: {{< param operatorVersion >}} + pgouser: admin + name: ${pgo_cluster_name} + namespace: ${cluster_namespace} +spec: + BackrestStorage: + accessmode: ReadWriteMany + matchLabels: "" + name: "" + size: 1G + storageclass: "" + storagetype: dynamic + supplementalgroups: "" + PrimaryStorage: + accessmode: ReadWriteMany + matchLabels: "" + name: ${pgo_cluster_name} + size: 1G + storageclass: "" + storagetype: dynamic + supplementalgroups: "" + ReplicaStorage: + accessmode: ReadWriteMany + matchLabels: "" + name: "" + size: 1G + storageclass: "" + storagetype: dynamic + supplementalgroups: "" + annotations: + backrestLimits: {} + backrestRepoPath: "" + backrestResources: + memory: 48Mi + backrestS3Bucket: ${backrest_s3_bucket} + backrestS3Endpoint: ${backrest_s3_endpoint} + backrestS3Region: ${backrest_s3_region} + backrestS3URIStyle: "" + backrestS3VerifyTLS: "" + ccpimage: crunchy-postgres-ha + ccpimageprefix: registry.developers.crunchydata.com/crunchydata + ccpimagetag: {{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}} + clustername: ${pgo_cluster_name} + customconfig: "" + database: ${pgo_cluster_name} + exporterport: "9187" + limits: {} + name: ${pgo_cluster_name} + namespace: ${cluster_namespace} + pgBouncer: + limits: {} + replicas: 0 + pgDataSource: + restoreFrom: "" + restoreOpts: "" + pgbadgerport: "10000" + pgoimageprefix: registry.developers.crunchydata.com/crunchydata + podAntiAffinity: + default: preferred + pgBackRest: preferred + pgBouncer: preferred + policies: "" + port: "5432" + primarysecretname: ${pgo_cluster_name}-primaryuser-secret + replicas: "0" + rootsecretname: ${pgo_cluster_name}-postgres-secret + shutdown: false + standby: false + tablespaceMounts: {} + tls: + caSecret: "" + replicationTLSSecret: "" + tlsSecret: "" + tlsOnly: false + user: hippo + userlabels: + backrest-storage-type: "s3" + crunchy-postgres-exporter: "false" + pg-pod-anti-affinity: "" + pgo-version: {{< param operatorVersion >}} + usersecretname: ${pgo_cluster_name}-hippo-secret +EOF + +kubectl apply -f "${pgo_cluster_name}-pgcluster.yaml" +``` + ### Modify a Cluster There following modification operations are supported on the From 62c849029c04354bd819639fd086fdf00c0bcdf2 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 27 Oct 2020 20:40:12 -0400 Subject: [PATCH 016/129] Create "pgo-config" ConfigMap if not provided The Operator (and associated containers) will create the pgo-config ConfigMap from the stored default configuration if the pgo-config ConfigMap is not present. This allows for the editing of "default configuration" after the Operator is deployed, and allows for the removal of the pgo-config creation step from several of the installation methods. Issue: [ch9451] --- docs/content/Configuration/configuration.md | 6 +- .../installation/other/operator-hub.md | 14 -- installers/olm/description.openshift.md | 14 -- installers/olm/description.upstream.md | 14 -- internal/config/pgoconfig.go | 176 +++++++++++------- 5 files changed, 111 insertions(+), 113 deletions(-) diff --git a/docs/content/Configuration/configuration.md b/docs/content/Configuration/configuration.md index e85823a865..e6bae33be9 100644 --- a/docs/content/Configuration/configuration.md +++ b/docs/content/Configuration/configuration.md @@ -16,9 +16,9 @@ The configuration files used by the Operator are found in 2 places: * the pgo-config ConfigMap in the namespace the Operator is running in * or, a copy of the configuration files are also included by default into the Operator container images themselves to support a very simplistic deployment of the Operator -If the pgo-config ConfigMap is not found by the Operator, it will use -the configuration files that are included in the Operator container -images. +If the `pgo-config` ConfigMap is not found by the Operator, it will create a +`pgo-config` ConfigMap using the configuration files that are included in the +Operator container. ## conf/postgres-operator/pgo.yaml The *pgo.yaml* file sets many different Operator configuration settings and is described in the [pgo.yaml configuration]({{< ref "pgo-yaml-configuration.md" >}}) documentation section. diff --git a/docs/content/installation/other/operator-hub.md b/docs/content/installation/other/operator-hub.md index 9b077ef073..b610ee2664 100644 --- a/docs/content/installation/other/operator-hub.md +++ b/docs/content/installation/other/operator-hub.md @@ -43,19 +43,6 @@ git clone -b v{{< param operatorVersion >}} https://github.com/CrunchyData/postg cd postgres-operator ``` -### PostgreSQL Operator Configuration - -Edit `conf/postgres-operator/pgo.yaml` to configure the deployment. Look over all of the options and make any -changes necessary for your environment. A full description of each option is available in the -[`pgo.yaml` configuration guide]({{< relref "configuration/pgo-yaml-configuration.md" >}}). - -When the file is ready, upload the entire directory to the `pgo-config` ConfigMap. - -``` -kubectl -n "$PGO_OPERATOR_NAMESPACE" create configmap pgo-config \ - --from-file=./conf/postgres-operator -``` - ### Secrets Configure pgBackRest for your environment. If you do not plan to use AWS S3 to store backups, you can omit @@ -152,4 +139,3 @@ pgo version # pgo client version {{< param operatorVersion >}} # pgo-apiserver version {{< param operatorVersion >}} ``` - diff --git a/installers/olm/description.openshift.md b/installers/olm/description.openshift.md index ad31cbe1e5..e4eb3c0831 100644 --- a/installers/olm/description.openshift.md +++ b/installers/olm/description.openshift.md @@ -63,20 +63,6 @@ edit `conf/postgres-operator/pgo.yaml` and set `DisableFSGroup` to `true`. [Security Context Constraint]: https://docs.openshift.com/container-platform/latest/authentication/managing-security-context-constraints.html -### PostgreSQL Operator Configuration - -Edit `conf/postgres-operator/pgo.yaml` to configure the deployment. Look over all of the options and make any -changes necessary for your environment. A [full description of each option][pgo-yaml-reference] is available in the documentation. - -[pgo-yaml-reference]: https://access.crunchydata.com/documentation/postgres-operator/${PGO_VERSION}/configuration/pgo-yaml-configuration/ - -When the file is ready, upload the entire directory to the `pgo-config` ConfigMap. - -``` -oc -n "$PGO_OPERATOR_NAMESPACE" create configmap pgo-config \ - --from-file=./conf/postgres-operator -``` - ### Secrets Configure pgBackRest for your environment. If you do not plan to use AWS S3 to store backups, you can omit diff --git a/installers/olm/description.upstream.md b/installers/olm/description.upstream.md index 8838098032..1e192fa9c2 100644 --- a/installers/olm/description.upstream.md +++ b/installers/olm/description.upstream.md @@ -56,20 +56,6 @@ git clone -b v${PGO_VERSION} https://github.com/CrunchyData/postgres-operator.gi cd postgres-operator ``` -### PostgreSQL Operator Configuration - -Edit `conf/postgres-operator/pgo.yaml` to configure the deployment. Look over all of the options and make any -changes necessary for your environment. A [full description of each option][pgo-yaml-reference] is available in the documentation. - -[pgo-yaml-reference]: https://access.crunchydata.com/documentation/postgres-operator/${PGO_VERSION}/configuration/pgo-yaml-configuration/ - -When the file is ready, upload the entire directory to the `pgo-config` ConfigMap. - -``` -kubectl -n "$PGO_OPERATOR_NAMESPACE" create configmap pgo-config \ - --from-file=./conf/postgres-operator -``` - ### Secrets Configure pgBackRest for your environment. If you do not plan to use AWS S3 to store backups, you can omit diff --git a/internal/config/pgoconfig.go b/internal/config/pgoconfig.go index f951f77dee..7b4a162e3f 100644 --- a/internal/config/pgoconfig.go +++ b/internal/config/pgoconfig.go @@ -20,6 +20,7 @@ import ( "fmt" "io/ioutil" "os" + "path/filepath" "strconv" "strings" "text/template" @@ -28,6 +29,7 @@ import ( log "github.com/sirupsen/logrus" v1 "k8s.io/api/core/v1" + kerrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/validation" @@ -36,8 +38,7 @@ import ( ) const CustomConfigMapName = "pgo-config" -const DefaultConfigsPath = "/default-pgo-config/" -const CustomConfigsPath = "/pgo-config/" +const defaultConfigPath = "/default-pgo-config/" var PgoDefaultServiceAccountTemplate *template.Template @@ -518,29 +519,17 @@ func (c *PgoConfig) GetStorageSpec(name string) (crv1.PgStorageSpec, error) { func (c *PgoConfig) GetConfig(clientset kubernetes.Interface, namespace string) error { - cMap, rootPath := getRootPath(clientset, namespace) - - var yamlFile []byte - var err error + cMap, err := initialize(clientset, namespace) //get the pgo.yaml config file - if cMap != nil { - str := cMap.Data[CONFIG_PATH] - if str == "" { - errMsg := fmt.Sprintf("could not get %s from ConfigMap", CONFIG_PATH) - return errors.New(errMsg) - } - yamlFile = []byte(str) - } else { - yamlFile, err = ioutil.ReadFile(rootPath + CONFIG_PATH) - if err != nil { - log.Errorf("yamlFile.Get err #%v ", err) - return err - } + str := cMap.Data[CONFIG_PATH] + if str == "" { + return fmt.Errorf("could not get %s from ConfigMap", CONFIG_PATH) } - err = yaml.Unmarshal(yamlFile, c) - if err != nil { + yamlFile := []byte(str) + + if err := yaml.Unmarshal(yamlFile, c); err != nil { log.Errorf("Unmarshal: %v", err) return err } @@ -554,183 +543,183 @@ func (c *PgoConfig) GetConfig(clientset kubernetes.Interface, namespace string) c.CheckEnv() //load up all the templates - PgoDefaultServiceAccountTemplate, err = c.LoadTemplate(cMap, rootPath, PGODefaultServiceAccountPath) + PgoDefaultServiceAccountTemplate, err = c.LoadTemplate(cMap, PGODefaultServiceAccountPath) if err != nil { return err } - PgoBackrestServiceAccountTemplate, err = c.LoadTemplate(cMap, rootPath, PGOBackrestServiceAccountPath) + PgoBackrestServiceAccountTemplate, err = c.LoadTemplate(cMap, PGOBackrestServiceAccountPath) if err != nil { return err } - PgoTargetServiceAccountTemplate, err = c.LoadTemplate(cMap, rootPath, PGOTargetServiceAccountPath) + PgoTargetServiceAccountTemplate, err = c.LoadTemplate(cMap, PGOTargetServiceAccountPath) if err != nil { return err } - PgoTargetRoleBindingTemplate, err = c.LoadTemplate(cMap, rootPath, PGOTargetRoleBindingPath) + PgoTargetRoleBindingTemplate, err = c.LoadTemplate(cMap, PGOTargetRoleBindingPath) if err != nil { return err } - PgoBackrestRoleTemplate, err = c.LoadTemplate(cMap, rootPath, PGOBackrestRolePath) + PgoBackrestRoleTemplate, err = c.LoadTemplate(cMap, PGOBackrestRolePath) if err != nil { return err } - PgoBackrestRoleBindingTemplate, err = c.LoadTemplate(cMap, rootPath, PGOBackrestRoleBindingPath) + PgoBackrestRoleBindingTemplate, err = c.LoadTemplate(cMap, PGOBackrestRoleBindingPath) if err != nil { return err } - PgoTargetRoleTemplate, err = c.LoadTemplate(cMap, rootPath, PGOTargetRolePath) + PgoTargetRoleTemplate, err = c.LoadTemplate(cMap, PGOTargetRolePath) if err != nil { return err } - PgoPgServiceAccountTemplate, err = c.LoadTemplate(cMap, rootPath, PGOPgServiceAccountPath) + PgoPgServiceAccountTemplate, err = c.LoadTemplate(cMap, PGOPgServiceAccountPath) if err != nil { return err } - PgoPgRoleTemplate, err = c.LoadTemplate(cMap, rootPath, PGOPgRolePath) + PgoPgRoleTemplate, err = c.LoadTemplate(cMap, PGOPgRolePath) if err != nil { return err } - PgoPgRoleBindingTemplate, err = c.LoadTemplate(cMap, rootPath, PGOPgRoleBindingPath) + PgoPgRoleBindingTemplate, err = c.LoadTemplate(cMap, PGOPgRoleBindingPath) if err != nil { return err } - PVCTemplate, err = c.LoadTemplate(cMap, rootPath, pvcPath) + PVCTemplate, err = c.LoadTemplate(cMap, pvcPath) if err != nil { return err } - PolicyJobTemplate, err = c.LoadTemplate(cMap, rootPath, policyJobTemplatePath) + PolicyJobTemplate, err = c.LoadTemplate(cMap, policyJobTemplatePath) if err != nil { return err } - ContainerResourcesTemplate, err = c.LoadTemplate(cMap, rootPath, containerResourcesTemplatePath) + ContainerResourcesTemplate, err = c.LoadTemplate(cMap, containerResourcesTemplatePath) if err != nil { return err } - PgoBackrestRepoServiceTemplate, err = c.LoadTemplate(cMap, rootPath, pgoBackrestRepoServiceTemplatePath) + PgoBackrestRepoServiceTemplate, err = c.LoadTemplate(cMap, pgoBackrestRepoServiceTemplatePath) if err != nil { return err } - PgoBackrestRepoTemplate, err = c.LoadTemplate(cMap, rootPath, pgoBackrestRepoTemplatePath) + PgoBackrestRepoTemplate, err = c.LoadTemplate(cMap, pgoBackrestRepoTemplatePath) if err != nil { return err } - PgmonitorEnvVarsTemplate, err = c.LoadTemplate(cMap, rootPath, pgmonitorEnvVarsPath) + PgmonitorEnvVarsTemplate, err = c.LoadTemplate(cMap, pgmonitorEnvVarsPath) if err != nil { return err } - PgbackrestEnvVarsTemplate, err = c.LoadTemplate(cMap, rootPath, pgbackrestEnvVarsPath) + PgbackrestEnvVarsTemplate, err = c.LoadTemplate(cMap, pgbackrestEnvVarsPath) if err != nil { return err } - PgbackrestS3EnvVarsTemplate, err = c.LoadTemplate(cMap, rootPath, pgbackrestS3EnvVarsPath) + PgbackrestS3EnvVarsTemplate, err = c.LoadTemplate(cMap, pgbackrestS3EnvVarsPath) if err != nil { return err } - PgAdminTemplate, err = c.LoadTemplate(cMap, rootPath, pgAdminTemplatePath) + PgAdminTemplate, err = c.LoadTemplate(cMap, pgAdminTemplatePath) if err != nil { return err } - PgAdminServiceTemplate, err = c.LoadTemplate(cMap, rootPath, pgAdminServiceTemplatePath) + PgAdminServiceTemplate, err = c.LoadTemplate(cMap, pgAdminServiceTemplatePath) if err != nil { return err } - PgbouncerTemplate, err = c.LoadTemplate(cMap, rootPath, pgbouncerTemplatePath) + PgbouncerTemplate, err = c.LoadTemplate(cMap, pgbouncerTemplatePath) if err != nil { return err } - PgbouncerConfTemplate, err = c.LoadTemplate(cMap, rootPath, pgbouncerConfTemplatePath) + PgbouncerConfTemplate, err = c.LoadTemplate(cMap, pgbouncerConfTemplatePath) if err != nil { return err } - PgbouncerUsersTemplate, err = c.LoadTemplate(cMap, rootPath, pgbouncerUsersTemplatePath) + PgbouncerUsersTemplate, err = c.LoadTemplate(cMap, pgbouncerUsersTemplatePath) if err != nil { return err } - PgbouncerHBATemplate, err = c.LoadTemplate(cMap, rootPath, pgbouncerHBATemplatePath) + PgbouncerHBATemplate, err = c.LoadTemplate(cMap, pgbouncerHBATemplatePath) if err != nil { return err } - ServiceTemplate, err = c.LoadTemplate(cMap, rootPath, serviceTemplatePath) + ServiceTemplate, err = c.LoadTemplate(cMap, serviceTemplatePath) if err != nil { return err } - RmdatajobTemplate, err = c.LoadTemplate(cMap, rootPath, rmdatajobPath) + RmdatajobTemplate, err = c.LoadTemplate(cMap, rmdatajobPath) if err != nil { return err } - BackrestjobTemplate, err = c.LoadTemplate(cMap, rootPath, backrestjobPath) + BackrestjobTemplate, err = c.LoadTemplate(cMap, backrestjobPath) if err != nil { return err } - BackrestRestorejobTemplate, err = c.LoadTemplate(cMap, rootPath, backrestRestorejobPath) + BackrestRestorejobTemplate, err = c.LoadTemplate(cMap, backrestRestorejobPath) if err != nil { return err } - PgDumpBackupJobTemplate, err = c.LoadTemplate(cMap, rootPath, pgDumpBackupJobPath) + PgDumpBackupJobTemplate, err = c.LoadTemplate(cMap, pgDumpBackupJobPath) if err != nil { return err } - PgRestoreJobTemplate, err = c.LoadTemplate(cMap, rootPath, pgRestoreJobPath) + PgRestoreJobTemplate, err = c.LoadTemplate(cMap, pgRestoreJobPath) if err != nil { return err } - PVCMatchLabelsTemplate, err = c.LoadTemplate(cMap, rootPath, pvcMatchLabelsPath) + PVCMatchLabelsTemplate, err = c.LoadTemplate(cMap, pvcMatchLabelsPath) if err != nil { return err } - PVCStorageClassTemplate, err = c.LoadTemplate(cMap, rootPath, pvcSCPath) + PVCStorageClassTemplate, err = c.LoadTemplate(cMap, pvcSCPath) if err != nil { return err } - AffinityTemplate, err = c.LoadTemplate(cMap, rootPath, affinityTemplatePath) + AffinityTemplate, err = c.LoadTemplate(cMap, affinityTemplatePath) if err != nil { return err } - PodAntiAffinityTemplate, err = c.LoadTemplate(cMap, rootPath, podAntiAffinityTemplatePath) + PodAntiAffinityTemplate, err = c.LoadTemplate(cMap, podAntiAffinityTemplatePath) if err != nil { return err } - ExporterTemplate, err = c.LoadTemplate(cMap, rootPath, exporterTemplatePath) + ExporterTemplate, err = c.LoadTemplate(cMap, exporterTemplatePath) if err != nil { return err } - BadgerTemplate, err = c.LoadTemplate(cMap, rootPath, badgerTemplatePath) + BadgerTemplate, err = c.LoadTemplate(cMap, badgerTemplatePath) if err != nil { return err } - DeploymentTemplate, err = c.LoadTemplate(cMap, rootPath, deploymentTemplatePath) + DeploymentTemplate, err = c.LoadTemplate(cMap, deploymentTemplatePath) if err != nil { return err } - BootstrapTemplate, err = c.LoadTemplate(cMap, rootPath, bootstrapTemplatePath) + BootstrapTemplate, err = c.LoadTemplate(cMap, bootstrapTemplatePath) if err != nil { return err } @@ -738,20 +727,71 @@ func (c *PgoConfig) GetConfig(clientset kubernetes.Interface, namespace string) return nil } -func getRootPath(clientset kubernetes.Interface, namespace string) (*v1.ConfigMap, string) { +// getOperatorConfigMap returns the config map that contains all of the +// configuration for the Operator +func getOperatorConfigMap(clientset kubernetes.Interface, namespace string) (*v1.ConfigMap, error) { + return clientset.CoreV1().ConfigMaps(namespace).Get(CustomConfigMapName, metav1.GetOptions{}) +} + +// initialize attemps to get the configuration ConfigMap based on a name. +// If the ConfigMap does not exist, a ConfigMap is created from the default +// configuration path +func initialize(clientset kubernetes.Interface, namespace string) (*v1.ConfigMap, error) { + // if the ConfigMap exists, exit + if cm, err := getOperatorConfigMap(clientset, namespace); err == nil { + log.Infof("Config: %q ConfigMap found, using config files from the configmap", CustomConfigMapName) + return cm, nil + } + + // otherwise, create a ConfigMap + log.Infof("Config: %q ConfigMap NOT found, creating ConfigMap from files from %q", CustomConfigMapName, defaultConfigPath) + + cm := &v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: CustomConfigMapName, + }, + Data: map[string]string{}, + } + + // get all of the file names that are in the default configuration directory + if err := filepath.Walk(defaultConfigPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + // skip if a directory + if info.IsDir() { + return nil + } + + // get all of the contents of a default configuration and load it into + // a ConfigMap + if contents, err := ioutil.ReadFile(path); err != nil { + return err + } else { + cm.Data[info.Name()] = string(contents) + } + + return nil + }); err != nil { + return nil, err + } + + // create the ConfigMap. If the error is that the ConfigMap was already + // created, then grab the new ConfigMap + if _, err := clientset.CoreV1().ConfigMaps(namespace).Create(cm); err != nil { + if kerrors.IsAlreadyExists(err) { + return getOperatorConfigMap(clientset, namespace) + } - cMap, err := clientset.CoreV1().ConfigMaps(namespace).Get(CustomConfigMapName, metav1.GetOptions{}) - if err == nil { - log.Infof("Config: %s ConfigMap found, using config files from the configmap", CustomConfigMapName) - return cMap, "" + return nil, err } - log.Infof("Config: %s ConfigMap NOT found, using default baked-in config files from %s", CustomConfigMapName, DefaultConfigsPath) - return nil, DefaultConfigsPath + return cm, nil } // LoadTemplate will load a JSON template from a path -func (c *PgoConfig) LoadTemplate(cMap *v1.ConfigMap, rootPath, path string) (*template.Template, error) { +func (c *PgoConfig) LoadTemplate(cMap *v1.ConfigMap, path string) (*template.Template, error) { var value string var err error @@ -781,7 +821,7 @@ func (c *PgoConfig) LoadTemplate(cMap *v1.ConfigMap, rootPath, path string) (*te func (c *PgoConfig) DefaultTemplate(path string) (string, error) { // set the lookup value for the file path based on the default configuration // path and the template file requested to be loaded - fullPath := DefaultConfigsPath + path + fullPath := defaultConfigPath + path log.Debugf("No entry in cmap loading default path [%s]", fullPath) From 2c318bacc6e65faa46be17d87469204a055bc421 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 8 Nov 2020 17:59:15 -0500 Subject: [PATCH 017/129] Fix compilatino errors introduced from backpatch REL_4_5 uses an older version of client-go for Kubernetes which does not use contexts. Additionally, 8719ac76 leveraged some functions that did not exist on REL_4_5 and as such the patch was rewritten to use the existing functions. Issue: [chch9510] --- .../apiserver/clusterservice/clusterimpl.go | 2 +- internal/apiserver/root.go | 20 +++++-------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index 5d887eee60..8d166236f8 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -1012,7 +1012,7 @@ func CreateCluster(request *msgs.CreateClusterRequest, ns, pgouser string) msgs. }, } - if _, err := apiserver.Clientset.CoreV1().Secrets(ns).Create(ctx, secret, metav1.CreateOptions{}); err != nil && !kubeapi.IsAlreadyExists(err) { + if _, err := apiserver.Clientset.CoreV1().Secrets(ns).Create(secret); err != nil && !kubeapi.IsAlreadyExists(err) { resp.Status.Code = msgs.Error resp.Status.Msg = fmt.Sprintf("could not create backrest repo secret: %s", err) return resp diff --git a/internal/apiserver/root.go b/internal/apiserver/root.go index 7cd28033f2..bff09ceb9d 100644 --- a/internal/apiserver/root.go +++ b/internal/apiserver/root.go @@ -35,7 +35,6 @@ import ( log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) @@ -511,17 +510,15 @@ func setNamespaceOperatingMode() error { // namespace. If any have an empty password, it generates a random password, // Base64 encodes it, then stores it in the relevant PGO user's secret func setRandomPgouserPasswords() { - ctx := context.TODO() - selector := "pgo-pgouser=true,vendor=crunchydata" secrets, err := Clientset.CoreV1().Secrets(PgoNamespace). - List(ctx, metav1.ListOptions{LabelSelector: selector}) + List(metav1.ListOptions{LabelSelector: selector}) if err != nil { log.Warnf("Could not get pgouser secrets in namespace: %s", PgoNamespace) return } - for _, secret := range secrets.Items { + for i, secret := range secrets.Items { // check if password is set. if it is, continue. if len(secret.Data["password"]) > 0 { continue @@ -539,18 +536,11 @@ func setRandomPgouserPasswords() { continue } - // create the password patch - patch, err := kubeapi.NewMergePatch().Add("stringData", "password")(generatedPassword).Bytes() - - if err != nil { - log.Errorf("Could not generate password patch for pgouser secret %s for operator installation "+ - "%s in namespace %s", secret.Name, InstallationName, PgoNamespace) - continue - } + // add the password to the secret + secrets.Items[i].Data["password"] = []byte(generatedPassword) // patch the pgouser secret with the new password - if _, err := Clientset.CoreV1().Secrets(PgoNamespace).Patch(ctx, secret.Name, types.MergePatchType, - patch, metav1.PatchOptions{}); err != nil { + if _, err := Clientset.CoreV1().Secrets(PgoNamespace).Update(&secrets.Items[i]); err != nil { log.Errorf("Could not patch pgouser secret %s with generated password for operator installation "+ "%s in namespace %s", secret.Name, InstallationName, PgoNamespace) } From 7c68baaaf2d36af9cbcd6018e9618725c628159a Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 9 Nov 2020 14:57:20 -0500 Subject: [PATCH 018/129] Reinstate the create-cluster directory in the Helm example For whatever reason, this was lost in backpatching. --- examples/helm/create-cluster/.helmignore | 23 +++++ examples/helm/create-cluster/Chart.yaml | 23 +++++ .../helm/create-cluster/templates/NOTES.txt | 34 +++++++ .../create-cluster/templates/_helpers.tpl | 62 ++++++++++++ .../templates/backrest-repo-config.yaml | 16 ++++ .../templates/hippo-secret.yaml | 12 +++ .../create-cluster/templates/pgcluster.yaml | 95 +++++++++++++++++++ .../templates/postgres-secret.yaml | 12 +++ .../templates/primaryuser-secret.yaml | 12 +++ examples/helm/create-cluster/values.yaml | 17 ++++ 10 files changed, 306 insertions(+) create mode 100644 examples/helm/create-cluster/.helmignore create mode 100644 examples/helm/create-cluster/Chart.yaml create mode 100644 examples/helm/create-cluster/templates/NOTES.txt create mode 100644 examples/helm/create-cluster/templates/_helpers.tpl create mode 100644 examples/helm/create-cluster/templates/backrest-repo-config.yaml create mode 100644 examples/helm/create-cluster/templates/hippo-secret.yaml create mode 100644 examples/helm/create-cluster/templates/pgcluster.yaml create mode 100644 examples/helm/create-cluster/templates/postgres-secret.yaml create mode 100644 examples/helm/create-cluster/templates/primaryuser-secret.yaml create mode 100644 examples/helm/create-cluster/values.yaml diff --git a/examples/helm/create-cluster/.helmignore b/examples/helm/create-cluster/.helmignore new file mode 100644 index 0000000000..0e8a0eb36f --- /dev/null +++ b/examples/helm/create-cluster/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/examples/helm/create-cluster/Chart.yaml b/examples/helm/create-cluster/Chart.yaml new file mode 100644 index 0000000000..5857415edb --- /dev/null +++ b/examples/helm/create-cluster/Chart.yaml @@ -0,0 +1,23 @@ +apiVersion: v2 +name: crunchycrdcluster +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +appVersion: 1.16.0 diff --git a/examples/helm/create-cluster/templates/NOTES.txt b/examples/helm/create-cluster/templates/NOTES.txt new file mode 100644 index 0000000000..542443a66e --- /dev/null +++ b/examples/helm/create-cluster/templates/NOTES.txt @@ -0,0 +1,34 @@ +Thank you deploying a crunchy postgreSQL cluster v{{ .Chart.AppVersion }}! + + (((((((((((((((((((((( + (((((((((((((%%%%%%%((((((((((((((( + (((((((((((%%% %%%%(((((((((((( + (((((((((((%%( (((( ( %%%((((((((((( + (((((((((((((%% (( ,(( %%%((((((((((( + (((((((((((((((%% *%%/ %%%%%%%(((((((((( + (((((((((((((((((((%%(( %%%%%%%%%%#(((((%%%%%%%%%%#(((((((((((( + ((((((((((((((((((%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%(((((((((((((( + *((((((((((((((((((((%%%%%% /%%%%%%%%%%%%%%%%%%%(((((((((((((((( + (((((((((((((((((((((((%%%/ .%, %%%((((((((((((((((((, + ((((((((((((((((((((((% %#((((((((((((((((( +(((((((((((((((%%%%%% #%((((((((((((((((( +((((((((((((((%% %%(((((((((((((((, +((((((((((((%%%#% % %%((((((((((((((( +((((((((((((%. % % #(((((((((((((( +(((((((((((%% % %%* %((((((((((((( +#(###(###(#%% %%% %% %%% #%%#(###(###(# +###########%%%%% /%%%%%%%%%%%%% %% %%%%% ,%%####### +###############%% %%%%%% %%% %%%%%%%% %%##### + ################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%## + ################%% %%%%%%%%%%%%%%%%% %%%% % + ##############%# %% (%%%%%%% %%%%%% + #############% %%%%% %%%%%%%%%%% + ###########% %%%%%%%%%%% %%%%%%%%% + #########%% %% %%%%%%%%%%%%%%%# + ########%% %% %%%%%%%%% + ######%% %% %%%%%% + ####%%% %%%%% % + %% %%%% + +More information about the custom resource workflow the docs can be found here: +https://access.crunchydata.com/documentation/postgres-operator/latest/custom-resources/ diff --git a/examples/helm/create-cluster/templates/_helpers.tpl b/examples/helm/create-cluster/templates/_helpers.tpl new file mode 100644 index 0000000000..8ebe4c4d53 --- /dev/null +++ b/examples/helm/create-cluster/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "crunchycrdcluster.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "crunchycrdcluster.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "crunchycrdcluster.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "crunchycrdcluster.labels" -}} +helm.sh/chart: {{ include "crunchycrdcluster.chart" . }} +{{ include "crunchycrdcluster.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "crunchycrdcluster.selectorLabels" -}} +app.kubernetes.io/name: {{ include "crunchycrdcluster.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "crunchycrdcluster.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "crunchycrdcluster.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/examples/helm/create-cluster/templates/backrest-repo-config.yaml b/examples/helm/create-cluster/templates/backrest-repo-config.yaml new file mode 100644 index 0000000000..166d0b3dcd --- /dev/null +++ b/examples/helm/create-cluster/templates/backrest-repo-config.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +data: + authorized_keys: {{ .Files.Get "certs/hippo-key.pub" | b64enc }} + config: SG9zdCAqClN0cmljdEhvc3RLZXlDaGVja2luZyBubwpJZGVudGl0eUZpbGUgL3RtcC9pZF9lZDI1NTE5ClBvcnQgMjAyMgpVc2VyIHBnYmFja3Jlc3QK + id_ed25519: {{ .Files.Get "certs/hippo-key" | b64enc }} + ssh_host_ed25519_key: {{ .Files.Get "certs/hippo-key" | b64enc }} + sshd_config: IwkkT3BlbkJTRDogc3NoZF9jb25maWcsdiAxLjEwMCAyMDE2LzA4LzE1IDEyOjMyOjA0IG5hZGR5IEV4cCAkCgojIFRoaXMgaXMgdGhlIHNzaGQgc2VydmVyIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZQojIHNzaGRfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKIyBUaGlzIHNzaGQgd2FzIGNvbXBpbGVkIHdpdGggUEFUSD0vdXNyL2xvY2FsL2JpbjovdXNyL2JpbgoKIyBUaGUgc3RyYXRlZ3kgdXNlZCBmb3Igb3B0aW9ucyBpbiB0aGUgZGVmYXVsdCBzc2hkX2NvbmZpZyBzaGlwcGVkIHdpdGgKIyBPcGVuU1NIIGlzIHRvIHNwZWNpZnkgb3B0aW9ucyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2hlcmUKIyBwb3NzaWJsZSwgYnV0IGxlYXZlIHRoZW0gY29tbWVudGVkLiAgVW5jb21tZW50ZWQgb3B0aW9ucyBvdmVycmlkZSB0aGUKIyBkZWZhdWx0IHZhbHVlLgoKIyBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHBvcnQgb24gYSBTRUxpbnV4IHN5c3RlbSwgeW91IGhhdmUgdG8gdGVsbAojIFNFTGludXggYWJvdXQgdGhpcyBjaGFuZ2UuCiMgc2VtYW5hZ2UgcG9ydCAtYSAtdCBzc2hfcG9ydF90IC1wIHRjcCAjUE9SVE5VTUJFUgojClBvcnQgMjAyMgojQWRkcmVzc0ZhbWlseSBhbnkKI0xpc3RlbkFkZHJlc3MgMC4wLjAuMAojTGlzdGVuQWRkcmVzcyA6OgoKSG9zdEtleSAvc3NoZC9zc2hfaG9zdF9lZDI1NTE5X2tleQoKIyBDaXBoZXJzIGFuZCBrZXlpbmcKI1Jla2V5TGltaXQgZGVmYXVsdCBub25lCgojIExvZ2dpbmcKI1N5c2xvZ0ZhY2lsaXR5IEFVVEgKU3lzbG9nRmFjaWxpdHkgQVVUSFBSSVYKI0xvZ0xldmVsIElORk8KCiMgQXV0aGVudGljYXRpb246CgojTG9naW5HcmFjZVRpbWUgMm0KUGVybWl0Um9vdExvZ2luIG5vClN0cmljdE1vZGVzIG5vCiNNYXhBdXRoVHJpZXMgNgojTWF4U2Vzc2lvbnMgMTAKClB1YmtleUF1dGhlbnRpY2F0aW9uIHllcwoKIyBUaGUgZGVmYXVsdCBpcyB0byBjaGVjayBib3RoIC5zc2gvYXV0aG9yaXplZF9rZXlzIGFuZCAuc3NoL2F1dGhvcml6ZWRfa2V5czIKIyBidXQgdGhpcyBpcyBvdmVycmlkZGVuIHNvIGluc3RhbGxhdGlvbnMgd2lsbCBvbmx5IGNoZWNrIC5zc2gvYXV0aG9yaXplZF9rZXlzCiNBdXRob3JpemVkS2V5c0ZpbGUJL3BnY29uZi9hdXRob3JpemVkX2tleXMKQXV0aG9yaXplZEtleXNGaWxlCS9zc2hkL2F1dGhvcml6ZWRfa2V5cwoKI0F1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSBub25lCgojQXV0aG9yaXplZEtleXNDb21tYW5kIG5vbmUKI0F1dGhvcml6ZWRLZXlzQ29tbWFuZFVzZXIgbm9ib2R5CgojIEZvciB0aGlzIHRvIHdvcmsgeW91IHdpbGwgYWxzbyBuZWVkIGhvc3Qga2V5cyBpbiAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMKI0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIG5vCiMgQ2hhbmdlIHRvIHllcyBpZiB5b3UgZG9uJ3QgdHJ1c3Qgfi8uc3NoL2tub3duX2hvc3RzIGZvcgojIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCiNJZ25vcmVVc2VyS25vd25Ib3N0cyBubwojIERvbid0IHJlYWQgdGhlIHVzZXIncyB+Ly5yaG9zdHMgYW5kIH4vLnNob3N0cyBmaWxlcwojSWdub3JlUmhvc3RzIHllcwoKIyBUbyBkaXNhYmxlIHR1bm5lbGVkIGNsZWFyIHRleHQgcGFzc3dvcmRzLCBjaGFuZ2UgdG8gbm8gaGVyZSEKI1Bhc3N3b3JkQXV0aGVudGljYXRpb24geWVzCiNQZXJtaXRFbXB0eVBhc3N3b3JkcyBubwpQYXNzd29yZEF1dGhlbnRpY2F0aW9uIG5vCgojIENoYW5nZSB0byBubyB0byBkaXNhYmxlIHMva2V5IHBhc3N3b3JkcwpDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHllcwojQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiBubwoKIyBLZXJiZXJvcyBvcHRpb25zCiNLZXJiZXJvc0F1dGhlbnRpY2F0aW9uIG5vCiNLZXJiZXJvc09yTG9jYWxQYXNzd2QgeWVzCiNLZXJiZXJvc1RpY2tldENsZWFudXAgeWVzCiNLZXJiZXJvc0dldEFGU1Rva2VuIG5vCiNLZXJiZXJvc1VzZUt1c2Vyb2sgeWVzCgojIEdTU0FQSSBvcHRpb25zCiNHU1NBUElBdXRoZW50aWNhdGlvbiB5ZXMKI0dTU0FQSUNsZWFudXBDcmVkZW50aWFscyBubwojR1NTQVBJU3RyaWN0QWNjZXB0b3JDaGVjayB5ZXMKI0dTU0FQSUtleUV4Y2hhbmdlIG5vCiNHU1NBUElFbmFibGVrNXVzZXJzIG5vCgojIFNldCB0aGlzIHRvICd5ZXMnIHRvIGVuYWJsZSBQQU0gYXV0aGVudGljYXRpb24sIGFjY291bnQgcHJvY2Vzc2luZywKIyBhbmQgc2Vzc2lvbiBwcm9jZXNzaW5nLiBJZiB0aGlzIGlzIGVuYWJsZWQsIFBBTSBhdXRoZW50aWNhdGlvbiB3aWxsCiMgYmUgYWxsb3dlZCB0aHJvdWdoIHRoZSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIGFuZAojIFBhc3N3b3JkQXV0aGVudGljYXRpb24uICBEZXBlbmRpbmcgb24geW91ciBQQU0gY29uZmlndXJhdGlvbiwKIyBQQU0gYXV0aGVudGljYXRpb24gdmlhIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gbWF5IGJ5cGFzcwojIHRoZSBzZXR0aW5nIG9mICJQZXJtaXRSb290TG9naW4gd2l0aG91dC1wYXNzd29yZCIuCiMgSWYgeW91IGp1c3Qgd2FudCB0aGUgUEFNIGFjY291bnQgYW5kIHNlc3Npb24gY2hlY2tzIHRvIHJ1biB3aXRob3V0CiMgUEFNIGF1dGhlbnRpY2F0aW9uLCB0aGVuIGVuYWJsZSB0aGlzIGJ1dCBzZXQgUGFzc3dvcmRBdXRoZW50aWNhdGlvbgojIGFuZCBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHRvICdubycuCiMgV0FSTklORzogJ1VzZVBBTSBubycgaXMgbm90IHN1cHBvcnRlZCBpbiBSZWQgSGF0IEVudGVycHJpc2UgTGludXggYW5kIG1heSBjYXVzZSBzZXZlcmFsCiMgcHJvYmxlbXMuClVzZVBBTSB5ZXMKCiNBbGxvd0FnZW50Rm9yd2FyZGluZyB5ZXMKI0FsbG93VGNwRm9yd2FyZGluZyB5ZXMKI0dhdGV3YXlQb3J0cyBubwpYMTFGb3J3YXJkaW5nIHllcwojWDExRGlzcGxheU9mZnNldCAxMAojWDExVXNlTG9jYWxob3N0IHllcwojUGVybWl0VFRZIHllcwojUHJpbnRNb3RkIHllcwojUHJpbnRMYXN0TG9nIHllcwojVENQS2VlcEFsaXZlIHllcwojVXNlTG9naW4gbm8KVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiBubwojUGVybWl0VXNlckVudmlyb25tZW50IG5vCiNDb21wcmVzc2lvbiBkZWxheWVkCiNDbGllbnRBbGl2ZUludGVydmFsIDAKI0NsaWVudEFsaXZlQ291bnRNYXggMwojU2hvd1BhdGNoTGV2ZWwgbm8KI1VzZUROUyB5ZXMKI1BpZEZpbGUgL3Zhci9ydW4vc3NoZC5waWQKI01heFN0YXJ0dXBzIDEwOjMwOjEwMAojUGVybWl0VHVubmVsIG5vCiNDaHJvb3REaXJlY3Rvcnkgbm9uZQojVmVyc2lvbkFkZGVuZHVtIG5vbmUKCiMgbm8gZGVmYXVsdCBiYW5uZXIgcGF0aAojQmFubmVyIG5vbmUKCiMgQWNjZXB0IGxvY2FsZS1yZWxhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcwpBY2NlcHRFbnYgTEFORyBMQ19DVFlQRSBMQ19OVU1FUklDIExDX1RJTUUgTENfQ09MTEFURSBMQ19NT05FVEFSWSBMQ19NRVNTQUdFUwpBY2NlcHRFbnYgTENfUEFQRVIgTENfTkFNRSBMQ19BRERSRVNTIExDX1RFTEVQSE9ORSBMQ19NRUFTVVJFTUVOVApBY2NlcHRFbnYgTENfSURFTlRJRklDQVRJT04gTENfQUxMIExBTkdVQUdFCkFjY2VwdEVudiBYTU9ESUZJRVJTCgojIG92ZXJyaWRlIGRlZmF1bHQgb2Ygbm8gc3Vic3lzdGVtcwpTdWJzeXN0ZW0Jc2Z0cAkvdXNyL2xpYmV4ZWMvb3BlbnNzaC9zZnRwLXNlcnZlcgoKIyBFeGFtcGxlIG9mIG92ZXJyaWRpbmcgc2V0dGluZ3Mgb24gYSBwZXItdXNlciBiYXNpcwojTWF0Y2ggVXNlciBhbm9uY3ZzCiMJWDExRm9yd2FyZGluZyBubwojCUFsbG93VGNwRm9yd2FyZGluZyBubwojCVBlcm1pdFRUWSBubwojCUZvcmNlQ29tbWFuZCBjdnMgc2VydmVyCg== +kind: Secret +metadata: + labels: + pg-cluster: {{ .Values.pgclustername }} + pgo-backrest-repo: "true" + vendor: crunchydata + name: {{ .Values.pgclustername }}-backrest-repo-config + namespace: {{ .Values.namespace }} +type: Opaque diff --git a/examples/helm/create-cluster/templates/hippo-secret.yaml b/examples/helm/create-cluster/templates/hippo-secret.yaml new file mode 100644 index 0000000000..8e922196e1 --- /dev/null +++ b/examples/helm/create-cluster/templates/hippo-secret.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +data: + password: {{ .Values.hipposecretpassword | b64enc }} + username: {{ .Values.hipposecretuser | b64enc }} +kind: Secret +metadata: + labels: + pg-cluster: {{ .Values.pgclustername }} + vendor: crunchydata + name: {{ .Values.pgclustername }}-hippo-secret + namespace: {{ .Values.namespace }} +type: Opaque diff --git a/examples/helm/create-cluster/templates/pgcluster.yaml b/examples/helm/create-cluster/templates/pgcluster.yaml new file mode 100644 index 0000000000..9dc5a4655d --- /dev/null +++ b/examples/helm/create-cluster/templates/pgcluster.yaml @@ -0,0 +1,95 @@ +apiVersion: crunchydata.com/v1 +kind: Pgcluster +metadata: + annotations: + current-primary: {{ .Values.pgclustername }} + labels: + autofail: "true" + crunchy-pgbadger: "false" + crunchy-pgha-scope: {{ .Values.pgclustername }} + crunchy-postgres-exporter: "false" + deployment-name: {{ .Values.pgclustername }} + name: {{ .Values.pgclustername }} + pg-cluster: {{ .Values.pgclustername }} + pg-pod-anti-affinity: "" + pgo-backrest: "true" + pgo-version: 4.5.0 + pgouser: admin + name: {{ .Values.pgclustername }} + namespace: {{ .Values.namespace }} +spec: + BackrestStorage: + accessmode: ReadWriteOnce + matchLabels: "" + name: "" + size: 3G + storageclass: "" + storagetype: dynamic + supplementalgroups: "" + PrimaryStorage: + accessmode: ReadWriteOnce + matchLabels: "" + name: {{ .Values.pgclustername }} + size: 3G + storageclass: "" + storagetype: dynamic + supplementalgroups: "" + ReplicaStorage: + accessmode: ReadWriteOnce + matchLabels: "" + name: "" + size: 3G + storageclass: "" + storagetype: dynamic + supplementalgroups: "" + annotations: + backrestLimits: {} + backrestRepoPath: "" + backrestResources: + memory: 48Mi + backrestS3Bucket: "" + backrestS3Endpoint: "" + backrestS3Region: "" + backrestS3URIStyle: "" + backrestS3VerifyTLS: "" + ccpimage: {{ .Values.ccpimage }} + ccpimageprefix: {{ .Values.ccpimageprefix }} + ccpimagetag: {{ .Values.ccpimagetag }} + clustername: {{ .Values.pgclustername }} + customconfig: "" + database: {{ .Values.pgclustername }} + exporterport: "9187" + limits: {} + name: {{ .Values.pgclustername }} + namespace: {{ .Values.namespace }} + pgBouncer: + limits: {} + replicas: 0 + pgDataSource: + restoreFrom: "" + restoreOpts: "" + pgbadgerport: "10000" + pgoimageprefix: {{ .Values.pgoimageprefix }} + podAntiAffinity: + default: preferred + pgBackRest: preferred + pgBouncer: preferred + policies: "" + port: "5432" + primarysecretname: {{ .Values.pgclustername }}-primaryuser-secret + replicas: "0" + rootsecretname: {{ .Values.pgclustername }}-postgres-secret + shutdown: false + standby: false + tablespaceMounts: {} + tls: + caSecret: "" + replicationTLSSecret: "" + tlsSecret: "" + tlsOnly: false + user: hippo + userlabels: + crunchy-postgres-exporter: "false" + pg-pod-anti-affinity: "" + pgo-version: {{ .Values.pgoversion }} + usersecretname: {{ .Values.pgclustername }}-hippo-secret diff --git a/examples/helm/create-cluster/templates/postgres-secret.yaml b/examples/helm/create-cluster/templates/postgres-secret.yaml new file mode 100644 index 0000000000..914da77e1c --- /dev/null +++ b/examples/helm/create-cluster/templates/postgres-secret.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +data: + password: {{ .Values.postgressecretpassword | b64enc }} + username: {{ .Values.postgressecretuser | b64enc }} +kind: Secret +metadata: + labels: + pg-cluster: {{ .Values.pgclustername }} + vendor: crunchydata + name: {{ .Values.pgclustername }}-postgres-secret + namespace: {{ .Values.namespace }} +type: Opaque \ No newline at end of file diff --git a/examples/helm/create-cluster/templates/primaryuser-secret.yaml b/examples/helm/create-cluster/templates/primaryuser-secret.yaml new file mode 100644 index 0000000000..f4471b8fd2 --- /dev/null +++ b/examples/helm/create-cluster/templates/primaryuser-secret.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +data: + password: {{ .Values.primaryusersecretpassword | b64enc }} + username: {{ .Values.primaryusersecretuser | b64enc }} +kind: Secret +metadata: + labels: + pg-cluster: {{ .Values.pgclustername }} + vendor: crunchydata + name: {{ .Values.pgclustername }}-primaryuser-secret + namespace: {{ .Values.namespace }} +type: Opaque \ No newline at end of file diff --git a/examples/helm/create-cluster/values.yaml b/examples/helm/create-cluster/values.yaml new file mode 100644 index 0000000000..09438cb745 --- /dev/null +++ b/examples/helm/create-cluster/values.yaml @@ -0,0 +1,17 @@ +# Default values for pg_deployment in SDX. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. +# The values is for the namespace and the postgresql cluster name +ccpimage: crunchy-postgres-ha +ccpimageprefix: registry.developers.crunchydata.com/crunchydata +ccpimagetag: centos7-12.4-4.5.0 +namespace: pgo +pgclustername: hippo +pgoimageprefix: registry.developers.crunchydata.com/crunchydata +pgoversion: 4.5.0 +hipposecretuser: "hippo" +hipposecretpassword: "Supersecurepassword*" +postgressecretuser: "postgres" +postgressecretpassword: "Anothersecurepassword*" +primaryusersecretuser: "primaryuser" +primaryusersecretpassword: "Moresecurepassword*" \ No newline at end of file From 558d1b9a32df4863b26f351d9bf59148b9e61a6b Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 9 Nov 2020 15:01:08 -0500 Subject: [PATCH 019/129] Remove pgBackRest Secret creation from Helm chart example This is no longer needed, as the Operator will reconcile this information if it is missing. --- .../templates/backrest-repo-config.yaml | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 examples/helm/create-cluster/templates/backrest-repo-config.yaml diff --git a/examples/helm/create-cluster/templates/backrest-repo-config.yaml b/examples/helm/create-cluster/templates/backrest-repo-config.yaml deleted file mode 100644 index 166d0b3dcd..0000000000 --- a/examples/helm/create-cluster/templates/backrest-repo-config.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -data: - authorized_keys: {{ .Files.Get "certs/hippo-key.pub" | b64enc }} - config: SG9zdCAqClN0cmljdEhvc3RLZXlDaGVja2luZyBubwpJZGVudGl0eUZpbGUgL3RtcC9pZF9lZDI1NTE5ClBvcnQgMjAyMgpVc2VyIHBnYmFja3Jlc3QK - id_ed25519: {{ .Files.Get "certs/hippo-key" | b64enc }} - ssh_host_ed25519_key: {{ .Files.Get "certs/hippo-key" | b64enc }} - sshd_config: IwkkT3BlbkJTRDogc3NoZF9jb25maWcsdiAxLjEwMCAyMDE2LzA4LzE1IDEyOjMyOjA0IG5hZGR5IEV4cCAkCgojIFRoaXMgaXMgdGhlIHNzaGQgc2VydmVyIHN5c3RlbS13aWRlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZQojIHNzaGRfY29uZmlnKDUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKIyBUaGlzIHNzaGQgd2FzIGNvbXBpbGVkIHdpdGggUEFUSD0vdXNyL2xvY2FsL2JpbjovdXNyL2JpbgoKIyBUaGUgc3RyYXRlZ3kgdXNlZCBmb3Igb3B0aW9ucyBpbiB0aGUgZGVmYXVsdCBzc2hkX2NvbmZpZyBzaGlwcGVkIHdpdGgKIyBPcGVuU1NIIGlzIHRvIHNwZWNpZnkgb3B0aW9ucyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2hlcmUKIyBwb3NzaWJsZSwgYnV0IGxlYXZlIHRoZW0gY29tbWVudGVkLiAgVW5jb21tZW50ZWQgb3B0aW9ucyBvdmVycmlkZSB0aGUKIyBkZWZhdWx0IHZhbHVlLgoKIyBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHBvcnQgb24gYSBTRUxpbnV4IHN5c3RlbSwgeW91IGhhdmUgdG8gdGVsbAojIFNFTGludXggYWJvdXQgdGhpcyBjaGFuZ2UuCiMgc2VtYW5hZ2UgcG9ydCAtYSAtdCBzc2hfcG9ydF90IC1wIHRjcCAjUE9SVE5VTUJFUgojClBvcnQgMjAyMgojQWRkcmVzc0ZhbWlseSBhbnkKI0xpc3RlbkFkZHJlc3MgMC4wLjAuMAojTGlzdGVuQWRkcmVzcyA6OgoKSG9zdEtleSAvc3NoZC9zc2hfaG9zdF9lZDI1NTE5X2tleQoKIyBDaXBoZXJzIGFuZCBrZXlpbmcKI1Jla2V5TGltaXQgZGVmYXVsdCBub25lCgojIExvZ2dpbmcKI1N5c2xvZ0ZhY2lsaXR5IEFVVEgKU3lzbG9nRmFjaWxpdHkgQVVUSFBSSVYKI0xvZ0xldmVsIElORk8KCiMgQXV0aGVudGljYXRpb246CgojTG9naW5HcmFjZVRpbWUgMm0KUGVybWl0Um9vdExvZ2luIG5vClN0cmljdE1vZGVzIG5vCiNNYXhBdXRoVHJpZXMgNgojTWF4U2Vzc2lvbnMgMTAKClB1YmtleUF1dGhlbnRpY2F0aW9uIHllcwoKIyBUaGUgZGVmYXVsdCBpcyB0byBjaGVjayBib3RoIC5zc2gvYXV0aG9yaXplZF9rZXlzIGFuZCAuc3NoL2F1dGhvcml6ZWRfa2V5czIKIyBidXQgdGhpcyBpcyBvdmVycmlkZGVuIHNvIGluc3RhbGxhdGlvbnMgd2lsbCBvbmx5IGNoZWNrIC5zc2gvYXV0aG9yaXplZF9rZXlzCiNBdXRob3JpemVkS2V5c0ZpbGUJL3BnY29uZi9hdXRob3JpemVkX2tleXMKQXV0aG9yaXplZEtleXNGaWxlCS9zc2hkL2F1dGhvcml6ZWRfa2V5cwoKI0F1dGhvcml6ZWRQcmluY2lwYWxzRmlsZSBub25lCgojQXV0aG9yaXplZEtleXNDb21tYW5kIG5vbmUKI0F1dGhvcml6ZWRLZXlzQ29tbWFuZFVzZXIgbm9ib2R5CgojIEZvciB0aGlzIHRvIHdvcmsgeW91IHdpbGwgYWxzbyBuZWVkIGhvc3Qga2V5cyBpbiAvZXRjL3NzaC9zc2hfa25vd25faG9zdHMKI0hvc3RiYXNlZEF1dGhlbnRpY2F0aW9uIG5vCiMgQ2hhbmdlIHRvIHllcyBpZiB5b3UgZG9uJ3QgdHJ1c3Qgfi8uc3NoL2tub3duX2hvc3RzIGZvcgojIEhvc3RiYXNlZEF1dGhlbnRpY2F0aW9uCiNJZ25vcmVVc2VyS25vd25Ib3N0cyBubwojIERvbid0IHJlYWQgdGhlIHVzZXIncyB+Ly5yaG9zdHMgYW5kIH4vLnNob3N0cyBmaWxlcwojSWdub3JlUmhvc3RzIHllcwoKIyBUbyBkaXNhYmxlIHR1bm5lbGVkIGNsZWFyIHRleHQgcGFzc3dvcmRzLCBjaGFuZ2UgdG8gbm8gaGVyZSEKI1Bhc3N3b3JkQXV0aGVudGljYXRpb24geWVzCiNQZXJtaXRFbXB0eVBhc3N3b3JkcyBubwpQYXNzd29yZEF1dGhlbnRpY2F0aW9uIG5vCgojIENoYW5nZSB0byBubyB0byBkaXNhYmxlIHMva2V5IHBhc3N3b3JkcwpDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHllcwojQ2hhbGxlbmdlUmVzcG9uc2VBdXRoZW50aWNhdGlvbiBubwoKIyBLZXJiZXJvcyBvcHRpb25zCiNLZXJiZXJvc0F1dGhlbnRpY2F0aW9uIG5vCiNLZXJiZXJvc09yTG9jYWxQYXNzd2QgeWVzCiNLZXJiZXJvc1RpY2tldENsZWFudXAgeWVzCiNLZXJiZXJvc0dldEFGU1Rva2VuIG5vCiNLZXJiZXJvc1VzZUt1c2Vyb2sgeWVzCgojIEdTU0FQSSBvcHRpb25zCiNHU1NBUElBdXRoZW50aWNhdGlvbiB5ZXMKI0dTU0FQSUNsZWFudXBDcmVkZW50aWFscyBubwojR1NTQVBJU3RyaWN0QWNjZXB0b3JDaGVjayB5ZXMKI0dTU0FQSUtleUV4Y2hhbmdlIG5vCiNHU1NBUElFbmFibGVrNXVzZXJzIG5vCgojIFNldCB0aGlzIHRvICd5ZXMnIHRvIGVuYWJsZSBQQU0gYXV0aGVudGljYXRpb24sIGFjY291bnQgcHJvY2Vzc2luZywKIyBhbmQgc2Vzc2lvbiBwcm9jZXNzaW5nLiBJZiB0aGlzIGlzIGVuYWJsZWQsIFBBTSBhdXRoZW50aWNhdGlvbiB3aWxsCiMgYmUgYWxsb3dlZCB0aHJvdWdoIHRoZSBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIGFuZAojIFBhc3N3b3JkQXV0aGVudGljYXRpb24uICBEZXBlbmRpbmcgb24geW91ciBQQU0gY29uZmlndXJhdGlvbiwKIyBQQU0gYXV0aGVudGljYXRpb24gdmlhIENoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24gbWF5IGJ5cGFzcwojIHRoZSBzZXR0aW5nIG9mICJQZXJtaXRSb290TG9naW4gd2l0aG91dC1wYXNzd29yZCIuCiMgSWYgeW91IGp1c3Qgd2FudCB0aGUgUEFNIGFjY291bnQgYW5kIHNlc3Npb24gY2hlY2tzIHRvIHJ1biB3aXRob3V0CiMgUEFNIGF1dGhlbnRpY2F0aW9uLCB0aGVuIGVuYWJsZSB0aGlzIGJ1dCBzZXQgUGFzc3dvcmRBdXRoZW50aWNhdGlvbgojIGFuZCBDaGFsbGVuZ2VSZXNwb25zZUF1dGhlbnRpY2F0aW9uIHRvICdubycuCiMgV0FSTklORzogJ1VzZVBBTSBubycgaXMgbm90IHN1cHBvcnRlZCBpbiBSZWQgSGF0IEVudGVycHJpc2UgTGludXggYW5kIG1heSBjYXVzZSBzZXZlcmFsCiMgcHJvYmxlbXMuClVzZVBBTSB5ZXMKCiNBbGxvd0FnZW50Rm9yd2FyZGluZyB5ZXMKI0FsbG93VGNwRm9yd2FyZGluZyB5ZXMKI0dhdGV3YXlQb3J0cyBubwpYMTFGb3J3YXJkaW5nIHllcwojWDExRGlzcGxheU9mZnNldCAxMAojWDExVXNlTG9jYWxob3N0IHllcwojUGVybWl0VFRZIHllcwojUHJpbnRNb3RkIHllcwojUHJpbnRMYXN0TG9nIHllcwojVENQS2VlcEFsaXZlIHllcwojVXNlTG9naW4gbm8KVXNlUHJpdmlsZWdlU2VwYXJhdGlvbiBubwojUGVybWl0VXNlckVudmlyb25tZW50IG5vCiNDb21wcmVzc2lvbiBkZWxheWVkCiNDbGllbnRBbGl2ZUludGVydmFsIDAKI0NsaWVudEFsaXZlQ291bnRNYXggMwojU2hvd1BhdGNoTGV2ZWwgbm8KI1VzZUROUyB5ZXMKI1BpZEZpbGUgL3Zhci9ydW4vc3NoZC5waWQKI01heFN0YXJ0dXBzIDEwOjMwOjEwMAojUGVybWl0VHVubmVsIG5vCiNDaHJvb3REaXJlY3Rvcnkgbm9uZQojVmVyc2lvbkFkZGVuZHVtIG5vbmUKCiMgbm8gZGVmYXVsdCBiYW5uZXIgcGF0aAojQmFubmVyIG5vbmUKCiMgQWNjZXB0IGxvY2FsZS1yZWxhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcwpBY2NlcHRFbnYgTEFORyBMQ19DVFlQRSBMQ19OVU1FUklDIExDX1RJTUUgTENfQ09MTEFURSBMQ19NT05FVEFSWSBMQ19NRVNTQUdFUwpBY2NlcHRFbnYgTENfUEFQRVIgTENfTkFNRSBMQ19BRERSRVNTIExDX1RFTEVQSE9ORSBMQ19NRUFTVVJFTUVOVApBY2NlcHRFbnYgTENfSURFTlRJRklDQVRJT04gTENfQUxMIExBTkdVQUdFCkFjY2VwdEVudiBYTU9ESUZJRVJTCgojIG92ZXJyaWRlIGRlZmF1bHQgb2Ygbm8gc3Vic3lzdGVtcwpTdWJzeXN0ZW0Jc2Z0cAkvdXNyL2xpYmV4ZWMvb3BlbnNzaC9zZnRwLXNlcnZlcgoKIyBFeGFtcGxlIG9mIG92ZXJyaWRpbmcgc2V0dGluZ3Mgb24gYSBwZXItdXNlciBiYXNpcwojTWF0Y2ggVXNlciBhbm9uY3ZzCiMJWDExRm9yd2FyZGluZyBubwojCUFsbG93VGNwRm9yd2FyZGluZyBubwojCVBlcm1pdFRUWSBubwojCUZvcmNlQ29tbWFuZCBjdnMgc2VydmVyCg== -kind: Secret -metadata: - labels: - pg-cluster: {{ .Values.pgclustername }} - pgo-backrest-repo: "true" - vendor: crunchydata - name: {{ .Values.pgclustername }}-backrest-repo-config - namespace: {{ .Values.namespace }} -type: Opaque From b1118b5308b2ddeba0595092190efea76098d1f6 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 9 Nov 2020 18:11:57 -0500 Subject: [PATCH 020/129] Indicate support for PL/Perl PL/Perl support was added to the PostGIS-enabled containers, as such, the Operator can now support it. Issue: CrunchyData/crunchy-containers#1287 --- README.md | 1 + docs/content/_index.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 86704fd5ba..664f4cd204 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,7 @@ There is also a `pgo-client` container if you wish to deploy the client directly - [PostgreSQL](https://www.postgresql.org) - [PostgreSQL Contrib Modules](https://www.postgresql.org/docs/current/contrib.html) - [PL/Python + PL/Python 3](https://www.postgresql.org/docs/current/plpython.html) + - [PL/Perl](https://www.postgresql.org/docs/current/plperl.html) - [pgAudit](https://www.pgaudit.org/) - [pgAudit Analyze](https://github.com/pgaudit/pgaudit_analyze) - [pgnodemx](https://github.com/CrunchyData/pgnodemx) diff --git a/docs/content/_index.md b/docs/content/_index.md index f83a7c49e1..b879f3db2a 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -104,6 +104,7 @@ The Crunchy PostgreSQL Operator extends Kubernetes to provide a higher-level abs - [PostgreSQL](https://www.postgresql.org) - [PostgreSQL Contrib Modules](https://www.postgresql.org/docs/current/contrib.html) - [PL/Python + PL/Python 3](https://www.postgresql.org/docs/current/plpython.html) + - [PL/Perl](https://www.postgresql.org/docs/current/plperl.html) - [pgAudit](https://www.pgaudit.org/) - [pgAudit Analyze](https://github.com/pgaudit/pgaudit_analyze) - [pgnodemx](https://github.com/CrunchyData/pgnodemx) From 1b1708d842b4d2a02797cd7c255aea0394d6c64c Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 10 Nov 2020 08:34:09 -0500 Subject: [PATCH 021/129] Add explanation for transient monitoring issue This issue only occurs during the initialization phase of a PostgreSQL cluster, but can be confusing as it indicates there is an error. Issue: #1962 --- docs/content/tutorial/create-cluster.md | 23 ++++++++++++++++++++++ docs/content/tutorial/customize-cluster.md | 23 ++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/docs/content/tutorial/create-cluster.md b/docs/content/tutorial/create-cluster.md index eeb798faf5..423f0a4dbb 100644 --- a/docs/content/tutorial/create-cluster.md +++ b/docs/content/tutorial/create-cluster.md @@ -120,6 +120,29 @@ Also ensure that you have enough persistent volumes available: your Kubernetes a The most common occurrence of this is due to the Kubernetes network blocking SSH connections between Pods. Ensure that your Kubernetes networking layer allows for SSH connections over port 2022 in the Namespace that you are deploying your PostgreSQL clusters into. +### PostgreSQL Pod reports "Authentication Failed for `ccp_monitoring`" + +This is a temporary error that occurs when a new PostgreSQL cluster is first +initialized with the `--metrics` flag. The `crunchy-postgres-exporter` container +within the PostgreSQL Pod may be ready before the container with PostgreSQL is +ready. If a message in your logs further down displays a timestamp, e.g.: + +``` + now +------------------------------- +2020-11-10 08:23:15.968196-05 +``` + +Then the `ccp_monitoring` user is properly reconciled with the PostgreSQL +cluster. + +If the error message does not go away, this could indicate a few things: + +- The PostgreSQL instance has not initialized. Check to ensure that PostgreSQL +has successfully started. +- The password for the `ccp_monitoring` user has changed. In this case you will +need to update the Secret with the monitoring credentials. + ## Next Steps Once your cluster is created, the next step is to [connect to your PostgreSQL cluster]({{< relref "tutorial/connect-cluster.md" >}}). You can also [learn how to customize your PostgreSQL cluster]({{< relref "tutorial/customize-cluster.md" >}})! diff --git a/docs/content/tutorial/customize-cluster.md b/docs/content/tutorial/customize-cluster.md index e9be31c268..2fee92bb0a 100644 --- a/docs/content/tutorial/customize-cluster.md +++ b/docs/content/tutorial/customize-cluster.md @@ -184,6 +184,29 @@ There are many reasons why a PostgreSQL Pod may not be scheduled: - **Node affinity rules cannot be satisfied**. If you assigned a node label, ensure that the Nodes with that label are available for scheduling. If they are, ensure that there are enough resources available. - **Pod anti-affinity rules cannot be satisfied**. This most likely happens when [pod anti-affinity]({{< relref "architecture/high-availability/_index.md" >}}#how-the-crunchy-postgresql-operator-uses-pod-anti-affinity) is set to `required` and there are not enough Nodes available for scheduling. Consider adding more Nodes or relaxing your anti-affinity rules. +### PostgreSQL Pod reports "Authentication Failed for `ccp_monitoring`" + +This is a temporary error that occurs when a new PostgreSQL cluster is first +initialized with the `--metrics` flag. The `crunchy-postgres-exporter` container +within the PostgreSQL Pod may be ready before the container with PostgreSQL is +ready. If a message in your logs further down displays a timestamp, e.g.: + +``` + now +------------------------------- +2020-11-10 08:23:15.968196-05 +``` + +Then the `ccp_monitoring` user is properly reconciled with the PostgreSQL +cluster. + +If the error message does not go away, this could indicate a few things: + +- The PostgreSQL instance has not initialized. Check to ensure that PostgreSQL +has successfully started. +- The password for the `ccp_monitoring` user has changed. In this case you will +need to update the Secret with the monitoring credentials. + ## Next Steps As mentioned at the beginning, there are a lot more customizations that you can make to your PostgreSQL cluster, and we will cover those as the tutorial progresses! This section was to get you familiar with some of the most common customizations, and to explore how many options `pgo create cluster` has! From bcd02e5a19aafca1d0d39026056a9477dc41bb48 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 10 Nov 2020 09:12:40 -0500 Subject: [PATCH 022/129] Bump to v4.5.1 --- Makefile | 4 +- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 +- docs/config.toml | 16 ++++---- docs/content/Configuration/compatibility.md | 10 ++++- docs/content/releases/4.5.1.md | 38 +++++++++++++++++++ docs/content/tutorial/pgbouncer.md | 2 +- examples/create-by-resource/fromcrd.json | 6 +-- examples/envs.sh | 2 +- .../create-cluster/templates/pgcluster.yaml | 2 +- examples/helm/create-cluster/values.yaml | 4 +- installers/ansible/README.md | 2 +- installers/ansible/values.yaml | 6 +-- installers/gcp-marketplace/Makefile | 2 +- installers/gcp-marketplace/README.md | 2 +- installers/gcp-marketplace/values.yaml | 6 +-- installers/helm/Chart.yaml | 2 +- installers/helm/values.yaml | 6 +-- installers/kubectl/client-setup.sh | 2 +- .../kubectl/postgres-operator-ocp311.yml | 8 ++-- installers/kubectl/postgres-operator.yml | 8 ++-- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- installers/metrics/helm/helm_template.yaml | 2 +- installers/metrics/helm/values.yaml | 2 +- .../postgres-operator-metrics-ocp311.yml | 2 +- .../kubectl/postgres-operator-metrics.yml | 2 +- installers/olm/Makefile | 4 +- pkg/apis/crunchydata.com/v1/doc.go | 8 ++-- pkg/apiservermsgs/common.go | 2 +- redhat/atomic/help.1 | 2 +- redhat/atomic/help.md | 2 +- 33 files changed, 106 insertions(+), 60 deletions(-) create mode 100644 docs/content/releases/4.5.1.md diff --git a/Makefile b/Makefile index d0caa5ed40..413a6a8181 100644 --- a/Makefile +++ b/Makefile @@ -9,9 +9,9 @@ PGO_CMD ?= kubectl PGO_IMAGE_PREFIX ?= crunchydata PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) PGO_OPERATOR_NAMESPACE ?= pgo -PGO_VERSION ?= 4.5.0 +PGO_VERSION ?= 4.5.1 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.4 +PGO_PG_FULLVERSION ?= 12.5 PGO_BACKREST_VERSION ?= 2.29 PACKAGER ?= yum diff --git a/README.md b/README.md index 664f4cd204..0a2784b7d6 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,7 @@ Based on your storage settings in your Kubernetes environment, you may be able t ```shell kubectl create namespace pgo -kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.0/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.1/installers/kubectl/postgres-operator.yml ``` Otherwise, we highly recommend following the instructions from our [Quickstart](https://access.crunchydata.com/documentation/postgres-operator/latest/quickstart/). diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index 3b9de84ed0..59e2e329e8 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -16,7 +16,7 @@ GCR_IMAGE_PREFIX=gcr.io/crunchy-dev-test CCP_IMAGE_PREFIX=crunchydata -CCP_IMAGE_TAG=centos7-12.4-4.5.0 +CCP_IMAGE_TAG=centos7-12.5-4.5.1 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index ff5c97ec7f..622fc268f8 100644 --- a/conf/postgres-operator/pgo.yaml +++ b/conf/postgres-operator/pgo.yaml @@ -2,7 +2,7 @@ Cluster: CCPImagePrefix: registry.developers.crunchydata.com/crunchydata Metrics: false Badger: false - CCPImageTag: centos7-12.4-4.5.0 + CCPImageTag: centos7-12.5-4.5.1 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -82,4 +82,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos7-4.5.0 + PGOImageTag: centos7-4.5.1 diff --git a/docs/config.toml b/docs/config.toml index 48ef2d760d..dc39d49daa 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,14 +25,14 @@ disableNavChevron = false # set true to hide next/prev chevron, default is false highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter menushortcutsnewtab = true # set true to open shortcuts links to a new tab/window enableGitInfo = true -operatorVersion = "4.5.0" -postgresVersion = "12.4" -postgresVersion13 = "13.0" -postgresVersion12 = "12.4" -postgresVersion11 = "11.9" -postgresVersion10 = "10.14" -postgresVersion96 = "9.6.19" -postgresVersion95 = "9.5.23" +operatorVersion = "4.5.1" +postgresVersion = "12.5" +postgresVersion13 = "13.1" +postgresVersion12 = "12.5" +postgresVersion11 = "11.10" +postgresVersion10 = "10.15" +postgresVersion96 = "9.6.20" +postgresVersion95 = "9.5.24" postgisVersion = "3.0" centosBase = "centos7" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index b805ef9c08..43af7021db 100644 --- a/docs/content/Configuration/compatibility.md +++ b/docs/content/Configuration/compatibility.md @@ -12,7 +12,15 @@ version dependencies between the two projects. Below are the operator releases a | Operator Release | Container Release | Postgres | PgBackrest Version |:----------|:-------------|:------------|:-------------- -| 4.5.0 | 4.5.0 | 12.4 | 2.29 | +| 4.5.1 | 4.5.1 | 13.1 | 2.29 | +|||12.5|2.29| +|||11.10|2.29| +|||10.15|2.29| +|||9.6.20|2.29| +|||9.5.24|2.29| +|||| +| 4.5.0 | 4.5.0 | 13.0 | 2.29 | +|||12.4|2.29| |||11.9|2.29| |||10.14|2.29| |||9.6.19|2.29| diff --git a/docs/content/releases/4.5.1.md b/docs/content/releases/4.5.1.md new file mode 100644 index 0000000000..eeed22c013 --- /dev/null +++ b/docs/content/releases/4.5.1.md @@ -0,0 +1,38 @@ +--- +title: "4.5.1" +date: +draft: false +weight: 69 +--- + +Crunchy Data announces the release of the PostgreSQL Operator 4.5.1 on November 13, 2020. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +PostgreSQL Operator 4.5.1 release includes the following software versions upgrades: + +- [PostgreSQL](https://www.postgresql.org) is now at versions 13.1, 12.5, 11.10, 10.15, 9.6.20, and 9.5.24. +- [Patroni](https://patroni.readthedocs.io/) is now at version 2.0.1. +- PL/Perl can now be used in the PostGIS-enabled containers. + +## Changes + +- Simplified creation of a PostgreSQL cluster from a `pgcluster` resource. A user no longer has to provide a pgBackRest repository Secret: the Postgres Operator will now automatically generate this. +- The exposed ports for Services associated with a cluster is now available from the `pgo show cluster` command. +- If the `pgo-config` ConfigMap is not created during the installation of the Postgres Operator, the Postgres Operator will generate one when it initializes. +- Providing a value for `pgo_admin_password` in the installer is now optional. If no value is provided, the password for the initial administrative user is randomly generated. +- Added an example for how to create a PostgreSQL cluster that uses S3 for pgBackRest backups via a custom resource. + +## Fixes + +- Fix readiness check for a standby leader. Previously, the standby leader would not report as ready, even though it was. Reported by Alec Rooney (@alrooney). +- Proper determination if a `pgcluster` custom resource creation has been processed by its corresponding Postgres Operator controller. This prevents the custom resource from being run by the creation logic multiple times. +- Prevent `initdb` (cluster reinitialization) from occurring if the PostgreSQL container cannot initialize while bootstrapping from an existing PGDATA directory. +- Fix issue with UBI 8 / CentOS 8 when running a pgBackRest bootstrap or restore job, where duplicate "repo types" could be set. Specifically, the ensures the name of the repo type is set via the `PGBACKREST_REPO1_TYPE` environmental variable. Reported by Alec Rooney (@alrooney). +- Ensure external WAL and Tablespace PVCs are fully recreated during a restore. Reported by (@aurelien43). +- Ensure `pgo show backup` will work regardless of state of any of the PostgreSQL clusters. This pulls the information directly from the pgBackRest Pod itself. Reported by (@saltenhub). +- Ensure that sidecars (e.g. metrics collection, pgAdmin 4, pgBouncer) are deployable when using the PostGIS-enabled PostgreSQL image. Reported by Jean-Denis Giguère (@jdenisgiguere). +- Allow for special characters in pgBackRest environmental variables. Reported by (@SockenSalat). +- Ensure password for the `pgbouncer` administrative user stays synchronized between an existing Kubernetes Secret and PostgreSQL should the pgBouncer be recreated. +- When uninstalling an instance of the Postgres Operator in a Kubernetes cluster that has multiple instances of the Postgres Operator, ensure that only the requested instance to be uninstalled is the one that's uninstalled. +- The logger no longer defaults to using a log level of `DEBUG`. diff --git a/docs/content/tutorial/pgbouncer.md b/docs/content/tutorial/pgbouncer.md index 89ba8ce993..0349ff1eaf 100644 --- a/docs/content/tutorial/pgbouncer.md +++ b/docs/content/tutorial/pgbouncer.md @@ -116,7 +116,7 @@ PGPASSWORD=randompassword psql -h localhost -p 5432 -U pgbouncer pgbouncer You should see something similar to this: ``` -psql (12.4, server 1.14.0/bouncer) +psql (12.5, server 1.14.0/bouncer) Type "help" for help. pgbouncer=# diff --git a/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index 987ec53d55..ea603808ac 100644 --- a/examples/create-by-resource/fromcrd.json +++ b/examples/create-by-resource/fromcrd.json @@ -16,7 +16,7 @@ "pg-cluster": "fromcrd", "pg-pod-anti-affinity": "", "pgo-backrest": "true", - "pgo-version": "4.5.0", + "pgo-version": "4.5.1", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos7-12.4-4.5.0", + "ccpimagetag": "centos7-12.5-4.5.1", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy-postgres-exporter": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.5.0", + "pgo-version": "4.5.1", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index 86bde3cde3..b17080fb17 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -23,7 +23,7 @@ export PGO_CONF_DIR=$PGOROOT/installers/ansible/roles/pgo-operator/files # the version of the Operator you run is set by these vars export PGO_IMAGE_PREFIX=registry.developers.crunchydata.com/crunchydata export PGO_BASEOS=centos7 -export PGO_VERSION=4.5.0 +export PGO_VERSION=4.5.1 export PGO_IMAGE_TAG=$PGO_BASEOS-$PGO_VERSION # for setting the pgo apiserver port, disabling TLS or not verifying TLS diff --git a/examples/helm/create-cluster/templates/pgcluster.yaml b/examples/helm/create-cluster/templates/pgcluster.yaml index 9dc5a4655d..0852b1f447 100644 --- a/examples/helm/create-cluster/templates/pgcluster.yaml +++ b/examples/helm/create-cluster/templates/pgcluster.yaml @@ -13,7 +13,7 @@ metadata: pg-cluster: {{ .Values.pgclustername }} pg-pod-anti-affinity: "" pgo-backrest: "true" - pgo-version: 4.5.0 + pgo-version: 4.5.1 pgouser: admin name: {{ .Values.pgclustername }} namespace: {{ .Values.namespace }} diff --git a/examples/helm/create-cluster/values.yaml b/examples/helm/create-cluster/values.yaml index 09438cb745..4add0e560f 100644 --- a/examples/helm/create-cluster/values.yaml +++ b/examples/helm/create-cluster/values.yaml @@ -4,11 +4,11 @@ # The values is for the namespace and the postgresql cluster name ccpimage: crunchy-postgres-ha ccpimageprefix: registry.developers.crunchydata.com/crunchydata -ccpimagetag: centos7-12.4-4.5.0 +ccpimagetag: centos7-12.5-4.5.1 namespace: pgo pgclustername: hippo pgoimageprefix: registry.developers.crunchydata.com/crunchydata -pgoversion: 4.5.0 +pgoversion: 4.5.1 hipposecretuser: "hippo" hipposecretpassword: "Supersecurepassword*" postgressecretuser: "postgres" diff --git a/installers/ansible/README.md b/installers/ansible/README.md index a9f0babd16..345d035037 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.0 +Latest Release: 4.5.1 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index 4eb672bcec..ebce0ed751 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -17,7 +17,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos7-12.4-4.5.0" +ccp_image_tag: "centos7-12.5-4.5.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -50,14 +50,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.0" +pgo_client_version: "4.5.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos7-4.5.0" +pgo_image_tag: "centos7-4.5.1" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index 5f4f0c6eb1..f10f5b7c27 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -6,7 +6,7 @@ MARKETPLACE_TOOLS ?= gcr.io/cloud-marketplace-tools/k8s/dev:$(MARKETPLACE_VERSIO MARKETPLACE_VERSION ?= 0.9.4 KUBECONFIG ?= $(HOME)/.kube/config PARAMETERS ?= {} -PGO_VERSION ?= 4.5.0 +PGO_VERSION ?= 4.5.1 IMAGE_BUILD_ARGS = --build-arg MARKETPLACE_VERSION='$(MARKETPLACE_VERSION)' \ --build-arg PGO_VERSION='$(PGO_VERSION)' diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index fd686764ad..af2e60f80c 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -59,7 +59,7 @@ Google Cloud Marketplace. ```shell IMAGE_REPOSITORY=gcr.io/crunchydata-public/postgres-operator - export PGO_VERSION=4.5.0 + export PGO_VERSION=4.5.1 export INSTALLER_IMAGE=${IMAGE_REPOSITORY}/deployer:${PGO_VERSION} export OPERATOR_IMAGE=${IMAGE_REPOSITORY}:${PGO_VERSION} export OPERATOR_IMAGE_API=${IMAGE_REPOSITORY}/pgo-apiserver:${PGO_VERSION} diff --git a/installers/gcp-marketplace/values.yaml b/installers/gcp-marketplace/values.yaml index cb0840b35b..e2ed852df1 100644 --- a/installers/gcp-marketplace/values.yaml +++ b/installers/gcp-marketplace/values.yaml @@ -10,7 +10,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos7-12.4-4.5.0" +ccp_image_tag: "centos7-12.5-4.5.1" create_rbac: "true" db_name: "" db_password_age_days: "0" @@ -32,9 +32,9 @@ pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" pgo_client_container_install: "false" pgo_client_install: 'false' -pgo_client_version: "4.5.0" +pgo_client_version: "4.5.1" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos7-4.5.0" +pgo_image_tag: "centos7-4.5.1" pgo_installation_name: '${OPERATOR_NAME}' pgo_operator_namespace: '${OPERATOR_NAMESPACE}' scheduler_timeout: "3600" diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index 6d7ffeaa30..e7a55444cb 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -3,7 +3,7 @@ name: postgres-operator description: Crunchy PostgreSQL Operator Helm chart for Kubernetes type: application version: 0.1.0 -appVersion: 4.5.0 +appVersion: 4.5.1 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/crunchy_logo.png keywords: diff --git a/installers/helm/values.yaml b/installers/helm/values.yaml index 649436e0af..b2c5d441b2 100644 --- a/installers/helm/values.yaml +++ b/installers/helm/values.yaml @@ -37,7 +37,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos7-12.4-4.5.0" +ccp_image_tag: "centos7-12.5-4.5.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -70,14 +70,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.0" +pgo_client_version: "4.5.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos7-4.5.0" +pgo_image_tag: "centos7-4.5.1" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index 6956d63f6b..496f25abd4 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -14,7 +14,7 @@ # This script should be run after the operator has been deployed PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}" PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}" -PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.0}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.1}" PGO_CLIENT_URL="https://github.com/CrunchyData/postgres-operator/releases/download/${PGO_CLIENT_VERSION}" PGO_CMD="${PGO_CMD-kubectl}" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 9978d052d3..977c9ea790 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -44,7 +44,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos7-12.4-4.5.0" + ccp_image_tag: "centos7-12.5-4.5.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -77,14 +77,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.0" + pgo_client_version: "4.5.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos7-4.5.0" + pgo_image_tag: "centos7-4.5.1" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -161,7 +161,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.0 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.1 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index 2b516ef2ca..971e436d20 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -138,7 +138,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos7-12.4-4.5.0" + ccp_image_tag: "centos7-12.5-4.5.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -171,14 +171,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.0" + pgo_client_version: "4.5.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos7-4.5.0" + pgo_image_tag: "centos7-4.5.1" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -268,7 +268,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.0 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.1 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index 1c047d1a85..57f68cd878 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.0 +Latest Release: 4.5.1 ## General diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index 603cab3982..520204c2d1 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-monitoring description: Install for Crunchy PostgreSQL Operator Monitoring type: application version: 0.1.0 -appVersion: 4.5.0 +appVersion: 4.5.1 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/crunchy_logo.png \ No newline at end of file diff --git a/installers/metrics/helm/helm_template.yaml b/installers/metrics/helm/helm_template.yaml index d5e346dbc7..b328adba55 100644 --- a/installers/metrics/helm/helm_template.yaml +++ b/installers/metrics/helm/helm_template.yaml @@ -20,5 +20,5 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos7-4.5.0" +pgo_image_tag: "centos7-4.5.1" diff --git a/installers/metrics/helm/values.yaml b/installers/metrics/helm/values.yaml index 9f2ecefb63..616001b5ec 100644 --- a/installers/metrics/helm/values.yaml +++ b/installers/metrics/helm/values.yaml @@ -20,7 +20,7 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos7-4.5.0" +pgo_image_tag: "centos7-4.5.1" # ===================== # Configuration Options diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index ca4daafd16..f4643fc126 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -96,7 +96,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.0 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.1 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index e1cc94fd5a..313698aaeb 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -165,7 +165,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.0 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.1 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index 3b8884bf78..41ee2405b2 100644 --- a/installers/olm/Makefile +++ b/installers/olm/Makefile @@ -2,7 +2,7 @@ .SUFFIXES: CCP_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -CCP_PG_FULLVERSION ?= 12.4 +CCP_PG_FULLVERSION ?= 12.5 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.15.1 @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.15.1 PGO_BASEOS ?= centos7 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.5.0 +PGO_VERSION ?= 4.5.1 PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) CCP_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(PGO_VERSION) CCP_POSTGIS_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(CCP_POSTGIS_VERSION)-$(PGO_VERSION) diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 3d5c49cd25..4c793e782f 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -53,7 +53,7 @@ cluster. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.0", + '{"ClientVersion":"4.5.1", "Namespace":"pgouser1", "Name":"mycluster", $PGO_APISERVER_URL/clusters @@ -72,7 +72,7 @@ show all of the clusters that are in the given namespace. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.0", + '{"ClientVersion":"4.5.1", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/showclusters @@ -82,7 +82,7 @@ $PGO_APISERVER_URL/showclusters curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.0", + '{"ClientVersion":"4.5.1", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.5.0 + Version: 4.5.1 License: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 Contact: Crunchy Data https://www.crunchydata.com/ diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index cce7f6be40..093405b4fd 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -const PGO_VERSION = "4.5.0" +const PGO_VERSION = "4.5.1" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index bc21518dd8..6f9bfad143 100644 --- a/redhat/atomic/help.1 +++ b/redhat/atomic/help.1 @@ -56,4 +56,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa \fB\fCRelease=\fR .PP -The specific release number of the container. For example, Release="4.5.0" +The specific release number of the container. For example, Release="4.5.1" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index 8950e24d47..1a12dbc144 100644 --- a/redhat/atomic/help.md +++ b/redhat/atomic/help.md @@ -45,4 +45,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa `Release=` -The specific release number of the container. For example, Release="4.5.0" +The specific release number of the container. For example, Release="4.5.1" From 2335a0003f8b8b4ae37d8b527356d7df95aef253 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 15 Nov 2020 14:14:49 -0500 Subject: [PATCH 023/129] Tighter check for replica service in `pgo test` The check looked to see if the word "replica" existed in one of the Service Labels, when really we shold be checking for a suffix of "replica". Issue: [ch9764] Issue: #2047 --- internal/apiserver/clusterservice/clusterimpl.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index 8d166236f8..1da1b65124 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -484,7 +484,7 @@ func TestCluster(name, selector, ns, pgouser string, allFlag bool) msgs.ClusterT switch { default: endpoint.InstanceType = msgs.ClusterTestInstanceTypePrimary - case strings.Contains(service.Name, msgs.PodTypeReplica): + case strings.HasSuffix(service.Name, msgs.PodTypeReplica): endpoint.InstanceType = msgs.ClusterTestInstanceTypeReplica case service.Pgbouncer: endpoint.InstanceType = msgs.ClusterTestInstanceTypePGBouncer From 6d7b39d0b4e995b0b93599726971fae6b6c15c73 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 16 Nov 2020 09:40:22 -0500 Subject: [PATCH 024/129] Update OLM installation instructions template This updates a few of the OLM installation instruction steps so that the dependency on `git` is removed, replaced by `curl` to get the exact files from the repository that are needed. --- installers/olm/description.openshift.md | 32 +++++++++++++------------ installers/olm/description.upstream.md | 32 +++++++++++++------------ 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/installers/olm/description.openshift.md b/installers/olm/description.openshift.md index e4eb3c0831..76be0028da 100644 --- a/installers/olm/description.openshift.md +++ b/installers/olm/description.openshift.md @@ -49,13 +49,6 @@ export PGO_OPERATOR_NAMESPACE=pgo oc create namespace "$PGO_OPERATOR_NAMESPACE" ``` -Next, clone the PostgreSQL Operator repository locally. - -``` -git clone -b v${PGO_VERSION} https://github.com/CrunchyData/postgres-operator.git -cd postgres-operator -``` - ### Security For the PostgreSQL Operator and PostgreSQL clusters to run in the recommended `restricted` [Security Context Constraint][], @@ -69,19 +62,23 @@ Configure pgBackRest for your environment. If you do not plan to use AWS S3 to s the `aws-s3` keys below. ``` +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/config > config +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config > sshd_config +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt > aws-s3-ca.crt + oc -n "$PGO_OPERATOR_NAMESPACE" create secret generic pgo-backrest-repo-config \ - --from-file=./installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/config \ - --from-file=./installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config \ - --from-file=./installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt \ + --from-file=./config \ + --from-file=./sshd_config \ + --from-file=./aws-s3-ca.crt \ --from-literal=aws-s3-key="" \ --from-literal=aws-s3-key-secret="" ``` ### Certificates (optional) -The PostgreSQL Operator has an API that uses TLS to communicate securely with clients. If you have -a certificate bundle validated by your organization, you can install it now. If not, the API will -automatically generate and use a self-signed certificate. +The PostgreSQL Operator has an API that uses TLS to communicate securely with clients. If one is not provided, the API will automatically generated one for you. + +If you have a certificate bundle validated by your organization, you can install it now. ``` oc -n "$PGO_OPERATOR_NAMESPACE" create secret tls pgo.tls \ @@ -102,8 +99,13 @@ to use the [PostgreSQL Operator Client][pgo-client]. Install the first set of client credentials and download the `pgo` binary and client certificates. ``` -PGO_CMD=oc ./deploy/install-bootstrap-creds.sh -PGO_CMD=oc ./installers/kubectl/client-setup.sh +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/deploy/install-bootstrap-creds.sh > install-bootstrap-creds.sh +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/kubectl/client-setup.sh > client-setup.sh + +chmod +x install-bootstrap-creds.sh client-setup.sh + +PGO_CMD=oc ./install-bootstrap-creds.sh +PGO_CMD=oc ./client-setup.sh ``` The client needs to be able to reach the PostgreSQL Operator API from outside the OpenShift cluster. diff --git a/installers/olm/description.upstream.md b/installers/olm/description.upstream.md index 1e192fa9c2..7d1dcce69d 100644 --- a/installers/olm/description.upstream.md +++ b/installers/olm/description.upstream.md @@ -49,32 +49,29 @@ export PGO_OPERATOR_NAMESPACE=pgo kubectl create namespace "$PGO_OPERATOR_NAMESPACE" ``` -Next, clone the PostgreSQL Operator repository locally. - -``` -git clone -b v${PGO_VERSION} https://github.com/CrunchyData/postgres-operator.git -cd postgres-operator -``` - ### Secrets Configure pgBackRest for your environment. If you do not plan to use AWS S3 to store backups, you can omit the `aws-s3` keys below. ``` +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/config > config +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config > sshd_config +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt > aws-s3-ca.crt + kubectl -n "$PGO_OPERATOR_NAMESPACE" create secret generic pgo-backrest-repo-config \ - --from-file=./installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/config \ - --from-file=./installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config \ - --from-file=./installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt \ + --from-file=./config \ + --from-file=./sshd_config \ + --from-file=./aws-s3-ca.crt \ --from-literal=aws-s3-key="" \ --from-literal=aws-s3-key-secret="" ``` ### Certificates (optional) -The PostgreSQL Operator has an API that uses TLS to communicate securely with clients. If you have -a certificate bundle validated by your organization, you can install it now. If not, the API will -automatically generate and use a self-signed certificate. +The PostgreSQL Operator has an API that uses TLS to communicate securely with clients. If one is not provided, the API will automatically generated one for you. + +If you have a certificate bundle validated by your organization, you can install it now. ``` kubectl -n "$PGO_OPERATOR_NAMESPACE" create secret tls pgo.tls \ @@ -95,8 +92,13 @@ to use the [PostgreSQL Operator Client][pgo-client]. Install the first set of client credentials and download the `pgo` binary and client certificates. ``` -PGO_CMD=kubectl ./deploy/install-bootstrap-creds.sh -PGO_CMD=kubectl ./installers/kubectl/client-setup.sh +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/deploy/install-bootstrap-creds.sh > install-bootstrap-creds.sh +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/kubectl/client-setup.sh > client-setup.sh + +chmod +x install-bootstrap-creds.sh client-setup.sh + +PGO_CMD=kubectl ./install-bootstrap-creds.sh +PGO_CMD=kubectl ./client-setup.sh ``` The client needs to be able to reach the PostgreSQL Operator API from outside the Kubernetes cluster. From d78454e410d9b073962640356b2e7cbb0fb0a186 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 17 Nov 2020 21:48:16 -0500 Subject: [PATCH 025/129] Provide clarity on retrieving credentials for standbys The `pgo show user` command has a `--show-system-accounts` flag for retrieving the credentials of system accounts (e.g. superuser, replication users, etc.), which can be helpful when setting up standby clusters. Issue: #2053 --- .../high-availability/multi-cluster-kubernetes.md | 11 +++++++++++ docs/content/pgo-client/common-tasks.md | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/docs/content/architecture/high-availability/multi-cluster-kubernetes.md b/docs/content/architecture/high-availability/multi-cluster-kubernetes.md index c6043adba4..f2be1e03c5 100644 --- a/docs/content/architecture/high-availability/multi-cluster-kubernetes.md +++ b/docs/content/architecture/high-availability/multi-cluster-kubernetes.md @@ -93,6 +93,14 @@ that matches that of the active cluster it is replicating. - `--pgbackrest-s3-endpoint`: The S3 endpoint to use - `--pgbackrest-s3-region`: The S3 region to use +If you do not want to set the user credentials, you can retrieve them at a later +time by using the [`pgo show user`]({{< relref "/pgo-client/reference/pgo_show_user.md" >}}) +command with the `--show-system-accounts` flag, e.g. + +``` +pgo show user --show-system-accounts hippo +``` + With respect to the credentials, it should be noted that when the standby cluster is being created within the same Kubernetes cluster AND it has access to the Kubernetes Secret created for the active cluster, one can use the @@ -182,6 +190,9 @@ pgo create cluster hippo-standby --standby --pgbouncer --replica-count=2 \ --password=opensourcehippo ``` +(If you are unsure of your credentials, you can use +`pgo show user hippo --show-system-accounts` to retrieve them). + Note the use of the `--pgbackrest-repo-path` flag as it points to the name of the pgBackRest repository that is used for the original `hippo` cluster. diff --git a/docs/content/pgo-client/common-tasks.md b/docs/content/pgo-client/common-tasks.md index a2ea5d1efe..2c58209937 100644 --- a/docs/content/pgo-client/common-tasks.md +++ b/docs/content/pgo-client/common-tasks.md @@ -1298,6 +1298,14 @@ pgo create cluster hippo-standby --standby --replica-count=2 \ --password=opensourcehippo ``` +If you are unsure of your user credentials form the original `hippo` cluster, +you can retrieve them using the [`pgo show user`]({{< relref "/pgo-client/reference/pgo_show_user.md" >}}) +command with the `--show-system-accounts` flag: + +``` +pgo show user hippo --show-system-accounts +``` + The standby cluster will take a few moments to bootstrap, but it is now set up! ### Promoting a Standby Cluster From 9e22fcec9fa442a1724314c0ba69448301ab955f Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 20 Nov 2020 13:35:37 -0500 Subject: [PATCH 026/129] Add command defaults to some of the examples Given the variable name `$PGO_CMD` can involve a lot of context and given that some of the examples may be run without the precursor "envs" executable being run, this adds a sane default of `kubectl` to some of the example scripts, while also indicating what are acceptable values, should one introspect the scripts. Issue: #1928 --- examples/create-by-resource/run.sh | 2 ++ examples/custom-config/create.sh | 7 ++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/create-by-resource/run.sh b/examples/create-by-resource/run.sh index ea034a4fe2..e6940ead12 100755 --- a/examples/create-by-resource/run.sh +++ b/examples/create-by-resource/run.sh @@ -18,6 +18,8 @@ ######### DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +# PGO_CMD should either be "kubectl" or "oc" -- defaulting to kubectl +PGO_CMD=${PGO_CMD:-kubectl} # A namespace that exists in NAMESPACE env var - see examples/envs.sh export NS=pgouser1 diff --git a/examples/custom-config/create.sh b/examples/custom-config/create.sh index b0599f1b37..df6c701f2a 100755 --- a/examples/custom-config/create.sh +++ b/examples/custom-config/create.sh @@ -28,11 +28,8 @@ function echo_info() { DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -#Error if PGO_CMD not set -if [[ -z ${PGO_CMD} ]] -then - echo_err "PGO_CMD is not set." -fi +# PGO_CMD should either be "kubectl" or "oc" -- defaulting to kubectl +PGO_CMD=${PGO_CMD:-kubectl} #Error is PGO_NAMESPACE not set if [[ -z ${PGO_NAMESPACE} ]] From df59748a3b198bbff255715bb88d69b72facca69 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 27 Nov 2020 11:54:40 -0500 Subject: [PATCH 027/129] Fix crash in cluster shutdown logic The Operator would crash if a shutdown was issued but there was no in the cluster. Issue: [ch9825] Issue: #2073 --- internal/operator/cluster/clusterlogic.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/internal/operator/cluster/clusterlogic.go b/internal/operator/cluster/clusterlogic.go index a953e07213..43ab32b27d 100644 --- a/internal/operator/cluster/clusterlogic.go +++ b/internal/operator/cluster/clusterlogic.go @@ -620,7 +620,10 @@ func ShutdownCluster(clientset kubeapi.Interface, cluster crv1.Pgcluster) error return err } - if len(pods.Items) > 1 { + if len(pods.Items) == 0 { + return fmt.Errorf("Cluster Operator: Could not find primary pod for shutdown of "+ + "cluster %s", cluster.Name) + } else if len(pods.Items) > 1 { return fmt.Errorf("Cluster Operator: Invalid number of primary pods (%d) found when "+ "shutting down cluster %s", len(pods.Items), cluster.Name) } From 7b88ae4ecbf05ff5d09d85817e1dad3b9b386327 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 30 Nov 2020 10:18:13 -0500 Subject: [PATCH 028/129] Catch error when generating default pgo-config During the initialization of the default "pgo-config" ConfigMap, there exists a case (likely a race condition that I did not track down) that triggered an error, but we were not catching the error. Regardless, we should, given the next line could trigger a panic. Immediate remediation without the patch should be just restarting the Operator Pod. Issue: [ch9826] Issue: #2075 --- internal/config/pgoconfig.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/config/pgoconfig.go b/internal/config/pgoconfig.go index 7b4a162e3f..6f5ea07b29 100644 --- a/internal/config/pgoconfig.go +++ b/internal/config/pgoconfig.go @@ -521,6 +521,11 @@ func (c *PgoConfig) GetConfig(clientset kubernetes.Interface, namespace string) cMap, err := initialize(clientset, namespace) + if err != nil { + log.Errorf("could not get ConfigMap: %s", err.Error()) + return err + } + //get the pgo.yaml config file str := cMap.Data[CONFIG_PATH] if str == "" { From 80cfa33d29e1f97dde76a98826871f73ac35b21d Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 30 Nov 2020 16:27:01 -0500 Subject: [PATCH 029/129] Allow for pg_stat_statements collections from pgMonitor pgMonitor 4.4 introduced the ability to scrape metrics around pg_stat_statments, which include: - `ccp_pg_stat_statements_total_calls_count` Total number of queries run per user/database - `ccp_pg_stat_statements_total_exec_time_ms` Total runtime of all queries per user/database - `ccp_pg_stat_statements_total_mean_exec_time_ms` Mean runtime of all queries per user/database - ccp_pg_stat_statements_total_row_count Total rows returned from all queries per user/database While there may not be corresponding visuals in the pgMonitor Kubernetes overlay at this point, this at least allows for the collection and aggregation of these metrics. This also retitles an error message. Issue: [ch9841] Issue: #2036 --- bin/crunchy-postgres-exporter/start.sh | 38 +++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/bin/crunchy-postgres-exporter/start.sh b/bin/crunchy-postgres-exporter/start.sh index f8e02e4094..2a0d543b70 100755 --- a/bin/crunchy-postgres-exporter/start.sh +++ b/bin/crunchy-postgres-exporter/start.sh @@ -144,6 +144,12 @@ else else echo_err "Custom Query file queries_pg95.yml does not exist (it should).." fi + if [[ -f ${CONFIG_DIR?}/queries_pg_stat_statements_pg95.yml ]] + then + cat ${CONFIG_DIR?}/queries_pg_stat_statements_pg95.yml >> /tmp/queries.yml + else + echo_warn "Custom Query file queries_pg_stat_statements_pg95.yml not loaded." + fi elif (( ${VERSION?} >= 90600 )) && (( ${VERSION?} < 100000 )) then if [[ -f ${CONFIG_DIR?}/queries_pg96.yml ]] @@ -152,6 +158,12 @@ else else echo_err "Custom Query file queries_pg96.yml does not exist (it should).." fi + if [[ -f ${CONFIG_DIR?}/queries_pg_stat_statements_pg96.yml ]] + then + cat ${CONFIG_DIR?}/queries_pg_stat_statements_pg96.yml >> /tmp/queries.yml + else + echo_warn "Custom Query file queries_pg_stat_statements_pg96.yml not loaded." + fi elif (( ${VERSION?} >= 100000 )) && (( ${VERSION?} < 110000 )) then if [[ -f ${CONFIG_DIR?}/queries_pg10.yml ]] @@ -160,6 +172,12 @@ else else echo_err "Custom Query file queries_pg10.yml does not exist (it should).." fi + if [[ -f ${CONFIG_DIR?}/queries_pg_stat_statements_pg10.yml ]] + then + cat ${CONFIG_DIR?}/queries_pg_stat_statements_pg10.yml >> /tmp/queries.yml + else + echo_warn "Custom Query file queries_pg_stat_statements_pg10.yml not loaded." + fi elif (( ${VERSION?} >= 110000 )) && (( ${VERSION?} < 120000 )) then if [[ -f ${CONFIG_DIR?}/queries_pg11.yml ]] @@ -168,6 +186,12 @@ else else echo_err "Custom Query file queries_pg11.yml does not exist (it should).." fi + if [[ -f ${CONFIG_DIR?}/queries_pg_stat_statements_pg11.yml ]] + then + cat ${CONFIG_DIR?}/queries_pg_stat_statements_pg11.yml >> /tmp/queries.yml + else + echo_warn "Custom Query file queries_pg_stat_statements_pg11.yml not loaded." + fi elif (( ${VERSION?} >= 120000 )) && (( ${VERSION?} < 130000 )) then if [[ -f ${CONFIG_DIR?}/queries_pg12.yml ]] @@ -176,13 +200,25 @@ else else echo_err "Custom Query file queries_pg12.yml does not exist (it should).." fi + if [[ -f ${CONFIG_DIR?}/queries_pg_stat_statements_pg12.yml ]] + then + cat ${CONFIG_DIR?}/queries_pg_stat_statements_pg12.yml >> /tmp/queries.yml + else + echo_warn "Custom Query file queries_pg_stat_statements_pg12.yml not loaded." + fi elif (( ${VERSION?} >= 130000 )) then if [[ -f ${CONFIG_DIR?}/queries_pg13.yml ]] then cat ${CONFIG_DIR?}/queries_pg13.yml >> /tmp/queries.yml else - echo_err "Custom Query file queries_pg12.yml does not exist (it should).." + echo_err "Custom Query file queries_pg13.yml does not exist (it should).." + fi + if [[ -f ${CONFIG_DIR?}/queries_pg_stat_statements_pg13.yml ]] + then + cat ${CONFIG_DIR?}/queries_pg_stat_statements_pg13.yml >> /tmp/queries.yml + else + echo_warn "Custom Query file queries_pg_stat_statements_pg13.yml not loaded." fi else echo_err "Unknown or unsupported version of PostgreSQL. Exiting.." From 06e16da9d03345fda83719d03953c3a71d4535b3 Mon Sep 17 00:00:00 2001 From: andrewlecuyer <43458182+andrewlecuyer@users.noreply.github.com> Date: Wed, 2 Dec 2020 10:16:22 -0600 Subject: [PATCH 030/129] Remove disabling of autofailover from rmdata The rmdata application no longer disables autofailover when deleting a PostgreSQL cluster. In past versions of the PostgreSQL Operator, it was necessary to first disable autofailover prior to cluster deletion since the rmdata application itself would stop the PostgreSQL database using 'pg_ctl stop'. However, since Patroni is now responsible for cleanly shutting down the database (specifically upon receipt of a SIGTERM signal), autofailver should no longer be disabled (if it is, Patroni will not respond to the SIGTERM and will therefore not attempt to cleanly shutdown the database). This commit therefore ensures an attempt is made to cleanly shutdown the database when deleting a PostgreSQL cluster. This, in turn, will increase the likeliness that the cluster can later be recreated and cleanly restarted. Issue: [ch9856] --- pgo-rmdata/rmdata/process.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/pgo-rmdata/rmdata/process.go b/pgo-rmdata/rmdata/process.go index 90d135a59a..866aca9fda 100644 --- a/pgo-rmdata/rmdata/process.go +++ b/pgo-rmdata/rmdata/process.go @@ -50,15 +50,6 @@ const ( func Delete(request Request) { log.Infof("rmdata.Process %v", request) - // if, check to see if this is a full cluster removal...i.e. "IsReplica" - // and "IsBackup" is set to false - // - // if this is a full cluster removal, first disable autofailover - if !(request.IsReplica || request.IsBackup) { - log.Debug("disabling autofailover for cluster removal") - util.ToggleAutoFailover(request.Clientset, false, request.ClusterPGHAScope, request.Namespace) - } - //the case of 'pgo scaledown' if request.IsReplica { log.Info("rmdata.Process scaledown replica use case") From f381400e31c09918a9524120f722db3a3090a4ff Mon Sep 17 00:00:00 2001 From: andrewlecuyer <43458182+andrewlecuyer@users.noreply.github.com> Date: Tue, 8 Dec 2020 15:00:14 -0600 Subject: [PATCH 031/129] No post-failover backups for standby clusters A post-failover backup is now only triggered for non-standby clusters. Therefore, if a failover occurs within a standby cluster, and automatic backup will no longer be run. Issue: [ch9912] Issue: #2102 --- internal/controller/pod/promotionhandler.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/controller/pod/promotionhandler.go b/internal/controller/pod/promotionhandler.go index c9476b6782..533f265344 100644 --- a/internal/controller/pod/promotionhandler.go +++ b/internal/controller/pod/promotionhandler.go @@ -62,7 +62,8 @@ func (c *Controller) handlePostgresPodPromotion(newPod *apiv1.Pod, cluster crv1. } } - if cluster.Status.State == crv1.PgclusterStateInitialized { + // create a post-failover backup if not a standby cluster + if !cluster.Spec.Standby && cluster.Status.State == crv1.PgclusterStateInitialized { if err := cleanAndCreatePostFailoverBackup(c.Client, cluster.Name, newPod.Namespace); err != nil { log.Error(err) From 09d12e68876a7f54a2d0470490f582fcd9b94c78 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 8 Dec 2020 22:19:40 -0500 Subject: [PATCH 032/129] Do not consider bootstrap Pod in `pgo df` The bootstrap Pod, a remnaint of a cluster restore, gets caught up in the `pgo df` search, but unfortunately this is not a valid Pod. This exlcude this Pod from being considered. Issue: [ch2029] Issue: #2029 --- internal/apiserver/dfservice/dfimpl.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/apiserver/dfservice/dfimpl.go b/internal/apiserver/dfservice/dfimpl.go index 6b244836c0..f10cda475b 100644 --- a/internal/apiserver/dfservice/dfimpl.go +++ b/internal/apiserver/dfservice/dfimpl.go @@ -143,7 +143,8 @@ func getClaimCapacity(clientset kubernetes.Interface, pvcName, ns string) (strin func getClusterDf(cluster *crv1.Pgcluster, clusterResultsChannel chan msgs.DfDetail, clusterProgressChannel chan bool, errorChannel chan error) { log.Debugf("pod df: %s", cluster.Spec.Name) - selector := fmt.Sprintf("%s=%s", config.LABEL_PG_CLUSTER, cluster.Spec.Name) + selector := fmt.Sprintf("%s=%s,!%s", + config.LABEL_PG_CLUSTER, cluster.Spec.Name, config.LABEL_PGHA_BOOTSTRAP) pods, err := apiserver.Clientset.CoreV1().Pods(cluster.Spec.Namespace).List(metav1.ListOptions{LabelSelector: selector}) From 19502ee93fd0cc34bce3cc42b45f429193427251 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 8 Dec 2020 22:41:06 -0500 Subject: [PATCH 033/129] Delete bootstrap Job once it successfully completes When the bootstrap Job completes successfully after a restore, it contains information that ends up being consumed by other parts of the Operator system, such as Patroni. As the logs from the Job do not provide much, if any, helpful information after a restore succeeds, it's best to have the Operator eliminate the job. As such, this changes the behavior so that the bootstrap Job is removed. As this has lead to some buggy behavior, this is being considered as a bug fix, as regular operational work would dictate that the Job is removed anyway. Issue: [ch9919] --- internal/controller/job/bootstraphandler.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/internal/controller/job/bootstraphandler.go b/internal/controller/job/bootstraphandler.go index 1b75d14803..6085c6bb7a 100644 --- a/internal/controller/job/bootstraphandler.go +++ b/internal/controller/job/bootstraphandler.go @@ -80,7 +80,7 @@ func (c *Controller) handleBootstrapUpdate(job *apiv1.Job) error { // If the job was successful we updated the state of the pgcluster to a "bootstrapped" status. // This will then trigger full initialization of the cluster. We also cleanup any resources - // from the bootstrap job. + // from the bootstrap job and delete the job itself if cluster.Status.State == crv1.PgclusterStateBootstrapping { if err := c.cleanupBootstrapResources(job, cluster, restore); err != nil { @@ -100,6 +100,11 @@ func (c *Controller) handleBootstrapUpdate(job *apiv1.Job) error { log.Error(err) return err } + + // as it is no longer needed, delete the job + deletePropagation := metav1.DeletePropagationBackground + return c.Client.BatchV1().Jobs(namespace).Delete(job.Name, + &metav1.DeleteOptions{PropagationPolicy: &deletePropagation}) } if restore { From 050fb51e5e0d936b2f95ef7ca53cec4a6d6ccc6a Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 10 Dec 2020 12:38:36 -0500 Subject: [PATCH 034/129] Only consider running Pods for `pgo test` By adding this limitation, Pods such as Evicted Pods would not be considered as a part of `pgo test` output, as this could present some odd scenarios, such as the presence of two primaries. Issue: [ch9931] Issue: #2095 --- .../apiserver/clusterservice/clusterimpl.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index 1da1b65124..565ce20a1f 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -38,6 +38,7 @@ import ( kerrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/client-go/kubernetes" ) @@ -2055,10 +2056,15 @@ func GetPrimaryAndReplicaPods(cluster *crv1.Pgcluster, ns string) ([]msgs.ShowCl output := make([]msgs.ShowClusterPod, 0) + // find all of the Pods that represent Postgres primary and replicas. + // only consider running Pods selector := config.LABEL_SERVICE_NAME + "=" + cluster.Spec.Name + "," + config.LABEL_DEPLOYMENT_NAME - log.Debugf("selector for GetPrimaryAndReplicaPods is %s", selector) + options := metav1.ListOptions{ + FieldSelector: fields.OneTermEqualSelector("status.phase", string(v1.PodRunning)).String(), + LabelSelector: selector, + } - pods, err := apiserver.Clientset.CoreV1().Pods(ns).List(metav1.ListOptions{LabelSelector: selector}) + pods, err := apiserver.Clientset.CoreV1().Pods(ns).List(options) if err != nil { return output, err } @@ -2078,9 +2084,12 @@ func GetPrimaryAndReplicaPods(cluster *crv1.Pgcluster, ns string) ([]msgs.ShowCl } selector = config.LABEL_SERVICE_NAME + "=" + cluster.Spec.Name + "-replica" + "," + config.LABEL_DEPLOYMENT_NAME - log.Debugf("selector for GetPrimaryAndReplicaPods is %s", selector) + options = metav1.ListOptions{ + FieldSelector: fields.OneTermEqualSelector("status.phase", string(v1.PodRunning)).String(), + LabelSelector: selector, + } - pods, err = apiserver.Clientset.CoreV1().Pods(ns).List(metav1.ListOptions{LabelSelector: selector}) + pods, err = apiserver.Clientset.CoreV1().Pods(ns).List(options) if err != nil { return output, err } From 773b6588c3e757cd6ef9ff3fed6038827170df2d Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 16 Dec 2020 09:43:40 -0500 Subject: [PATCH 035/129] Do not consider evicted Pods with `pgo df` For a variety of reasons, including the need to exec into Pods to get PVC status with `pgo df`, only running Pods should be considered for this command and, in particular, no evicted Pods. Issue: [ch9959] Issue: #2129 --- internal/apiserver/dfservice/dfimpl.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/internal/apiserver/dfservice/dfimpl.go b/internal/apiserver/dfservice/dfimpl.go index f10cda475b..fe1bbd3529 100644 --- a/internal/apiserver/dfservice/dfimpl.go +++ b/internal/apiserver/dfservice/dfimpl.go @@ -24,10 +24,12 @@ import ( "github.com/crunchydata/postgres-operator/internal/kubeapi" crv1 "github.com/crunchydata/postgres-operator/pkg/apis/crunchydata.com/v1" msgs "github.com/crunchydata/postgres-operator/pkg/apiservermsgs" + log "github.com/sirupsen/logrus" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" "k8s.io/client-go/kubernetes" ) @@ -146,7 +148,12 @@ func getClusterDf(cluster *crv1.Pgcluster, clusterResultsChannel chan msgs.DfDet selector := fmt.Sprintf("%s=%s,!%s", config.LABEL_PG_CLUSTER, cluster.Spec.Name, config.LABEL_PGHA_BOOTSTRAP) - pods, err := apiserver.Clientset.CoreV1().Pods(cluster.Spec.Namespace).List(metav1.ListOptions{LabelSelector: selector}) + options := metav1.ListOptions{ + FieldSelector: fields.OneTermEqualSelector("status.phase", string(v1.PodRunning)).String(), + LabelSelector: selector, + } + + pods, err := apiserver.Clientset.CoreV1().Pods(cluster.Spec.Namespace).List(options) // if there is an error attempting to get the pods, just return if err != nil { From a4de7811525db14047fadd40a3891c64a56fe5cc Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 18 Dec 2020 16:36:12 -0500 Subject: [PATCH 036/129] Modify syntax for checking for recovery status via SQL (#2133) There were cases where this was failing due to too many quotes being used, so this should avoid said issues. Issue: [ch9981] Issue: #2108 --- internal/controller/pod/promotionhandler.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/internal/controller/pod/promotionhandler.go b/internal/controller/pod/promotionhandler.go index 533f265344..660f841fdc 100644 --- a/internal/controller/pod/promotionhandler.go +++ b/internal/controller/pod/promotionhandler.go @@ -34,9 +34,14 @@ import ( "k8s.io/client-go/rest" ) +const ( + // recoverySQL is just the SQL to figure out if Postgres is in recovery mode + recoverySQL = "SELECT pg_is_in_recovery();" +) + var ( // isInRecoveryCommand is the command run to determine if postgres is in recovery - isInRecoveryCMD []string = []string{"psql", "-t", "-c", "'SELECT pg_is_in_recovery();'", "-p"} + isInRecoveryCMD []string = []string{"psql", "-t", "-c", recoverySQL, "-p"} // leaderStatusCMD is the command run to get the Patroni status for the primary leaderStatusCMD []string = []string{"curl", fmt.Sprintf("localhost:%s/master", From ff5bdf97f868af57d33b7a9de1df4da69d3d59aa Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sat, 19 Dec 2020 16:51:05 -0500 Subject: [PATCH 037/129] Bump Grafana version for Postgres Operator Monitoring This moves Grafana to 6.7.5. Note that this continues to use the upstream version. --- docs/content/installation/metrics/metrics-configuration.md | 6 +++--- .../metrics/ansible/roles/pgo-metrics/defaults/main.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/content/installation/metrics/metrics-configuration.md b/docs/content/installation/metrics/metrics-configuration.md index 7d343480cf..d65cd47aef 100644 --- a/docs/content/installation/metrics/metrics-configuration.md +++ b/docs/content/installation/metrics/metrics-configuration.md @@ -108,7 +108,7 @@ and tag as needed to use the RedHat certified containers: | `alertmanager_image_tag` | v0.21.0 | **Required** | Configures the image tag to use for the Alertmanager container. | | `grafana_image_prefix` | grafana | **Required** | Configures the image prefix to use for the Grafana container.| | `grafana_image_name` | grafana | **Required** | Configures the image name to use for the Grafana container. | -| `grafana_image_tag` | 6.7.4 | **Required** | Configures the image tag to use for the Grafana container. | +| `grafana_image_tag` | 6.7.5 | **Required** | Configures the image tag to use for the Grafana container. | | `prometheus_image_prefix` | prom | **Required** | Configures the image prefix to use for the Prometheus container. | | `prometheus_image_name` | promtheus | **Required** | Configures the image name to use for the Prometheus container. | | `prometheus_image_tag` | v2.20.0 | **Required** | Configures the image tag to use for the Prometheus container. | @@ -124,7 +124,7 @@ PostgreSQL Operator Monitoring infrastructure: | Name | Default | Required | Description | |------|---------|----------|-------------| -| `pgo_image_prefix` | registry.developers.crunchydata.com/crunchydata | **Required** | Configures the image prefix used by the `pgo-deployer` container | +| `pgo_image_prefix` | registry.developers.crunchydata.com/crunchydata | **Required** | Configures the image prefix used by the `pgo-deployer` container | | `pgo_image_tag` | {{< param centosBase >}}-{{< param operatorVersion >}} | **Required** | Configures the image tag used by the `pgo-deployer` container | -[k8s-service-type]: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types \ No newline at end of file +[k8s-service-type]: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types diff --git a/installers/metrics/ansible/roles/pgo-metrics/defaults/main.yml b/installers/metrics/ansible/roles/pgo-metrics/defaults/main.yml index 775d6691f5..08df353edf 100644 --- a/installers/metrics/ansible/roles/pgo-metrics/defaults/main.yml +++ b/installers/metrics/ansible/roles/pgo-metrics/defaults/main.yml @@ -29,7 +29,7 @@ grafana_admin_password: "" grafana_install: "true" grafana_image_prefix: "grafana" grafana_image_name: "grafana" -grafana_image_tag: "6.7.4" +grafana_image_tag: "6.7.5" grafana_port: "3000" grafana_service_name: "crunchy-grafana" grafana_service_type: "ClusterIP" From c8c29c3d04965a3666111d13367212a1ff300b2f Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 20 Dec 2020 11:37:57 -0500 Subject: [PATCH 038/129] Add missing `--no-prompt` flag to `pgo upgrade` The mechanism for disabling the verification prompt for `pgo upgrade` was always available, but the flag itself was not exposed. Issue: [ch9988] Issue: #2135 --- docs/content/pgo-client/reference/pgo_upgrade.md | 11 ++++++----- pgo/cmd/upgrade.go | 11 +++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/content/pgo-client/reference/pgo_upgrade.md b/docs/content/pgo-client/reference/pgo_upgrade.md index 78d787f6f0..534790f189 100644 --- a/docs/content/pgo-client/reference/pgo_upgrade.md +++ b/docs/content/pgo-client/reference/pgo_upgrade.md @@ -7,10 +7,10 @@ Perform a cluster upgrade. ### Synopsis -UPGRADE allows you to perform a comprehensive PGCluster upgrade - (for use after performing a Postgres Operator upgrade). +UPGRADE allows you to perform a comprehensive PGCluster upgrade + (for use after performing a Postgres Operator upgrade). For example: - + pgo upgrade mycluster Upgrades the cluster for use with the upgraded Postgres Operator version. @@ -24,12 +24,13 @@ pgo upgrade [flags] --ccp-image-tag string The image tag to use for cluster creation. If specified, it overrides the default configuration setting and disables tag validation checking. -h, --help help for upgrade --ignore-validation Disables version checking against the image tags when performing an cluster upgrade. + --no-prompt No command line confirmation. ``` ### Options inherited from parent commands ``` - --apiserver-url string The URL for the PostgreSQL Operator apiserver that will process the request from the pgo client. + --apiserver-url string The URL for the PostgreSQL Operator apiserver that will process the request from the pgo client. Note that the URL should **not** end in a '/'. --debug Enable additional output for debugging. --disable-tls Disable TLS authentication to the Postgres Operator. --exclude-os-trust Exclude CA certs from OS default trust store @@ -43,4 +44,4 @@ pgo upgrade [flags] * [pgo](/pgo-client/reference/pgo/) - The pgo command line interface. -###### Auto generated by spf13/cobra on 1-Oct-2020 +###### Auto generated by spf13/cobra on 20-Dec-2020 diff --git a/pgo/cmd/upgrade.go b/pgo/cmd/upgrade.go index e6672f1aa8..1211990790 100644 --- a/pgo/cmd/upgrade.go +++ b/pgo/cmd/upgrade.go @@ -41,10 +41,10 @@ var UpgradeCCPImageTag string var UpgradeCmd = &cobra.Command{ Use: "upgrade", Short: "Perform a cluster upgrade.", - Long: `UPGRADE allows you to perform a comprehensive PGCluster upgrade - (for use after performing a Postgres Operator upgrade). + Long: `UPGRADE allows you to perform a comprehensive PGCluster upgrade + (for use after performing a Postgres Operator upgrade). For example: - + pgo upgrade mycluster Upgrades the cluster for use with the upgraded Postgres Operator version.`, Run: func(cmd *cobra.Command, args []string) { @@ -69,8 +69,9 @@ func init() { RootCmd.AddCommand(UpgradeCmd) // flags for "pgo upgrade" - UpgradeCmd.Flags().BoolVarP(&IgnoreValidation, "ignore-validation", "", false, "Disables version checking against the image tags when performing an cluster upgrade.") UpgradeCmd.Flags().StringVarP(&UpgradeCCPImageTag, "ccp-image-tag", "", "", "The image tag to use for cluster creation. If specified, it overrides the default configuration setting and disables tag validation checking.") + UpgradeCmd.Flags().BoolVarP(&IgnoreValidation, "ignore-validation", "", false, "Disables version checking against the image tags when performing an cluster upgrade.") + UpgradeCmd.Flags().BoolVar(&NoPrompt, "no-prompt", false, "No command line confirmation.") } func createUpgrade(args []string, ns string) { @@ -90,7 +91,6 @@ func createUpgrade(args []string, ns string) { request.UpgradeCCPImageTag = UpgradeCCPImageTag response, err := api.CreateUpgrade(httpclient, &SessionCredentials, &request) - if err != nil { fmt.Println("Error: " + err.Error()) os.Exit(2) @@ -104,5 +104,4 @@ func createUpgrade(args []string, ns string) { fmt.Println("Error: " + response.Status.Msg) os.Exit(2) } - } From 62a677db54ad40df314c0fd5368b599aaf9f91ee Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 20 Dec 2020 12:30:26 -0500 Subject: [PATCH 039/129] Ensure consistent permissions for mounting repo Secret While the Secret volume mount is set to be readonly for the pgBackRest Secret information, the defaultMode on the volume itself was set to be more permissive. While it appears that the vast majority of Kubernetes distributions gie precedence to the value of the volume mount, so flavors do use the values set on the volume. As such, it's prudent to remove the more permissive settings, which this patch does. Issue: [ch9989] Issue: #2140 --- .../pgo-operator/files/pgo-configs/cluster-bootstrap-job.json | 3 +-- .../pgo-operator/files/pgo-configs/cluster-deployment.json | 3 +-- .../files/pgo-configs/pgo-backrest-repo-template.json | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/cluster-bootstrap-job.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/cluster-bootstrap-job.json index ecd2cf735a..9bd5a10f21 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/cluster-bootstrap-job.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/cluster-bootstrap-job.json @@ -166,8 +166,7 @@ }, { "name": "sshd", "secret": { - "secretName": "{{.RestoreFrom}}-backrest-repo-config", - "defaultMode": 511 + "secretName": "{{.RestoreFrom}}-backrest-repo-config" } }, {{if .TLSEnabled}} diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/cluster-deployment.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/cluster-deployment.json index 4a44785b27..b92f0e3b94 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/cluster-deployment.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/cluster-deployment.json @@ -252,8 +252,7 @@ }, { "name": "sshd", "secret": { - "secretName": "{{.ClusterName}}-backrest-repo-config", - "defaultMode": 511 + "secretName": "{{.ClusterName}}-backrest-repo-config" } }, { "name": "root-volume", diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-repo-template.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-repo-template.json index 5f9e5d5049..1c14cc08e4 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-repo-template.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-repo-template.json @@ -102,8 +102,7 @@ "volumes": [{ "name": "sshd", "secret": { - "secretName": "{{.SshdSecretsName}}", - "defaultMode": 511 + "secretName": "{{.SshdSecretsName}}" } }, { "name": "backrestrepo", From dce3c34a9e6c7d3870d4582c211e960d3b06fa3f Mon Sep 17 00:00:00 2001 From: Chris Bandy Date: Thu, 24 Sep 2020 11:41:28 -0500 Subject: [PATCH 040/129] Build the GCP Marketplace installer with a smaller context This reduces the time it takes to build with Docker. --- installers/gcp-marketplace/Dockerfile | 18 +++++++++--------- installers/gcp-marketplace/Makefile | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/installers/gcp-marketplace/Dockerfile b/installers/gcp-marketplace/Dockerfile index adf85a355a..0e84cb2f27 100644 --- a/installers/gcp-marketplace/Dockerfile +++ b/installers/gcp-marketplace/Dockerfile @@ -20,21 +20,21 @@ RUN apt-get update \ && apt-get install -y --no-install-recommends ansible=2.9.* openssh-client \ && rm -rf /var/lib/apt/lists/* -COPY installers/ansible/* \ +COPY ansible/* \ /opt/postgres-operator/ansible/ -COPY installers/favicon.png \ - installers/gcp-marketplace/install-job.yaml \ - installers/gcp-marketplace/install.sh \ - installers/gcp-marketplace/values.yaml \ +COPY favicon.png \ + gcp-marketplace/install-job.yaml \ + gcp-marketplace/install.sh \ + gcp-marketplace/values.yaml \ /opt/postgres-operator/ -COPY installers/gcp-marketplace/install-hook.sh \ +COPY gcp-marketplace/install-hook.sh \ /bin/create_manifests.sh -COPY installers/gcp-marketplace/schema.yaml \ +COPY gcp-marketplace/schema.yaml \ /data/ -COPY installers/gcp-marketplace/application.yaml \ +COPY gcp-marketplace/application.yaml \ /data/manifest/ -COPY installers/gcp-marketplace/test-pod.yaml \ +COPY gcp-marketplace/test-pod.yaml \ /data-test/manifest/ ARG PGO_VERSION diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index f10f5b7c27..6236ae3ad8 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -37,12 +37,12 @@ image: image-$(IMAGE_BUILDER) .PHONY: image-buildah image-buildah: ## Build the deployer image with Buildah - sudo buildah bud --file Dockerfile --tag '$(DEPLOYER_IMAGE)' $(IMAGE_BUILD_ARGS) --layers ../.. + sudo buildah bud --file Dockerfile --tag '$(DEPLOYER_IMAGE)' $(IMAGE_BUILD_ARGS) --layers .. sudo buildah push '$(DEPLOYER_IMAGE)' docker-daemon:'$(DEPLOYER_IMAGE)' .PHONY: image-docker image-docker: ## Build the deployer image with Docker - docker build --file Dockerfile --tag '$(DEPLOYER_IMAGE)' $(IMAGE_BUILD_ARGS) ../.. + docker build --file Dockerfile --tag '$(DEPLOYER_IMAGE)' $(IMAGE_BUILD_ARGS) .. # PARAMETERS='{"OPERATOR_NAMESPACE": "", "OPERATOR_NAME": "", "OPERATOR_ADMIN_PASSWORD": ""}' .PHONY: install From 3330f7098ed72df60de06046bad2261737e6be66 Mon Sep 17 00:00:00 2001 From: Chris Bandy Date: Tue, 22 Dec 2020 12:54:57 -0600 Subject: [PATCH 041/129] Wait for RBAC reconciliation in GCP Marketplace Marketplace verification checks that the namespace has no RBAC objects after the application is removed. These objects used to be created during the install, but now they are created by the operator during reconcile. See: 78b39759cef7f6994165a937348291f03500db5c Issue: [ch10000] --- installers/gcp-marketplace/install.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/installers/gcp-marketplace/install.sh b/installers/gcp-marketplace/install.sh index 6dc770b993..3b65f8976d 100755 --- a/installers/gcp-marketplace/install.sh +++ b/installers/gcp-marketplace/install.sh @@ -37,16 +37,36 @@ resources=( clusterrolebinding/pgo-cluster-role configmap/pgo-config deployment/postgres-operator + role/pgo-backrest-role + role/pgo-pg-role role/pgo-role + role/pgo-target-role + rolebinding/pgo-backrest-role-binding + rolebinding/pgo-pg-role-binding rolebinding/pgo-role + rolebinding/pgo-target-role-binding secret/pgo.tls secret/pgo-backrest-repo-config secret/pgorole-pgoadmin secret/pgouser-admin service/postgres-operator + serviceaccount/pgo-backrest + serviceaccount/pgo-default + serviceaccount/pgo-pg + serviceaccount/pgo-target serviceaccount/postgres-operator ) for resource in "${resources[@]}"; do + kind="${resource%/*}" + name="${resource#*/}" + + for _ in $(seq 5); do + if [ "$( kc get "$kind" --field-selector="metadata.name=$name" --output=name )" ] + then break + else sleep 1s + fi + done + kc patch "$resource" --type=strategic --patch="$application_ownership" done From 49b220a7127ef627b7996b5e06946b48dd557439 Mon Sep 17 00:00:00 2001 From: Chris Bandy Date: Tue, 22 Dec 2020 13:46:19 -0600 Subject: [PATCH 042/129] Verify GCP Marketplace installer without parameters To be on the marketplace, the deployer image must pass verification without any specified parameters. Contrary to the documentation, the verify command still takes parameters which allows us to test different configuration values. See: https://github.com/GoogleCloudPlatform/marketplace-k8s-app-tools/commit/aca27e694dc2 Issue: [ch10000] --- installers/gcp-marketplace/Dockerfile | 2 ++ installers/gcp-marketplace/test-schema.yaml | 6 ++++++ 2 files changed, 8 insertions(+) create mode 100644 installers/gcp-marketplace/test-schema.yaml diff --git a/installers/gcp-marketplace/Dockerfile b/installers/gcp-marketplace/Dockerfile index 0e84cb2f27..464e7d74fd 100644 --- a/installers/gcp-marketplace/Dockerfile +++ b/installers/gcp-marketplace/Dockerfile @@ -36,6 +36,8 @@ COPY gcp-marketplace/application.yaml \ /data/manifest/ COPY gcp-marketplace/test-pod.yaml \ /data-test/manifest/ +COPY gcp-marketplace/test-schema.yaml \ + /data-test/schema.yaml ARG PGO_VERSION RUN for file in \ diff --git a/installers/gcp-marketplace/test-schema.yaml b/installers/gcp-marketplace/test-schema.yaml new file mode 100644 index 0000000000..5dae182d7e --- /dev/null +++ b/installers/gcp-marketplace/test-schema.yaml @@ -0,0 +1,6 @@ +properties: + OPERATOR_ADMIN_PASSWORD: + type: string + default: insecure + x-google-marketplace: + type: MASKED_FIELD From 974b0f0075a85641d90e0bd6489655855ddad33a Mon Sep 17 00:00:00 2001 From: Chris Bandy Date: Tue, 22 Dec 2020 14:22:07 -0600 Subject: [PATCH 043/129] Move GCP Marketplace service account description Recent versions of marketplace verification expect a service account's description under a different schema key. Tested with tools v0.10.10. See: https://github.com/GoogleCloudPlatform/marketplace-k8s-app-tools/commit/10c92d4bb52c Issue: [ch10000] --- installers/gcp-marketplace/schema.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/installers/gcp-marketplace/schema.yaml b/installers/gcp-marketplace/schema.yaml index 6f0ec5320f..6b7e3df965 100644 --- a/installers/gcp-marketplace/schema.yaml +++ b/installers/gcp-marketplace/schema.yaml @@ -11,13 +11,13 @@ properties: INSTALLER_SERVICE_ACCOUNT: # This key appears in the ClusterRoleBinding name. title: Cluster Admin Service Account - description: >- - Name of a service account in the target namespace that has cluster-admin permissions. - This is used by the operator installer to create Custom Resource Definitions. type: string x-google-marketplace: type: SERVICE_ACCOUNT serviceAccount: + description: >- + Name of a service account in the target namespace that has cluster-admin permissions. + This is used by the operator installer to create Custom Resource Definitions. roles: - type: ClusterRole rulesType: PREDEFINED From f541288f04083c8120300a44acf6f4a066056c7b Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sat, 26 Dec 2020 15:14:47 -0500 Subject: [PATCH 044/129] Modify character space for random password generation This removes a couple of characters from consideration for the randomly generated passwords, as these characters could pose problems when applying them in shell environments. The character entropy is still quite large even with this removal. --- internal/util/secrets.go | 20 ++++++++++++++++---- internal/util/secrets_test.go | 12 +++++++++--- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/internal/util/secrets.go b/internal/util/secrets.go index 1ef90e7bd6..ce7b69472f 100644 --- a/internal/util/secrets.go +++ b/internal/util/secrets.go @@ -45,6 +45,10 @@ const ( // passwordCharUpper is the highest ASCII character to use for generating a // password, which is 126 passwordCharUpper = 126 + // passwordCharExclude is a map of characters that we choose to exclude from + // the password to simplify usage in the shell. There is still enough entropy + // that exclusion of these characters is OK. + passwordCharExclude = "`\\" ) // passwordCharSelector is a "big int" that we need to select the random ASCII @@ -77,16 +81,24 @@ func CreateSecret(clientset kubernetes.Interface, db, secretName, username, pass // ASCII characters suitable for a password func GeneratePassword(length int) (string, error) { password := make([]byte, length) + i := 0 - for i := 0; i < length; i++ { - char, err := rand.Int(rand.Reader, passwordCharSelector) - + for i < length { + val, err := rand.Int(rand.Reader, passwordCharSelector) // if there is an error generating the random integer, return if err != nil { return "", err } - password[i] = byte(passwordCharLower + char.Int64()) + char := byte(passwordCharLower + val.Int64()) + + // if the character is in the exclusion list, continue + if idx := strings.IndexAny(string(char), passwordCharExclude); idx > -1 { + continue + } + + password[i] = char + i++ } return string(password), nil diff --git a/internal/util/secrets_test.go b/internal/util/secrets_test.go index 89cbcebac9..423beb5e03 100644 --- a/internal/util/secrets_test.go +++ b/internal/util/secrets_test.go @@ -23,7 +23,7 @@ import ( func TestGeneratePassword(t *testing.T) { // different lengths - for _, length := range []int{1, 2, 3, 5, 20} { + for _, length := range []int{1, 2, 3, 5, 20, 200} { password, err := GeneratePassword(length) if err != nil { t.Fatalf("expected no error, got %v", err) @@ -31,9 +31,12 @@ func TestGeneratePassword(t *testing.T) { if expected, actual := length, len(password); expected != actual { t.Fatalf("expected length %v, got %v", expected, actual) } - if i := strings.IndexFunc(password, unicode.IsPrint); i > 0 { + if i := strings.IndexFunc(password, func(r rune) bool { return !unicode.IsPrint(r) }); i > -1 { t.Fatalf("expected only printable characters, got %q in %q", password[i], password) } + if i := strings.IndexAny(password, passwordCharExclude); i > -1 { + t.Fatalf("expected no exclude characters, got %q in %q", password[i], password) + } } // random contents @@ -44,9 +47,12 @@ func TestGeneratePassword(t *testing.T) { if err != nil { t.Fatalf("expected no error, got %v", err) } - if i := strings.IndexFunc(password, unicode.IsPrint); i > 0 { + if i := strings.IndexFunc(password, func(r rune) bool { return !unicode.IsPrint(r) }); i > -1 { t.Fatalf("expected only printable characters, got %q in %q", password[i], password) } + if i := strings.IndexAny(password, passwordCharExclude); i > -1 { + t.Fatalf("expected no exclude characters, got %q in %q", password[i], password) + } for i := range previous { if password == previous[i] { From c17d4fe7045b6888c6e1cecc80ccb36fe1430e6f Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 29 Dec 2020 09:59:45 -0500 Subject: [PATCH 045/129] Ensure sync replication ConfigMap is deleted on delete The deletion task was not checking for the existence of this ConfigMap on delete, and as such it was being missed. --- pgo-rmdata/rmdata/process.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pgo-rmdata/rmdata/process.go b/pgo-rmdata/rmdata/process.go index 866aca9fda..772eae8f17 100644 --- a/pgo-rmdata/rmdata/process.go +++ b/pgo-rmdata/rmdata/process.go @@ -45,6 +45,7 @@ const ( configConfigMapSuffix = "config" leaderConfigMapSuffix = "leader" failoverConfigMapSuffix = "failover" + syncConfigMapSuffix = "sync" ) func Delete(request Request) { @@ -236,6 +237,8 @@ func removeClusterConfigmaps(request Request) { // next, the name of the failover configmap, which is // "`clusterName`-failover" fmt.Sprintf("%s-%s", request.ClusterName, failoverConfigMapSuffix), + // next, if there is a synchronous replication configmap, clean that up + fmt.Sprintf("%s-%s", request.ClusterName, syncConfigMapSuffix), // finally, if there is a pgbouncer, remove the pgbouncer configmap util.GeneratePgBouncerConfigMapName(request.ClusterName), } From bdd5da20f8bd8c7f0d5b9a4ea9e012709554b44f Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sat, 2 Jan 2021 11:58:10 -0500 Subject: [PATCH 046/129] Happy New Year! Good riddance 2020, hello 2021. --- LICENSE.md | 2 +- apiserver.go | 2 +- bin/crunchy-postgres-exporter/common_lib.sh | 2 +- bin/crunchy-postgres-exporter/start.sh | 2 +- bin/get-deps.sh | 2 +- bin/get-pgmonitor.sh | 2 +- bin/pgo-backrest-repo-sync/pgo-backrest-repo-sync.sh | 2 +- bin/pgo-backrest-repo/pgo-backrest-repo.sh | 2 +- bin/pgo-backrest-restore/pgo-backrest-restore.sh | 2 +- bin/pgo-backrest/pgo-backrest.sh | 2 +- bin/pgo-event/pgo-event.sh | 2 +- bin/pgo-rmdata/start.sh | 2 +- bin/pgo-scheduler/start.sh | 2 +- bin/pgo-sqlrunner/start.sh | 2 +- bin/pre-pull-crunchy-containers.sh | 2 +- bin/pull-from-gcr.sh | 2 +- bin/push-ccp-to-gcr.sh | 2 +- bin/push-to-gcr.sh | 2 +- bin/uid_daemon.sh | 2 +- bin/upgrade-secret.sh | 2 +- deploy/add-targeted-namespace-reconcile-rbac.sh | 2 +- deploy/add-targeted-namespace.sh | 2 +- deploy/cleannamespaces.sh | 2 +- deploy/cleanup-rbac.sh | 2 +- deploy/cleanup.sh | 2 +- deploy/deploy.sh | 2 +- deploy/gen-api-keys.sh | 2 +- deploy/install-bootstrap-creds.sh | 2 +- deploy/install-rbac.sh | 2 +- deploy/remove-crd.sh | 2 +- deploy/setupnamespaces.sh | 2 +- deploy/show-crd.sh | 2 +- deploy/upgrade-creds.sh | 2 +- deploy/upgrade-pgo.sh | 2 +- examples/create-by-resource/run.sh | 2 +- examples/custom-config/create.sh | 2 +- examples/custom-config/setup.sql | 2 +- hack/boilerplate.go.txt | 2 +- hack/config_sync.sh | 2 +- hack/update-codegen.sh | 2 +- hack/verify-codegen.sh | 2 +- .../roles/pgo-operator/templates/add-targeted-namespace.sh.j2 | 2 +- installers/image/bin/pgo-deploy.sh | 2 +- installers/kubectl/client-setup.sh | 2 +- internal/apiserver/backrestservice/backrestimpl.go | 2 +- internal/apiserver/backrestservice/backrestservice.go | 2 +- internal/apiserver/backupoptions/backupoptionsutil.go | 2 +- internal/apiserver/backupoptions/pgbackrestoptions.go | 2 +- internal/apiserver/backupoptions/pgdumpoptions.go | 2 +- internal/apiserver/catservice/catimpl.go | 2 +- internal/apiserver/catservice/catservice.go | 2 +- internal/apiserver/cloneservice/cloneimpl.go | 2 +- internal/apiserver/cloneservice/cloneservice.go | 2 +- internal/apiserver/clusterservice/clusterimpl.go | 2 +- internal/apiserver/clusterservice/clusterservice.go | 2 +- internal/apiserver/clusterservice/scaleimpl.go | 2 +- internal/apiserver/clusterservice/scaleservice.go | 2 +- internal/apiserver/common.go | 2 +- internal/apiserver/common_test.go | 2 +- internal/apiserver/configservice/configimpl.go | 2 +- internal/apiserver/configservice/configservice.go | 2 +- internal/apiserver/dfservice/dfimpl.go | 2 +- internal/apiserver/dfservice/dfservice.go | 2 +- internal/apiserver/failoverservice/failoverimpl.go | 2 +- internal/apiserver/failoverservice/failoverservice.go | 2 +- internal/apiserver/labelservice/labelimpl.go | 2 +- internal/apiserver/labelservice/labelservice.go | 2 +- internal/apiserver/middleware.go | 2 +- internal/apiserver/namespaceservice/namespaceimpl.go | 2 +- internal/apiserver/namespaceservice/namespaceservice.go | 2 +- internal/apiserver/perms.go | 2 +- internal/apiserver/pgadminservice/pgadminimpl.go | 2 +- internal/apiserver/pgadminservice/pgadminservice.go | 2 +- internal/apiserver/pgbouncerservice/pgbouncerimpl.go | 2 +- internal/apiserver/pgbouncerservice/pgbouncerservice.go | 2 +- internal/apiserver/pgdumpservice/pgdumpimpl.go | 2 +- internal/apiserver/pgdumpservice/pgdumpservice.go | 2 +- internal/apiserver/pgoroleservice/pgoroleimpl.go | 2 +- internal/apiserver/pgoroleservice/pgoroleservice.go | 2 +- internal/apiserver/pgouserservice/pgouserimpl.go | 2 +- internal/apiserver/pgouserservice/pgouserservice.go | 2 +- internal/apiserver/policyservice/policyimpl.go | 2 +- internal/apiserver/policyservice/policyservice.go | 2 +- internal/apiserver/pvcservice/pvcimpl.go | 2 +- internal/apiserver/pvcservice/pvcservice.go | 2 +- internal/apiserver/reloadservice/reloadimpl.go | 2 +- internal/apiserver/reloadservice/reloadservice.go | 2 +- internal/apiserver/restartservice/restartimpl.go | 2 +- internal/apiserver/restartservice/restartservice.go | 2 +- internal/apiserver/root.go | 2 +- internal/apiserver/routing/doc.go | 2 +- internal/apiserver/routing/routes.go | 2 +- internal/apiserver/scheduleservice/scheduleimpl.go | 2 +- internal/apiserver/scheduleservice/scheduleservice.go | 2 +- internal/apiserver/statusservice/statusimpl.go | 2 +- internal/apiserver/statusservice/statusservice.go | 2 +- internal/apiserver/upgradeservice/upgradeimpl.go | 2 +- internal/apiserver/upgradeservice/upgradeservice.go | 2 +- internal/apiserver/userservice/userimpl.go | 2 +- internal/apiserver/userservice/userimpl_test.go | 2 +- internal/apiserver/userservice/userservice.go | 2 +- internal/apiserver/versionservice/versionimpl.go | 2 +- internal/apiserver/versionservice/versionservice.go | 2 +- internal/apiserver/workflowservice/workflowimpl.go | 2 +- internal/apiserver/workflowservice/workflowservice.go | 2 +- internal/config/annotations.go | 2 +- internal/config/defaults.go | 2 +- internal/config/images.go | 2 +- internal/config/labels.go | 2 +- internal/config/pgoconfig.go | 2 +- internal/config/volumes.go | 2 +- internal/controller/configmap/configmapcontroller.go | 2 +- internal/controller/configmap/synchandler.go | 2 +- internal/controller/controllerutil.go | 2 +- internal/controller/job/backresthandler.go | 2 +- internal/controller/job/bootstraphandler.go | 2 +- internal/controller/job/jobcontroller.go | 2 +- internal/controller/job/jobevents.go | 2 +- internal/controller/job/jobutil.go | 2 +- internal/controller/job/pgdumphandler.go | 2 +- internal/controller/job/reposynchandler.go | 2 +- internal/controller/job/rmdatahandler.go | 2 +- internal/controller/manager/controllermanager.go | 2 +- internal/controller/manager/rbac.go | 2 +- internal/controller/namespace/namespacecontroller.go | 2 +- internal/controller/pgcluster/pgclustercontroller.go | 2 +- internal/controller/pgpolicy/pgpolicycontroller.go | 2 +- internal/controller/pgreplica/pgreplicacontroller.go | 2 +- internal/controller/pgtask/backresthandler.go | 2 +- internal/controller/pgtask/pgtaskcontroller.go | 2 +- internal/controller/pod/inithandler.go | 2 +- internal/controller/pod/podcontroller.go | 2 +- internal/controller/pod/podevents.go | 2 +- internal/controller/pod/promotionhandler.go | 2 +- internal/kubeapi/client_config.go | 2 +- internal/kubeapi/deployment.go | 2 +- internal/kubeapi/endpoints.go | 2 +- internal/kubeapi/errors.go | 2 +- internal/kubeapi/exec.go | 2 +- internal/kubeapi/fake/clientset.go | 2 +- internal/kubeapi/fake/fakeclients.go | 2 +- internal/kubeapi/pod.go | 2 +- internal/kubeapi/volumes.go | 2 +- internal/kubeapi/volumes_test.go | 2 +- internal/logging/loglib.go | 2 +- internal/ns/nslogic.go | 2 +- internal/operator/backrest/backup.go | 2 +- internal/operator/backrest/repo.go | 2 +- internal/operator/backrest/restore.go | 2 +- internal/operator/backrest/stanza.go | 2 +- internal/operator/cluster/clone.go | 2 +- internal/operator/cluster/cluster.go | 2 +- internal/operator/cluster/clusterlogic.go | 2 +- internal/operator/cluster/failover.go | 2 +- internal/operator/cluster/failoverlogic.go | 2 +- internal/operator/cluster/pgadmin.go | 2 +- internal/operator/cluster/pgbouncer.go | 2 +- internal/operator/cluster/pgbouncer_test.go | 2 +- internal/operator/cluster/rmdata.go | 2 +- internal/operator/cluster/service.go | 2 +- internal/operator/cluster/standby.go | 2 +- internal/operator/cluster/upgrade.go | 2 +- internal/operator/clusterutilities.go | 2 +- internal/operator/clusterutilities_test.go | 2 +- internal/operator/common.go | 2 +- internal/operator/config/configutil.go | 2 +- internal/operator/config/dcs.go | 2 +- internal/operator/config/localdb.go | 2 +- internal/operator/operatorupgrade/version-check.go | 2 +- internal/operator/pgbackrest.go | 2 +- internal/operator/pgbackrest_test.go | 2 +- internal/operator/pgdump/dump.go | 2 +- internal/operator/pgdump/restore.go | 2 +- internal/operator/pvc/pvc.go | 2 +- internal/operator/storage.go | 2 +- internal/operator/storage_test.go | 2 +- internal/operator/task/applypolicies.go | 2 +- internal/operator/task/rmbackups.go | 2 +- internal/operator/task/rmdata.go | 2 +- internal/operator/task/workflow.go | 2 +- internal/operator/wal.go | 2 +- internal/patroni/doc.go | 2 +- internal/patroni/patroni.go | 2 +- internal/pgadmin/backoff.go | 2 +- internal/pgadmin/backoff_test.go | 2 +- internal/pgadmin/crypto.go | 2 +- internal/pgadmin/crypto_test.go | 2 +- internal/pgadmin/doc.go | 2 +- internal/pgadmin/hash.go | 2 +- internal/pgadmin/logic.go | 2 +- internal/pgadmin/runner.go | 2 +- internal/pgadmin/server.go | 2 +- internal/postgres/doc.go | 2 +- internal/postgres/password/doc.go | 2 +- internal/postgres/password/md5.go | 2 +- internal/postgres/password/md5_test.go | 2 +- internal/postgres/password/password.go | 2 +- internal/postgres/password/password_test.go | 2 +- internal/postgres/password/scram.go | 2 +- internal/postgres/password/scram_test.go | 2 +- internal/tlsutil/primitives.go | 2 +- internal/tlsutil/primitives_test.go | 2 +- internal/util/backrest.go | 2 +- internal/util/clone.go | 2 +- internal/util/cluster.go | 2 +- internal/util/failover.go | 2 +- internal/util/pgbouncer.go | 2 +- internal/util/policy.go | 2 +- internal/util/secrets.go | 2 +- internal/util/secrets_test.go | 2 +- internal/util/ssh.go | 2 +- internal/util/util.go | 2 +- pgo-backrest/pgo-backrest.go | 2 +- pgo-rmdata/pgo-rmdata.go | 2 +- pgo-rmdata/rmdata/process.go | 2 +- pgo-rmdata/rmdata/types.go | 2 +- pgo-scheduler/pgo-scheduler.go | 2 +- pgo-scheduler/scheduler/configmapcontroller.go | 2 +- pgo-scheduler/scheduler/controllermanager.go | 2 +- pgo-scheduler/scheduler/pgbackrest.go | 2 +- pgo-scheduler/scheduler/policy.go | 2 +- pgo-scheduler/scheduler/scheduler.go | 2 +- pgo-scheduler/scheduler/tasks.go | 2 +- pgo-scheduler/scheduler/types.go | 2 +- pgo-scheduler/scheduler/validate.go | 2 +- pgo-scheduler/scheduler/validate_test.go | 2 +- pgo/api/backrest.go | 2 +- pgo/api/cat.go | 2 +- pgo/api/clone.go | 2 +- pgo/api/cluster.go | 2 +- pgo/api/common.go | 2 +- pgo/api/config.go | 2 +- pgo/api/df.go | 2 +- pgo/api/failover.go | 2 +- pgo/api/label.go | 2 +- pgo/api/namespace.go | 2 +- pgo/api/pgadmin.go | 2 +- pgo/api/pgbouncer.go | 2 +- pgo/api/pgdump.go | 2 +- pgo/api/pgorole.go | 2 +- pgo/api/pgouser.go | 2 +- pgo/api/policy.go | 2 +- pgo/api/pvc.go | 2 +- pgo/api/reload.go | 2 +- pgo/api/restart.go | 2 +- pgo/api/restore.go | 2 +- pgo/api/restoreDump.go | 2 +- pgo/api/scale.go | 2 +- pgo/api/scaledown.go | 2 +- pgo/api/schedule.go | 2 +- pgo/api/status.go | 2 +- pgo/api/test.go | 2 +- pgo/api/upgrade.go | 2 +- pgo/api/user.go | 2 +- pgo/api/version.go | 2 +- pgo/api/workflow.go | 2 +- pgo/cmd/auth.go | 2 +- pgo/cmd/backrest.go | 2 +- pgo/cmd/backup.go | 2 +- pgo/cmd/cat.go | 2 +- pgo/cmd/clone.go | 2 +- pgo/cmd/cluster.go | 2 +- pgo/cmd/common.go | 2 +- pgo/cmd/config.go | 2 +- pgo/cmd/create.go | 2 +- pgo/cmd/delete.go | 2 +- pgo/cmd/df.go | 2 +- pgo/cmd/failover.go | 2 +- pgo/cmd/flags.go | 2 +- pgo/cmd/label.go | 2 +- pgo/cmd/namespace.go | 2 +- pgo/cmd/pgadmin.go | 2 +- pgo/cmd/pgbouncer.go | 2 +- pgo/cmd/pgdump.go | 2 +- pgo/cmd/pgorole.go | 2 +- pgo/cmd/pgouser.go | 2 +- pgo/cmd/policy.go | 2 +- pgo/cmd/pvc.go | 2 +- pgo/cmd/reload.go | 2 +- pgo/cmd/restart.go | 2 +- pgo/cmd/restore.go | 2 +- pgo/cmd/root.go | 2 +- pgo/cmd/scale.go | 2 +- pgo/cmd/scaledown.go | 2 +- pgo/cmd/schedule.go | 2 +- pgo/cmd/show.go | 2 +- pgo/cmd/status.go | 2 +- pgo/cmd/test.go | 2 +- pgo/cmd/update.go | 2 +- pgo/cmd/upgrade.go | 2 +- pgo/cmd/user.go | 2 +- pgo/cmd/version.go | 2 +- pgo/cmd/watch.go | 2 +- pgo/cmd/workflow.go | 2 +- pgo/generatedocs.go | 2 +- pgo/pgo.go | 2 +- pgo/util/confirmation.go | 2 +- pgo/util/pad.go | 2 +- pgo/util/validation.go | 2 +- pkg/apis/crunchydata.com/v1/cluster.go | 2 +- pkg/apis/crunchydata.com/v1/common.go | 2 +- pkg/apis/crunchydata.com/v1/common_test.go | 2 +- pkg/apis/crunchydata.com/v1/doc.go | 2 +- pkg/apis/crunchydata.com/v1/policy.go | 2 +- pkg/apis/crunchydata.com/v1/register.go | 2 +- pkg/apis/crunchydata.com/v1/replica.go | 2 +- pkg/apis/crunchydata.com/v1/task.go | 2 +- pkg/apis/crunchydata.com/v1/zz_generated.deepcopy.go | 2 +- pkg/apiservermsgs/backrestmsgs.go | 2 +- pkg/apiservermsgs/catmsgs.go | 2 +- pkg/apiservermsgs/clonemsgs.go | 2 +- pkg/apiservermsgs/clustermsgs.go | 2 +- pkg/apiservermsgs/common.go | 2 +- pkg/apiservermsgs/configmsgs.go | 2 +- pkg/apiservermsgs/dfmsgs.go | 2 +- pkg/apiservermsgs/failovermsgs.go | 2 +- pkg/apiservermsgs/labelmsgs.go | 2 +- pkg/apiservermsgs/namespacemsgs.go | 2 +- pkg/apiservermsgs/pgadminmsgs.go | 2 +- pkg/apiservermsgs/pgbouncermsgs.go | 2 +- pkg/apiservermsgs/pgdumpmsgs.go | 2 +- pkg/apiservermsgs/pgorolemsgs.go | 2 +- pkg/apiservermsgs/pgousermsgs.go | 2 +- pkg/apiservermsgs/policymsgs.go | 2 +- pkg/apiservermsgs/pvcmsgs.go | 2 +- pkg/apiservermsgs/reloadmsgs.go | 2 +- pkg/apiservermsgs/restartmsgs.go | 2 +- pkg/apiservermsgs/schedulemsgs.go | 2 +- pkg/apiservermsgs/statusmsgs.go | 2 +- pkg/apiservermsgs/upgrademsgs.go | 2 +- pkg/apiservermsgs/usermsgs.go | 2 +- pkg/apiservermsgs/usermsgs_test.go | 2 +- pkg/apiservermsgs/versionmsgs.go | 2 +- pkg/apiservermsgs/watchmsgs.go | 2 +- pkg/apiservermsgs/workflowmsgs.go | 2 +- pkg/events/eventing.go | 2 +- pkg/events/eventtype.go | 2 +- pkg/events/pgoeventtype.go | 2 +- pkg/generated/clientset/versioned/clientset.go | 2 +- pkg/generated/clientset/versioned/doc.go | 2 +- pkg/generated/clientset/versioned/fake/clientset_generated.go | 2 +- pkg/generated/clientset/versioned/fake/doc.go | 2 +- pkg/generated/clientset/versioned/fake/register.go | 2 +- pkg/generated/clientset/versioned/scheme/doc.go | 2 +- pkg/generated/clientset/versioned/scheme/register.go | 2 +- .../typed/crunchydata.com/v1/crunchydata.com_client.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/doc.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/fake/doc.go | 2 +- .../crunchydata.com/v1/fake/fake_crunchydata.com_client.go | 2 +- .../versioned/typed/crunchydata.com/v1/fake/fake_pgcluster.go | 2 +- .../versioned/typed/crunchydata.com/v1/fake/fake_pgpolicy.go | 2 +- .../versioned/typed/crunchydata.com/v1/fake/fake_pgreplica.go | 2 +- .../versioned/typed/crunchydata.com/v1/fake/fake_pgtask.go | 2 +- .../versioned/typed/crunchydata.com/v1/generated_expansion.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/pgcluster.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/pgpolicy.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/pgreplica.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/pgtask.go | 2 +- .../informers/externalversions/crunchydata.com/interface.go | 2 +- .../informers/externalversions/crunchydata.com/v1/interface.go | 2 +- .../informers/externalversions/crunchydata.com/v1/pgcluster.go | 2 +- .../informers/externalversions/crunchydata.com/v1/pgpolicy.go | 2 +- .../informers/externalversions/crunchydata.com/v1/pgreplica.go | 2 +- .../informers/externalversions/crunchydata.com/v1/pgtask.go | 2 +- pkg/generated/informers/externalversions/factory.go | 2 +- pkg/generated/informers/externalversions/generic.go | 2 +- .../externalversions/internalinterfaces/factory_interfaces.go | 2 +- pkg/generated/listers/crunchydata.com/v1/expansion_generated.go | 2 +- pkg/generated/listers/crunchydata.com/v1/pgcluster.go | 2 +- pkg/generated/listers/crunchydata.com/v1/pgpolicy.go | 2 +- pkg/generated/listers/crunchydata.com/v1/pgreplica.go | 2 +- pkg/generated/listers/crunchydata.com/v1/pgtask.go | 2 +- postgres-operator.go | 2 +- pv/create-pv-nfs-label.sh | 2 +- pv/create-pv-nfs-legacy.sh | 2 +- pv/create-pv-nfs.sh | 2 +- pv/create-pv.sh | 2 +- pv/delete-pv.sh | 2 +- testing/pgo_cli/cluster_backup_test.go | 2 +- testing/pgo_cli/cluster_cat_test.go | 2 +- testing/pgo_cli/cluster_clone_test.go | 2 +- testing/pgo_cli/cluster_create_test.go | 2 +- testing/pgo_cli/cluster_delete_test.go | 2 +- testing/pgo_cli/cluster_df_test.go | 2 +- testing/pgo_cli/cluster_failover_test.go | 2 +- testing/pgo_cli/cluster_label_test.go | 2 +- testing/pgo_cli/cluster_pgbouncer_test.go | 2 +- testing/pgo_cli/cluster_policy_test.go | 2 +- testing/pgo_cli/cluster_pvc_test.go | 2 +- testing/pgo_cli/cluster_reload_test.go | 2 +- testing/pgo_cli/cluster_restart_test.go | 2 +- testing/pgo_cli/cluster_scale_test.go | 2 +- testing/pgo_cli/cluster_scaledown_test.go | 2 +- testing/pgo_cli/cluster_test_test.go | 2 +- testing/pgo_cli/cluster_user_test.go | 2 +- testing/pgo_cli/operator_namespace_test.go | 2 +- testing/pgo_cli/operator_rbac_test.go | 2 +- testing/pgo_cli/operator_test.go | 2 +- testing/pgo_cli/suite_helpers_test.go | 2 +- testing/pgo_cli/suite_pgo_cmd_test.go | 2 +- testing/pgo_cli/suite_test.go | 2 +- 401 files changed, 401 insertions(+), 401 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index 90fe0562e2..f8ebe3dacd 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -176,7 +176,7 @@ END OF TERMS AND CONDITIONS - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/apiserver.go b/apiserver.go index 2c3858bb63..3df9608796 100644 --- a/apiserver.go +++ b/apiserver.go @@ -1,7 +1,7 @@ package main /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/bin/crunchy-postgres-exporter/common_lib.sh b/bin/crunchy-postgres-exporter/common_lib.sh index 283352062b..a42a618eb1 100755 --- a/bin/crunchy-postgres-exporter/common_lib.sh +++ b/bin/crunchy-postgres-exporter/common_lib.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/crunchy-postgres-exporter/start.sh b/bin/crunchy-postgres-exporter/start.sh index 2a0d543b70..95c6d55ab8 100755 --- a/bin/crunchy-postgres-exporter/start.sh +++ b/bin/crunchy-postgres-exporter/start.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/get-deps.sh b/bin/get-deps.sh index a0fddd048e..6c3e39324e 100755 --- a/bin/get-deps.sh +++ b/bin/get-deps.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/get-pgmonitor.sh b/bin/get-pgmonitor.sh index cfc178e77d..b6cceb2af4 100755 --- a/bin/get-pgmonitor.sh +++ b/bin/get-pgmonitor.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-backrest-repo-sync/pgo-backrest-repo-sync.sh b/bin/pgo-backrest-repo-sync/pgo-backrest-repo-sync.sh index 53e98e3a2e..f4bf1f1709 100644 --- a/bin/pgo-backrest-repo-sync/pgo-backrest-repo-sync.sh +++ b/bin/pgo-backrest-repo-sync/pgo-backrest-repo-sync.sh @@ -1,6 +1,6 @@ #!/bin/bash -x -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-backrest-repo/pgo-backrest-repo.sh b/bin/pgo-backrest-repo/pgo-backrest-repo.sh index 25fdec5f69..925e5808a3 100755 --- a/bin/pgo-backrest-repo/pgo-backrest-repo.sh +++ b/bin/pgo-backrest-repo/pgo-backrest-repo.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-backrest-restore/pgo-backrest-restore.sh b/bin/pgo-backrest-restore/pgo-backrest-restore.sh index 89f3888fff..a0373b7a96 100755 --- a/bin/pgo-backrest-restore/pgo-backrest-restore.sh +++ b/bin/pgo-backrest-restore/pgo-backrest-restore.sh @@ -1,6 +1,6 @@ #!/bin/bash -x -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-backrest/pgo-backrest.sh b/bin/pgo-backrest/pgo-backrest.sh index fda20af57c..86f758a50a 100755 --- a/bin/pgo-backrest/pgo-backrest.sh +++ b/bin/pgo-backrest/pgo-backrest.sh @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-event/pgo-event.sh b/bin/pgo-event/pgo-event.sh index cddcb2e708..1602e56193 100755 --- a/bin/pgo-event/pgo-event.sh +++ b/bin/pgo-event/pgo-event.sh @@ -1,6 +1,6 @@ #!/bin/bash -x -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-rmdata/start.sh b/bin/pgo-rmdata/start.sh index 95a4903289..228f891694 100755 --- a/bin/pgo-rmdata/start.sh +++ b/bin/pgo-rmdata/start.sh @@ -1,6 +1,6 @@ #!/bin/bash -x -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-scheduler/start.sh b/bin/pgo-scheduler/start.sh index 4a32cf8bc3..4549d82d57 100755 --- a/bin/pgo-scheduler/start.sh +++ b/bin/pgo-scheduler/start.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-sqlrunner/start.sh b/bin/pgo-sqlrunner/start.sh index 0b2eb6d417..01422d26d7 100755 --- a/bin/pgo-sqlrunner/start.sh +++ b/bin/pgo-sqlrunner/start.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pre-pull-crunchy-containers.sh b/bin/pre-pull-crunchy-containers.sh index 5a7031f8e9..91cfcb9dc8 100755 --- a/bin/pre-pull-crunchy-containers.sh +++ b/bin/pre-pull-crunchy-containers.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pull-from-gcr.sh b/bin/pull-from-gcr.sh index ad25336aab..a180a7a472 100755 --- a/bin/pull-from-gcr.sh +++ b/bin/pull-from-gcr.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index 59e2e329e8..d476c07b0b 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/push-to-gcr.sh b/bin/push-to-gcr.sh index f8293d9159..f0467affdb 100755 --- a/bin/push-to-gcr.sh +++ b/bin/push-to-gcr.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/uid_daemon.sh b/bin/uid_daemon.sh index 83d8aca5e2..bc988bae79 100755 --- a/bin/uid_daemon.sh +++ b/bin/uid_daemon.sh @@ -1,6 +1,6 @@ #!/usr/bin/bash -# Copyright 2020 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/upgrade-secret.sh b/bin/upgrade-secret.sh index ee93af1377..f852008890 100755 --- a/bin/upgrade-secret.sh +++ b/bin/upgrade-secret.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/add-targeted-namespace-reconcile-rbac.sh b/deploy/add-targeted-namespace-reconcile-rbac.sh index 8438c10912..533e8507f9 100755 --- a/deploy/add-targeted-namespace-reconcile-rbac.sh +++ b/deploy/add-targeted-namespace-reconcile-rbac.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/add-targeted-namespace.sh b/deploy/add-targeted-namespace.sh index af088314d9..61647e9feb 100755 --- a/deploy/add-targeted-namespace.sh +++ b/deploy/add-targeted-namespace.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/cleannamespaces.sh b/deploy/cleannamespaces.sh index 66cd693863..169bae6853 100755 --- a/deploy/cleannamespaces.sh +++ b/deploy/cleannamespaces.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/cleanup-rbac.sh b/deploy/cleanup-rbac.sh index 50f52bbc5f..df60c14500 100755 --- a/deploy/cleanup-rbac.sh +++ b/deploy/cleanup-rbac.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/cleanup.sh b/deploy/cleanup.sh index afe13f98c7..711e276823 100755 --- a/deploy/cleanup.sh +++ b/deploy/cleanup.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 823671c7d9..139bba7c08 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/gen-api-keys.sh b/deploy/gen-api-keys.sh index 8aece10000..a5444a9020 100755 --- a/deploy/gen-api-keys.sh +++ b/deploy/gen-api-keys.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/install-bootstrap-creds.sh b/deploy/install-bootstrap-creds.sh index 1b446824d3..e25253104c 100755 --- a/deploy/install-bootstrap-creds.sh +++ b/deploy/install-bootstrap-creds.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/install-rbac.sh b/deploy/install-rbac.sh index d96532d9f1..ec7a4d7d49 100755 --- a/deploy/install-rbac.sh +++ b/deploy/install-rbac.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/remove-crd.sh b/deploy/remove-crd.sh index 764645264f..f14bbfd022 100755 --- a/deploy/remove-crd.sh +++ b/deploy/remove-crd.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/setupnamespaces.sh b/deploy/setupnamespaces.sh index 9d2188a56f..08aade3518 100755 --- a/deploy/setupnamespaces.sh +++ b/deploy/setupnamespaces.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/show-crd.sh b/deploy/show-crd.sh index 7f40285c5d..091c2b6810 100755 --- a/deploy/show-crd.sh +++ b/deploy/show-crd.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/upgrade-creds.sh b/deploy/upgrade-creds.sh index ddc0953df7..dfea9c10c1 100755 --- a/deploy/upgrade-creds.sh +++ b/deploy/upgrade-creds.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/upgrade-pgo.sh b/deploy/upgrade-pgo.sh index 66f61639eb..0999cd9b79 100755 --- a/deploy/upgrade-pgo.sh +++ b/deploy/upgrade-pgo.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/examples/create-by-resource/run.sh b/examples/create-by-resource/run.sh index e6940ead12..c450490734 100755 --- a/examples/create-by-resource/run.sh +++ b/examples/create-by-resource/run.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/examples/custom-config/create.sh b/examples/custom-config/create.sh index df6c701f2a..5900132568 100755 --- a/examples/custom-config/create.sh +++ b/examples/custom-config/create.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/examples/custom-config/setup.sql b/examples/custom-config/setup.sql index 206005eb8a..1a05bce487 100644 --- a/examples/custom-config/setup.sql +++ b/examples/custom-config/setup.sql @@ -1,5 +1,5 @@ /* - * Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + * Copyright 2017 - 2021 Crunchy Data Solutions, Inc. * 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 diff --git a/hack/boilerplate.go.txt b/hack/boilerplate.go.txt index 8aabc9a12b..e681957476 100644 --- a/hack/boilerplate.go.txt +++ b/hack/boilerplate.go.txt @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/hack/config_sync.sh b/hack/config_sync.sh index cab45b023b..6317c556a1 100755 --- a/hack/config_sync.sh +++ b/hack/config_sync.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index c9795398ae..97fb0aa383 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2020 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/hack/verify-codegen.sh b/hack/verify-codegen.sh index c096654ca9..27eccb0eb1 100755 --- a/hack/verify-codegen.sh +++ b/hack/verify-codegen.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2020 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/installers/ansible/roles/pgo-operator/templates/add-targeted-namespace.sh.j2 b/installers/ansible/roles/pgo-operator/templates/add-targeted-namespace.sh.j2 index 380a8a80b7..ec5e9e82d6 100644 --- a/installers/ansible/roles/pgo-operator/templates/add-targeted-namespace.sh.j2 +++ b/installers/ansible/roles/pgo-operator/templates/add-targeted-namespace.sh.j2 @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/installers/image/bin/pgo-deploy.sh b/installers/image/bin/pgo-deploy.sh index 9a965d58be..92fc955e9a 100755 --- a/installers/image/bin/pgo-deploy.sh +++ b/installers/image/bin/pgo-deploy.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index 496f25abd4..1504009506 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/internal/apiserver/backrestservice/backrestimpl.go b/internal/apiserver/backrestservice/backrestimpl.go index 5ce194a337..31dd01fe4b 100644 --- a/internal/apiserver/backrestservice/backrestimpl.go +++ b/internal/apiserver/backrestservice/backrestimpl.go @@ -1,7 +1,7 @@ package backrestservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/backrestservice/backrestservice.go b/internal/apiserver/backrestservice/backrestservice.go index e436afb878..00f4aba481 100644 --- a/internal/apiserver/backrestservice/backrestservice.go +++ b/internal/apiserver/backrestservice/backrestservice.go @@ -1,7 +1,7 @@ package backrestservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/backupoptions/backupoptionsutil.go b/internal/apiserver/backupoptions/backupoptionsutil.go index 196d0f1fa1..c1c3c69f1b 100644 --- a/internal/apiserver/backupoptions/backupoptionsutil.go +++ b/internal/apiserver/backupoptions/backupoptionsutil.go @@ -1,7 +1,7 @@ package backupoptions /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/backupoptions/pgbackrestoptions.go b/internal/apiserver/backupoptions/pgbackrestoptions.go index 2c7a1e356e..ea932de517 100644 --- a/internal/apiserver/backupoptions/pgbackrestoptions.go +++ b/internal/apiserver/backupoptions/pgbackrestoptions.go @@ -1,7 +1,7 @@ package backupoptions /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/backupoptions/pgdumpoptions.go b/internal/apiserver/backupoptions/pgdumpoptions.go index 268aa42412..bfbae16c23 100644 --- a/internal/apiserver/backupoptions/pgdumpoptions.go +++ b/internal/apiserver/backupoptions/pgdumpoptions.go @@ -1,7 +1,7 @@ package backupoptions /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/catservice/catimpl.go b/internal/apiserver/catservice/catimpl.go index 6d656f7e9a..f3bd91ce9b 100644 --- a/internal/apiserver/catservice/catimpl.go +++ b/internal/apiserver/catservice/catimpl.go @@ -1,7 +1,7 @@ package catservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/catservice/catservice.go b/internal/apiserver/catservice/catservice.go index 439274271e..9c34db38db 100644 --- a/internal/apiserver/catservice/catservice.go +++ b/internal/apiserver/catservice/catservice.go @@ -1,7 +1,7 @@ package catservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/cloneservice/cloneimpl.go b/internal/apiserver/cloneservice/cloneimpl.go index 4eeb4ac8ac..452c201d09 100644 --- a/internal/apiserver/cloneservice/cloneimpl.go +++ b/internal/apiserver/cloneservice/cloneimpl.go @@ -1,7 +1,7 @@ package cloneservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/cloneservice/cloneservice.go b/internal/apiserver/cloneservice/cloneservice.go index f98a5f439d..7bf035e94f 100644 --- a/internal/apiserver/cloneservice/cloneservice.go +++ b/internal/apiserver/cloneservice/cloneservice.go @@ -1,7 +1,7 @@ package cloneservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index 565ce20a1f..b089162368 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -1,7 +1,7 @@ package clusterservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/clusterservice/clusterservice.go b/internal/apiserver/clusterservice/clusterservice.go index d0f31df636..eac046a580 100644 --- a/internal/apiserver/clusterservice/clusterservice.go +++ b/internal/apiserver/clusterservice/clusterservice.go @@ -1,7 +1,7 @@ package clusterservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/clusterservice/scaleimpl.go b/internal/apiserver/clusterservice/scaleimpl.go index 6e3c7e975b..11fe1e55f6 100644 --- a/internal/apiserver/clusterservice/scaleimpl.go +++ b/internal/apiserver/clusterservice/scaleimpl.go @@ -1,7 +1,7 @@ package clusterservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/clusterservice/scaleservice.go b/internal/apiserver/clusterservice/scaleservice.go index 92db853216..bb742691e7 100644 --- a/internal/apiserver/clusterservice/scaleservice.go +++ b/internal/apiserver/clusterservice/scaleservice.go @@ -1,7 +1,7 @@ package clusterservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/common.go b/internal/apiserver/common.go index b171b8ce6a..d4dffc8368 100644 --- a/internal/apiserver/common.go +++ b/internal/apiserver/common.go @@ -1,7 +1,7 @@ package apiserver /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/common_test.go b/internal/apiserver/common_test.go index da909d2ba6..6ec95b7066 100644 --- a/internal/apiserver/common_test.go +++ b/internal/apiserver/common_test.go @@ -1,7 +1,7 @@ package apiserver /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/configservice/configimpl.go b/internal/apiserver/configservice/configimpl.go index 76d891d5ed..dc7ec2274c 100644 --- a/internal/apiserver/configservice/configimpl.go +++ b/internal/apiserver/configservice/configimpl.go @@ -1,7 +1,7 @@ package configservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/configservice/configservice.go b/internal/apiserver/configservice/configservice.go index 1f70934888..92a296ac3f 100644 --- a/internal/apiserver/configservice/configservice.go +++ b/internal/apiserver/configservice/configservice.go @@ -1,7 +1,7 @@ package configservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/dfservice/dfimpl.go b/internal/apiserver/dfservice/dfimpl.go index fe1bbd3529..e9e62df216 100644 --- a/internal/apiserver/dfservice/dfimpl.go +++ b/internal/apiserver/dfservice/dfimpl.go @@ -1,7 +1,7 @@ package dfservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/dfservice/dfservice.go b/internal/apiserver/dfservice/dfservice.go index 325e20257a..3a71e9feab 100644 --- a/internal/apiserver/dfservice/dfservice.go +++ b/internal/apiserver/dfservice/dfservice.go @@ -1,7 +1,7 @@ package dfservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/failoverservice/failoverimpl.go b/internal/apiserver/failoverservice/failoverimpl.go index 0a988a3027..cd40406e5c 100644 --- a/internal/apiserver/failoverservice/failoverimpl.go +++ b/internal/apiserver/failoverservice/failoverimpl.go @@ -1,7 +1,7 @@ package failoverservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/failoverservice/failoverservice.go b/internal/apiserver/failoverservice/failoverservice.go index 164d7b1545..e80d7e05de 100644 --- a/internal/apiserver/failoverservice/failoverservice.go +++ b/internal/apiserver/failoverservice/failoverservice.go @@ -1,7 +1,7 @@ package failoverservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/labelservice/labelimpl.go b/internal/apiserver/labelservice/labelimpl.go index bd6e26da3d..8c47701931 100644 --- a/internal/apiserver/labelservice/labelimpl.go +++ b/internal/apiserver/labelservice/labelimpl.go @@ -1,7 +1,7 @@ package labelservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/labelservice/labelservice.go b/internal/apiserver/labelservice/labelservice.go index f13054fd17..5921a7633b 100644 --- a/internal/apiserver/labelservice/labelservice.go +++ b/internal/apiserver/labelservice/labelservice.go @@ -1,7 +1,7 @@ package labelservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/middleware.go b/internal/apiserver/middleware.go index fc7e60e8e2..58a1fcd77d 100644 --- a/internal/apiserver/middleware.go +++ b/internal/apiserver/middleware.go @@ -1,7 +1,7 @@ package apiserver /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/namespaceservice/namespaceimpl.go b/internal/apiserver/namespaceservice/namespaceimpl.go index 04b6671f26..281bb5d085 100644 --- a/internal/apiserver/namespaceservice/namespaceimpl.go +++ b/internal/apiserver/namespaceservice/namespaceimpl.go @@ -1,7 +1,7 @@ package namespaceservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/namespaceservice/namespaceservice.go b/internal/apiserver/namespaceservice/namespaceservice.go index 1e27294c96..1e348218fa 100644 --- a/internal/apiserver/namespaceservice/namespaceservice.go +++ b/internal/apiserver/namespaceservice/namespaceservice.go @@ -1,7 +1,7 @@ package namespaceservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/perms.go b/internal/apiserver/perms.go index d8796c8590..db4861fe7e 100644 --- a/internal/apiserver/perms.go +++ b/internal/apiserver/perms.go @@ -1,7 +1,7 @@ package apiserver /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgadminservice/pgadminimpl.go b/internal/apiserver/pgadminservice/pgadminimpl.go index 5ca4aa8a1a..2ac3130a8f 100644 --- a/internal/apiserver/pgadminservice/pgadminimpl.go +++ b/internal/apiserver/pgadminservice/pgadminimpl.go @@ -1,7 +1,7 @@ package pgadminservice /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgadminservice/pgadminservice.go b/internal/apiserver/pgadminservice/pgadminservice.go index 90378868ca..44fe32f6b7 100644 --- a/internal/apiserver/pgadminservice/pgadminservice.go +++ b/internal/apiserver/pgadminservice/pgadminservice.go @@ -1,7 +1,7 @@ package pgadminservice /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgbouncerservice/pgbouncerimpl.go b/internal/apiserver/pgbouncerservice/pgbouncerimpl.go index bab470b00a..e7ef6ff768 100644 --- a/internal/apiserver/pgbouncerservice/pgbouncerimpl.go +++ b/internal/apiserver/pgbouncerservice/pgbouncerimpl.go @@ -1,7 +1,7 @@ package pgbouncerservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgbouncerservice/pgbouncerservice.go b/internal/apiserver/pgbouncerservice/pgbouncerservice.go index 969aabd205..54fa6b3dae 100644 --- a/internal/apiserver/pgbouncerservice/pgbouncerservice.go +++ b/internal/apiserver/pgbouncerservice/pgbouncerservice.go @@ -1,7 +1,7 @@ package pgbouncerservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgdumpservice/pgdumpimpl.go b/internal/apiserver/pgdumpservice/pgdumpimpl.go index ecad14f7fd..2297a99242 100644 --- a/internal/apiserver/pgdumpservice/pgdumpimpl.go +++ b/internal/apiserver/pgdumpservice/pgdumpimpl.go @@ -1,7 +1,7 @@ package pgdumpservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgdumpservice/pgdumpservice.go b/internal/apiserver/pgdumpservice/pgdumpservice.go index 755a9bbd98..a31a2a788a 100644 --- a/internal/apiserver/pgdumpservice/pgdumpservice.go +++ b/internal/apiserver/pgdumpservice/pgdumpservice.go @@ -1,7 +1,7 @@ package pgdumpservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgoroleservice/pgoroleimpl.go b/internal/apiserver/pgoroleservice/pgoroleimpl.go index 633d0c3660..5d9e1c7c2c 100644 --- a/internal/apiserver/pgoroleservice/pgoroleimpl.go +++ b/internal/apiserver/pgoroleservice/pgoroleimpl.go @@ -1,7 +1,7 @@ package pgoroleservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgoroleservice/pgoroleservice.go b/internal/apiserver/pgoroleservice/pgoroleservice.go index b3e3413e09..9b9c70b061 100644 --- a/internal/apiserver/pgoroleservice/pgoroleservice.go +++ b/internal/apiserver/pgoroleservice/pgoroleservice.go @@ -1,7 +1,7 @@ package pgoroleservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgouserservice/pgouserimpl.go b/internal/apiserver/pgouserservice/pgouserimpl.go index 6e0c061467..f7627c47cf 100644 --- a/internal/apiserver/pgouserservice/pgouserimpl.go +++ b/internal/apiserver/pgouserservice/pgouserimpl.go @@ -1,7 +1,7 @@ package pgouserservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgouserservice/pgouserservice.go b/internal/apiserver/pgouserservice/pgouserservice.go index ccf1b1ce8f..1abaf309d6 100644 --- a/internal/apiserver/pgouserservice/pgouserservice.go +++ b/internal/apiserver/pgouserservice/pgouserservice.go @@ -1,7 +1,7 @@ package pgouserservice /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/policyservice/policyimpl.go b/internal/apiserver/policyservice/policyimpl.go index aff08b0e36..8fb0c3d751 100644 --- a/internal/apiserver/policyservice/policyimpl.go +++ b/internal/apiserver/policyservice/policyimpl.go @@ -1,7 +1,7 @@ package policyservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/policyservice/policyservice.go b/internal/apiserver/policyservice/policyservice.go index d2a3d6234f..874c6c4ff9 100644 --- a/internal/apiserver/policyservice/policyservice.go +++ b/internal/apiserver/policyservice/policyservice.go @@ -1,7 +1,7 @@ package policyservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pvcservice/pvcimpl.go b/internal/apiserver/pvcservice/pvcimpl.go index 734c21fa4c..ca07a3e8d9 100644 --- a/internal/apiserver/pvcservice/pvcimpl.go +++ b/internal/apiserver/pvcservice/pvcimpl.go @@ -1,7 +1,7 @@ package pvcservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pvcservice/pvcservice.go b/internal/apiserver/pvcservice/pvcservice.go index a12979cb3c..de24ab7616 100644 --- a/internal/apiserver/pvcservice/pvcservice.go +++ b/internal/apiserver/pvcservice/pvcservice.go @@ -1,7 +1,7 @@ package pvcservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/reloadservice/reloadimpl.go b/internal/apiserver/reloadservice/reloadimpl.go index 08bc21430e..da68706a90 100644 --- a/internal/apiserver/reloadservice/reloadimpl.go +++ b/internal/apiserver/reloadservice/reloadimpl.go @@ -1,7 +1,7 @@ package reloadservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/reloadservice/reloadservice.go b/internal/apiserver/reloadservice/reloadservice.go index 9d1096c3c9..e464a7991e 100644 --- a/internal/apiserver/reloadservice/reloadservice.go +++ b/internal/apiserver/reloadservice/reloadservice.go @@ -1,7 +1,7 @@ package reloadservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/restartservice/restartimpl.go b/internal/apiserver/restartservice/restartimpl.go index 51c172e91f..ffb5e4f692 100644 --- a/internal/apiserver/restartservice/restartimpl.go +++ b/internal/apiserver/restartservice/restartimpl.go @@ -1,7 +1,7 @@ package restartservice /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/restartservice/restartservice.go b/internal/apiserver/restartservice/restartservice.go index a1bfb97194..460635bec1 100644 --- a/internal/apiserver/restartservice/restartservice.go +++ b/internal/apiserver/restartservice/restartservice.go @@ -1,7 +1,7 @@ package restartservice /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/root.go b/internal/apiserver/root.go index bff09ceb9d..c76a93f0ff 100644 --- a/internal/apiserver/root.go +++ b/internal/apiserver/root.go @@ -1,7 +1,7 @@ package apiserver /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/routing/doc.go b/internal/apiserver/routing/doc.go index e985fd4280..2807dfb978 100644 --- a/internal/apiserver/routing/doc.go +++ b/internal/apiserver/routing/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/routing/routes.go b/internal/apiserver/routing/routes.go index 0198efaaf8..3488ee9f25 100644 --- a/internal/apiserver/routing/routes.go +++ b/internal/apiserver/routing/routes.go @@ -1,7 +1,7 @@ package routing /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/scheduleservice/scheduleimpl.go b/internal/apiserver/scheduleservice/scheduleimpl.go index 96e134949c..1ecc2992ec 100644 --- a/internal/apiserver/scheduleservice/scheduleimpl.go +++ b/internal/apiserver/scheduleservice/scheduleimpl.go @@ -1,7 +1,7 @@ package scheduleservice /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/scheduleservice/scheduleservice.go b/internal/apiserver/scheduleservice/scheduleservice.go index b88fa16d7e..52f00bbe14 100644 --- a/internal/apiserver/scheduleservice/scheduleservice.go +++ b/internal/apiserver/scheduleservice/scheduleservice.go @@ -1,7 +1,7 @@ package scheduleservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/statusservice/statusimpl.go b/internal/apiserver/statusservice/statusimpl.go index 64c55f62e7..5388842d39 100644 --- a/internal/apiserver/statusservice/statusimpl.go +++ b/internal/apiserver/statusservice/statusimpl.go @@ -1,7 +1,7 @@ package statusservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/statusservice/statusservice.go b/internal/apiserver/statusservice/statusservice.go index ecab0047c2..2dd232dc4c 100644 --- a/internal/apiserver/statusservice/statusservice.go +++ b/internal/apiserver/statusservice/statusservice.go @@ -1,7 +1,7 @@ package statusservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/upgradeservice/upgradeimpl.go b/internal/apiserver/upgradeservice/upgradeimpl.go index 04758d2d34..a157c34d30 100644 --- a/internal/apiserver/upgradeservice/upgradeimpl.go +++ b/internal/apiserver/upgradeservice/upgradeimpl.go @@ -1,7 +1,7 @@ package upgradeservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/upgradeservice/upgradeservice.go b/internal/apiserver/upgradeservice/upgradeservice.go index dee9c68dc2..7f6e1cd350 100644 --- a/internal/apiserver/upgradeservice/upgradeservice.go +++ b/internal/apiserver/upgradeservice/upgradeservice.go @@ -1,7 +1,7 @@ package upgradeservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/userservice/userimpl.go b/internal/apiserver/userservice/userimpl.go index f3bad44677..b4b5698b48 100644 --- a/internal/apiserver/userservice/userimpl.go +++ b/internal/apiserver/userservice/userimpl.go @@ -1,7 +1,7 @@ package userservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/userservice/userimpl_test.go b/internal/apiserver/userservice/userimpl_test.go index 71d3aa5fcf..ba6f378c0d 100644 --- a/internal/apiserver/userservice/userimpl_test.go +++ b/internal/apiserver/userservice/userimpl_test.go @@ -1,7 +1,7 @@ package userservice /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/userservice/userservice.go b/internal/apiserver/userservice/userservice.go index 83994c90fa..709105daae 100644 --- a/internal/apiserver/userservice/userservice.go +++ b/internal/apiserver/userservice/userservice.go @@ -1,7 +1,7 @@ package userservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/versionservice/versionimpl.go b/internal/apiserver/versionservice/versionimpl.go index d2341d4e93..959cfae669 100644 --- a/internal/apiserver/versionservice/versionimpl.go +++ b/internal/apiserver/versionservice/versionimpl.go @@ -1,7 +1,7 @@ package versionservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/versionservice/versionservice.go b/internal/apiserver/versionservice/versionservice.go index 49735dff1a..5affd301dd 100644 --- a/internal/apiserver/versionservice/versionservice.go +++ b/internal/apiserver/versionservice/versionservice.go @@ -1,7 +1,7 @@ package versionservice /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/workflowservice/workflowimpl.go b/internal/apiserver/workflowservice/workflowimpl.go index 13c5f342a8..1f0742704b 100644 --- a/internal/apiserver/workflowservice/workflowimpl.go +++ b/internal/apiserver/workflowservice/workflowimpl.go @@ -1,7 +1,7 @@ package workflowservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/workflowservice/workflowservice.go b/internal/apiserver/workflowservice/workflowservice.go index 81aea9ff98..168937d31d 100644 --- a/internal/apiserver/workflowservice/workflowservice.go +++ b/internal/apiserver/workflowservice/workflowservice.go @@ -1,7 +1,7 @@ package workflowservice /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/annotations.go b/internal/config/annotations.go index eb474738eb..d8c872e879 100644 --- a/internal/config/annotations.go +++ b/internal/config/annotations.go @@ -1,7 +1,7 @@ package config /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/defaults.go b/internal/config/defaults.go index d86e404eb7..776dfd7c90 100644 --- a/internal/config/defaults.go +++ b/internal/config/defaults.go @@ -1,7 +1,7 @@ package config /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/images.go b/internal/config/images.go index 905e46579c..455677bb13 100644 --- a/internal/config/images.go +++ b/internal/config/images.go @@ -1,7 +1,7 @@ package config /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/labels.go b/internal/config/labels.go index 6d20c72742..4ef9676a33 100644 --- a/internal/config/labels.go +++ b/internal/config/labels.go @@ -1,7 +1,7 @@ package config /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/pgoconfig.go b/internal/config/pgoconfig.go index 6f5ea07b29..8d3f1d7790 100644 --- a/internal/config/pgoconfig.go +++ b/internal/config/pgoconfig.go @@ -1,7 +1,7 @@ package config /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/volumes.go b/internal/config/volumes.go index d21c2d6a4e..4738d682c1 100644 --- a/internal/config/volumes.go +++ b/internal/config/volumes.go @@ -1,7 +1,7 @@ package config /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/configmap/configmapcontroller.go b/internal/controller/configmap/configmapcontroller.go index a7145ea6bf..9c9710c345 100644 --- a/internal/controller/configmap/configmapcontroller.go +++ b/internal/controller/configmap/configmapcontroller.go @@ -1,7 +1,7 @@ package configmap /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/configmap/synchandler.go b/internal/controller/configmap/synchandler.go index 9309c0555c..289a6c0afa 100644 --- a/internal/controller/configmap/synchandler.go +++ b/internal/controller/configmap/synchandler.go @@ -1,7 +1,7 @@ package configmap /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/controllerutil.go b/internal/controller/controllerutil.go index bf54f98fce..db67bb1e56 100644 --- a/internal/controller/controllerutil.go +++ b/internal/controller/controllerutil.go @@ -1,7 +1,7 @@ package controller /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/backresthandler.go b/internal/controller/job/backresthandler.go index f399cf1e3d..faf1061a7a 100644 --- a/internal/controller/job/backresthandler.go +++ b/internal/controller/job/backresthandler.go @@ -1,7 +1,7 @@ package job /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/bootstraphandler.go b/internal/controller/job/bootstraphandler.go index 6085c6bb7a..c26817da2d 100644 --- a/internal/controller/job/bootstraphandler.go +++ b/internal/controller/job/bootstraphandler.go @@ -1,7 +1,7 @@ package job /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/jobcontroller.go b/internal/controller/job/jobcontroller.go index 13d919ed5e..75ce0ca9bb 100644 --- a/internal/controller/job/jobcontroller.go +++ b/internal/controller/job/jobcontroller.go @@ -1,7 +1,7 @@ package job /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/jobevents.go b/internal/controller/job/jobevents.go index ef4f1a1760..05e1d0d0fe 100644 --- a/internal/controller/job/jobevents.go +++ b/internal/controller/job/jobevents.go @@ -1,7 +1,7 @@ package job /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/jobutil.go b/internal/controller/job/jobutil.go index 78d6bb6e34..e7a3113469 100644 --- a/internal/controller/job/jobutil.go +++ b/internal/controller/job/jobutil.go @@ -1,7 +1,7 @@ package job /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/pgdumphandler.go b/internal/controller/job/pgdumphandler.go index 0fc8444f20..dc9012cabd 100644 --- a/internal/controller/job/pgdumphandler.go +++ b/internal/controller/job/pgdumphandler.go @@ -1,7 +1,7 @@ package job /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/reposynchandler.go b/internal/controller/job/reposynchandler.go index 136f63365a..49b642b4bd 100644 --- a/internal/controller/job/reposynchandler.go +++ b/internal/controller/job/reposynchandler.go @@ -1,7 +1,7 @@ package job /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/rmdatahandler.go b/internal/controller/job/rmdatahandler.go index 4a6861c5c9..e2f0693e66 100644 --- a/internal/controller/job/rmdatahandler.go +++ b/internal/controller/job/rmdatahandler.go @@ -1,7 +1,7 @@ package job /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/manager/controllermanager.go b/internal/controller/manager/controllermanager.go index bb2c2e1039..e2514d52a7 100644 --- a/internal/controller/manager/controllermanager.go +++ b/internal/controller/manager/controllermanager.go @@ -1,7 +1,7 @@ package manager /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/manager/rbac.go b/internal/controller/manager/rbac.go index 21f7db9cee..5b04e7004d 100644 --- a/internal/controller/manager/rbac.go +++ b/internal/controller/manager/rbac.go @@ -1,7 +1,7 @@ package manager /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/namespace/namespacecontroller.go b/internal/controller/namespace/namespacecontroller.go index 6fc85f644f..20db2e9534 100644 --- a/internal/controller/namespace/namespacecontroller.go +++ b/internal/controller/namespace/namespacecontroller.go @@ -1,7 +1,7 @@ package namespace /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pgcluster/pgclustercontroller.go b/internal/controller/pgcluster/pgclustercontroller.go index f0b83607ad..fef1a54734 100644 --- a/internal/controller/pgcluster/pgclustercontroller.go +++ b/internal/controller/pgcluster/pgclustercontroller.go @@ -1,7 +1,7 @@ package pgcluster /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pgpolicy/pgpolicycontroller.go b/internal/controller/pgpolicy/pgpolicycontroller.go index 0f3ab76ff3..a5be12bafb 100644 --- a/internal/controller/pgpolicy/pgpolicycontroller.go +++ b/internal/controller/pgpolicy/pgpolicycontroller.go @@ -1,7 +1,7 @@ package pgpolicy /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pgreplica/pgreplicacontroller.go b/internal/controller/pgreplica/pgreplicacontroller.go index e41babcb6f..5ada57d30a 100644 --- a/internal/controller/pgreplica/pgreplicacontroller.go +++ b/internal/controller/pgreplica/pgreplicacontroller.go @@ -1,7 +1,7 @@ package pgreplica /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pgtask/backresthandler.go b/internal/controller/pgtask/backresthandler.go index 8e8582364a..31753453ab 100644 --- a/internal/controller/pgtask/backresthandler.go +++ b/internal/controller/pgtask/backresthandler.go @@ -1,7 +1,7 @@ package pgtask /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pgtask/pgtaskcontroller.go b/internal/controller/pgtask/pgtaskcontroller.go index e1dfbcd18b..e26755e35e 100644 --- a/internal/controller/pgtask/pgtaskcontroller.go +++ b/internal/controller/pgtask/pgtaskcontroller.go @@ -1,7 +1,7 @@ package pgtask /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pod/inithandler.go b/internal/controller/pod/inithandler.go index ea19ec4e8d..6f3eed2c2d 100644 --- a/internal/controller/pod/inithandler.go +++ b/internal/controller/pod/inithandler.go @@ -1,7 +1,7 @@ package pod /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pod/podcontroller.go b/internal/controller/pod/podcontroller.go index cc05f84fb7..30f21836b8 100644 --- a/internal/controller/pod/podcontroller.go +++ b/internal/controller/pod/podcontroller.go @@ -1,7 +1,7 @@ package pod /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pod/podevents.go b/internal/controller/pod/podevents.go index dc0b53766b..7aa3c8da3a 100644 --- a/internal/controller/pod/podevents.go +++ b/internal/controller/pod/podevents.go @@ -1,7 +1,7 @@ package pod /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pod/promotionhandler.go b/internal/controller/pod/promotionhandler.go index 660f841fdc..513a675f7b 100644 --- a/internal/controller/pod/promotionhandler.go +++ b/internal/controller/pod/promotionhandler.go @@ -1,7 +1,7 @@ package pod /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/client_config.go b/internal/kubeapi/client_config.go index 5d070fc25e..10285b7873 100644 --- a/internal/kubeapi/client_config.go +++ b/internal/kubeapi/client_config.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/deployment.go b/internal/kubeapi/deployment.go index ec13795e09..5e9a665480 100644 --- a/internal/kubeapi/deployment.go +++ b/internal/kubeapi/deployment.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/endpoints.go b/internal/kubeapi/endpoints.go index b4cd8ece62..d655ba1484 100644 --- a/internal/kubeapi/endpoints.go +++ b/internal/kubeapi/endpoints.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/errors.go b/internal/kubeapi/errors.go index 829ca9f097..ab5e9c07aa 100644 --- a/internal/kubeapi/errors.go +++ b/internal/kubeapi/errors.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/exec.go b/internal/kubeapi/exec.go index b2e994d84d..c154ba1fa3 100644 --- a/internal/kubeapi/exec.go +++ b/internal/kubeapi/exec.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/fake/clientset.go b/internal/kubeapi/fake/clientset.go index 7fbd74b802..2ac060e1da 100644 --- a/internal/kubeapi/fake/clientset.go +++ b/internal/kubeapi/fake/clientset.go @@ -1,7 +1,7 @@ package fake /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/fake/fakeclients.go b/internal/kubeapi/fake/fakeclients.go index 6a263818d4..173c7ea4e4 100644 --- a/internal/kubeapi/fake/fakeclients.go +++ b/internal/kubeapi/fake/fakeclients.go @@ -1,7 +1,7 @@ package fake /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/pod.go b/internal/kubeapi/pod.go index 1dc5539089..bedae52adf 100644 --- a/internal/kubeapi/pod.go +++ b/internal/kubeapi/pod.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/volumes.go b/internal/kubeapi/volumes.go index 05412672ac..795b0a9151 100644 --- a/internal/kubeapi/volumes.go +++ b/internal/kubeapi/volumes.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/volumes_test.go b/internal/kubeapi/volumes_test.go index b793ac5269..458a4153ef 100644 --- a/internal/kubeapi/volumes_test.go +++ b/internal/kubeapi/volumes_test.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/logging/loglib.go b/internal/logging/loglib.go index b443e47b4d..6205760a4e 100644 --- a/internal/logging/loglib.go +++ b/internal/logging/loglib.go @@ -2,7 +2,7 @@ package logging /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/ns/nslogic.go b/internal/ns/nslogic.go index e579b6d47b..b9bb8da878 100644 --- a/internal/ns/nslogic.go +++ b/internal/ns/nslogic.go @@ -1,7 +1,7 @@ package ns /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/backrest/backup.go b/internal/operator/backrest/backup.go index 690d7e5e78..055f6ac7a1 100644 --- a/internal/operator/backrest/backup.go +++ b/internal/operator/backrest/backup.go @@ -1,7 +1,7 @@ package backrest /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/backrest/repo.go b/internal/operator/backrest/repo.go index 65466232b9..d84b9773e2 100644 --- a/internal/operator/backrest/repo.go +++ b/internal/operator/backrest/repo.go @@ -1,7 +1,7 @@ package backrest /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/backrest/restore.go b/internal/operator/backrest/restore.go index 97b6449dd2..cd0a1c8a24 100644 --- a/internal/operator/backrest/restore.go +++ b/internal/operator/backrest/restore.go @@ -1,7 +1,7 @@ package backrest /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/backrest/stanza.go b/internal/operator/backrest/stanza.go index d7d55615dd..a88b058d6e 100644 --- a/internal/operator/backrest/stanza.go +++ b/internal/operator/backrest/stanza.go @@ -1,7 +1,7 @@ package backrest /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/clone.go b/internal/operator/cluster/clone.go index ae33ffd0cb..494ca88e16 100644 --- a/internal/operator/cluster/clone.go +++ b/internal/operator/cluster/clone.go @@ -1,7 +1,7 @@ package cluster /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/cluster.go b/internal/operator/cluster/cluster.go index 81cf6cbbcd..40360ab12b 100644 --- a/internal/operator/cluster/cluster.go +++ b/internal/operator/cluster/cluster.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/clusterlogic.go b/internal/operator/cluster/clusterlogic.go index 43ab32b27d..2842281914 100644 --- a/internal/operator/cluster/clusterlogic.go +++ b/internal/operator/cluster/clusterlogic.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/failover.go b/internal/operator/cluster/failover.go index 45870d9a75..e6533db7a6 100644 --- a/internal/operator/cluster/failover.go +++ b/internal/operator/cluster/failover.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/failoverlogic.go b/internal/operator/cluster/failoverlogic.go index 3dee469682..cf61bff6e8 100644 --- a/internal/operator/cluster/failoverlogic.go +++ b/internal/operator/cluster/failoverlogic.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/pgadmin.go b/internal/operator/cluster/pgadmin.go index c7170ce541..4a78c48a53 100644 --- a/internal/operator/cluster/pgadmin.go +++ b/internal/operator/cluster/pgadmin.go @@ -1,7 +1,7 @@ package cluster /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/pgbouncer.go b/internal/operator/cluster/pgbouncer.go index 4eaa54828c..cc9cbf9910 100644 --- a/internal/operator/cluster/pgbouncer.go +++ b/internal/operator/cluster/pgbouncer.go @@ -1,7 +1,7 @@ package cluster /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/pgbouncer_test.go b/internal/operator/cluster/pgbouncer_test.go index 06ff30d8b6..2407da50a0 100644 --- a/internal/operator/cluster/pgbouncer_test.go +++ b/internal/operator/cluster/pgbouncer_test.go @@ -1,7 +1,7 @@ package cluster /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/rmdata.go b/internal/operator/cluster/rmdata.go index b25d260ca4..bf0a8ce365 100644 --- a/internal/operator/cluster/rmdata.go +++ b/internal/operator/cluster/rmdata.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/service.go b/internal/operator/cluster/service.go index 2812a88389..f192be92cf 100644 --- a/internal/operator/cluster/service.go +++ b/internal/operator/cluster/service.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/standby.go b/internal/operator/cluster/standby.go index 154a2dd3f6..67ae9148e6 100644 --- a/internal/operator/cluster/standby.go +++ b/internal/operator/cluster/standby.go @@ -1,7 +1,7 @@ package cluster /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/upgrade.go b/internal/operator/cluster/upgrade.go index e2d58e7dc4..692eb544d1 100644 --- a/internal/operator/cluster/upgrade.go +++ b/internal/operator/cluster/upgrade.go @@ -1,7 +1,7 @@ package cluster /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/clusterutilities.go b/internal/operator/clusterutilities.go index 46d6cdc5ee..500ccf26ea 100644 --- a/internal/operator/clusterutilities.go +++ b/internal/operator/clusterutilities.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/clusterutilities_test.go b/internal/operator/clusterutilities_test.go index 72de4844ff..f5f00d84ef 100644 --- a/internal/operator/clusterutilities_test.go +++ b/internal/operator/clusterutilities_test.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/common.go b/internal/operator/common.go index 2d4360deb7..03d69d5329 100644 --- a/internal/operator/common.go +++ b/internal/operator/common.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/config/configutil.go b/internal/operator/config/configutil.go index af6bc62f35..0b4d594f27 100644 --- a/internal/operator/config/configutil.go +++ b/internal/operator/config/configutil.go @@ -1,7 +1,7 @@ package config /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/config/dcs.go b/internal/operator/config/dcs.go index 7b5c721c5f..99c383d904 100644 --- a/internal/operator/config/dcs.go +++ b/internal/operator/config/dcs.go @@ -1,7 +1,7 @@ package config /* - Copyright 2020 Crunchy Data Solutions, Ind. + Copyright 2020 - 2021 Crunchy Data Solutions, Ind. 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 diff --git a/internal/operator/config/localdb.go b/internal/operator/config/localdb.go index 0e3c182e17..dbdb9ab89e 100644 --- a/internal/operator/config/localdb.go +++ b/internal/operator/config/localdb.go @@ -1,7 +1,7 @@ package config /* - Copyright 2020 Crunchy Data Solutions, Inl. + Copyright 2020 - 2021 Crunchy Data Solutions, Inl. 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 diff --git a/internal/operator/operatorupgrade/version-check.go b/internal/operator/operatorupgrade/version-check.go index 81461417cb..b49b2d430c 100644 --- a/internal/operator/operatorupgrade/version-check.go +++ b/internal/operator/operatorupgrade/version-check.go @@ -1,7 +1,7 @@ package operatorupgrade /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/pgbackrest.go b/internal/operator/pgbackrest.go index 42a8f645d1..7c4232c51c 100644 --- a/internal/operator/pgbackrest.go +++ b/internal/operator/pgbackrest.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/pgbackrest_test.go b/internal/operator/pgbackrest_test.go index 046d2be770..38d09a6be6 100644 --- a/internal/operator/pgbackrest_test.go +++ b/internal/operator/pgbackrest_test.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/pgdump/dump.go b/internal/operator/pgdump/dump.go index 78d51a0a38..d1e6f393c1 100644 --- a/internal/operator/pgdump/dump.go +++ b/internal/operator/pgdump/dump.go @@ -1,7 +1,7 @@ package pgdump /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/pgdump/restore.go b/internal/operator/pgdump/restore.go index d813331dd5..2cf3d385e9 100644 --- a/internal/operator/pgdump/restore.go +++ b/internal/operator/pgdump/restore.go @@ -1,7 +1,7 @@ package pgdump /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/pvc/pvc.go b/internal/operator/pvc/pvc.go index 0c37e8d27c..b557514511 100644 --- a/internal/operator/pvc/pvc.go +++ b/internal/operator/pvc/pvc.go @@ -1,7 +1,7 @@ package pvc /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/storage.go b/internal/operator/storage.go index da06087deb..2b1e3053b4 100644 --- a/internal/operator/storage.go +++ b/internal/operator/storage.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/storage_test.go b/internal/operator/storage_test.go index 280b1c6cd0..dacaaf78d3 100644 --- a/internal/operator/storage_test.go +++ b/internal/operator/storage_test.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/task/applypolicies.go b/internal/operator/task/applypolicies.go index 8d3b540927..eb63f3674a 100644 --- a/internal/operator/task/applypolicies.go +++ b/internal/operator/task/applypolicies.go @@ -1,7 +1,7 @@ package task /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/task/rmbackups.go b/internal/operator/task/rmbackups.go index 928a8cb977..8c9744181c 100644 --- a/internal/operator/task/rmbackups.go +++ b/internal/operator/task/rmbackups.go @@ -1,7 +1,7 @@ package task /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/task/rmdata.go b/internal/operator/task/rmdata.go index d4e62a5775..c061170727 100644 --- a/internal/operator/task/rmdata.go +++ b/internal/operator/task/rmdata.go @@ -1,7 +1,7 @@ package task /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/task/workflow.go b/internal/operator/task/workflow.go index 2f55b0f481..a275f0e306 100644 --- a/internal/operator/task/workflow.go +++ b/internal/operator/task/workflow.go @@ -1,7 +1,7 @@ package task /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/wal.go b/internal/operator/wal.go index 1b679755fb..b9a14c3219 100644 --- a/internal/operator/wal.go +++ b/internal/operator/wal.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/patroni/doc.go b/internal/patroni/doc.go index 63a42c84d3..6311d1e653 100644 --- a/internal/patroni/doc.go +++ b/internal/patroni/doc.go @@ -4,7 +4,7 @@ package patroni /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/patroni/patroni.go b/internal/patroni/patroni.go index e1bc58a01a..83d2772839 100644 --- a/internal/patroni/patroni.go +++ b/internal/patroni/patroni.go @@ -1,7 +1,7 @@ package patroni /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/backoff.go b/internal/pgadmin/backoff.go index d1df68c80d..7fe83c72b6 100644 --- a/internal/pgadmin/backoff.go +++ b/internal/pgadmin/backoff.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/backoff_test.go b/internal/pgadmin/backoff_test.go index aeae16f7a5..ec24f360fe 100644 --- a/internal/pgadmin/backoff_test.go +++ b/internal/pgadmin/backoff_test.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/crypto.go b/internal/pgadmin/crypto.go index 55ebc8b771..e2db5beb5d 100644 --- a/internal/pgadmin/crypto.go +++ b/internal/pgadmin/crypto.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/crypto_test.go b/internal/pgadmin/crypto_test.go index 36f8468379..8c78611501 100644 --- a/internal/pgadmin/crypto_test.go +++ b/internal/pgadmin/crypto_test.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/doc.go b/internal/pgadmin/doc.go index 97900b0227..58bf983ab5 100644 --- a/internal/pgadmin/doc.go +++ b/internal/pgadmin/doc.go @@ -4,7 +4,7 @@ database which powers pgadmin */ package pgadmin /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/hash.go b/internal/pgadmin/hash.go index b73222fb8b..64bc3df471 100644 --- a/internal/pgadmin/hash.go +++ b/internal/pgadmin/hash.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/logic.go b/internal/pgadmin/logic.go index 2a3fdf0c30..5481f69dc6 100644 --- a/internal/pgadmin/logic.go +++ b/internal/pgadmin/logic.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/runner.go b/internal/pgadmin/runner.go index 233dc092be..e4cb8a8ece 100644 --- a/internal/pgadmin/runner.go +++ b/internal/pgadmin/runner.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/server.go b/internal/pgadmin/server.go index 26568e8806..b5ab3b6ef5 100644 --- a/internal/pgadmin/server.go +++ b/internal/pgadmin/server.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/doc.go b/internal/postgres/doc.go index 974cb7c8df..2a2155a2cd 100644 --- a/internal/postgres/doc.go +++ b/internal/postgres/doc.go @@ -5,7 +5,7 @@ package postgres /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/doc.go b/internal/postgres/password/doc.go index 6ea6563873..b0e22372f6 100644 --- a/internal/postgres/password/doc.go +++ b/internal/postgres/password/doc.go @@ -4,7 +4,7 @@ package password /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/md5.go b/internal/postgres/password/md5.go index ae93d2cc56..7541d05a70 100644 --- a/internal/postgres/password/md5.go +++ b/internal/postgres/password/md5.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/md5_test.go b/internal/postgres/password/md5_test.go index c77c8abf43..5f810d884d 100644 --- a/internal/postgres/password/md5_test.go +++ b/internal/postgres/password/md5_test.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/password.go b/internal/postgres/password/password.go index b70112a4c3..c0ad603a14 100644 --- a/internal/postgres/password/password.go +++ b/internal/postgres/password/password.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/password_test.go b/internal/postgres/password/password_test.go index b9b7094dbc..1cf7e6f09f 100644 --- a/internal/postgres/password/password_test.go +++ b/internal/postgres/password/password_test.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/scram.go b/internal/postgres/password/scram.go index aa6eee3df8..a28b187b90 100644 --- a/internal/postgres/password/scram.go +++ b/internal/postgres/password/scram.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/scram_test.go b/internal/postgres/password/scram_test.go index 6de92bb17c..69397c1f8a 100644 --- a/internal/postgres/password/scram_test.go +++ b/internal/postgres/password/scram_test.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/tlsutil/primitives.go b/internal/tlsutil/primitives.go index 03fb73f744..a2c8da3187 100644 --- a/internal/tlsutil/primitives.go +++ b/internal/tlsutil/primitives.go @@ -1,7 +1,7 @@ package tlsutil /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/tlsutil/primitives_test.go b/internal/tlsutil/primitives_test.go index 22676e9fbc..0805621f57 100644 --- a/internal/tlsutil/primitives_test.go +++ b/internal/tlsutil/primitives_test.go @@ -1,7 +1,7 @@ package tlsutil /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/backrest.go b/internal/util/backrest.go index 66e3a2dec6..eae2e62bfb 100644 --- a/internal/util/backrest.go +++ b/internal/util/backrest.go @@ -1,7 +1,7 @@ package util /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/clone.go b/internal/util/clone.go index a1d563262c..e01e34e670 100644 --- a/internal/util/clone.go +++ b/internal/util/clone.go @@ -1,7 +1,7 @@ package util /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/cluster.go b/internal/util/cluster.go index 6e05a0f71f..ef5a324f4f 100644 --- a/internal/util/cluster.go +++ b/internal/util/cluster.go @@ -1,7 +1,7 @@ package util /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/failover.go b/internal/util/failover.go index 87dadf51cf..dcee1da022 100644 --- a/internal/util/failover.go +++ b/internal/util/failover.go @@ -1,7 +1,7 @@ package util /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/pgbouncer.go b/internal/util/pgbouncer.go index 2fdd645126..3775c01378 100644 --- a/internal/util/pgbouncer.go +++ b/internal/util/pgbouncer.go @@ -1,7 +1,7 @@ package util /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/policy.go b/internal/util/policy.go index 11f5a1563e..2d3180b0d0 100644 --- a/internal/util/policy.go +++ b/internal/util/policy.go @@ -1,7 +1,7 @@ package util /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/secrets.go b/internal/util/secrets.go index ce7b69472f..43300706a1 100644 --- a/internal/util/secrets.go +++ b/internal/util/secrets.go @@ -1,7 +1,7 @@ package util /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/secrets_test.go b/internal/util/secrets_test.go index 423beb5e03..8dca7649bb 100644 --- a/internal/util/secrets_test.go +++ b/internal/util/secrets_test.go @@ -1,7 +1,7 @@ package util /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/ssh.go b/internal/util/ssh.go index aa886bbca7..e72eb77cdd 100644 --- a/internal/util/ssh.go +++ b/internal/util/ssh.go @@ -1,7 +1,7 @@ package util /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/util.go b/internal/util/util.go index 094cec77f4..97a5fb3e27 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -1,7 +1,7 @@ package util /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-backrest/pgo-backrest.go b/pgo-backrest/pgo-backrest.go index ee75dd743d..a02598bd37 100644 --- a/pgo-backrest/pgo-backrest.go +++ b/pgo-backrest/pgo-backrest.go @@ -1,7 +1,7 @@ package main /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-rmdata/pgo-rmdata.go b/pgo-rmdata/pgo-rmdata.go index 40a3bf32fd..c191acbde9 100644 --- a/pgo-rmdata/pgo-rmdata.go +++ b/pgo-rmdata/pgo-rmdata.go @@ -1,7 +1,7 @@ package main /* -Copyright 2019 - 2020 Crunchy Data +Copyright 2019 - 2021 Crunchy Data 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 diff --git a/pgo-rmdata/rmdata/process.go b/pgo-rmdata/rmdata/process.go index 772eae8f17..4dd5eec16c 100644 --- a/pgo-rmdata/rmdata/process.go +++ b/pgo-rmdata/rmdata/process.go @@ -1,7 +1,7 @@ package rmdata /* -Copyright 2019 - 2020 Crunchy Data +Copyright 2019 - 2021 Crunchy Data 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 diff --git a/pgo-rmdata/rmdata/types.go b/pgo-rmdata/rmdata/types.go index 1044e85ee9..06aec3ff3c 100644 --- a/pgo-rmdata/rmdata/types.go +++ b/pgo-rmdata/rmdata/types.go @@ -1,7 +1,7 @@ package rmdata /* -Copyright 2019 - 2020 Crunchy Data +Copyright 2019 - 2021 Crunchy Data 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 diff --git a/pgo-scheduler/pgo-scheduler.go b/pgo-scheduler/pgo-scheduler.go index 68b17c1218..a33ce5d18e 100644 --- a/pgo-scheduler/pgo-scheduler.go +++ b/pgo-scheduler/pgo-scheduler.go @@ -1,7 +1,7 @@ package main /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/configmapcontroller.go b/pgo-scheduler/scheduler/configmapcontroller.go index 41372f96b5..c6b1e701d7 100644 --- a/pgo-scheduler/scheduler/configmapcontroller.go +++ b/pgo-scheduler/scheduler/configmapcontroller.go @@ -1,7 +1,7 @@ package scheduler /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/controllermanager.go b/pgo-scheduler/scheduler/controllermanager.go index 843f6ac060..bdb8f7eb9c 100644 --- a/pgo-scheduler/scheduler/controllermanager.go +++ b/pgo-scheduler/scheduler/controllermanager.go @@ -1,7 +1,7 @@ package scheduler /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/pgbackrest.go b/pgo-scheduler/scheduler/pgbackrest.go index 1ce1fb3166..75561e0af3 100644 --- a/pgo-scheduler/scheduler/pgbackrest.go +++ b/pgo-scheduler/scheduler/pgbackrest.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/policy.go b/pgo-scheduler/scheduler/policy.go index acf5c6a489..3b3d097492 100644 --- a/pgo-scheduler/scheduler/policy.go +++ b/pgo-scheduler/scheduler/policy.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/scheduler.go b/pgo-scheduler/scheduler/scheduler.go index d0360b4df4..7f84e18963 100644 --- a/pgo-scheduler/scheduler/scheduler.go +++ b/pgo-scheduler/scheduler/scheduler.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/tasks.go b/pgo-scheduler/scheduler/tasks.go index a2c715d3be..a8374bfbe7 100644 --- a/pgo-scheduler/scheduler/tasks.go +++ b/pgo-scheduler/scheduler/tasks.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/types.go b/pgo-scheduler/scheduler/types.go index 7b0b07353e..7d7a3b5bb6 100644 --- a/pgo-scheduler/scheduler/types.go +++ b/pgo-scheduler/scheduler/types.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/validate.go b/pgo-scheduler/scheduler/validate.go index 37c24dc7ab..29e923c716 100644 --- a/pgo-scheduler/scheduler/validate.go +++ b/pgo-scheduler/scheduler/validate.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/validate_test.go b/pgo-scheduler/scheduler/validate_test.go index 6abe1a7396..9cc7b4864e 100644 --- a/pgo-scheduler/scheduler/validate_test.go +++ b/pgo-scheduler/scheduler/validate_test.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/backrest.go b/pgo/api/backrest.go index 13e2ff702b..08c74e1ac5 100644 --- a/pgo/api/backrest.go +++ b/pgo/api/backrest.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/cat.go b/pgo/api/cat.go index 00d17c7fb6..9e06936153 100644 --- a/pgo/api/cat.go +++ b/pgo/api/cat.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/clone.go b/pgo/api/clone.go index 2e7ebfccba..ae09c01553 100644 --- a/pgo/api/clone.go +++ b/pgo/api/clone.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/cluster.go b/pgo/api/cluster.go index 74407c0dbc..d3d543ba08 100644 --- a/pgo/api/cluster.go +++ b/pgo/api/cluster.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/common.go b/pgo/api/common.go index 6fcd876ebf..327bbce98e 100644 --- a/pgo/api/common.go +++ b/pgo/api/common.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/config.go b/pgo/api/config.go index 90848edcfd..c3c580cc4c 100644 --- a/pgo/api/config.go +++ b/pgo/api/config.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/df.go b/pgo/api/df.go index fa993051aa..6ed90c9643 100644 --- a/pgo/api/df.go +++ b/pgo/api/df.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/failover.go b/pgo/api/failover.go index 4ebbab9471..1ee9bf3694 100644 --- a/pgo/api/failover.go +++ b/pgo/api/failover.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/label.go b/pgo/api/label.go index e083f998a8..9ce0456812 100644 --- a/pgo/api/label.go +++ b/pgo/api/label.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/namespace.go b/pgo/api/namespace.go index 96f10ba8d7..391fb75816 100644 --- a/pgo/api/namespace.go +++ b/pgo/api/namespace.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pgadmin.go b/pgo/api/pgadmin.go index 0d410355cd..56858a6be4 100644 --- a/pgo/api/pgadmin.go +++ b/pgo/api/pgadmin.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pgbouncer.go b/pgo/api/pgbouncer.go index efee86ca53..58ae62d7ee 100644 --- a/pgo/api/pgbouncer.go +++ b/pgo/api/pgbouncer.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pgdump.go b/pgo/api/pgdump.go index 3bc0804c7b..2d6e0f3fd7 100644 --- a/pgo/api/pgdump.go +++ b/pgo/api/pgdump.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pgorole.go b/pgo/api/pgorole.go index 804f0c1eb2..c9d9716b0b 100644 --- a/pgo/api/pgorole.go +++ b/pgo/api/pgorole.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pgouser.go b/pgo/api/pgouser.go index e0026d20ca..a17804d61e 100644 --- a/pgo/api/pgouser.go +++ b/pgo/api/pgouser.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/policy.go b/pgo/api/policy.go index b7e9cf5d6f..9e56993dc9 100644 --- a/pgo/api/policy.go +++ b/pgo/api/policy.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pvc.go b/pgo/api/pvc.go index f4fac4ceb4..0498967561 100644 --- a/pgo/api/pvc.go +++ b/pgo/api/pvc.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/reload.go b/pgo/api/reload.go index 9235cc1ea9..9dbe07a5f4 100644 --- a/pgo/api/reload.go +++ b/pgo/api/reload.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/restart.go b/pgo/api/restart.go index 13dc205972..3fba6f112f 100644 --- a/pgo/api/restart.go +++ b/pgo/api/restart.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/restore.go b/pgo/api/restore.go index e22cea904b..f8816e3c6c 100644 --- a/pgo/api/restore.go +++ b/pgo/api/restore.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/restoreDump.go b/pgo/api/restoreDump.go index bd911c1b75..cb7aa573d7 100644 --- a/pgo/api/restoreDump.go +++ b/pgo/api/restoreDump.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/scale.go b/pgo/api/scale.go index 6defb09127..b64133653f 100644 --- a/pgo/api/scale.go +++ b/pgo/api/scale.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/scaledown.go b/pgo/api/scaledown.go index 1cc6691b72..f4c8de0f6e 100644 --- a/pgo/api/scaledown.go +++ b/pgo/api/scaledown.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/schedule.go b/pgo/api/schedule.go index 4007e77e1b..02de41ba2d 100644 --- a/pgo/api/schedule.go +++ b/pgo/api/schedule.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/status.go b/pgo/api/status.go index ad70bd2f96..31ee0f7c70 100644 --- a/pgo/api/status.go +++ b/pgo/api/status.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/test.go b/pgo/api/test.go index 887d67b056..30bbeafd69 100644 --- a/pgo/api/test.go +++ b/pgo/api/test.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/upgrade.go b/pgo/api/upgrade.go index 6079a29023..9f00a2c2d5 100644 --- a/pgo/api/upgrade.go +++ b/pgo/api/upgrade.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/user.go b/pgo/api/user.go index 38424ab17b..4334acd186 100644 --- a/pgo/api/user.go +++ b/pgo/api/user.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/version.go b/pgo/api/version.go index 9ca743add1..bef166c93a 100644 --- a/pgo/api/version.go +++ b/pgo/api/version.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/workflow.go b/pgo/api/workflow.go index 3289329aa1..6b4ef05f67 100644 --- a/pgo/api/workflow.go +++ b/pgo/api/workflow.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/auth.go b/pgo/cmd/auth.go index 322e5f5e9c..7b1b54ca04 100644 --- a/pgo/cmd/auth.go +++ b/pgo/cmd/auth.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/backrest.go b/pgo/cmd/backrest.go index a0a183fa86..c4c39a3af7 100644 --- a/pgo/cmd/backrest.go +++ b/pgo/cmd/backrest.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/backup.go b/pgo/cmd/backup.go index 61225cc3ea..719ea55712 100644 --- a/pgo/cmd/backup.go +++ b/pgo/cmd/backup.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/cat.go b/pgo/cmd/cat.go index e97301d40d..b213777843 100644 --- a/pgo/cmd/cat.go +++ b/pgo/cmd/cat.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/clone.go b/pgo/cmd/clone.go index 5f544e52e3..463ccfca96 100644 --- a/pgo/cmd/clone.go +++ b/pgo/cmd/clone.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/cluster.go b/pgo/cmd/cluster.go index d3c63f9445..095b41e286 100644 --- a/pgo/cmd/cluster.go +++ b/pgo/cmd/cluster.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/common.go b/pgo/cmd/common.go index f1e8f84e70..266bbf2937 100644 --- a/pgo/cmd/common.go +++ b/pgo/cmd/common.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/config.go b/pgo/cmd/config.go index 16a29d0603..0a1a4ba773 100644 --- a/pgo/cmd/config.go +++ b/pgo/cmd/config.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/create.go b/pgo/cmd/create.go index 57e4e77eb6..180904305b 100644 --- a/pgo/cmd/create.go +++ b/pgo/cmd/create.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/delete.go b/pgo/cmd/delete.go index d29341355e..eae34e471c 100644 --- a/pgo/cmd/delete.go +++ b/pgo/cmd/delete.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/df.go b/pgo/cmd/df.go index 576376d1bc..ec4bdc81b1 100644 --- a/pgo/cmd/df.go +++ b/pgo/cmd/df.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/failover.go b/pgo/cmd/failover.go index 4a667429a7..f55c98d8a8 100644 --- a/pgo/cmd/failover.go +++ b/pgo/cmd/failover.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/flags.go b/pgo/cmd/flags.go index bb831e4006..89d55e4f97 100644 --- a/pgo/cmd/flags.go +++ b/pgo/cmd/flags.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/label.go b/pgo/cmd/label.go index 3a888663b6..f06e8fdac6 100644 --- a/pgo/cmd/label.go +++ b/pgo/cmd/label.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/namespace.go b/pgo/cmd/namespace.go index 1065193ad8..5dd1fdc81e 100644 --- a/pgo/cmd/namespace.go +++ b/pgo/cmd/namespace.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pgadmin.go b/pgo/cmd/pgadmin.go index 52412324d4..336ab4ab40 100644 --- a/pgo/cmd/pgadmin.go +++ b/pgo/cmd/pgadmin.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pgbouncer.go b/pgo/cmd/pgbouncer.go index 9d302a8cdb..3771047e9d 100644 --- a/pgo/cmd/pgbouncer.go +++ b/pgo/cmd/pgbouncer.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pgdump.go b/pgo/cmd/pgdump.go index 744ebe7274..e34036005c 100644 --- a/pgo/cmd/pgdump.go +++ b/pgo/cmd/pgdump.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pgorole.go b/pgo/cmd/pgorole.go index 171b03e401..144f1fb108 100644 --- a/pgo/cmd/pgorole.go +++ b/pgo/cmd/pgorole.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pgouser.go b/pgo/cmd/pgouser.go index 2ccc72d970..ff4b535a1c 100644 --- a/pgo/cmd/pgouser.go +++ b/pgo/cmd/pgouser.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/policy.go b/pgo/cmd/policy.go index 3afa306923..805bef66fd 100644 --- a/pgo/cmd/policy.go +++ b/pgo/cmd/policy.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pvc.go b/pgo/cmd/pvc.go index 47bc481cb0..6fc4c5cdd7 100644 --- a/pgo/cmd/pvc.go +++ b/pgo/cmd/pvc.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/reload.go b/pgo/cmd/reload.go index cf6c5b647c..f006f1a7dd 100644 --- a/pgo/cmd/reload.go +++ b/pgo/cmd/reload.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/restart.go b/pgo/cmd/restart.go index 5303466f9b..d01e6dab80 100644 --- a/pgo/cmd/restart.go +++ b/pgo/cmd/restart.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/restore.go b/pgo/cmd/restore.go index bafe7418e3..7f4e884002 100644 --- a/pgo/cmd/restore.go +++ b/pgo/cmd/restore.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/root.go b/pgo/cmd/root.go index ec3cdd5f32..396c078493 100644 --- a/pgo/cmd/root.go +++ b/pgo/cmd/root.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/scale.go b/pgo/cmd/scale.go index 831ec2ddf9..f6a5e10518 100644 --- a/pgo/cmd/scale.go +++ b/pgo/cmd/scale.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/scaledown.go b/pgo/cmd/scaledown.go index 20241c3d46..57b869a6a8 100644 --- a/pgo/cmd/scaledown.go +++ b/pgo/cmd/scaledown.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/schedule.go b/pgo/cmd/schedule.go index 5413001efb..018a5fdb52 100644 --- a/pgo/cmd/schedule.go +++ b/pgo/cmd/schedule.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/show.go b/pgo/cmd/show.go index b42ba2a7d9..9636f7615f 100644 --- a/pgo/cmd/show.go +++ b/pgo/cmd/show.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/status.go b/pgo/cmd/status.go index 681ad08d6c..f93c4a93bf 100644 --- a/pgo/cmd/status.go +++ b/pgo/cmd/status.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/test.go b/pgo/cmd/test.go index 111475fbed..38b2df6146 100644 --- a/pgo/cmd/test.go +++ b/pgo/cmd/test.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/update.go b/pgo/cmd/update.go index 806b44388e..408ee5b699 100644 --- a/pgo/cmd/update.go +++ b/pgo/cmd/update.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/upgrade.go b/pgo/cmd/upgrade.go index 1211990790..500865330d 100644 --- a/pgo/cmd/upgrade.go +++ b/pgo/cmd/upgrade.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/user.go b/pgo/cmd/user.go index 7216ce9e1d..a952aef402 100644 --- a/pgo/cmd/user.go +++ b/pgo/cmd/user.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/version.go b/pgo/cmd/version.go index 25e6253767..a5934cfb88 100644 --- a/pgo/cmd/version.go +++ b/pgo/cmd/version.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/watch.go b/pgo/cmd/watch.go index 69d288a1d8..9dd9d5cd41 100644 --- a/pgo/cmd/watch.go +++ b/pgo/cmd/watch.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/workflow.go b/pgo/cmd/workflow.go index 239fcd6ef2..c0fb0b8ca5 100644 --- a/pgo/cmd/workflow.go +++ b/pgo/cmd/workflow.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/generatedocs.go b/pgo/generatedocs.go index daafa3224c..8d2b2a2833 100644 --- a/pgo/generatedocs.go +++ b/pgo/generatedocs.go @@ -1,7 +1,7 @@ package main /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/pgo.go b/pgo/pgo.go index 6895b7863a..49bdb9fde5 100644 --- a/pgo/pgo.go +++ b/pgo/pgo.go @@ -1,7 +1,7 @@ package main /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/util/confirmation.go b/pgo/util/confirmation.go index c227055cb1..4d15e0ae83 100644 --- a/pgo/util/confirmation.go +++ b/pgo/util/confirmation.go @@ -1,7 +1,7 @@ package util /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/util/pad.go b/pgo/util/pad.go index 276469471a..fee08615ed 100644 --- a/pgo/util/pad.go +++ b/pgo/util/pad.go @@ -1,7 +1,7 @@ package util /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/util/validation.go b/pgo/util/validation.go index 7d90f6a6ac..17d29b8eac 100644 --- a/pgo/util/validation.go +++ b/pgo/util/validation.go @@ -1,7 +1,7 @@ package util /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/cluster.go b/pkg/apis/crunchydata.com/v1/cluster.go index e67d0f107d..375255130c 100644 --- a/pkg/apis/crunchydata.com/v1/cluster.go +++ b/pkg/apis/crunchydata.com/v1/cluster.go @@ -1,7 +1,7 @@ package v1 /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/common.go b/pkg/apis/crunchydata.com/v1/common.go index 723c2a0a60..227a74d3a9 100644 --- a/pkg/apis/crunchydata.com/v1/common.go +++ b/pkg/apis/crunchydata.com/v1/common.go @@ -1,7 +1,7 @@ package v1 /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/common_test.go b/pkg/apis/crunchydata.com/v1/common_test.go index 8ad909e64f..cde6832420 100644 --- a/pkg/apis/crunchydata.com/v1/common_test.go +++ b/pkg/apis/crunchydata.com/v1/common_test.go @@ -1,7 +1,7 @@ package v1 /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 4c793e782f..62cd5bc582 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -108,7 +108,7 @@ package v1 // +k8s:deepcopy-gen=package,register /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/policy.go b/pkg/apis/crunchydata.com/v1/policy.go index 28347f9950..f3ac077cf4 100644 --- a/pkg/apis/crunchydata.com/v1/policy.go +++ b/pkg/apis/crunchydata.com/v1/policy.go @@ -1,7 +1,7 @@ package v1 /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/register.go b/pkg/apis/crunchydata.com/v1/register.go index 00db119bda..10e79dc7fc 100644 --- a/pkg/apis/crunchydata.com/v1/register.go +++ b/pkg/apis/crunchydata.com/v1/register.go @@ -1,7 +1,7 @@ package v1 /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/apis/crunchydata.com/v1/replica.go b/pkg/apis/crunchydata.com/v1/replica.go index 386fa033d0..c5e17f4697 100644 --- a/pkg/apis/crunchydata.com/v1/replica.go +++ b/pkg/apis/crunchydata.com/v1/replica.go @@ -1,7 +1,7 @@ package v1 /* - Copyright 2018 - 2020 Crunchy Data Solutions, Inc. + Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/task.go b/pkg/apis/crunchydata.com/v1/task.go index 5e54d97ab3..e898b548fd 100644 --- a/pkg/apis/crunchydata.com/v1/task.go +++ b/pkg/apis/crunchydata.com/v1/task.go @@ -1,7 +1,7 @@ package v1 /* - Copyright 2017 - 2020 Crunchy Data Solutions, Inc. + Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/zz_generated.deepcopy.go b/pkg/apis/crunchydata.com/v1/zz_generated.deepcopy.go index 80fd389e4f..81f9ab7a41 100644 --- a/pkg/apis/crunchydata.com/v1/zz_generated.deepcopy.go +++ b/pkg/apis/crunchydata.com/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/backrestmsgs.go b/pkg/apiservermsgs/backrestmsgs.go index 12d72844b9..622b94bbe9 100644 --- a/pkg/apiservermsgs/backrestmsgs.go +++ b/pkg/apiservermsgs/backrestmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/catmsgs.go b/pkg/apiservermsgs/catmsgs.go index ded313371f..15f7d5cf85 100644 --- a/pkg/apiservermsgs/catmsgs.go +++ b/pkg/apiservermsgs/catmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/clonemsgs.go b/pkg/apiservermsgs/clonemsgs.go index 7f78139af1..c8ff454904 100644 --- a/pkg/apiservermsgs/clonemsgs.go +++ b/pkg/apiservermsgs/clonemsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/clustermsgs.go b/pkg/apiservermsgs/clustermsgs.go index e8983613c4..d23aa6af38 100644 --- a/pkg/apiservermsgs/clustermsgs.go +++ b/pkg/apiservermsgs/clustermsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index 093405b4fd..d52499aa4a 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/configmsgs.go b/pkg/apiservermsgs/configmsgs.go index 06ed680008..325e2281e5 100644 --- a/pkg/apiservermsgs/configmsgs.go +++ b/pkg/apiservermsgs/configmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/dfmsgs.go b/pkg/apiservermsgs/dfmsgs.go index 22541840e7..8d947768ef 100644 --- a/pkg/apiservermsgs/dfmsgs.go +++ b/pkg/apiservermsgs/dfmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/failovermsgs.go b/pkg/apiservermsgs/failovermsgs.go index bfeefcb49a..b51b11c3e4 100644 --- a/pkg/apiservermsgs/failovermsgs.go +++ b/pkg/apiservermsgs/failovermsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/labelmsgs.go b/pkg/apiservermsgs/labelmsgs.go index eabf3e8ecf..d0a914840e 100644 --- a/pkg/apiservermsgs/labelmsgs.go +++ b/pkg/apiservermsgs/labelmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/namespacemsgs.go b/pkg/apiservermsgs/namespacemsgs.go index 3921604a00..5fc4665a9b 100644 --- a/pkg/apiservermsgs/namespacemsgs.go +++ b/pkg/apiservermsgs/namespacemsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pgadminmsgs.go b/pkg/apiservermsgs/pgadminmsgs.go index 5d68b9352d..73e4475294 100644 --- a/pkg/apiservermsgs/pgadminmsgs.go +++ b/pkg/apiservermsgs/pgadminmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pgbouncermsgs.go b/pkg/apiservermsgs/pgbouncermsgs.go index 0feab5f15e..2c575b8f0c 100644 --- a/pkg/apiservermsgs/pgbouncermsgs.go +++ b/pkg/apiservermsgs/pgbouncermsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pgdumpmsgs.go b/pkg/apiservermsgs/pgdumpmsgs.go index e247fca304..34bc123127 100644 --- a/pkg/apiservermsgs/pgdumpmsgs.go +++ b/pkg/apiservermsgs/pgdumpmsgs.go @@ -5,7 +5,7 @@ import ( ) /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pgorolemsgs.go b/pkg/apiservermsgs/pgorolemsgs.go index 1f62efa1ab..6aae3494d0 100644 --- a/pkg/apiservermsgs/pgorolemsgs.go +++ b/pkg/apiservermsgs/pgorolemsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pgousermsgs.go b/pkg/apiservermsgs/pgousermsgs.go index 815f8f1fdf..4690c1f888 100644 --- a/pkg/apiservermsgs/pgousermsgs.go +++ b/pkg/apiservermsgs/pgousermsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/policymsgs.go b/pkg/apiservermsgs/policymsgs.go index ec3e7cf2f9..54fb12d52a 100644 --- a/pkg/apiservermsgs/policymsgs.go +++ b/pkg/apiservermsgs/policymsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pvcmsgs.go b/pkg/apiservermsgs/pvcmsgs.go index f59ddd7983..da902da96b 100644 --- a/pkg/apiservermsgs/pvcmsgs.go +++ b/pkg/apiservermsgs/pvcmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/reloadmsgs.go b/pkg/apiservermsgs/reloadmsgs.go index 34a3738399..11c4293980 100644 --- a/pkg/apiservermsgs/reloadmsgs.go +++ b/pkg/apiservermsgs/reloadmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/restartmsgs.go b/pkg/apiservermsgs/restartmsgs.go index c0b32d3d00..bf6b9faa1d 100644 --- a/pkg/apiservermsgs/restartmsgs.go +++ b/pkg/apiservermsgs/restartmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/schedulemsgs.go b/pkg/apiservermsgs/schedulemsgs.go index 4b037a5992..47e9f90ca8 100644 --- a/pkg/apiservermsgs/schedulemsgs.go +++ b/pkg/apiservermsgs/schedulemsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/statusmsgs.go b/pkg/apiservermsgs/statusmsgs.go index 94994c75b9..72a6c79aab 100644 --- a/pkg/apiservermsgs/statusmsgs.go +++ b/pkg/apiservermsgs/statusmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/upgrademsgs.go b/pkg/apiservermsgs/upgrademsgs.go index ab7fecc47a..a360c036c7 100644 --- a/pkg/apiservermsgs/upgrademsgs.go +++ b/pkg/apiservermsgs/upgrademsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/usermsgs.go b/pkg/apiservermsgs/usermsgs.go index 1f0ba56295..bf67358abe 100644 --- a/pkg/apiservermsgs/usermsgs.go +++ b/pkg/apiservermsgs/usermsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/usermsgs_test.go b/pkg/apiservermsgs/usermsgs_test.go index d2f70388fc..0f6d39b754 100644 --- a/pkg/apiservermsgs/usermsgs_test.go +++ b/pkg/apiservermsgs/usermsgs_test.go @@ -1,7 +1,7 @@ package apiservermsgs /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/versionmsgs.go b/pkg/apiservermsgs/versionmsgs.go index 7685221c44..38ab640cdb 100644 --- a/pkg/apiservermsgs/versionmsgs.go +++ b/pkg/apiservermsgs/versionmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +Copyright 2017 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/watchmsgs.go b/pkg/apiservermsgs/watchmsgs.go index 9d50a81ccd..02c1472b90 100644 --- a/pkg/apiservermsgs/watchmsgs.go +++ b/pkg/apiservermsgs/watchmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/workflowmsgs.go b/pkg/apiservermsgs/workflowmsgs.go index 2908d75347..3d4c44353a 100644 --- a/pkg/apiservermsgs/workflowmsgs.go +++ b/pkg/apiservermsgs/workflowmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +Copyright 2018 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/events/eventing.go b/pkg/events/eventing.go index 66fc353117..3ea0e68044 100644 --- a/pkg/events/eventing.go +++ b/pkg/events/eventing.go @@ -1,7 +1,7 @@ package events /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/events/eventtype.go b/pkg/events/eventtype.go index 15b1bcd726..db946cf915 100644 --- a/pkg/events/eventtype.go +++ b/pkg/events/eventtype.go @@ -1,7 +1,7 @@ package events /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/events/pgoeventtype.go b/pkg/events/pgoeventtype.go index 75c076b311..4e4f114868 100644 --- a/pkg/events/pgoeventtype.go +++ b/pkg/events/pgoeventtype.go @@ -1,7 +1,7 @@ package events /* - Copyright 2019 - 2020 Crunchy Data Solutions, Inc. + Copyright 2019 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/clientset.go b/pkg/generated/clientset/versioned/clientset.go index 7c5e89774a..bc2b61e5e0 100644 --- a/pkg/generated/clientset/versioned/clientset.go +++ b/pkg/generated/clientset/versioned/clientset.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/doc.go b/pkg/generated/clientset/versioned/doc.go index e2534c0fe7..f862afa1b0 100644 --- a/pkg/generated/clientset/versioned/doc.go +++ b/pkg/generated/clientset/versioned/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/fake/clientset_generated.go b/pkg/generated/clientset/versioned/fake/clientset_generated.go index 384d0e7737..5f9ec9bbbb 100644 --- a/pkg/generated/clientset/versioned/fake/clientset_generated.go +++ b/pkg/generated/clientset/versioned/fake/clientset_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/fake/doc.go b/pkg/generated/clientset/versioned/fake/doc.go index 6318a06f3c..e9300efbfe 100644 --- a/pkg/generated/clientset/versioned/fake/doc.go +++ b/pkg/generated/clientset/versioned/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/fake/register.go b/pkg/generated/clientset/versioned/fake/register.go index 26c69c1594..7d57cf4437 100644 --- a/pkg/generated/clientset/versioned/fake/register.go +++ b/pkg/generated/clientset/versioned/fake/register.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/scheme/doc.go b/pkg/generated/clientset/versioned/scheme/doc.go index 462fec5e30..49cfafd10d 100644 --- a/pkg/generated/clientset/versioned/scheme/doc.go +++ b/pkg/generated/clientset/versioned/scheme/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/scheme/register.go b/pkg/generated/clientset/versioned/scheme/register.go index 4850f74045..2ce45ab80b 100644 --- a/pkg/generated/clientset/versioned/scheme/register.go +++ b/pkg/generated/clientset/versioned/scheme/register.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/crunchydata.com_client.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/crunchydata.com_client.go index aac71b2aa3..4c862528fa 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/crunchydata.com_client.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/crunchydata.com_client.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/doc.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/doc.go index b7311c21af..21c249ea20 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/doc.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/doc.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/doc.go index 759d8fff95..14f506a6fb 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/doc.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_crunchydata.com_client.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_crunchydata.com_client.go index f8d6b6b350..33ad7a5550 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_crunchydata.com_client.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_crunchydata.com_client.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgcluster.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgcluster.go index 516955d577..01bb2a2f00 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgcluster.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgcluster.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgpolicy.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgpolicy.go index f44e8a4ebb..43a0a0a1fc 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgpolicy.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgreplica.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgreplica.go index d6dc4fbd40..b1a3ea105e 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgreplica.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgreplica.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgtask.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgtask.go index 2db70f152f..d4c2e511a1 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgtask.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgtask.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/generated_expansion.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/generated_expansion.go index 066f811e51..5ea3a63db1 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/generated_expansion.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgcluster.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgcluster.go index 035712a6ef..d87c091f29 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgcluster.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgcluster.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgpolicy.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgpolicy.go index 402b99f523..31d0ddd8b7 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgpolicy.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgreplica.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgreplica.go index 88fb060a69..5df06c39a4 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgreplica.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgreplica.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgtask.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgtask.go index 25b2cd1055..cbed3e2468 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgtask.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgtask.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/interface.go b/pkg/generated/informers/externalversions/crunchydata.com/interface.go index dfe44a0fcb..698763aff3 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/interface.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/v1/interface.go b/pkg/generated/informers/externalversions/crunchydata.com/v1/interface.go index c34a37f8e7..b30e24b239 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/v1/interface.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/v1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgcluster.go b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgcluster.go index 92f0d9a6a9..3be680bc29 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgcluster.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgcluster.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgpolicy.go b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgpolicy.go index ea70fa720d..4383e0914c 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgpolicy.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgreplica.go b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgreplica.go index 99332793ac..840efd6b0a 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgreplica.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgreplica.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgtask.go b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgtask.go index bf1cbd60a8..c25536e459 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgtask.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgtask.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/factory.go b/pkg/generated/informers/externalversions/factory.go index 56886a005a..65c18752b4 100644 --- a/pkg/generated/informers/externalversions/factory.go +++ b/pkg/generated/informers/externalversions/factory.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/generic.go b/pkg/generated/informers/externalversions/generic.go index 130dd5ad37..48e7491d80 100644 --- a/pkg/generated/informers/externalversions/generic.go +++ b/pkg/generated/informers/externalversions/generic.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go b/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go index 4086ab3a09..130bc043a8 100644 --- a/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go +++ b/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/listers/crunchydata.com/v1/expansion_generated.go b/pkg/generated/listers/crunchydata.com/v1/expansion_generated.go index ca6b77b1a3..369c56b717 100644 --- a/pkg/generated/listers/crunchydata.com/v1/expansion_generated.go +++ b/pkg/generated/listers/crunchydata.com/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/listers/crunchydata.com/v1/pgcluster.go b/pkg/generated/listers/crunchydata.com/v1/pgcluster.go index 10db1c63a2..eb059beb06 100644 --- a/pkg/generated/listers/crunchydata.com/v1/pgcluster.go +++ b/pkg/generated/listers/crunchydata.com/v1/pgcluster.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/listers/crunchydata.com/v1/pgpolicy.go b/pkg/generated/listers/crunchydata.com/v1/pgpolicy.go index d996df08ee..d73fef8e45 100644 --- a/pkg/generated/listers/crunchydata.com/v1/pgpolicy.go +++ b/pkg/generated/listers/crunchydata.com/v1/pgpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/listers/crunchydata.com/v1/pgreplica.go b/pkg/generated/listers/crunchydata.com/v1/pgreplica.go index 23632d1ee4..db450cee51 100644 --- a/pkg/generated/listers/crunchydata.com/v1/pgreplica.go +++ b/pkg/generated/listers/crunchydata.com/v1/pgreplica.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/listers/crunchydata.com/v1/pgtask.go b/pkg/generated/listers/crunchydata.com/v1/pgtask.go index 94a405754c..2042db9581 100644 --- a/pkg/generated/listers/crunchydata.com/v1/pgtask.go +++ b/pkg/generated/listers/crunchydata.com/v1/pgtask.go @@ -1,5 +1,5 @@ /* -Copyright 2020 Crunchy Data Solutions, Inc. +Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/postgres-operator.go b/postgres-operator.go index 325303c9a2..5289876661 100644 --- a/postgres-operator.go +++ b/postgres-operator.go @@ -1,7 +1,7 @@ package main /* -Copyright 2017 - 2020 Crunchy Data +Copyright 2017 - 2021 Crunchy Data 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 diff --git a/pv/create-pv-nfs-label.sh b/pv/create-pv-nfs-label.sh index a77e3e68e3..a347a907fd 100755 --- a/pv/create-pv-nfs-label.sh +++ b/pv/create-pv-nfs-label.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/pv/create-pv-nfs-legacy.sh b/pv/create-pv-nfs-legacy.sh index 4850e73652..96d698e159 100755 --- a/pv/create-pv-nfs-legacy.sh +++ b/pv/create-pv-nfs-legacy.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/pv/create-pv-nfs.sh b/pv/create-pv-nfs.sh index 8b2ef4ab67..e1e71c95d8 100755 --- a/pv/create-pv-nfs.sh +++ b/pv/create-pv-nfs.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/pv/create-pv.sh b/pv/create-pv.sh index 46bbf4dbe8..6d9ede0b71 100755 --- a/pv/create-pv.sh +++ b/pv/create-pv.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/pv/delete-pv.sh b/pv/delete-pv.sh index cd653a1778..b3d7422ff2 100755 --- a/pv/delete-pv.sh +++ b/pv/delete-pv.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2020 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. # 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 diff --git a/testing/pgo_cli/cluster_backup_test.go b/testing/pgo_cli/cluster_backup_test.go index d2f8508c3d..ceeefe2e5a 100644 --- a/testing/pgo_cli/cluster_backup_test.go +++ b/testing/pgo_cli/cluster_backup_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_cat_test.go b/testing/pgo_cli/cluster_cat_test.go index 4cb159be8d..aea958fb15 100644 --- a/testing/pgo_cli/cluster_cat_test.go +++ b/testing/pgo_cli/cluster_cat_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_clone_test.go b/testing/pgo_cli/cluster_clone_test.go index 606139e820..24154c2f05 100644 --- a/testing/pgo_cli/cluster_clone_test.go +++ b/testing/pgo_cli/cluster_clone_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_create_test.go b/testing/pgo_cli/cluster_create_test.go index 26f0c2be4f..f0579de8cd 100644 --- a/testing/pgo_cli/cluster_create_test.go +++ b/testing/pgo_cli/cluster_create_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_delete_test.go b/testing/pgo_cli/cluster_delete_test.go index cba99408f7..1285b6026e 100644 --- a/testing/pgo_cli/cluster_delete_test.go +++ b/testing/pgo_cli/cluster_delete_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_df_test.go b/testing/pgo_cli/cluster_df_test.go index 8171a7aa45..91ae0b8092 100644 --- a/testing/pgo_cli/cluster_df_test.go +++ b/testing/pgo_cli/cluster_df_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_failover_test.go b/testing/pgo_cli/cluster_failover_test.go index d35a6d87f5..ac4f2a40c6 100644 --- a/testing/pgo_cli/cluster_failover_test.go +++ b/testing/pgo_cli/cluster_failover_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_label_test.go b/testing/pgo_cli/cluster_label_test.go index 0f54f7af93..ccf4a17461 100644 --- a/testing/pgo_cli/cluster_label_test.go +++ b/testing/pgo_cli/cluster_label_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_pgbouncer_test.go b/testing/pgo_cli/cluster_pgbouncer_test.go index 9c5b72ba66..b0f9199881 100644 --- a/testing/pgo_cli/cluster_pgbouncer_test.go +++ b/testing/pgo_cli/cluster_pgbouncer_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_policy_test.go b/testing/pgo_cli/cluster_policy_test.go index df7197deb4..66db7c6080 100644 --- a/testing/pgo_cli/cluster_policy_test.go +++ b/testing/pgo_cli/cluster_policy_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_pvc_test.go b/testing/pgo_cli/cluster_pvc_test.go index bd91b28435..0009225e4a 100644 --- a/testing/pgo_cli/cluster_pvc_test.go +++ b/testing/pgo_cli/cluster_pvc_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_reload_test.go b/testing/pgo_cli/cluster_reload_test.go index e2900ee4fb..02cf63a479 100644 --- a/testing/pgo_cli/cluster_reload_test.go +++ b/testing/pgo_cli/cluster_reload_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_restart_test.go b/testing/pgo_cli/cluster_restart_test.go index 3f438b6570..2a106fbd41 100644 --- a/testing/pgo_cli/cluster_restart_test.go +++ b/testing/pgo_cli/cluster_restart_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_scale_test.go b/testing/pgo_cli/cluster_scale_test.go index 11ce9a9c21..219e44f582 100644 --- a/testing/pgo_cli/cluster_scale_test.go +++ b/testing/pgo_cli/cluster_scale_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_scaledown_test.go b/testing/pgo_cli/cluster_scaledown_test.go index f1926a4d4d..5e9dc16b28 100644 --- a/testing/pgo_cli/cluster_scaledown_test.go +++ b/testing/pgo_cli/cluster_scaledown_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_test_test.go b/testing/pgo_cli/cluster_test_test.go index 153d47f467..76100eb9f0 100644 --- a/testing/pgo_cli/cluster_test_test.go +++ b/testing/pgo_cli/cluster_test_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_user_test.go b/testing/pgo_cli/cluster_user_test.go index 9e59757a9a..964bb6b58c 100644 --- a/testing/pgo_cli/cluster_user_test.go +++ b/testing/pgo_cli/cluster_user_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/operator_namespace_test.go b/testing/pgo_cli/operator_namespace_test.go index ef327c2ece..57bc685ea2 100644 --- a/testing/pgo_cli/operator_namespace_test.go +++ b/testing/pgo_cli/operator_namespace_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/operator_rbac_test.go b/testing/pgo_cli/operator_rbac_test.go index 8fa4609894..569f1bd090 100644 --- a/testing/pgo_cli/operator_rbac_test.go +++ b/testing/pgo_cli/operator_rbac_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/operator_test.go b/testing/pgo_cli/operator_test.go index 743b872614..09e8148c68 100644 --- a/testing/pgo_cli/operator_test.go +++ b/testing/pgo_cli/operator_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/suite_helpers_test.go b/testing/pgo_cli/suite_helpers_test.go index 4ec5ed613b..b4db220487 100644 --- a/testing/pgo_cli/suite_helpers_test.go +++ b/testing/pgo_cli/suite_helpers_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/suite_pgo_cmd_test.go b/testing/pgo_cli/suite_pgo_cmd_test.go index 91aec62228..245d314aa7 100644 --- a/testing/pgo_cli/suite_pgo_cmd_test.go +++ b/testing/pgo_cli/suite_pgo_cmd_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/suite_test.go b/testing/pgo_cli/suite_test.go index 4f2056d08e..9429f28278 100644 --- a/testing/pgo_cli/suite_test.go +++ b/testing/pgo_cli/suite_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 Crunchy Data Solutions, Inc. + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. 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 From 33c6a7f3270ff9ed0f7416057323f6f7691adb6c Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 7 Jan 2021 11:51:11 -0500 Subject: [PATCH 047/129] Modify roles for pgo-target-role This moves the "replicasets" resource to be under the "apps" group, where it really should have been all along (at least since 1.9). This also adds an explicit permission for viewing pods/logs. Co-authored-by: Pramodh Mereddy Issue: [ch10081] --- deploy/cluster-roles.yaml | 11 ++++-- docs/content/architecture/namespace.md | 35 +++++++++++-------- .../files/pgo-configs/pgo-target-role.json | 18 ++++++++-- .../templates/cluster-rbac.yaml.j2 | 11 ++++-- installers/helm/templates/rbac.yaml | 3 +- installers/kubectl/postgres-operator.yml | 1 + 6 files changed, 57 insertions(+), 22 deletions(-) diff --git a/deploy/cluster-roles.yaml b/deploy/cluster-roles.yaml index cb0bb85b41..d760492836 100644 --- a/deploy/cluster-roles.yaml +++ b/deploy/cluster-roles.yaml @@ -41,8 +41,6 @@ rules: - endpoints - pods - pods/exec - - pods/log - - replicasets - secrets - services - persistentvolumeclaims @@ -55,10 +53,19 @@ rules: - update - delete - deletecollection + - apiGroups: + - '' + resources: + - pods/log + verbs: + - get + - list + - watch - apiGroups: - apps resources: - deployments + - replicasets verbs: - get - list diff --git a/docs/content/architecture/namespace.md b/docs/content/architecture/namespace.md index f6b4265723..1a551a8b91 100644 --- a/docs/content/architecture/namespace.md +++ b/docs/content/architecture/namespace.md @@ -34,8 +34,8 @@ settings. Enables full dynamic namespace capabilities, in which the Operator can create, delete and update any namespaces within a Kubernetes cluster. With `dynamic` mode enabled, the PostgreSQL Operator -can respond to namespace events in a Kubernetes cluster, such as when a namespace is created, and -take an appropriate action, such as adding the PostgreSQL Operator controllers for the newly +can respond to namespace events in a Kubernetes cluster, such as when a namespace is created, and +take an appropriate action, such as adding the PostgreSQL Operator controllers for the newly created namespace. The following defines the namespace permissions required for the `dynamic` mode to be enabled: @@ -62,8 +62,8 @@ rules: ### `readonly` -In `readonly` mode, the PostgreSQL Operator is still able to listen to namespace events within a -Kubernetes cluster, but it can no longer modify (create, update, delete) namespaces. For example, +In `readonly` mode, the PostgreSQL Operator is still able to listen to namespace events within a +Kubernetes cluster, but it can no longer modify (create, update, delete) namespaces. For example, if a Kubernetes administrator creates a namespace, the PostgreSQL Operator can respond and create controllers for that namespace. @@ -95,7 +95,7 @@ Operator is unable to dynamically respond to namespace events in the cluster, i target namespaces are deleted or new target namespaces need to be added, the PostgreSQL Operator will need to be re-deployed. -Please note that it is important to redeploy the PostgreSQL Operator following the deletion of a +Please note that it is important to redeploy the PostgreSQL Operator following the deletion of a target namespace to ensure it no longer attempts to listen for events in that namespace. The `disabled` mode is enabled the when the PostgreSQL Operator has not been assigned namespace @@ -103,22 +103,22 @@ permissions. ## RBAC Reconciliation -By default, the PostgreSQL Operator will attempt to reconcile RBAC resources (ServiceAccounts, +By default, the PostgreSQL Operator will attempt to reconcile RBAC resources (ServiceAccounts, Roles and RoleBindings) within each namespace configured for the PostgreSQL Operator installation. This allows the PostgreSQL Operator to create, update and delete the various RBAC resources it requires in order to properly create and manage PostgreSQL clusters within each targeted namespace (this includes self-healing RBAC resources as needed if removed and/or misconfigured). In order for RBAC reconciliation to function properly, the PostgreSQL Operator ServiceAccount must -be assigned a certain set of permissions. While the PostgreSQL Operator is not concerned with +be assigned a certain set of permissions. While the PostgreSQL Operator is not concerned with exactly how it has been assigned the permissions required to reconcile RBAC in each target -namespace, the various [installation methods]({{< relref "installation" >}}) supported by the +namespace, the various [installation methods]({{< relref "installation" >}}) supported by the PostgreSQL Operator install a recommended set permissions based on the specific Namespace Operating Mode enabled (see section [Namespace Operating Modes]({{< relref "#namespace-operating-modes" >}}) above for more information regarding the various Namespace Operating Modes available). -The following section defines the recommended set of permissions that should be assigned to the -PostgreSQL Operator ServiceAccount in order to ensure proper RBAC reconciliation based on the +The following section defines the recommended set of permissions that should be assigned to the +PostgreSQL Operator ServiceAccount in order to ensure proper RBAC reconciliation based on the specific Namespace Operating Mode enabled. Please note that each PostgreSQL Operator installation method handles the initial configuration and setup of the permissions shown below based on the Namespace Operating Mode configured during installation. @@ -127,7 +127,7 @@ Namespace Operating Mode configured during installation. When using the `dynamic` Namespace Operating Mode, it is recommended that the PostgreSQL Operator ServiceAccount be granted permissions to manage RBAC inside any namespace in the Kubernetes cluster -via a ClusterRole. This allows for a fully-hands off approach to managing RBAC within each +via a ClusterRole. This allows for a fully-hands off approach to managing RBAC within each targeted namespace space. In other words, as namespaces are added and removed post-installation of the PostgreSQL Operator (e.g. using `pgo create namespace` or `pgo delete namespace`), the Operator is able to automatically reconcile RBAC in those namespaces without the need for any external @@ -170,8 +170,6 @@ rules: - endpoints - pods - pods/exec - - pods/log - - replicasets - secrets - services - persistentvolumeclaims @@ -184,10 +182,19 @@ rules: - update - delete - deletecollection + - apiGroups: + - '' + resources: + - pods/log + verbs: + - get + - list + - watch - apiGroups: - apps resources: - deployments + - replicasets verbs: - get - list @@ -230,7 +237,7 @@ rules: ### `readonly` & `disabled` Namespace Operating Modes -When using the `readonly` or `disabled` Namespace Operating Modes, it is recommended that the +When using the `readonly` or `disabled` Namespace Operating Modes, it is recommended that the PostgreSQL Operator ServiceAccount be granted permissions to manage RBAC inside of any configured namespaces using local Roles within each targeted namespace. This means that as new namespaces are added and removed post-installation of the PostgreSQL Operator, an administrator must manually diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role.json index 1cb6a31cc5..09b77ef469 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role.json @@ -15,8 +15,6 @@ "endpoints", "pods", "pods/exec", - "pods/log", - "replicasets", "secrets", "services", "persistentvolumeclaims" @@ -32,12 +30,26 @@ "deletecollection" ] }, + { + "apiGroups": [ + "" + ], + "resources": [ + "pods/log" + ], + "verbs":[ + "get", + "list", + "watch" + ] + }, { "apiGroups": [ "apps" ], "resources": [ - "deployments" + "deployments", + "replicasets" ], "verbs":[ "get", diff --git a/installers/ansible/roles/pgo-operator/templates/cluster-rbac.yaml.j2 b/installers/ansible/roles/pgo-operator/templates/cluster-rbac.yaml.j2 index 771080042e..4212d9107b 100644 --- a/installers/ansible/roles/pgo-operator/templates/cluster-rbac.yaml.j2 +++ b/installers/ansible/roles/pgo-operator/templates/cluster-rbac.yaml.j2 @@ -42,8 +42,6 @@ rules: - endpoints - pods - pods/exec - - pods/log - - replicasets - secrets - services - persistentvolumeclaims @@ -56,10 +54,19 @@ rules: - update - delete - deletecollection + - apiGroups: + - '' + resources: + - pods/log + verbs: + - get + - list + - watch - apiGroups: - apps resources: - deployments + - replicasets verbs: - get - list diff --git a/installers/helm/templates/rbac.yaml b/installers/helm/templates/rbac.yaml index dbef140471..19d6fc06e4 100644 --- a/installers/helm/templates/rbac.yaml +++ b/installers/helm/templates/rbac.yaml @@ -73,6 +73,7 @@ rules: - extensions resources: - deployments + - replicasets verbs: - get - list @@ -145,4 +146,4 @@ subjects: - kind: ServiceAccount name: {{ include "postgres-operator.serviceAccountName" . }} namespace: {{ .Release.Namespace }} -{{ end }} \ No newline at end of file +{{ end }} diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index 971e436d20..d163795cbe 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -60,6 +60,7 @@ rules: - extensions resources: - deployments + - replicasets verbs: - get - list From 3f8c6541e1705ca903db173fd1de73e3904e01ac Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 11 Jan 2021 11:51:02 -0500 Subject: [PATCH 048/129] Embed pgMonitor assets into pgo-deployer container This allows for the pgo-deployer container to install the monitoring stack without making any additional calls to the Internet. If the installation script does not detect the presence of the asset files, it will attempt to download them from the Internet. Issue: [ch10107] Issue: #1987 --- build/pgo-deployer/Dockerfile | 2 ++ .../ansible/roles/pgo-metrics/tasks/alertmanager.yml | 2 +- .../ansible/roles/pgo-metrics/tasks/grafana.yml | 6 +++--- .../metrics/ansible/roles/pgo-metrics/tasks/main.yml | 11 +++++++++-- .../ansible/roles/pgo-metrics/tasks/prometheus.yml | 8 ++++---- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/build/pgo-deployer/Dockerfile b/build/pgo-deployer/Dockerfile index c2000eaa87..2f18411334 100644 --- a/build/pgo-deployer/Dockerfile +++ b/build/pgo-deployer/Dockerfile @@ -70,6 +70,7 @@ fi COPY installers/ansible /ansible/postgres-operator COPY installers/metrics/ansible /ansible/metrics +ADD tools/pgmonitor /tmp/.pgo/metrics/pgmonitor COPY installers/image/bin/pgo-deploy.sh /pgo-deploy.sh COPY bin/uid_daemon.sh /uid_daemon.sh @@ -78,6 +79,7 @@ ENV HOME="/tmp" RUN chmod g=u /etc/passwd RUN chmod g=u /uid_daemon.sh +RUN chown -R 2:2 /tmp/.pgo/metrics ENTRYPOINT ["/uid_daemon.sh"] diff --git a/installers/metrics/ansible/roles/pgo-metrics/tasks/alertmanager.yml b/installers/metrics/ansible/roles/pgo-metrics/tasks/alertmanager.yml index dc82e92d1a..13fd013290 100644 --- a/installers/metrics/ansible/roles/pgo-metrics/tasks/alertmanager.yml +++ b/installers/metrics/ansible/roles/pgo-metrics/tasks/alertmanager.yml @@ -16,7 +16,7 @@ - name: Set pgmonitor Prometheus Directory Fact set_fact: - pgmonitor_prometheus_dir: "{{ metrics_dir }}/pgmonitor-{{ pgmonitor_version | replace('v','') }}/prometheus" + pgmonitor_prometheus_dir: "{{ metrics_dir }}/pgmonitor/prometheus" - name: Copy Alertmanger Config to Output Directory command: "cp {{ pgmonitor_prometheus_dir }}/{{ item.src }} {{ alertmanager_output_dir }}/{{ item.dst }}" diff --git a/installers/metrics/ansible/roles/pgo-metrics/tasks/grafana.yml b/installers/metrics/ansible/roles/pgo-metrics/tasks/grafana.yml index 1d528429b5..f0b88e0c65 100644 --- a/installers/metrics/ansible/roles/pgo-metrics/tasks/grafana.yml +++ b/installers/metrics/ansible/roles/pgo-metrics/tasks/grafana.yml @@ -9,7 +9,7 @@ grafana_output_dir: "{{ metrics_dir }}/output/grafana" - name: Ensure Output Directory Exists - file: + file: path: "{{ grafana_output_dir }}" state: "directory" mode: "0700" @@ -48,7 +48,7 @@ - name: Set pgmonitor Grafana Directory Fact set_fact: - pgmonitor_grafana_dir: "{{ metrics_dir }}/pgmonitor-{{ pgmonitor_version | replace('v','') }}/grafana" + pgmonitor_grafana_dir: "{{ metrics_dir }}/pgmonitor/grafana" - name: Copy Grafana Config to Output Directory command: "cp {{ pgmonitor_grafana_dir }}/{{ item }} {{ grafana_output_dir }}" @@ -111,7 +111,7 @@ src: "{{ item }}" dest: "{{ grafana_output_dir }}/{{ item | replace('.j2', '') }}" mode: "0600" - loop: + loop: - grafana-pvc.json.j2 - grafana-service.json.j2 - grafana-deployment.json.j2 diff --git a/installers/metrics/ansible/roles/pgo-metrics/tasks/main.yml b/installers/metrics/ansible/roles/pgo-metrics/tasks/main.yml index 425d3f8e1b..ae2c27b8e3 100644 --- a/installers/metrics/ansible/roles/pgo-metrics/tasks/main.yml +++ b/installers/metrics/ansible/roles/pgo-metrics/tasks/main.yml @@ -1,7 +1,7 @@ --- - name: Set Metrics Directory Fact set_fact: - metrics_dir: "{{ ansible_env.HOME }}/.pgo/metrics/{{ metrics_namespace }}" + metrics_dir: "{{ ansible_env.HOME }}/.pgo/metrics" tags: always - name: Ensure Output Directory Exists @@ -54,16 +54,23 @@ - install-metrics - update-metrics block: + - name: Check for pgmonitor + stat: + path: "{{ metrics_dir }}/pgmonitor" + register: pgmonitor_dir + - name: Download pgmonitor {{ pgmonitor_version }} get_url: url: https://github.com/CrunchyData/pgmonitor/archive/{{ pgmonitor_version }}.tar.gz dest: "{{ metrics_dir }}" mode: "0600" + when: not pgmonitor_dir.stat.exists - name: Extract pgmonitor unarchive: src: "{{ metrics_dir }}/pgmonitor-{{ pgmonitor_version | replace('v','') }}.tar.gz" - dest: "{{ metrics_dir }}" + dest: "{{ metrics_dir }}/pgmonitor" + when: not pgmonitor_dir.stat.exists - name: Create Metrics Image Pull Secret shell: > diff --git a/installers/metrics/ansible/roles/pgo-metrics/tasks/prometheus.yml b/installers/metrics/ansible/roles/pgo-metrics/tasks/prometheus.yml index ffcfa7c625..b9d70aad1f 100644 --- a/installers/metrics/ansible/roles/pgo-metrics/tasks/prometheus.yml +++ b/installers/metrics/ansible/roles/pgo-metrics/tasks/prometheus.yml @@ -9,7 +9,7 @@ prom_output_dir: "{{ metrics_dir }}/output/prom" - name: Ensure Output Directory Exists - file: + file: path: "{{ prom_output_dir }}" state: "directory" mode: "0700" @@ -22,7 +22,7 @@ loop: - prometheus-rbac.json.j2 when: create_rbac | bool - + - name: Create Prometheus RBAC command: "{{ kubectl_or_oc }} create -f {{ prom_output_dir }}/{{ item }} -n {{ metrics_namespace }}" loop: @@ -35,7 +35,7 @@ - name: Set pgmonitor Prometheus Directory Fact set_fact: - pgmonitor_prometheus_dir: "{{ metrics_dir }}/pgmonitor-{{ pgmonitor_version | replace('v','') }}/prometheus" + pgmonitor_prometheus_dir: "{{ metrics_dir }}/pgmonitor/prometheus" - name: Copy Prometheus Config to Output Directory command: "cp {{ pgmonitor_prometheus_dir }}/{{ item.src }} {{ prom_output_dir }}/{{ item.dst }}" @@ -88,7 +88,7 @@ src: "{{ item }}" dest: "{{ prom_output_dir }}/{{ item | replace('.j2', '') }}" mode: "0600" - loop: + loop: - prometheus-pvc.json.j2 - prometheus-service.json.j2 - prometheus-deployment.json.j2 From bea76d5328953b0992266e0d33cb86fc23d74b1e Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 13 Jan 2021 12:43:46 -0500 Subject: [PATCH 049/129] Gracefully handle names with "replica" in `pgo test` This provides an even tighter check than the one introduced in b0a276ab1 to determine what is a primary vs. replica Service. Issue: [ch9764] Issue: #2047 --- internal/apiserver/clusterservice/clusterimpl.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index b089162368..d5d02544b2 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -485,7 +485,7 @@ func TestCluster(name, selector, ns, pgouser string, allFlag bool) msgs.ClusterT switch { default: endpoint.InstanceType = msgs.ClusterTestInstanceTypePrimary - case strings.HasSuffix(service.Name, msgs.PodTypeReplica): + case (strings.HasSuffix(service.Name, "-"+msgs.PodTypeReplica) && strings.Count(service.Name, "-"+msgs.PodTypeReplica) == 1): endpoint.InstanceType = msgs.ClusterTestInstanceTypeReplica case service.Pgbouncer: endpoint.InstanceType = msgs.ClusterTestInstanceTypePGBouncer From d094049be7e40c27aa1c6cde6ec1d88016a7a207 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 13 Jan 2021 16:47:44 -0500 Subject: [PATCH 050/129] Ensure standby cluster creates pgBouncer Secret The code was not allowing for this to happen. Even though the pgBouncer credential will need to be rotated after a standby is promoted, we can still create the credential with a nonworking default. Issue: [ch10083] --- internal/operator/cluster/pgbouncer.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/internal/operator/cluster/pgbouncer.go b/internal/operator/cluster/pgbouncer.go index cc9cbf9910..422614131f 100644 --- a/internal/operator/cluster/pgbouncer.go +++ b/internal/operator/cluster/pgbouncer.go @@ -185,6 +185,12 @@ func AddPgbouncer(clientset kubernetes.Interface, restconfig *rest.Config, clust if err := setPostgreSQLPassword(clientset, restconfig, pod, cluster.Spec.Port, pgBouncerPassword); err != nil { return err } + } else { + // if this is a standby cluster, we still need to create a pgBouncer Secret, + // but no credentials are available + if err := createPgbouncerSecret(clientset, cluster, ""); err != nil { + return err + } } // next, create the pgBouncer config map that will allow pgBouncer to be From 4bb67f99edba43563272bbae48beeea3586bfcac Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 13 Jan 2021 17:38:23 -0500 Subject: [PATCH 051/129] Remove restrictions on generic linking options for pgBackRest This is useful for creating a new cluster with an external WAL volume from a cluster that lacks one. Issue: [ch10157] --- internal/apiserver/backupoptions/pgbackrestoptions.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/internal/apiserver/backupoptions/pgbackrestoptions.go b/internal/apiserver/backupoptions/pgbackrestoptions.go index ea932de517..026fb45501 100644 --- a/internal/apiserver/backupoptions/pgbackrestoptions.go +++ b/internal/apiserver/backupoptions/pgbackrestoptions.go @@ -25,8 +25,6 @@ var pgBackRestOptsDenyList = []string{ "--config", "--config-include-path", "--config-path", - "--link-all", - "--link-map", "--lock-path", "--log-timestamp", "--neutral-umask", From 90d2097fd6879f979cd1003a6e2a1157f5cd5e86 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 13 Jan 2021 18:24:57 -0500 Subject: [PATCH 052/129] Reconcile API server permissions list Of note is the "Restart" permission which was not added to the validation list, and removing some permissions for calls that are no longer available. Issue: #2203 Issue: #2201 --- docs/content/Security/configure-postgres-operator-rbac.md | 1 + internal/apiserver/perms.go | 7 +------ 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/content/Security/configure-postgres-operator-rbac.md b/docs/content/Security/configure-postgres-operator-rbac.md index de70e2b480..5e8b72f648 100644 --- a/docs/content/Security/configure-postgres-operator-rbac.md +++ b/docs/content/Security/configure-postgres-operator-rbac.md @@ -73,6 +73,7 @@ The following list shows the current complete list of possible pgo permissions t |DfCluster | allow *pgo df*| |Label | allow *pgo label*| |Reload | allow *pgo reload*| +|Restart | allow *pgo restart*| |Restore | allow *pgo restore*| |RestoreDump | allow *pgo restore* for pgdumps| |ShowBackup | allow *pgo show backup*| diff --git a/internal/apiserver/perms.go b/internal/apiserver/perms.go index db4861fe7e..1874ffbd3c 100644 --- a/internal/apiserver/perms.go +++ b/internal/apiserver/perms.go @@ -41,7 +41,6 @@ const ( CREATE_CLUSTER_PERM = "CreateCluster" CREATE_DUMP_PERM = "CreateDump" CREATE_FAILOVER_PERM = "CreateFailover" - CREATE_INGEST_PERM = "CreateIngest" CREATE_NAMESPACE_PERM = "CreateNamespace" CREATE_PGADMIN_PERM = "CreatePgAdmin" CREATE_PGBOUNCER_PERM = "CreatePgbouncer" @@ -58,7 +57,6 @@ const ( // DELETE DELETE_BACKUP_PERM = "DeleteBackup" DELETE_CLUSTER_PERM = "DeleteCluster" - DELETE_INGEST_PERM = "DeleteIngest" DELETE_NAMESPACE_PERM = "DeleteNamespace" DELETE_PGADMIN_PERM = "DeletePgAdmin" DELETE_PGBOUNCER_PERM = "DeletePgbouncer" @@ -72,7 +70,6 @@ const ( SHOW_BACKUP_PERM = "ShowBackup" SHOW_CLUSTER_PERM = "ShowCluster" SHOW_CONFIG_PERM = "ShowConfig" - SHOW_INGEST_PERM = "ShowIngest" SHOW_NAMESPACE_PERM = "ShowNamespace" SHOW_PGADMIN_PERM = "ShowPgAdmin" SHOW_PGBOUNCER_PERM = "ShowPgBouncer" @@ -117,6 +114,7 @@ func initializePerms() { DF_CLUSTER_PERM: "yes", LABEL_PERM: "yes", RELOAD_PERM: "yes", + RESTART_PERM: "yes", RESTORE_PERM: "yes", STATUS_PERM: "yes", TEST_CLUSTER_PERM: "yes", @@ -127,7 +125,6 @@ func initializePerms() { CREATE_DUMP_PERM: "yes", CREATE_CLUSTER_PERM: "yes", CREATE_FAILOVER_PERM: "yes", - CREATE_INGEST_PERM: "yes", CREATE_NAMESPACE_PERM: "yes", CREATE_PGADMIN_PERM: "yes", CREATE_PGBOUNCER_PERM: "yes", @@ -144,7 +141,6 @@ func initializePerms() { // DELETE DELETE_BACKUP_PERM: "yes", DELETE_CLUSTER_PERM: "yes", - DELETE_INGEST_PERM: "yes", DELETE_NAMESPACE_PERM: "yes", DELETE_PGADMIN_PERM: "yes", DELETE_PGBOUNCER_PERM: "yes", @@ -158,7 +154,6 @@ func initializePerms() { SHOW_BACKUP_PERM: "yes", SHOW_CLUSTER_PERM: "yes", SHOW_CONFIG_PERM: "yes", - SHOW_INGEST_PERM: "yes", SHOW_NAMESPACE_PERM: "yes", SHOW_PGADMIN_PERM: "yes", SHOW_PGBOUNCER_PERM: "yes", From 2291158f0572f067f07650488a454fa5f4a33524 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 17 Jan 2021 10:40:22 -0500 Subject: [PATCH 053/129] Remove references to `--autofail` flag This has been gone for a bit. Replace with `--enable-autofail` and `--disable-autofail`. Issue: #2214 --- docs/content/architecture/disaster-recovery.md | 2 +- docs/content/pgo-client/common-tasks.md | 2 +- docs/content/pgo-client/reference/pgo_update.md | 4 ++-- docs/content/pgo-client/reference/pgo_update_cluster.md | 2 +- internal/apiserver/clusterservice/clusterimpl.go | 2 +- internal/apiserver/clusterservice/clusterservice.go | 4 ++-- pgo/cmd/update.go | 6 +++--- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/content/architecture/disaster-recovery.md b/docs/content/architecture/disaster-recovery.md index deee66dcc5..7833661e07 100644 --- a/docs/content/architecture/disaster-recovery.md +++ b/docs/content/architecture/disaster-recovery.md @@ -196,7 +196,7 @@ to re-enable autofail if you would like your PostgreSQL cluster to be highly-available. You can re-enable autofail with this command: ```shell -pgo update cluster hacluster --autofail=true +pgo update cluster hacluster --enable-autofail ``` ## Scheduling Backups diff --git a/docs/content/pgo-client/common-tasks.md b/docs/content/pgo-client/common-tasks.md index 2c58209937..265e0354aa 100644 --- a/docs/content/pgo-client/common-tasks.md +++ b/docs/content/pgo-client/common-tasks.md @@ -699,7 +699,7 @@ high availability on the PostgreSQL cluster manually. You can re-enable high availability by executing the following command: ``` -pgo update cluster hacluster --autofail=true +pgo update cluster hacluster --enable-autofail ``` ### Logical Backups (`pg_dump` / `pg_dumpall`) diff --git a/docs/content/pgo-client/reference/pgo_update.md b/docs/content/pgo-client/reference/pgo_update.md index 669c841701..e4dca221ae 100644 --- a/docs/content/pgo-client/reference/pgo_update.md +++ b/docs/content/pgo-client/reference/pgo_update.md @@ -9,8 +9,8 @@ Update a pgouser, pgorole, or cluster The update command allows you to update a pgouser, pgorole, or cluster. For example: - pgo update cluster --selector=name=mycluster --autofail=false - pgo update cluster --all --autofail=true + pgo update cluster --selector=name=mycluster --disable-autofail + pgo update cluster --all --enable-autofail pgo update namespace mynamespace pgo update pgbouncer mycluster --rotate-password pgo update pgorole somerole --pgorole-permission="Cat" diff --git a/docs/content/pgo-client/reference/pgo_update_cluster.md b/docs/content/pgo-client/reference/pgo_update_cluster.md index 007c34b0fc..a907eab7be 100644 --- a/docs/content/pgo-client/reference/pgo_update_cluster.md +++ b/docs/content/pgo-client/reference/pgo_update_cluster.md @@ -9,7 +9,7 @@ Update a PostgreSQL cluster Update a PostgreSQL cluster. For example: - pgo update cluster mycluster --autofail=false + pgo update cluster mycluster --disable-autofail pgo update cluster mycluster myothercluster --disable-autofail pgo update cluster --selector=name=mycluster --disable-autofail pgo update cluster --all --enable-autofail diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index d5d02544b2..3516a54f4a 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -1888,7 +1888,7 @@ func UpdateCluster(request *msgs.UpdateClusterRequest) msgs.UpdateClusterRespons for _, cluster := range clusterList.Items { - //set autofail=true or false on each pgcluster CRD + // set --enable-autofail / --disable-autofail on each pgcluster CRD // Make the change based on the value of Autofail vis-a-vis UpdateClusterAutofailStatus switch request.Autofail { case msgs.UpdateClusterAutofailEnable: diff --git a/internal/apiserver/clusterservice/clusterservice.go b/internal/apiserver/clusterservice/clusterservice.go index eac046a580..9d1a3a29e5 100644 --- a/internal/apiserver/clusterservice/clusterservice.go +++ b/internal/apiserver/clusterservice/clusterservice.go @@ -306,8 +306,8 @@ func TestClusterHandler(w http.ResponseWriter, r *http.Request) { } // UpdateClusterHandler ... -// pgo update cluster mycluster --autofail=true -// pgo update cluster --selector=env=research --autofail=false +// pgo update cluster mycluster --enable-autofail +// pgo update cluster --selector=env=research --disable-autofail // returns a UpdateClusterResponse func UpdateClusterHandler(w http.ResponseWriter, r *http.Request) { // swagger:operation POST /clustersupdate clusterservice clustersupdate diff --git a/pgo/cmd/update.go b/pgo/cmd/update.go index 408ee5b699..fde0f6f774 100644 --- a/pgo/cmd/update.go +++ b/pgo/cmd/update.go @@ -169,8 +169,8 @@ var UpdateCmd = &cobra.Command{ Short: "Update a pgouser, pgorole, or cluster", Long: `The update command allows you to update a pgouser, pgorole, or cluster. For example: - pgo update cluster --selector=name=mycluster --autofail=false - pgo update cluster --all --autofail=true + pgo update cluster --selector=name=mycluster --disable-autofail + pgo update cluster --all --enable-autofail pgo update namespace mynamespace pgo update pgbouncer mycluster --rotate-password pgo update pgorole somerole --pgorole-permission="Cat" @@ -215,7 +215,7 @@ var UpdateClusterCmd = &cobra.Command{ Short: "Update a PostgreSQL cluster", Long: `Update a PostgreSQL cluster. For example: - pgo update cluster mycluster --autofail=false + pgo update cluster mycluster --disable-autofail pgo update cluster mycluster myothercluster --disable-autofail pgo update cluster --selector=name=mycluster --disable-autofail pgo update cluster --all --enable-autofail`, From b15c31dc96e842740096e3d4e2d5580f575e3b49 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 17 Jan 2021 10:52:55 -0500 Subject: [PATCH 054/129] Adjust replica creation logic as part of a standby cluster This ensures an explicit call of standby creation after receiving a notification that a stanza for the cluster was successfully created. Co-authored-by: Andrew L'Ecuyer --- internal/controller/job/backresthandler.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/controller/job/backresthandler.go b/internal/controller/job/backresthandler.go index faf1061a7a..36c455b6f5 100644 --- a/internal/controller/job/backresthandler.go +++ b/internal/controller/job/backresthandler.go @@ -198,6 +198,9 @@ func (c *Controller) handleBackrestStanzaCreateUpdate(job *apiv1.Job) error { log.Debugf("job Controller: standby cluster %s will now be set to an initialized "+ "status", clusterName) controller.SetClusterInitializedStatus(c.Client, clusterName, namespace) + + // now initialize the creation of any replica + controller.InitializeReplicaCreation(c.Client, clusterName, namespace) return nil } From 7afc54ccb2e26cb12116b6c132cb8a0aadbe9543 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 17 Jan 2021 21:44:41 -0500 Subject: [PATCH 055/129] Update label validation to match Kubernetes rules The validation rules for certain kinds of keys are now covered, and values are properly validated against what Kubernetes expects. Issue: [ch10197] Issue: #2215 --- internal/apiserver/labelservice/labelimpl.go | 63 +++++++++++++++----- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/internal/apiserver/labelservice/labelimpl.go b/internal/apiserver/labelservice/labelimpl.go index 8c47701931..a5bfb3c6be 100644 --- a/internal/apiserver/labelservice/labelimpl.go +++ b/internal/apiserver/labelservice/labelimpl.go @@ -16,8 +16,13 @@ limitations under the License. */ import ( +<<<<<<< HEAD "encoding/json" "errors" +======= + "context" + "fmt" +>>>>>>> 5c56a341d... Update label validation to match Kubernetes rules "strings" "github.com/crunchydata/postgres-operator/internal/apiserver" @@ -54,7 +59,7 @@ func Label(request *msgs.LabelRequest, ns, pgouser string) msgs.LabelResponse { labelsMap, err = validateLabel(request.LabelCmdLabel, ns) if err != nil { resp.Status.Code = msgs.Error - resp.Status.Msg = "labels not formatted correctly" + resp.Status.Msg = err.Error() return resp } @@ -250,29 +255,57 @@ func PatchPgcluster(newLabels map[string]string, oldCRD crv1.Pgcluster, ns strin } -func validateLabel(LabelCmdLabel, ns string) (map[string]string, error) { - var err error - labelMap := make(map[string]string) - userValues := strings.Split(LabelCmdLabel, ",") - for _, v := range userValues { +// validateLabel validates if the input is a valid Kubernetes label +// +// A label is composed of a key and value. +// +// The key can either be a name or have an optional prefix that i +// terminated by a "/", e.g. "prefix/name" +// +// The name must be a valid DNS 1123 value +// THe prefix must be a valid DNS 1123 subdomain +// +// The value can be validated by machinery provided by Kubenretes +// +// Ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ +func validateLabel(LabelCmdLabel string) (map[string]string, error) { + labelMap := map[string]string{} + + for _, v := range strings.Split(LabelCmdLabel, ",") { pair := strings.Split(v, "=") if len(pair) != 2 { - log.Error("label format incorrect, requires name=value") - return labelMap, errors.New("label format incorrect, requires name=value") + return labelMap, fmt.Errorf("label format incorrect, requires key=value") } - errs := validation.IsDNS1035Label(pair[0]) - if len(errs) > 0 { - return labelMap, errors.New("label format incorrect, requires name=value " + errs[0]) + // first handle the key + keyParts := strings.Split(pair[0], "/") + + switch len(keyParts) { + default: + return labelMap, fmt.Errorf("invalid key for " + v) + case 2: + if errs := validation.IsDNS1123Subdomain(keyParts[0]); len(errs) > 0 { + return labelMap, fmt.Errorf("invalid key for %s: %s", v, strings.Join(errs, ",")) + } + + if errs := validation.IsDNS1123Label(keyParts[1]); len(errs) > 0 { + return labelMap, fmt.Errorf("invalid key for %s: %s", v, strings.Join(errs, ",")) + } + case 1: + if errs := validation.IsDNS1123Label(keyParts[0]); len(errs) > 0 { + return labelMap, fmt.Errorf("invalid key for %s: %s", v, strings.Join(errs, ",")) + } } - errs = validation.IsDNS1035Label(pair[1]) - if len(errs) > 0 { - return labelMap, errors.New("label format incorrect, requires name=value " + errs[0]) + + // handle the value + if errs := validation.IsValidLabelValue(pair[1]); len(errs) > 0 { + return labelMap, fmt.Errorf("invalid value for %s: %s", v, strings.Join(errs, ",")) } labelMap[pair[0]] = pair[1] } - return labelMap, err + + return labelMap, nil } // DeleteLabel ... From f87c6b185e873e6a787043b1fc80d54ef0998f1f Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 18 Jan 2021 10:23:59 -0500 Subject: [PATCH 056/129] Refactor of label validation function This moves the function to a common area in the API code and adds some much needed testing to it. --- internal/apiserver/common.go | 57 +++++++++++++++++ internal/apiserver/common_test.go | 63 +++++++++++++++++++ internal/apiserver/labelservice/labelimpl.go | 65 +------------------- 3 files changed, 122 insertions(+), 63 deletions(-) diff --git a/internal/apiserver/common.go b/internal/apiserver/common.go index d4dffc8368..d3e1c007dc 100644 --- a/internal/apiserver/common.go +++ b/internal/apiserver/common.go @@ -26,6 +26,7 @@ import ( kerrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/validation" ) const ( @@ -44,6 +45,8 @@ var ( // ErrDBContainerNotFound is an error that indicates that a "database" container // could not be found in a specific pod ErrDBContainerNotFound = errors.New("\"database\" container not found in pod") + // ErrLabelInvalid indicates that a label is invalid + ErrLabelInvalid = errors.New("invalid label") // ErrStandbyNotAllowed contains the error message returned when an API call is not // permitted because it involves a cluster that is in standby mode ErrStandbyNotAllowed = errors.New("Action not permitted because standby mode is enabled") @@ -109,6 +112,60 @@ func IsValidPVC(pvcName, ns string) bool { return pvc != nil } +// ValidateLabel is derived from a legacy method and validates if the input is a +// valid Kubernetes label. +// +// A label is composed of a key and value. +// +// The key can either be a name or have an optional prefix that i +// terminated by a "/", e.g. "prefix/name" +// +// The name must be a valid DNS 1123 value +// THe prefix must be a valid DNS 1123 subdomain +// +// The value can be validated by machinery provided by Kubenretes +// +// Ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ +func ValidateLabel(labelStr string) (map[string]string, error) { + labelMap := map[string]string{} + + for _, v := range strings.Split(labelStr, ",") { + pair := strings.Split(v, "=") + if len(pair) != 2 { + return labelMap, fmt.Errorf("%w: label format incorrect, requires key=value", ErrLabelInvalid) + } + + // first handle the key + keyParts := strings.Split(pair[0], "/") + + switch len(keyParts) { + default: + return labelMap, fmt.Errorf("%w: invalid key for "+v, ErrLabelInvalid) + case 2: + if errs := validation.IsDNS1123Subdomain(keyParts[0]); len(errs) > 0 { + return labelMap, fmt.Errorf("%w: invalid key for %s: %s", ErrLabelInvalid, v, strings.Join(errs, ",")) + } + + if errs := validation.IsDNS1123Label(keyParts[1]); len(errs) > 0 { + return labelMap, fmt.Errorf("%w: invalid key for %s: %s", ErrLabelInvalid, v, strings.Join(errs, ",")) + } + case 1: + if errs := validation.IsDNS1123Label(keyParts[0]); len(errs) > 0 { + return labelMap, fmt.Errorf("%w: invalid key for %s: %s", ErrLabelInvalid, v, strings.Join(errs, ",")) + } + } + + // handle the value + if errs := validation.IsValidLabelValue(pair[1]); len(errs) > 0 { + return labelMap, fmt.Errorf("%w: invalid value for %s: %s", ErrLabelInvalid, v, strings.Join(errs, ",")) + } + + labelMap[pair[0]] = pair[1] + } + + return labelMap, nil +} + // ValidateResourceRequestLimit validates that a Kubernetes Requests/Limit pair // is valid, both by validating the values are valid quantity values, and then // by checking that the limit >= request. This also needs to check against the diff --git a/internal/apiserver/common_test.go b/internal/apiserver/common_test.go index 6ec95b7066..c36cb7bfa3 100644 --- a/internal/apiserver/common_test.go +++ b/internal/apiserver/common_test.go @@ -16,11 +16,74 @@ limitations under the License. */ import ( + "errors" + "fmt" + "strings" "testing" "k8s.io/apimachinery/pkg/api/resource" ) +func TestValidateLabel(t *testing.T) { + t.Run("valid", func(t *testing.T) { + inputs := []map[string]string{ + map[string]string{"key": "value"}, + map[string]string{"example.com/key": "value"}, + map[string]string{"key1": "value1", "key2": "value2"}, + } + + for _, input := range inputs { + labelStr := "" + + for k, v := range input { + labelStr += fmt.Sprintf("%s=%s,", k, v) + } + + labelStr = strings.Trim(labelStr, ",") + + t.Run(labelStr, func(*testing.T) { + labels, err := ValidateLabel(labelStr) + + if err != nil { + t.Fatalf("expected no error, got: %s", err.Error()) + } + + for k := range labels { + if v, ok := input[k]; !(ok || v == labels[k]) { + t.Fatalf("label values do not matched (%s vs. %s)", input[k], labels[k]) + } + } + }) + } + }) + + t.Run("invalid", func(t *testing.T) { + inputs := []string{ + "key", + "key=value=value", + "key=value,", + "b@d=value", + "b@d-prefix/key=value", + "really/bad/prefix/key=value", + "key=v\\alue", + } + + for _, input := range inputs { + t.Run(input, func(t *testing.T) { + _, err := ValidateLabel(input) + + if err == nil { + t.Fatalf("expected an invalid input error.") + } + + if !errors.Is(err, ErrLabelInvalid) { + t.Fatalf("expected an ErrLabelInvalid error.") + } + }) + } + }) +} + func TestValidateResourceRequestLimit(t *testing.T) { t.Run("valid", func(t *testing.T) { resources := []struct{ request, limit, defaultRequest string }{ diff --git a/internal/apiserver/labelservice/labelimpl.go b/internal/apiserver/labelservice/labelimpl.go index a5bfb3c6be..deb49e32b9 100644 --- a/internal/apiserver/labelservice/labelimpl.go +++ b/internal/apiserver/labelservice/labelimpl.go @@ -16,14 +16,7 @@ limitations under the License. */ import ( -<<<<<<< HEAD "encoding/json" - "errors" -======= - "context" - "fmt" ->>>>>>> 5c56a341d... Update label validation to match Kubernetes rules - "strings" "github.com/crunchydata/postgres-operator/internal/apiserver" "github.com/crunchydata/postgres-operator/internal/config" @@ -36,7 +29,6 @@ import ( "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/validation" ) // Label ... 2 forms ... @@ -56,7 +48,7 @@ func Label(request *msgs.LabelRequest, ns, pgouser string) msgs.LabelResponse { return resp } - labelsMap, err = validateLabel(request.LabelCmdLabel, ns) + labelsMap, err = apiserver.ValidateLabel(request.LabelCmdLabel) if err != nil { resp.Status.Code = msgs.Error resp.Status.Msg = err.Error() @@ -255,59 +247,6 @@ func PatchPgcluster(newLabels map[string]string, oldCRD crv1.Pgcluster, ns strin } -// validateLabel validates if the input is a valid Kubernetes label -// -// A label is composed of a key and value. -// -// The key can either be a name or have an optional prefix that i -// terminated by a "/", e.g. "prefix/name" -// -// The name must be a valid DNS 1123 value -// THe prefix must be a valid DNS 1123 subdomain -// -// The value can be validated by machinery provided by Kubenretes -// -// Ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ -func validateLabel(LabelCmdLabel string) (map[string]string, error) { - labelMap := map[string]string{} - - for _, v := range strings.Split(LabelCmdLabel, ",") { - pair := strings.Split(v, "=") - if len(pair) != 2 { - return labelMap, fmt.Errorf("label format incorrect, requires key=value") - } - - // first handle the key - keyParts := strings.Split(pair[0], "/") - - switch len(keyParts) { - default: - return labelMap, fmt.Errorf("invalid key for " + v) - case 2: - if errs := validation.IsDNS1123Subdomain(keyParts[0]); len(errs) > 0 { - return labelMap, fmt.Errorf("invalid key for %s: %s", v, strings.Join(errs, ",")) - } - - if errs := validation.IsDNS1123Label(keyParts[1]); len(errs) > 0 { - return labelMap, fmt.Errorf("invalid key for %s: %s", v, strings.Join(errs, ",")) - } - case 1: - if errs := validation.IsDNS1123Label(keyParts[0]); len(errs) > 0 { - return labelMap, fmt.Errorf("invalid key for %s: %s", v, strings.Join(errs, ",")) - } - } - - // handle the value - if errs := validation.IsValidLabelValue(pair[1]); len(errs) > 0 { - return labelMap, fmt.Errorf("invalid value for %s: %s", v, strings.Join(errs, ",")) - } - - labelMap[pair[0]] = pair[1] - } - - return labelMap, nil -} - // DeleteLabel ... // pgo delete label mycluster yourcluster --label=env=prod // pgo delete label --label=env=prod --selector=group=somegroup @@ -325,7 +264,7 @@ func DeleteLabel(request *msgs.DeleteLabelRequest, ns string) msgs.LabelResponse return resp } - labelsMap, err = validateLabel(request.LabelCmdLabel, ns) + labelsMap, err = apiserver.ValidateLabel(request.LabelCmdLabel) if err != nil { resp.Status.Code = msgs.Error resp.Status.Msg = "labels not formatted correctly" From 69ae6435e19b06662c33a759da80b7310e506124 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 18 Jan 2021 10:31:28 -0500 Subject: [PATCH 057/129] Unify label validation strategy across API functions The `pgo create cluster` command was not using the same label validation as the other label commands were using. Issue: [ch10201] --- .../apiserver/clusterservice/clusterimpl.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index 3516a54f4a..1bf31a84ec 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -576,18 +576,12 @@ func CreateCluster(request *msgs.CreateClusterRequest, ns, pgouser string) msgs. return resp } - userLabelsMap := make(map[string]string) - if request.UserLabels != "" { - labels := strings.Split(request.UserLabels, ",") - for _, v := range labels { - p := strings.Split(v, "=") - if len(p) < 2 { - resp.Status.Code = msgs.Error - resp.Status.Msg = "invalid labels format" - return resp - } - userLabelsMap[p[0]] = p[1] - } + userLabelsMap, err := apiserver.ValidateLabel(request.UserLabels) + + if err != nil { + resp.Status.Code = msgs.Error + resp.Status.Msg = err.Error() + return resp } // validate any parameters provided to bootstrap the cluster from an existing data source From 42f489223460acf261c5901e237a070b48609dcf Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 22 Jan 2021 09:35:13 -0500 Subject: [PATCH 058/129] Fix compilation errors from bad backpatch The apiserver binary was missing one import. --- internal/apiserver/common.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/apiserver/common.go b/internal/apiserver/common.go index d3e1c007dc..a072ebc779 100644 --- a/internal/apiserver/common.go +++ b/internal/apiserver/common.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" "strconv" + "strings" "github.com/crunchydata/postgres-operator/internal/config" crv1 "github.com/crunchydata/postgres-operator/pkg/apis/crunchydata.com/v1" From eacd2bbb2b8ecec79e1f70ba95ca31289a208480 Mon Sep 17 00:00:00 2001 From: andrewlecuyer <43458182+andrewlecuyer@users.noreply.github.com> Date: Fri, 22 Jan 2021 08:14:00 -0600 Subject: [PATCH 059/129] Update Replica Init Logic The operator will now only initialize replica creation prior to stanza creation if the cluster has s3-only enabled. Otherwise replicas will be created following stanza-creation. Additionally, the InitializeReplicaCreation() function (as used to trigger the creation of replicas via pgreplica custom resources) now uses a Patch() operation instead of an Update() operation. This is to prevent potential conflicts when updating a pgreplica. --- internal/controller/controllerutil.go | 17 +- internal/controller/job/backresthandler.go | 28 ++- internal/controller/pod/inithandler.go | 22 +- internal/kubeapi/patch.go | 171 ++++++++++++++ internal/kubeapi/patch_test.go | 259 +++++++++++++++++++++ 5 files changed, 475 insertions(+), 22 deletions(-) create mode 100644 internal/kubeapi/patch.go create mode 100644 internal/kubeapi/patch_test.go diff --git a/internal/controller/controllerutil.go b/internal/controller/controllerutil.go index db67bb1e56..849582db04 100644 --- a/internal/controller/controllerutil.go +++ b/internal/controller/controllerutil.go @@ -20,6 +20,7 @@ import ( "errors" "github.com/crunchydata/postgres-operator/internal/config" + "github.com/crunchydata/postgres-operator/internal/kubeapi" crv1 "github.com/crunchydata/postgres-operator/pkg/apis/crunchydata.com/v1" pgo "github.com/crunchydata/postgres-operator/pkg/generated/clientset/versioned" log "github.com/sirupsen/logrus" @@ -61,17 +62,19 @@ func InitializeReplicaCreation(clientset pgo.Interface, clusterName, log.Error(err) return err } - for _, pgreplica := range pgreplicaList.Items { - if pgreplica.Annotations == nil { - pgreplica.Annotations = make(map[string]string) + for i := range pgreplicaList.Items { + patch, err := kubeapi.NewMergePatch(). + Add("metadata", "annotations")(map[string]string{ + config.ANNOTATION_PGHA_BOOTSTRAP_REPLICA: "true", + }).Bytes() + if err != nil { + log.Error(err) } - pgreplica.Annotations[config.ANNOTATION_PGHA_BOOTSTRAP_REPLICA] = "true" - - if _, err = clientset.CrunchydataV1().Pgreplicas(namespace).Update(&pgreplica); err != nil { + if _, err := clientset.CrunchydataV1().Pgreplicas(namespace). + Patch(pgreplicaList.Items[i].GetName(), types.MergePatchType, patch, ""); err != nil { log.Error(err) - return err } } return nil diff --git a/internal/controller/job/backresthandler.go b/internal/controller/job/backresthandler.go index 36c455b6f5..5d142b6ebb 100644 --- a/internal/controller/job/backresthandler.go +++ b/internal/controller/job/backresthandler.go @@ -144,12 +144,18 @@ func (c *Controller) handleBackrestBackupUpdate(job *apiv1.Job) error { if labels[config.LABEL_PGHA_BACKUP_TYPE] == crv1.BackupTypeBootstrap { log.Debugf("jobController onUpdate initial backup complete") - controller.SetClusterInitializedStatus(c.Client, labels[config.LABEL_PG_CLUSTER], - job.ObjectMeta.Namespace) + if err := controller.SetClusterInitializedStatus(c.Client, labels[config.LABEL_PG_CLUSTER], + job.ObjectMeta.Namespace); err != nil { + log.Error(err) + return err + } - // now initialize the creation of any replica - controller.InitializeReplicaCreation(c.Client, labels[config.LABEL_PG_CLUSTER], - job.ObjectMeta.Namespace) + // now initialize the creation of any replicas + if err := controller.InitializeReplicaCreation(c.Client, labels[config.LABEL_PG_CLUSTER], + job.ObjectMeta.Namespace); err != nil { + log.Error(err) + return err + } } else if labels[config.LABEL_PGHA_BACKUP_TYPE] == crv1.BackupTypeFailover { err := clusteroperator.RemovePrimaryOnRoleChangeTag(c.Client, c.Client.Config, @@ -197,10 +203,18 @@ func (c *Controller) handleBackrestStanzaCreateUpdate(job *apiv1.Job) error { if cluster.Spec.Standby { log.Debugf("job Controller: standby cluster %s will now be set to an initialized "+ "status", clusterName) - controller.SetClusterInitializedStatus(c.Client, clusterName, namespace) + if err := controller.SetClusterInitializedStatus(c.Client, clusterName, + namespace); err != nil { + log.Error(err) + return err + } // now initialize the creation of any replica - controller.InitializeReplicaCreation(c.Client, clusterName, namespace) + if err := controller.InitializeReplicaCreation(c.Client, clusterName, + namespace); err != nil { + log.Error(err) + return err + } return nil } diff --git a/internal/controller/pod/inithandler.go b/internal/controller/pod/inithandler.go index 6f3eed2c2d..b96a911c22 100644 --- a/internal/controller/pod/inithandler.go +++ b/internal/controller/pod/inithandler.go @@ -208,15 +208,21 @@ func (c *Controller) handleStandbyInit(cluster *crv1.Pgcluster) error { } backrestoperator.StanzaCreate(namespace, clusterName, c.Client) } else { - controller.SetClusterInitializedStatus(c.Client, clusterName, namespace) - } + if err := controller.SetClusterInitializedStatus(c.Client, clusterName, + namespace); err != nil { + log.Error(err) + } - // If a standby cluster initialize the creation of any replicas. Replicas - // can be initialized right away, i.e. there is no dependency on - // stanza-creation and/or the creation of any backups, since the replicas - // will be generated from the pgBackRest repository of an external PostgreSQL - // database (which should already exist). - controller.InitializeReplicaCreation(c.Client, clusterName, namespace) + // If a standby cluster with s3 only initialize the creation of any replicas. Replicas + // can be initialized right away, i.e. there is no dependency on + // stanza-creation and/or the creation of any backups, since the replicas + // will be generated from the pgBackRest repository of an external PostgreSQL + // database (which should already exist). + if err := controller.InitializeReplicaCreation(c.Client, clusterName, + namespace); err != nil { + log.Error(err) + } + } // if this is a pgbouncer enabled cluster, add a pgbouncer // Note: we only warn if we cannot create the pgBouncer, so eecution can diff --git a/internal/kubeapi/patch.go b/internal/kubeapi/patch.go new file mode 100644 index 0000000000..57f11e6867 --- /dev/null +++ b/internal/kubeapi/patch.go @@ -0,0 +1,171 @@ +package kubeapi + +/* + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + 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. +*/ + +import ( + "encoding/json" + "strings" +) + +// escapeJSONPointer encodes '~' and '/' according to RFC 6901. +var escapeJSONPointer = strings.NewReplacer( + "~", "~0", + "/", "~1", +).Replace + +// JSON6902 represents a JSON Patch according to RFC 6902; the same as +// k8s.io/apimachinery/pkg/types.JSONPatchType. +type JSON6902 []interface{} + +// NewJSONPatch creates a new JSON Patch according to RFC 6902; the same as +// k8s.io/apimachinery/pkg/types.JSONPatchType. +func NewJSONPatch() *JSON6902 { return &JSON6902{} } + +func (*JSON6902) pointer(tokens ...string) string { + var b strings.Builder + + for _, t := range tokens { + _ = b.WriteByte('/') + _, _ = b.WriteString(escapeJSONPointer(t)) + } + + return b.String() +} + +// Add appends an "add" operation to patch. +// +// > The "add" operation performs one of the following functions, +// > depending upon what the target location references: +// > +// > o If the target location specifies an array index, a new value is +// > inserted into the array at the specified index. +// > +// > o If the target location specifies an object member that does not +// > already exist, a new member is added to the object. +// > +// > o If the target location specifies an object member that does exist, +// > that member's value is replaced. +// +func (patch *JSON6902) Add(path ...string) func(value interface{}) *JSON6902 { + i := len(*patch) + f := func(value interface{}) *JSON6902 { + (*patch)[i] = map[string]interface{}{ + "op": "add", + "path": patch.pointer(path...), + "value": value, + } + return patch + } + + *patch = append(*patch, f) + + return f +} + +// Remove appends a "remove" operation to patch. +// +// > The "remove" operation removes the value at the target location. +// > +// > The target location MUST exist for the operation to be successful. +// +func (patch *JSON6902) Remove(path ...string) *JSON6902 { + *patch = append(*patch, map[string]interface{}{ + "op": "remove", + "path": patch.pointer(path...), + }) + + return patch +} + +// Replace appends a "replace" operation to patch. +// +// > The "replace" operation replaces the value at the target location +// > with a new value. +// > +// > The target location MUST exist for the operation to be successful. +// +func (patch *JSON6902) Replace(path ...string) func(value interface{}) *JSON6902 { + i := len(*patch) + f := func(value interface{}) *JSON6902 { + (*patch)[i] = map[string]interface{}{ + "op": "replace", + "path": patch.pointer(path...), + "value": value, + } + return patch + } + + *patch = append(*patch, f) + + return f +} + +// Bytes returns the JSON representation of patch. +func (patch JSON6902) Bytes() ([]byte, error) { return json.Marshal(patch) } + +// Merge7386 represents a JSON Merge Patch according to RFC 7386; the same as +// k8s.io/apimachinery/pkg/types.MergePatchType. +type Merge7386 map[string]interface{} + +// NewMergePatch creates a new JSON Merge Patch according to RFC 7386; the same +// as k8s.io/apimachinery/pkg/types.MergePatchType. +func NewMergePatch() *Merge7386 { return &Merge7386{} } + +// Add modifies patch to indicate that the member at path should be added or +// replaced with value. +// +// > If the provided merge patch contains members that do not appear +// > within the target, those members are added. If the target does +// > contain the member, the value is replaced. Null values in the merge +// > patch are given special meaning to indicate the removal of existing +// > values in the target. +// +func (patch *Merge7386) Add(path ...string) func(value interface{}) *Merge7386 { + position := *patch + + for len(path) > 1 { + p, ok := position[path[0]].(Merge7386) + if !ok { + p = Merge7386{} + position[path[0]] = p + } + + position = p + path = path[1:] + } + + if len(path) < 1 { + return func(interface{}) *Merge7386 { return patch } + } + + f := func(value interface{}) *Merge7386 { + position[path[0]] = value + return patch + } + + position[path[0]] = f + + return f +} + +// Remove modifies patch to indicate that the member at path should be removed +// if it exists. +func (patch *Merge7386) Remove(path ...string) *Merge7386 { + return patch.Add(path...)(nil) +} + +// Bytes returns the JSON representation of patch. +func (patch Merge7386) Bytes() ([]byte, error) { return json.Marshal(patch) } diff --git a/internal/kubeapi/patch_test.go b/internal/kubeapi/patch_test.go new file mode 100644 index 0000000000..706ee4768d --- /dev/null +++ b/internal/kubeapi/patch_test.go @@ -0,0 +1,259 @@ +package kubeapi + +/* + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + 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. +*/ + +import ( + "encoding/json" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/labels" +) + +func assertJSON(t testing.TB, expected interface{}, actual []byte) { + t.Helper() + + var e, a interface{} + var err error + + if b, ok := expected.([]byte); ok { + err = json.Unmarshal(b, &e) + } else if s, ok := expected.(string); ok { + err = json.Unmarshal([]byte(s), &e) + } else { + t.Fatalf("bug in test: unexpected type %T", expected) + } + + if err != nil { + t.Fatalf("bug in test: %v", err) + } + + if err = json.Unmarshal(actual, &a); err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(e, a) { + t.Errorf("\n--- Expected\n+++ Actual\n- %#v\n+ %#v", e, a) + } +} + +func TestEscapeJSONPointer(t *testing.T) { + t.Parallel() + + for _, tt := range []struct{ input, expected string }{ + {"~1", "~01"}, + {"~~", "~0~0"}, + {"/1", "~11"}, + {"//", "~1~1"}, + {"~/", "~0~1"}, + {"some/label", "some~1label"}, + } { + actual := escapeJSONPointer(tt.input) + if actual != tt.expected { + t.Errorf("expected %q, got %q", tt.expected, actual) + } + } +} + +func TestJSON6902(t *testing.T) { + t.Parallel() + + // An empty patch is valid. + { + b, err := NewJSONPatch().Bytes() + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + assertJSON(t, `[]`, b) + } + + // Calling Add without its value is an error. + { + patch := NewJSONPatch() + patch.Add("a") + _, err := patch.Bytes() + if err == nil { + t.Fatal("expected an error, got none") + } + } + { + b, err := NewJSONPatch().Add("a", "x/y", "0")(9).Bytes() + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + assertJSON(t, `[{"op":"add","path":"/a/x~1y/0","value":9}]`, b) + } + + // Remove takes no value. + { + b, err := NewJSONPatch().Remove("b", "m/n/o").Bytes() + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + assertJSON(t, `[{"op":"remove","path":"/b/m~1n~1o"}]`, b) + } + + // Calling Replace without its value is an error. + { + patch := NewJSONPatch() + patch.Replace("a") + _, err := patch.Bytes() + if err == nil { + t.Fatal("expected an error, got none") + } + } + { + b, err := NewJSONPatch().Replace("metadata", "labels", "some/thing")("5").Bytes() + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + assertJSON(t, `[{"op":"replace","path":"/metadata/labels/some~1thing","value":"5"}]`, b) + } + + // Calls are chainable. + { + b, err := NewJSONPatch(). + Add("a", "b", "c")(1). + Remove("x", "y", "z"). + Replace("1", "2", "3")(nil). + Bytes() + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + assertJSON(t, `[ + {"op":"add","path":"/a/b/c","value":1}, + {"op":"remove","path":"/x/y/z"}, + {"op":"replace","path":"/1/2/3","value":null} + ]`, b) + } +} + +func TestMerge7386(t *testing.T) { + t.Parallel() + + // An empty patch is valid. + { + b, err := NewMergePatch().Bytes() + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + assertJSON(t, `{}`, b) + } + + // Calling Add without a path does nothing. + { + b, err := NewMergePatch().Add()("anything").Bytes() + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + assertJSON(t, `{}`, b) + } + + // Calling Add without its value is an error. + { + patch := NewMergePatch() + patch.Add("a") + _, err := patch.Bytes() + if err == nil { + t.Fatal("expected an error, got none") + } + } + { + b, err := NewMergePatch().Add("a", "x/y", "0")(9).Bytes() + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + assertJSON(t, `{"a":{"x/y":{"0":9}}}`, b) + } + + // Remove takes no value. + { + b, err := NewMergePatch().Remove("b", "m/n/o").Bytes() + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + assertJSON(t, `{"b":{"m/n/o":null}}`, b) + } + + // Calls are chainable. + { + b, err := NewMergePatch(). + Add("a", "b", "c")(1). + Remove("x", "y", "z"). + Bytes() + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + assertJSON(t, `{ + "a":{"b":{"c":1}}, + "x":{"y":{"z":null}} + }`, b) + } +} + +// TestMerge7386Equivalence demonstrates that the same effect can be spelled +// different ways with Merge7386. +func TestMerge7386Equivalence(t *testing.T) { + t.Parallel() + + expected := `{ + "metadata": { + "labels": {"lk":"lv"}, + "annotations": {"ak1":"av1", "ak2":"av2"} + } + }` + + patches := []*Merge7386{ + // multiple calls to Add + NewMergePatch(). + Add("metadata", "labels", "lk")("lv"). + Add("metadata", "annotations", "ak1")("av1"). + Add("metadata", "annotations", "ak2")("av2"), + + // fewer calls using the patch type + NewMergePatch(). + Add("metadata", "labels")(Merge7386{"lk": "lv"}). + Add("metadata", "annotations")(Merge7386{"ak1": "av1", "ak2": "av2"}), + + // fewer calls using other types + NewMergePatch(). + Add("metadata", "labels")(labels.Set{"lk": "lv"}). + Add("metadata", "annotations")(map[string]string{"ak1": "av1", "ak2": "av2"}), + + // one call using the patch type + NewMergePatch(). + Add("metadata")(Merge7386{ + "labels": Merge7386{"lk": "lv"}, + "annotations": Merge7386{"ak1": "av1", "ak2": "av2"}, + }), + + // one call using other types + NewMergePatch(). + Add("metadata")(map[string]interface{}{ + "labels": labels.Set{"lk": "lv"}, + "annotations": map[string]string{"ak1": "av1", "ak2": "av2"}, + }), + } + + for i, patch := range patches { + b, err := patch.Bytes() + if err != nil { + t.Fatalf("expected no error for %v, got %v", i, err) + } + + assertJSON(t, expected, b) + } +} From 45886e8ed5692618fe11ed16826cb4cf1571b4f9 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 29 Jan 2021 13:13:43 -0500 Subject: [PATCH 060/129] Add support for the pgBackRest `--compress-type` flag Selecting the compression type for pgBackRest is supported across recent Postgres Operator releases, but the CLI was not allowing for this flag to be passed through. This allows for the selection of pgBackRest compression type amongst the allowable methods in the container, which are none, bz2, gz, and lz4. Currently zst does not ship within the container. Issue: [ch10287] --- .../backupoptions/backupoptionsutil.go | 7 ++++ .../backupoptions/backupoptionsutil_test.go | 40 +++++++++++++++++++ .../backupoptions/pgbackrestoptions.go | 6 +++ 3 files changed, 53 insertions(+) create mode 100644 internal/apiserver/backupoptions/backupoptionsutil_test.go diff --git a/internal/apiserver/backupoptions/backupoptionsutil.go b/internal/apiserver/backupoptions/backupoptionsutil.go index c1c3c69f1b..c8efed16b5 100644 --- a/internal/apiserver/backupoptions/backupoptionsutil.go +++ b/internal/apiserver/backupoptions/backupoptionsutil.go @@ -167,6 +167,13 @@ func isValidCompressLevel(compressLevel int) bool { } } +// isValidCompressType checks that the compression type passed in matches one +// of the ones supported by pgBackRest. However, it presently does not support +// `zst` +func isValidCompressType(compressType string) bool { + return compressType == "gz" || compressType == "bz2" || compressType == "lz4" || compressType == "none" +} + // isValidRetentionRange validates that pgBackrest Full, Diff or Archive // retention option value is set within the allowable range. // allowed: 1-9999999 diff --git a/internal/apiserver/backupoptions/backupoptionsutil_test.go b/internal/apiserver/backupoptions/backupoptionsutil_test.go new file mode 100644 index 0000000000..44048f15d8 --- /dev/null +++ b/internal/apiserver/backupoptions/backupoptionsutil_test.go @@ -0,0 +1,40 @@ +package backupoptions + +/* +Copyright 2021 Crunchy Data Solutions, Inc. +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. +*/ + +import "testing" + +func TestIsValidCompressType(t *testing.T) { + tests := []struct { + compressType string + expected bool + }{ + {compressType: "bz2", expected: true}, + {compressType: "gz", expected: true}, + {compressType: "none", expected: true}, + {compressType: "lz4", expected: true}, + {compressType: "zst", expected: false}, + {compressType: "bogus", expected: false}, + } + + for _, test := range tests { + t.Run(test.compressType, func(t *testing.T) { + if isValidCompressType(test.compressType) != test.expected { + t.Fatalf("expected %q to be %t", test.compressType, test.expected) + } + }) + } +} diff --git a/internal/apiserver/backupoptions/pgbackrestoptions.go b/internal/apiserver/backupoptions/pgbackrestoptions.go index 026fb45501..2deb8d2dcf 100644 --- a/internal/apiserver/backupoptions/pgbackrestoptions.go +++ b/internal/apiserver/backupoptions/pgbackrestoptions.go @@ -82,6 +82,7 @@ type pgBackRestBackupOptions struct { NoCompress bool `flag:"no-compress"` CompressLevel int `flag:"compress-level"` CompressLevelNetwork int `flag:"compress-level-network"` + CompressType string `flag:"compress-type"` DBTimeout int `flag:"db-timeout"` Delta bool `flag:"no-delta"` ProcessMax int `flag:"process-max"` @@ -146,6 +147,11 @@ func (backRestBackupOpts pgBackRestBackupOptions) validate(setFlagFieldNames []s err := errors.New("Invalid network compress level for pgBackRest backup") errstrings = append(errstrings, err.Error()) } + case "CompressType": + if !isValidCompressType(backRestBackupOpts.CompressType) { + err := errors.New("Invalid compress type for pgBackRest backup") + errstrings = append(errstrings, err.Error()) + } case "LogLevelConsole": if !isValidBackrestLogLevel(backRestBackupOpts.LogLevelConsole) { err := errors.New("Invalid log level for pgBackRest backup") From 91d773ca4799c2459170204782ed75db4ce4ee4c Mon Sep 17 00:00:00 2001 From: Steven Siahetiong Date: Mon, 1 Feb 2021 00:54:39 +0800 Subject: [PATCH 061/129] Replace PG_STAT_STATEMENTS_LIMIT on exporter startup The new variable was added for the `pg_stat_statements` support. This sets the default to be "20" statements, which is what is used by pgMonitor. Co-authored-by: Steven Siahetiong Issue: #2244 --- bin/crunchy-postgres-exporter/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/crunchy-postgres-exporter/start.sh b/bin/crunchy-postgres-exporter/start.sh index 95c6d55ab8..5ecfc1c07c 100755 --- a/bin/crunchy-postgres-exporter/start.sh +++ b/bin/crunchy-postgres-exporter/start.sh @@ -226,7 +226,7 @@ else fi fi -sed -i "s/#PGBACKREST_INFO_THROTTLE_MINUTES#/${PGBACKREST_INFO_THROTTLE_MINUTES:-10}/g" /tmp/queries.yml +sed -i -e "s/#PGBACKREST_INFO_THROTTLE_MINUTES#/${PGBACKREST_INFO_THROTTLE_MINUTES:-10}/g" -e "s/#PG_STAT_STATEMENTS_LIMIT#/${PG_STAT_STATEMENTS_LIMIT:-20}/g" /tmp/queries.yml PG_OPTIONS="--extend.query-path=${QUERY_DIR?}/queries.yml --web.listen-address=:${POSTGRES_EXPORTER_PORT}" From 67b44d77010bc2afc5a05bd371f326bc49bf988c Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 31 Jan 2021 12:37:40 -0500 Subject: [PATCH 062/129] Only consider running Pods for scheduled backups Though the scheduled backup code would bail if it found multiple pgBackRest repository Pods, this ensures that only running pgBackRest Pods would be considered. Issue: #2237 --- pgo-scheduler/scheduler/pgbackrest.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pgo-scheduler/scheduler/pgbackrest.go b/pgo-scheduler/scheduler/pgbackrest.go index 75561e0af3..fd706d5337 100644 --- a/pgo-scheduler/scheduler/pgbackrest.go +++ b/pgo-scheduler/scheduler/pgbackrest.go @@ -21,8 +21,10 @@ import ( "github.com/crunchydata/postgres-operator/internal/config" log "github.com/sirupsen/logrus" + v1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/util/wait" ) @@ -113,17 +115,20 @@ func (b BackRestBackupJob) Run() { return } - selector := fmt.Sprintf("%s=%s,pgo-backrest-repo=true", config.LABEL_PG_CLUSTER, b.cluster) - pods, err := clientset.CoreV1().Pods(b.namespace).List(metav1.ListOptions{LabelSelector: selector}) + selector := fmt.Sprintf("%s=%s,%s", config.LABEL_PG_CLUSTER, b.cluster, config.LABEL_PGO_BACKREST_REPO) + options := metav1.ListOptions{ + FieldSelector: fields.OneTermEqualSelector("status.phase", string(v1.PodRunning)).String(), + LabelSelector: selector, + } + + pods, err := clientset.CoreV1().Pods(b.namespace).List(options) if err != nil { contextLogger.WithFields(log.Fields{ "selector": selector, "error": err, }).Error("error getting pods from selector") return - } - - if len(pods.Items) != 1 { + } else if len(pods.Items) != 1 { contextLogger.WithFields(log.Fields{ "selector": selector, "error": err, From 744b9b52286ef2aee7d1fae846b6fdbebc0e30c5 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Fri, 29 Jan 2021 23:43:17 +0000 Subject: [PATCH 063/129] Clean Stanza Create pgtask & Job After Init When a PostgreSQL cluster is initialized for the first time, the stanza create pgtask and the Kubernetes Job associated with it are now automatically deleted. This ensures that subsequent update events in the Job controller for a stanza-create Job do not trigger additional "initial backups" Jobs for the cluster. Issue: [ch10277] Issue: #2106 --- internal/controller/job/backresthandler.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/controller/job/backresthandler.go b/internal/controller/job/backresthandler.go index 5d142b6ebb..5727bffbfa 100644 --- a/internal/controller/job/backresthandler.go +++ b/internal/controller/job/backresthandler.go @@ -229,6 +229,14 @@ func (c *Controller) handleBackrestStanzaCreateUpdate(job *apiv1.Job) error { backrestoperator.CreateInitialBackup(c.Client, job.ObjectMeta.Namespace, clusterName, backrestRepoPodName) + // now that the initial backup has been initiated, proceed with deleting the stanza-create + // pgtask and associated Job. This will ensure any subsequent updates to the stanza-create + // Job do not trigger more initial backup Jobs. + if err := backrest.CleanStanzaCreateResources(namespace, clusterName, c.Client); err != nil { + log.Error(err) + return err + } + } return nil } From 52b578e9cbe2c88f1a54996f078f582180d39232 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Mon, 1 Feb 2021 20:43:03 +0000 Subject: [PATCH 064/129] Handle & Log Initial Backup Creation Errors Errors are now handled and logged when creating an initial cluster backup pgtask following a successful stanza-create Job. --- internal/controller/job/backresthandler.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/internal/controller/job/backresthandler.go b/internal/controller/job/backresthandler.go index 5727bffbfa..7873089a37 100644 --- a/internal/controller/job/backresthandler.go +++ b/internal/controller/job/backresthandler.go @@ -226,8 +226,11 @@ func (c *Controller) handleBackrestStanzaCreateUpdate(job *apiv1.Job) error { return err } - backrestoperator.CreateInitialBackup(c.Client, job.ObjectMeta.Namespace, - clusterName, backrestRepoPodName) + if _, err := backrestoperator.CreateInitialBackup(c.Client, job.ObjectMeta.Namespace, + clusterName, backrestRepoPodName); err != nil { + log.Error(err) + return err + } // now that the initial backup has been initiated, proceed with deleting the stanza-create // pgtask and associated Job. This will ensure any subsequent updates to the stanza-create From 611ce309a0c80c5009c975ca9d8cb0cdabf6a5b9 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 1 Feb 2021 16:58:08 -0500 Subject: [PATCH 065/129] Use proper bootstrap template for debug output This also moves the debugging line before the actual template execution to make it possible to more easily debug any issues if the template were customized. --- internal/operator/cluster/clusterlogic.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/internal/operator/cluster/clusterlogic.go b/internal/operator/cluster/clusterlogic.go index 2842281914..9b828e173c 100644 --- a/internal/operator/cluster/clusterlogic.go +++ b/internal/operator/cluster/clusterlogic.go @@ -97,15 +97,16 @@ func addClusterBootstrapJob(clientset kubeapi.Interface, return err } + if operator.CRUNCHY_DEBUG { + _ = config.BootstrapTemplate.Execute(os.Stdout, bootstrapFields) + } + var bootstrapSpec bytes.Buffer + if err := config.BootstrapTemplate.Execute(&bootstrapSpec, bootstrapFields); err != nil { return err } - if operator.CRUNCHY_DEBUG { - config.DeploymentTemplate.Execute(os.Stdout, bootstrapFields) - } - job := &batchv1.Job{} if err := json.Unmarshal(bootstrapSpec.Bytes(), job); err != nil { return err From 19de963977f48c0364859eededf03290d4ebc607 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 11 Feb 2021 18:36:01 -0500 Subject: [PATCH 066/129] Existence check for primary Deployment before scaling During the cluster initialization process, there is a step where the Deployment object representing the primary is explicitly scaled from 0 to 1 Pods. However, there is a case that may trigger the Deployment scaling before the Deployment is created. As such, we can add a guard to check that the Deployment is actually created before proceeding with the scaling operation. This patch also modifies a debug line around the cluster Deployment creation, as the debug output came after the point at which the code may have exited due to error. --- internal/controller/pod/inithandler.go | 47 ++++++++++++++++++++++- internal/operator/cluster/clusterlogic.go | 8 ++-- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/internal/controller/pod/inithandler.go b/internal/controller/pod/inithandler.go index b96a911c22..37b8b103d4 100644 --- a/internal/controller/pod/inithandler.go +++ b/internal/controller/pod/inithandler.go @@ -18,6 +18,7 @@ limitations under the License. import ( "fmt" "strconv" + "time" "github.com/crunchydata/postgres-operator/internal/config" "github.com/crunchydata/postgres-operator/internal/controller" @@ -28,12 +29,14 @@ import ( taskoperator "github.com/crunchydata/postgres-operator/internal/operator/task" "github.com/crunchydata/postgres-operator/internal/util" crv1 "github.com/crunchydata/postgres-operator/pkg/apis/crunchydata.com/v1" + + log "github.com/sirupsen/logrus" apiv1 "k8s.io/api/core/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/types" - - log "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/util/wait" ) // handleClusterInit is responsible for proceeding with initialization of the PG cluster once the @@ -85,6 +88,16 @@ func (c *Controller) handleBackRestRepoInit(newPod *apiv1.Pod, cluster *crv1.Pgc return nil } + // first: a sanity check that there exists a primary deployment to scale. this + // is to attempt to avoid any silent failures in the deployment scaling + // function. + // + // If we do encounter an error, we will proceed in case the deployment becomes + // available after. + if err := c.waitForPrimaryDeployment(cluster); err != nil { + log.Warn(err) + } + clusterInfo, err := clusteroperator.ScaleClusterDeployments(c.Client, *cluster, 1, true, false, false, false) if err != nil { @@ -288,3 +301,33 @@ func (c *Controller) labelPostgresPodAndDeployment(newpod *apiv1.Pod) { } } + +// waitForPrimaryDeployment checks to see that a primary deployment is +// available. It does not check readiness, only that the deployment exists. This +// used before scaling to ensure scaling does not fail silently +func (c *Controller) waitForPrimaryDeployment(cluster *crv1.Pgcluster) error { + primaryDeploymentName := cluster.Annotations[config.ANNOTATION_CURRENT_PRIMARY] + options := metav1.ListOptions{ + LabelSelector: fields.AndSelectors( + fields.OneTermEqualSelector(config.LABEL_PG_CLUSTER, cluster.Name), + fields.OneTermEqualSelector(config.LABEL_PG_DATABASE, config.LABEL_TRUE), + fields.OneTermEqualSelector(config.LABEL_DEPLOYMENT_NAME, primaryDeploymentName), + ).String(), + } + + // start polling to see if the primary deployment is created + if err := wait.PollImmediate(5*time.Second, 60*time.Second, func() (bool, error) { + // check to see if the deployment exists + d, err := c.Client.AppsV1().Deployments(cluster.Namespace).List(options) + + if err != nil { + log.Warnf("could not find primary deployment for scaling: %s", err) + } + + return err == nil && len(d.Items) > 0, nil + }); err != nil { + return fmt.Errorf("primary deployment lookup timeout reached for %q", primaryDeploymentName) + } + + return nil +} diff --git a/internal/operator/cluster/clusterlogic.go b/internal/operator/cluster/clusterlogic.go index 9b828e173c..4270b456d9 100644 --- a/internal/operator/cluster/clusterlogic.go +++ b/internal/operator/cluster/clusterlogic.go @@ -141,15 +141,15 @@ func addClusterDeployments(clientset kubeapi.Interface, deploymentFields := getClusterDeploymentFields(clientset, cl, dataVolume, walVolume, tablespaceVolumes) + if operator.CRUNCHY_DEBUG { + _ = config.DeploymentTemplate.Execute(os.Stdout, deploymentFields) + } + var primaryDoc bytes.Buffer if err := config.DeploymentTemplate.Execute(&primaryDoc, deploymentFields); err != nil { return err } - if operator.CRUNCHY_DEBUG { - config.DeploymentTemplate.Execute(os.Stdout, deploymentFields) - } - deployment := &appsv1.Deployment{} if err := json.Unmarshal(primaryDoc.Bytes(), deployment); err != nil { return err From 7b197d4abc77449ac5b1a17dc8454091d346de00 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 11 Feb 2021 18:42:46 -0500 Subject: [PATCH 067/129] Modify primary check before taking backup This was using a legacy method and is now modified to use the method used by other Operator operations to check for both the primary cluster and its availability. --- .../apiserver/backrestservice/backrestimpl.go | 56 +++++-------------- 1 file changed, 14 insertions(+), 42 deletions(-) diff --git a/internal/apiserver/backrestservice/backrestimpl.go b/internal/apiserver/backrestservice/backrestimpl.go index 31dd01fe4b..7b5b7d1b64 100644 --- a/internal/apiserver/backrestservice/backrestimpl.go +++ b/internal/apiserver/backrestservice/backrestimpl.go @@ -203,10 +203,9 @@ func CreateBackup(request *msgs.CreateBackrestBackupRequest, ns, pgouser string) } // check if primary is ready - if err := isPrimaryReady(cluster, ns); err != nil { - log.Error(err) + if !isPrimaryReady(cluster) { resp.Status.Code = msgs.Error - resp.Status.Msg = err.Error() + resp.Status.Msg = "primary pod is not in Ready state" return resp } @@ -288,54 +287,27 @@ func getBackrestRepoPodName(cluster *crv1.Pgcluster, ns string) (string, error) return repopodName, err } -func isPrimary(pod *v1.Pod, clusterName string) bool { - if pod.ObjectMeta.Labels[config.LABEL_SERVICE_NAME] == clusterName { - return true - } - return false - -} - -func isReady(pod *v1.Pod) bool { - readyCount := 0 - containerCount := 0 - for _, stat := range pod.Status.ContainerStatuses { - containerCount++ - if stat.Ready { - readyCount++ - } - } - if readyCount != containerCount { - return false - } - return true - -} - // isPrimaryReady goes through the pod list to first identify the // Primary pod and, once identified, determine if it is in a // ready state. If not, it returns an error, otherwise it returns // a nil value -func isPrimaryReady(cluster *crv1.Pgcluster, ns string) error { - primaryReady := false +func isPrimaryReady(cluster *crv1.Pgcluster) bool { + options := metav1.ListOptions{ + FieldSelector: fields.OneTermEqualSelector("status.phase", string(v1.PodRunning)).String(), + LabelSelector: fields.AndSelectors( + fields.OneTermEqualSelector(config.LABEL_PG_CLUSTER, cluster.Name), + fields.OneTermEqualSelector(config.LABEL_PGHA_ROLE, config.LABEL_PGHA_ROLE_PRIMARY), + ).String(), + } - selector := fmt.Sprintf("%s=%s,%s=%s", config.LABEL_PG_CLUSTER, cluster.Name, - config.LABEL_PGHA_ROLE, config.LABEL_PGHA_ROLE_PRIMARY) + pods, err := apiserver.Clientset.CoreV1().Pods(cluster.Namespace).List(options) - pods, err := apiserver.Clientset.CoreV1().Pods(ns).List(metav1.ListOptions{LabelSelector: selector}) if err != nil { - return err - } - for _, p := range pods.Items { - if isPrimary(&p, cluster.Spec.Name) && isReady(&p) { - primaryReady = true - } + log.Error(err) + return false } - if primaryReady == false { - return errors.New("primary pod is not in Ready state") - } - return nil + return len(pods.Items) > 0 } // ShowBackrest ... From 2f6268adc2d65942baa6ab357c6e7f92e97e3770 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 12 Feb 2021 15:32:02 -0500 Subject: [PATCH 068/129] Revise inernal references in pkg components The location of these functions caused a cross internal/pkg reference, which made external SDK builds difficult. This removes the internal components from the pkg components to ensure proper pkg compatibility. --- internal/apiserver/common.go | 25 +++++++++ internal/apiserver/common_test.go | 42 +++++++++++++++ internal/apiserver/userservice/userimpl.go | 9 ++-- pgo/cmd/user.go | 5 +- pkg/apiservermsgs/configmsgs.go | 6 +-- pkg/apiservermsgs/usermsgs.go | 33 ------------ pkg/apiservermsgs/usermsgs_test.go | 63 ---------------------- pkg/events/eventing.go | 8 ++- 8 files changed, 78 insertions(+), 113 deletions(-) delete mode 100644 pkg/apiservermsgs/usermsgs_test.go diff --git a/internal/apiserver/common.go b/internal/apiserver/common.go index a072ebc779..b6c665c652 100644 --- a/internal/apiserver/common.go +++ b/internal/apiserver/common.go @@ -22,6 +22,7 @@ import ( "strings" "github.com/crunchydata/postgres-operator/internal/config" + pgpassword "github.com/crunchydata/postgres-operator/internal/postgres/password" crv1 "github.com/crunchydata/postgres-operator/pkg/apis/crunchydata.com/v1" log "github.com/sirupsen/logrus" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -48,6 +49,9 @@ var ( ErrDBContainerNotFound = errors.New("\"database\" container not found in pod") // ErrLabelInvalid indicates that a label is invalid ErrLabelInvalid = errors.New("invalid label") + // ErrPasswordTypeInvalid is used when a string that's not included in + // PasswordTypeStrings is used + ErrPasswordTypeInvalid = errors.New("invalid password type. choices are (md5, scram-sha-256)") // ErrStandbyNotAllowed contains the error message returned when an API call is not // permitted because it involves a cluster that is in standby mode ErrStandbyNotAllowed = errors.New("Action not permitted because standby mode is enabled") @@ -58,6 +62,15 @@ var ( "Operator installation") ) +// passwordTypeStrings is a mapping of strings of password types to their +// corresponding value of the structured password type +var passwordTypeStrings = map[string]pgpassword.PasswordType{ + "": pgpassword.MD5, + "md5": pgpassword.MD5, + "scram": pgpassword.SCRAM, + "scram-sha-256": pgpassword.SCRAM, +} + func CreateRMDataTask(clusterName, replicaName, taskName string, deleteBackups, deleteData, isReplica, isBackup bool, ns, clusterPGHAScope string) error { var err error @@ -100,6 +113,18 @@ func GetBackrestStorageTypes() []string { return backrestStorageTypes } +// GetPasswordType returns the enumerated password type based on the string, and +// an error if it cannot match one +func GetPasswordType(passwordTypeStr string) (pgpassword.PasswordType, error) { + passwordType, ok := passwordTypeStrings[passwordTypeStr] + + if !ok { + return passwordType, ErrPasswordTypeInvalid + } + + return passwordType, nil +} + // IsValidPVC determines if a PVC with the name provided exits func IsValidPVC(pvcName, ns string) bool { pvc, err := Clientset.CoreV1().PersistentVolumeClaims(ns).Get(pvcName, metav1.GetOptions{}) diff --git a/internal/apiserver/common_test.go b/internal/apiserver/common_test.go index c36cb7bfa3..992cc134b7 100644 --- a/internal/apiserver/common_test.go +++ b/internal/apiserver/common_test.go @@ -21,9 +21,51 @@ import ( "strings" "testing" + pgpassword "github.com/crunchydata/postgres-operator/internal/postgres/password" + "k8s.io/apimachinery/pkg/api/resource" ) +func TestGetPasswordType(t *testing.T) { + t.Run("valid", func(t *testing.T) { + tests := map[string]pgpassword.PasswordType{ + "": pgpassword.MD5, + "md5": pgpassword.MD5, + "scram": pgpassword.SCRAM, + "scram-sha-256": pgpassword.SCRAM, + } + + for passwordTypeStr, expected := range tests { + t.Run(passwordTypeStr, func(t *testing.T) { + passwordType, err := GetPasswordType(passwordTypeStr) + if err != nil { + t.Error(err) + return + } + + if passwordType != expected { + t.Errorf("password type %q should yield %d", passwordTypeStr, expected) + } + }) + } + }) + + t.Run("invalid", func(t *testing.T) { + tests := map[string]error{ + "magic": ErrPasswordTypeInvalid, + "scram-sha-512": ErrPasswordTypeInvalid, + } + + for passwordTypeStr, expected := range tests { + t.Run(passwordTypeStr, func(t *testing.T) { + if _, err := GetPasswordType(passwordTypeStr); !errors.Is(err, expected) { + t.Errorf("password type %q should yield error %q", passwordTypeStr, expected.Error()) + } + }) + } + }) +} + func TestValidateLabel(t *testing.T) { t.Run("valid", func(t *testing.T) { inputs := []map[string]string{ diff --git a/internal/apiserver/userservice/userimpl.go b/internal/apiserver/userservice/userimpl.go index b4b5698b48..cbc71c2485 100644 --- a/internal/apiserver/userservice/userimpl.go +++ b/internal/apiserver/userservice/userimpl.go @@ -168,8 +168,7 @@ func CreateUser(request *msgs.CreateUserRequest, pgouser string) msgs.CreateUser } // determine if the user passed in a valid password type - passwordType, err := msgs.GetPasswordType(request.PasswordType) - + passwordType, err := apiserver.GetPasswordType(request.PasswordType) if err != nil { response.Status.Code = msgs.Error response.Status.Msg = err.Error() @@ -620,7 +619,7 @@ func UpdateUser(request *msgs.UpdateUserRequest, pgouser string) msgs.UpdateUser } // determine if the user passed in a valid password type - if _, err := msgs.GetPasswordType(request.PasswordType); err != nil { + if _, err := apiserver.GetPasswordType(request.PasswordType); err != nil { response.Status.Code = msgs.Error response.Status.Msg = err.Error() return response @@ -965,7 +964,7 @@ func rotateExpiredPasswords(request *msgs.UpdateUserRequest, cluster *crv1.Pgclu // get the password type. the error is already evaluated in a called // function - passwordType, _ := msgs.GetPasswordType(request.PasswordType) + passwordType, _ := apiserver.GetPasswordType(request.PasswordType) // generate a new password. Check to see if the user passed in a particular // length of the password, or passed in a password to rotate (though that @@ -1097,7 +1096,7 @@ func updateUser(request *msgs.UpdateUserRequest, cluster *crv1.Pgcluster) msgs.U // Speaking of passwords...let's first determine if the user updated their // password. See generatePassword for how precedence is given for password // updates - passwordType, _ := msgs.GetPasswordType(request.PasswordType) + passwordType, _ := apiserver.GetPasswordType(request.PasswordType) isChanged, password, hashedPassword, err := generatePassword(result.Username, request.Password, passwordType, request.RotatePassword, request.PasswordLength) diff --git a/pgo/cmd/user.go b/pgo/cmd/user.go index a952aef402..ef8e73f283 100644 --- a/pgo/cmd/user.go +++ b/pgo/cmd/user.go @@ -20,6 +20,7 @@ import ( "os" "strings" + "github.com/crunchydata/postgres-operator/internal/apiserver" utiloperator "github.com/crunchydata/postgres-operator/internal/util" "github.com/crunchydata/postgres-operator/pgo/api" "github.com/crunchydata/postgres-operator/pgo/util" @@ -88,7 +89,7 @@ func createUser(args []string, ns string) { } // determine if the user provies a valid password type - if _, err := msgs.GetPasswordType(PasswordType); err != nil { + if _, err := apiserver.GetPasswordType(PasswordType); err != nil { fmt.Println("Error:", err.Error()) os.Exit(1) } @@ -401,7 +402,7 @@ func updateUser(clusterNames []string, namespace string) { } // determine if the user provies a valid password type - if _, err := msgs.GetPasswordType(PasswordType); err != nil { + if _, err := apiserver.GetPasswordType(PasswordType); err != nil { fmt.Println("Error:", err.Error()) os.Exit(1) } diff --git a/pkg/apiservermsgs/configmsgs.go b/pkg/apiservermsgs/configmsgs.go index 325e2281e5..1a4f8aae9c 100644 --- a/pkg/apiservermsgs/configmsgs.go +++ b/pkg/apiservermsgs/configmsgs.go @@ -15,13 +15,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import ( - "github.com/crunchydata/postgres-operator/internal/config" -) - // ShowConfigResponse ... // swagger:model type ShowConfigResponse struct { - Result config.PgoConfig + Result interface{} Status } diff --git a/pkg/apiservermsgs/usermsgs.go b/pkg/apiservermsgs/usermsgs.go index bf67358abe..da048129db 100644 --- a/pkg/apiservermsgs/usermsgs.go +++ b/pkg/apiservermsgs/usermsgs.go @@ -15,12 +15,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import ( - "errors" - - pgpassword "github.com/crunchydata/postgres-operator/internal/postgres/password" -) - type UpdateClusterLoginState int // set the different values around whether or not to disable/enable a user's @@ -31,21 +25,6 @@ const ( UpdateUserLoginDisable ) -var ( - // ErrPasswordTypeInvalid is used when a string that's not included in - // PasswordTypeStrings is used - ErrPasswordTypeInvalid = errors.New("invalid password type. choices are (md5, scram-sha-256)") -) - -// passwordTypeStrings is a mapping of strings of password types to their -// corresponding value of the structured password type -var passwordTypeStrings = map[string]pgpassword.PasswordType{ - "": pgpassword.MD5, - "md5": pgpassword.MD5, - "scram": pgpassword.SCRAM, - "scram-sha-256": pgpassword.SCRAM, -} - // CreateUserRequest contains the parameters that are passed in when an Operator // user requests to create a new PostgreSQL user // swagger:model @@ -152,15 +131,3 @@ type UserResponseDetail struct { Username string ValidUntil string } - -// GetPasswordType returns the enumerated password type based on the string, and -// an error if it cannot match one -func GetPasswordType(passwordTypeStr string) (pgpassword.PasswordType, error) { - passwordType, ok := passwordTypeStrings[passwordTypeStr] - - if !ok { - return passwordType, ErrPasswordTypeInvalid - } - - return passwordType, nil -} diff --git a/pkg/apiservermsgs/usermsgs_test.go b/pkg/apiservermsgs/usermsgs_test.go deleted file mode 100644 index 0f6d39b754..0000000000 --- a/pkg/apiservermsgs/usermsgs_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package apiservermsgs - -/* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. - 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. -*/ - -import ( - "testing" - - pgpassword "github.com/crunchydata/postgres-operator/internal/postgres/password" -) - -func TestGetPasswordType(t *testing.T) { - t.Run("valid", func(t *testing.T) { - tests := map[string]pgpassword.PasswordType{ - "": pgpassword.MD5, - "md5": pgpassword.MD5, - "scram": pgpassword.SCRAM, - "scram-sha-256": pgpassword.SCRAM, - } - - for passwordTypeStr, expected := range tests { - t.Run(passwordTypeStr, func(t *testing.T) { - passwordType, err := GetPasswordType(passwordTypeStr) - - if err != nil { - t.Error(err) - return - } - - if passwordType != expected { - t.Errorf("password type %q should yield %d", passwordTypeStr, expected) - } - }) - } - }) - - t.Run("invalid", func(t *testing.T) { - tests := map[string]error{ - "magic": ErrPasswordTypeInvalid, - "scram-sha-512": ErrPasswordTypeInvalid, - } - - for passwordTypeStr, expected := range tests { - t.Run(passwordTypeStr, func(t *testing.T) { - if _, err := GetPasswordType(passwordTypeStr); err != expected { - t.Errorf("password type %q should yield error %q", passwordTypeStr, expected.Error()) - } - }) - } - }) -} diff --git a/pkg/events/eventing.go b/pkg/events/eventing.go index 3ea0e68044..5efcf7d328 100644 --- a/pkg/events/eventing.go +++ b/pkg/events/eventing.go @@ -19,18 +19,16 @@ import ( "encoding/json" "errors" "fmt" - crunchylog "github.com/crunchydata/postgres-operator/internal/logging" - "github.com/nsqio/go-nsq" - log "github.com/sirupsen/logrus" "os" "reflect" "time" + + "github.com/nsqio/go-nsq" + log "github.com/sirupsen/logrus" ) // String returns the string form for a given LogLevel func Publish(e EventInterface) error { - //Add logging configuration - crunchylog.CrunchyLogger(crunchylog.SetParameters()) eventAddr := os.Getenv("EVENT_ADDR") if eventAddr == "" { return errors.New("EVENT_ADDR not set") From ba89897b20c916ffaf70caa3a0726131a05f127d Mon Sep 17 00:00:00 2001 From: Roel Adriaans Date: Fri, 12 Feb 2021 22:32:27 +0100 Subject: [PATCH 069/129] Fix typo in create cluster tutorial Replaces "testuer" with -"testuser". --- docs/content/tutorial/create-cluster.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/tutorial/create-cluster.md b/docs/content/tutorial/create-cluster.md index 423f0a4dbb..3012787e93 100644 --- a/docs/content/tutorial/create-cluster.md +++ b/docs/content/tutorial/create-cluster.md @@ -65,7 +65,7 @@ So what just happened? Let's break down what occurs during the create cluster pr - Creating [persistent volume claims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) (PVCs) for the PostgreSQL instance and the pgBackRest repository. - Creating [services](https://kubernetes.io/docs/concepts/services-networking/service/) that provide a stable network interface for connecting to the PostgreSQL instance and pgBackRest repository. - Creating [deployments](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) that house each PostgreSQL instance and pgBackRest repository. Each of these is responsible for one Pod. - - The PostgreSQL Pod, when it is started, provisions a PostgreSQL database and performs other bootstrapping functions, such as creating `testuer`. + - The PostgreSQL Pod, when it is started, provisions a PostgreSQL database and performs other bootstrapping functions, such as creating `testuser`. - The pgBackRest Pod, when it is started, initializes a pgBackRest repository. Note that the pgBackRest repository is not yet ready to start taking backups, but will be after the next step! 3. When the PostgreSQL Operator detects that the PostgreSQL and pgBackRest deployments are up and running, it creates a Kubenretes Job to create a pgBackRest stanza. This is necessary as part of intializing the pgBackRest repository to accept backups from our PostgreSQL cluster. From 7d6b3aebe3241eafb10fc2049a9c4c29a3abc609 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 21 Feb 2021 22:28:31 -0500 Subject: [PATCH 070/129] Bump version 4.5.2 --- Makefile | 8 +-- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 +- docs/config.toml | 18 +++---- docs/content/Configuration/compatibility.md | 7 +++ docs/content/Upgrade/manual/upgrade4.md | 4 +- docs/content/releases/4.5.2.md | 54 +++++++++++++++++++ docs/content/tutorial/pgbouncer.md | 2 +- examples/create-by-resource/fromcrd.json | 6 +-- examples/envs.sh | 4 +- examples/helm/README.md | 4 +- .../create-cluster/templates/pgcluster.yaml | 2 +- examples/helm/create-cluster/values.yaml | 4 +- installers/ansible/README.md | 2 +- installers/ansible/values.yaml | 6 +-- installers/gcp-marketplace/Makefile | 2 +- installers/gcp-marketplace/README.md | 2 +- installers/gcp-marketplace/values.yaml | 6 +-- installers/helm/Chart.yaml | 2 +- installers/helm/values.yaml | 6 +-- installers/kubectl/client-setup.sh | 2 +- .../kubectl/postgres-operator-ocp311.yml | 8 +-- installers/kubectl/postgres-operator.yml | 8 +-- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- installers/metrics/helm/helm_template.yaml | 2 +- installers/metrics/helm/values.yaml | 2 +- .../postgres-operator-metrics-ocp311.yml | 2 +- .../kubectl/postgres-operator-metrics.yml | 2 +- installers/olm/Makefile | 6 +-- internal/util/util_test.go | 24 ++++----- pkg/apis/crunchydata.com/v1/doc.go | 8 +-- pkg/apiservermsgs/common.go | 2 +- redhat/atomic/help.1 | 2 +- redhat/atomic/help.md | 2 +- 36 files changed, 141 insertions(+), 80 deletions(-) create mode 100644 docs/content/releases/4.5.2.md diff --git a/Makefile b/Makefile index 413a6a8181..464bc28483 100644 --- a/Makefile +++ b/Makefile @@ -4,14 +4,14 @@ GOBIN ?= $(GOPATH)/bin # Default values if not already set ANSIBLE_VERSION ?= 2.9.* PGOROOT ?= $(GOPATH)/src/github.com/crunchydata/postgres-operator -PGO_BASEOS ?= centos7 +PGO_BASEOS ?= centos8 PGO_CMD ?= kubectl PGO_IMAGE_PREFIX ?= crunchydata PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) PGO_OPERATOR_NAMESPACE ?= pgo -PGO_VERSION ?= 4.5.1 +PGO_VERSION ?= 4.5.2 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.5 +PGO_PG_FULLVERSION ?= 12.6 PGO_BACKREST_VERSION ?= 2.29 PACKAGER ?= yum @@ -61,7 +61,7 @@ ifeq ("$(PGO_BASEOS)", "ubi8") PACKAGER=dnf endif -ifeq ("$(PGO_BASEOS)", "centos7") +ifeq ("$(PGO_BASEOS)", "centos8") DFSET=centos DOCKERBASEREGISTRY=centos: endif diff --git a/README.md b/README.md index 0a2784b7d6..fdd72b8cb9 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,7 @@ Based on your storage settings in your Kubernetes environment, you may be able t ```shell kubectl create namespace pgo -kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.1/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.2/installers/kubectl/postgres-operator.yml ``` Otherwise, we highly recommend following the instructions from our [Quickstart](https://access.crunchydata.com/documentation/postgres-operator/latest/quickstart/). diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index d476c07b0b..5a293622b5 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -16,7 +16,7 @@ GCR_IMAGE_PREFIX=gcr.io/crunchy-dev-test CCP_IMAGE_PREFIX=crunchydata -CCP_IMAGE_TAG=centos7-12.5-4.5.1 +CCP_IMAGE_TAG=centos8-12.6-4.5.2 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index 622fc268f8..c98c69aa98 100644 --- a/conf/postgres-operator/pgo.yaml +++ b/conf/postgres-operator/pgo.yaml @@ -2,7 +2,7 @@ Cluster: CCPImagePrefix: registry.developers.crunchydata.com/crunchydata Metrics: false Badger: false - CCPImageTag: centos7-12.5-4.5.1 + CCPImageTag: centos8-12.6-4.5.2 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -82,4 +82,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos7-4.5.1 + PGOImageTag: centos8-4.5.2 diff --git a/docs/config.toml b/docs/config.toml index dc39d49daa..7d328e9564 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,16 +25,16 @@ disableNavChevron = false # set true to hide next/prev chevron, default is false highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter menushortcutsnewtab = true # set true to open shortcuts links to a new tab/window enableGitInfo = true -operatorVersion = "4.5.1" -postgresVersion = "12.5" -postgresVersion13 = "13.1" -postgresVersion12 = "12.5" -postgresVersion11 = "11.10" -postgresVersion10 = "10.15" -postgresVersion96 = "9.6.20" -postgresVersion95 = "9.5.24" +operatorVersion = "4.5.2" +postgresVersion = "12.6" +postgresVersion13 = "13.2" +postgresVersion12 = "12.6" +postgresVersion11 = "11.11" +postgresVersion10 = "10.16" +postgresVersion96 = "9.6.21" +postgresVersion95 = "9.5.25" postgisVersion = "3.0" -centosBase = "centos7" +centosBase = "centos8" [outputs] home = [ "HTML", "RSS", "JSON"] diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index 43af7021db..57e86019b8 100644 --- a/docs/content/Configuration/compatibility.md +++ b/docs/content/Configuration/compatibility.md @@ -12,6 +12,13 @@ version dependencies between the two projects. Below are the operator releases a | Operator Release | Container Release | Postgres | PgBackrest Version |:----------|:-------------|:------------|:-------------- +| 4.5.2 | 4.5.2 | 13.2 | 2.29 | +|||12.6|2.29| +|||11.11|2.29| +|||10.16|2.29| +|||9.6.21|2.29| +|||9.5.25|2.29| +|||| | 4.5.1 | 4.5.1 | 13.1 | 2.29 | |||12.5|2.29| |||11.10|2.29| diff --git a/docs/content/Upgrade/manual/upgrade4.md b/docs/content/Upgrade/manual/upgrade4.md index da11f86f15..01d6ac1d32 100644 --- a/docs/content/Upgrade/manual/upgrade4.md +++ b/docs/content/Upgrade/manual/upgrade4.md @@ -58,7 +58,7 @@ For example, given the following output: ``` $ pgo show cluster mycluster -cluster : mycluster (crunchy-postgres:centos7-11.5-2.4.2) +cluster : mycluster (crunchy-postgres:centos8-11.5-2.4.2) pod : mycluster-7bbf54d785-pk5dq (Running) on kubernetes1 (1/1) (replica) pvc : mycluster pod : mycluster-ypvq-5b9b8d645-nvlb6 (Running) on kubernetes1 (1/1) (primary) @@ -223,7 +223,7 @@ For example, given the following output: ``` $ pgo show cluster mycluster -cluster : mycluster (crunchy-postgres:centos7-11.5-2.4.2) +cluster : mycluster (crunchy-postgres:centos8-11.5-2.4.2) pod : mycluster-7bbf54d785-pk5dq (Running) on kubernetes1 (1/1) (replica) pvc : mycluster pod : mycluster-ypvq-5b9b8d645-nvlb6 (Running) on kubernetes1 (1/1) (primary) diff --git a/docs/content/releases/4.5.2.md b/docs/content/releases/4.5.2.md new file mode 100644 index 0000000000..3914ef2b2d --- /dev/null +++ b/docs/content/releases/4.5.2.md @@ -0,0 +1,54 @@ +--- +title: "4.5.2" +date: +draft: false +weight: 68 +--- + +Crunchy Data announces the release of the PostgreSQL Operator 4.5.2 on February 23, 2021. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +PostgreSQL Operator 4.5.2 release includes the following software versions upgrades: + +- [PostgreSQL](https://www.postgresql.org) is now at versions 13.2, 12.6, 11.11, 10.16, 9.6.21, and 9.5.25. +- pgnodemx now uses version 1.0.3 + +PostgreSQL Operator is tested against Kubernetes 1.17 - 1.20, OpenShift 3.11, OpenShift 4.4+, Google Kubernetes Engine (GKE), Amazon EKS, Microsoft AKS, and VMware Enterprise PKS 1.3+, and works on other Kubernetes distributions as well. + +## Changes + +- `crunchy-postgres-exporter` now exposes several pgMonitor metrics related to `pg_stat_statements`. +- When using the `--restore-from` option on `pgo create cluster` to create a new PostgreSQL cluster, the cluster bootstrap Job is now automatically removed if it completes successfully. +- PostgreSQL JIT compilation is explicitly disabled on new cluster creation. This prevents a memory leak that has been observed on queries coming from the metrics exporter. +- The `--compress-type` flag is now supported for the backup options (`--backup-opts`) for pgBackRest backups with `pgo backup`. `none`, `gz`, `bz2`, and `lz4` are all supported. Presently `zst` is not supported. +- The post-cluster creation pgBackRest tasks, i.e. creating a stanza and creating an initial backup, are now deleted by the Operator should they complete successfully. Besides good housekeeping, this provides a workaround for an OpenShift 3.11 bug that was causing the Operator to continuously issue pgBackRest backups during an OpenShift refresh cycle. Reported by Paul Heinen (@v3nturetheworld). +- Add the `--no-prompt` flag to `pgo upgrade`. The mechanism to disable the prompt verification was already in place, but the flag was not exposed. Reported by (@devopsevd). +- Removes certain characters that causes issues in shell environments from consideration when using the random password generator, which is used to create default passwords or with `--rotate-password`. +- Allow for the `--link-map` attribute for a pgBackRest option, which can help with the restore of an existing cluster to a new cluster that adds an external WAL volume. + +## Fixes + +- Fix issue where `pgo test` would indicate every Service was a replica if the cluster name contained the word `replica` in it. Reported by Jose Joye (@jose-joye). +- Do not consider Evicted Pods as part of `pgo test`. This eliminates a behavior where faux primaries are considered as part of `pgo test`. Reported by Dennis Jacobfeuerborn (@dennisjac). +- Fix `pgo df` to not fail in the event it tries to execute a command within a dangling container from the bootstrap process when `pgo create cluster --restore-from` is used. Reported by Ignacio J.Ortega (@IJOL). +- `pgo df` will now only attempt to execute in running Pods, i.e. it does not attempt to run in evicted Pods. Reported by (@kseswar). +- Ensure the sync replication ConfigMap is removed when a cluster is deleted. +- Fix crash in shutdown logic when attempting to shut down a cluster where no primaries exist. Reported by Jeffrey den Drijver (@JeffreyDD). +- Fix syntax in recovery check command which could lead to failures when manually promoting a standby cluster. Reported by (@SockenSalat). +- Fix potential race condition that could lead to a crash in the Operator boot when an error is issued around loading the `pgo-config` ConfigMap. Reported by Aleksander Roszig (@AleksanderRoszig). +- Do not trigger a backup if a standby cluster fails over. Reported by (@aprilito1965). +- Fix issue with `pgo backup` where it was unable to take a backup from a new primary after `pgo failover` was called. Reported by (@mesobreira). +- On initialization, check that primary PostgreSQL Deployment is created before attempting to scale. +- Ensure `archive_mode` is forced to `on` when performing using the "restore in place" method. This ensures that the timeline is correctly incremented post-restore, which could manifest itself with various types of WAL archive failures. +- Ensure pgBouncer Secret is created when adding it to a standby cluster. +- Generally improvements to initialization of a standby cluster. +- Ensure proper label parsing based on Kubernetes rules and that it is consistently applied across all functionality that uses labels. Reported by José Joye (@jose-joye). +- Remove legacy `defaultMode` setting on the volume instructions for the pgBackRest repo Secret as the `readOnly` setting is used on the mount itself. Reported by (@szhang1). +- Only attempts to start scheduled backups in running pgBackRest repository Pods. Reported by Satria Sahputra (@satriashp). +- Allow for `Restart` API server permission to be explicitly set. Reported by Aleksander Roszig (@AleksanderRoszig). +- Update `pgo-target` permissions to match expectations for modern Kubernetes versions. +- Support the substitution for the limit on the number of queries to include the the `pg_stat_statements` support of pgMonitor. Defaults to 20, which is the pgMonitor upstream value. Contributed by Steven Siahetiong (@ssiahetiong). +- Major upgrade container now includes references for `pgnodemx`. +- During a major upgrade, ensure permissions are correct on the old data directory before running `pg_upgrade`. +- The metrics stack installer is fixed to work in environments that may not have connectivity to the Internet ("air gapped"). Reported by (@eliranw). diff --git a/docs/content/tutorial/pgbouncer.md b/docs/content/tutorial/pgbouncer.md index 0349ff1eaf..2e189bb76f 100644 --- a/docs/content/tutorial/pgbouncer.md +++ b/docs/content/tutorial/pgbouncer.md @@ -116,7 +116,7 @@ PGPASSWORD=randompassword psql -h localhost -p 5432 -U pgbouncer pgbouncer You should see something similar to this: ``` -psql (12.5, server 1.14.0/bouncer) +psql (12.6, server 1.14.0/bouncer) Type "help" for help. pgbouncer=# diff --git a/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index ea603808ac..81fa142821 100644 --- a/examples/create-by-resource/fromcrd.json +++ b/examples/create-by-resource/fromcrd.json @@ -16,7 +16,7 @@ "pg-cluster": "fromcrd", "pg-pod-anti-affinity": "", "pgo-backrest": "true", - "pgo-version": "4.5.1", + "pgo-version": "4.5.2", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos7-12.5-4.5.1", + "ccpimagetag": "centos8-12.6-4.5.2", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy-postgres-exporter": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.5.1", + "pgo-version": "4.5.2", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index b17080fb17..9d00960260 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -22,8 +22,8 @@ export PGO_CONF_DIR=$PGOROOT/installers/ansible/roles/pgo-operator/files # the version of the Operator you run is set by these vars export PGO_IMAGE_PREFIX=registry.developers.crunchydata.com/crunchydata -export PGO_BASEOS=centos7 -export PGO_VERSION=4.5.1 +export PGO_BASEOS=centos8 +export PGO_VERSION=4.5.2 export PGO_IMAGE_TAG=$PGO_BASEOS-$PGO_VERSION # for setting the pgo apiserver port, disabling TLS or not verifying TLS diff --git a/examples/helm/README.md b/examples/helm/README.md index 390bfbbaae..230906684c 100644 --- a/examples/helm/README.md +++ b/examples/helm/README.md @@ -22,10 +22,10 @@ https://access.crunchydata.com/documentation/postgres-operator/latest/custom-res ## Setup -If you are running Postgres Operator 4.5.1 or later, you can skip the below +If you are running Postgres Operator 4.5.2 or later, you can skip the below step. -### Before 4.5.1 +### Before 4.5.2 ``` cd postgres-operator/examples/helm/create-cluster diff --git a/examples/helm/create-cluster/templates/pgcluster.yaml b/examples/helm/create-cluster/templates/pgcluster.yaml index 0852b1f447..fab6c18d93 100644 --- a/examples/helm/create-cluster/templates/pgcluster.yaml +++ b/examples/helm/create-cluster/templates/pgcluster.yaml @@ -13,7 +13,7 @@ metadata: pg-cluster: {{ .Values.pgclustername }} pg-pod-anti-affinity: "" pgo-backrest: "true" - pgo-version: 4.5.1 + pgo-version: 4.5.2 pgouser: admin name: {{ .Values.pgclustername }} namespace: {{ .Values.namespace }} diff --git a/examples/helm/create-cluster/values.yaml b/examples/helm/create-cluster/values.yaml index 4add0e560f..f334830007 100644 --- a/examples/helm/create-cluster/values.yaml +++ b/examples/helm/create-cluster/values.yaml @@ -4,11 +4,11 @@ # The values is for the namespace and the postgresql cluster name ccpimage: crunchy-postgres-ha ccpimageprefix: registry.developers.crunchydata.com/crunchydata -ccpimagetag: centos7-12.5-4.5.1 +ccpimagetag: centos8-12.6-4.5.2 namespace: pgo pgclustername: hippo pgoimageprefix: registry.developers.crunchydata.com/crunchydata -pgoversion: 4.5.1 +pgoversion: 4.5.2 hipposecretuser: "hippo" hipposecretpassword: "Supersecurepassword*" postgressecretuser: "postgres" diff --git a/installers/ansible/README.md b/installers/ansible/README.md index 345d035037..238f1398bb 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.1 +Latest Release: 4.5.2 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index ebce0ed751..acde59ad02 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -17,7 +17,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos7-12.5-4.5.1" +ccp_image_tag: "centos8-12.6-4.5.2" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -50,14 +50,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.1" +pgo_client_version: "4.5.2" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos7-4.5.1" +pgo_image_tag: "centos8-4.5.2" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index 6236ae3ad8..a5ca4e43e1 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -6,7 +6,7 @@ MARKETPLACE_TOOLS ?= gcr.io/cloud-marketplace-tools/k8s/dev:$(MARKETPLACE_VERSIO MARKETPLACE_VERSION ?= 0.9.4 KUBECONFIG ?= $(HOME)/.kube/config PARAMETERS ?= {} -PGO_VERSION ?= 4.5.1 +PGO_VERSION ?= 4.5.2 IMAGE_BUILD_ARGS = --build-arg MARKETPLACE_VERSION='$(MARKETPLACE_VERSION)' \ --build-arg PGO_VERSION='$(PGO_VERSION)' diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index af2e60f80c..6a5c1429c8 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -59,7 +59,7 @@ Google Cloud Marketplace. ```shell IMAGE_REPOSITORY=gcr.io/crunchydata-public/postgres-operator - export PGO_VERSION=4.5.1 + export PGO_VERSION=4.5.2 export INSTALLER_IMAGE=${IMAGE_REPOSITORY}/deployer:${PGO_VERSION} export OPERATOR_IMAGE=${IMAGE_REPOSITORY}:${PGO_VERSION} export OPERATOR_IMAGE_API=${IMAGE_REPOSITORY}/pgo-apiserver:${PGO_VERSION} diff --git a/installers/gcp-marketplace/values.yaml b/installers/gcp-marketplace/values.yaml index e2ed852df1..4c514f533f 100644 --- a/installers/gcp-marketplace/values.yaml +++ b/installers/gcp-marketplace/values.yaml @@ -10,7 +10,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos7-12.5-4.5.1" +ccp_image_tag: "centos8-12.6-4.5.2" create_rbac: "true" db_name: "" db_password_age_days: "0" @@ -32,9 +32,9 @@ pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" pgo_client_container_install: "false" pgo_client_install: 'false' -pgo_client_version: "4.5.1" +pgo_client_version: "4.5.2" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos7-4.5.1" +pgo_image_tag: "centos8-4.5.2" pgo_installation_name: '${OPERATOR_NAME}' pgo_operator_namespace: '${OPERATOR_NAMESPACE}' scheduler_timeout: "3600" diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index e7a55444cb..6b32ef6d5e 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -3,7 +3,7 @@ name: postgres-operator description: Crunchy PostgreSQL Operator Helm chart for Kubernetes type: application version: 0.1.0 -appVersion: 4.5.1 +appVersion: 4.5.2 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/crunchy_logo.png keywords: diff --git a/installers/helm/values.yaml b/installers/helm/values.yaml index b2c5d441b2..f7bb96330c 100644 --- a/installers/helm/values.yaml +++ b/installers/helm/values.yaml @@ -37,7 +37,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos7-12.5-4.5.1" +ccp_image_tag: "centos8-12.6-4.5.2" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -70,14 +70,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.1" +pgo_client_version: "4.5.2" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos7-4.5.1" +pgo_image_tag: "centos8-4.5.2" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index 1504009506..455c91bd63 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -14,7 +14,7 @@ # This script should be run after the operator has been deployed PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}" PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}" -PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.1}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.2}" PGO_CLIENT_URL="https://github.com/CrunchyData/postgres-operator/releases/download/${PGO_CLIENT_VERSION}" PGO_CMD="${PGO_CMD-kubectl}" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 977c9ea790..33567fa374 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -44,7 +44,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos7-12.5-4.5.1" + ccp_image_tag: "centos8-12.6-4.5.2" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -77,14 +77,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.1" + pgo_client_version: "4.5.2" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos7-4.5.1" + pgo_image_tag: "centos8-4.5.2" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -161,7 +161,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.1 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.2 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index d163795cbe..a26a841742 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -139,7 +139,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos7-12.5-4.5.1" + ccp_image_tag: "centos8-12.6-4.5.2" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -172,14 +172,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.1" + pgo_client_version: "4.5.2" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos7-4.5.1" + pgo_image_tag: "centos8-4.5.2" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -269,7 +269,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.1 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.2 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index 57f68cd878..319de0231f 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.1 +Latest Release: 4.5.2 ## General diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index 520204c2d1..91853271ac 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-monitoring description: Install for Crunchy PostgreSQL Operator Monitoring type: application version: 0.1.0 -appVersion: 4.5.1 +appVersion: 4.5.2 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/crunchy_logo.png \ No newline at end of file diff --git a/installers/metrics/helm/helm_template.yaml b/installers/metrics/helm/helm_template.yaml index b328adba55..5af724ab41 100644 --- a/installers/metrics/helm/helm_template.yaml +++ b/installers/metrics/helm/helm_template.yaml @@ -20,5 +20,5 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos7-4.5.1" +pgo_image_tag: "centos8-4.5.2" diff --git a/installers/metrics/helm/values.yaml b/installers/metrics/helm/values.yaml index 616001b5ec..d10e50ddf0 100644 --- a/installers/metrics/helm/values.yaml +++ b/installers/metrics/helm/values.yaml @@ -20,7 +20,7 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos7-4.5.1" +pgo_image_tag: "centos8-4.5.2" # ===================== # Configuration Options diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index f4643fc126..aa38708858 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -96,7 +96,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.1 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.2 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index 313698aaeb..e1630c8601 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -165,7 +165,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.5.1 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.2 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index 41ee2405b2..8706e15016 100644 --- a/installers/olm/Makefile +++ b/installers/olm/Makefile @@ -2,15 +2,15 @@ .SUFFIXES: CCP_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -CCP_PG_FULLVERSION ?= 12.5 +CCP_PG_FULLVERSION ?= 12.6 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.15.1 OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSION) OLM_VERSION ?= 0.15.1 -PGO_BASEOS ?= centos7 +PGO_BASEOS ?= centos8 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.5.1 +PGO_VERSION ?= 4.5.2 PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) CCP_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(PGO_VERSION) CCP_POSTGIS_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(CCP_POSTGIS_VERSION)-$(PGO_VERSION) diff --git a/internal/util/util_test.go b/internal/util/util_test.go index 30d6d8b65d..b7ae785b55 100644 --- a/internal/util/util_test.go +++ b/internal/util/util_test.go @@ -18,25 +18,25 @@ func TestGetStandardImageTag(t *testing.T) { expected string }{ { - "image: crunchy-postgres-ha, tag: centos7-12.4-4.5.0", + "image: crunchy-postgres-ha, tag: centos8-12.4-4.5.0", "crunchy-postgres-ha", - "centos7-12.4-4.5.0", - "centos7-12.4-4.5.0", + "centos8-12.4-4.5.0", + "centos8-12.4-4.5.0", }, { - "image: crunchy-postgres-gis-ha, tag: centos7-12.4-3.0-4.5.0", + "image: crunchy-postgres-gis-ha, tag: centos8-12.4-3.0-4.5.0", "crunchy-postgres-gis-ha", - "centos7-12.4-3.0-4.5.0", - "centos7-12.4-4.5.0", + "centos8-12.4-3.0-4.5.0", + "centos8-12.4-4.5.0", }, { - "image: crunchy-postgres-ha, tag: centos7-12.4-4.5.0-beta.1", + "image: crunchy-postgres-ha, tag: centos8-12.4-4.5.0-beta.1", "crunchy-postgres-ha", - "centos7-12.4-4.5.0-beta.1", - "centos7-12.4-4.5.0-beta.1", + "centos8-12.4-4.5.0-beta.1", + "centos8-12.4-4.5.0-beta.1", }, { - "image: crunchy-postgres-gis-ha, tag: centos7-12.4-3.0-4.5.0-beta.2", + "image: crunchy-postgres-gis-ha, tag: centos8-12.4-3.0-4.5.0-beta.2", "crunchy-postgres-gis-ha", - "centos7-12.4-3.0-4.5.0-beta.2", - "centos7-12.4-4.5.0-beta.2", + "centos8-12.4-3.0-4.5.0-beta.2", + "centos8-12.4-4.5.0-beta.2", }, { "image: crunchy-postgres-ha, tag: centos8-9.5.23-4.5.0-rc.1", "crunchy-postgres-ha", diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 62cd5bc582..630f69fe82 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -53,7 +53,7 @@ cluster. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.1", + '{"ClientVersion":"4.5.2", "Namespace":"pgouser1", "Name":"mycluster", $PGO_APISERVER_URL/clusters @@ -72,7 +72,7 @@ show all of the clusters that are in the given namespace. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.1", + '{"ClientVersion":"4.5.2", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/showclusters @@ -82,7 +82,7 @@ $PGO_APISERVER_URL/showclusters curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.1", + '{"ClientVersion":"4.5.2", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.5.1 + Version: 4.5.2 License: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 Contact: Crunchy Data https://www.crunchydata.com/ diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index d52499aa4a..1f2307540b 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -const PGO_VERSION = "4.5.1" +const PGO_VERSION = "4.5.2" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index 6f9bfad143..69852f8802 100644 --- a/redhat/atomic/help.1 +++ b/redhat/atomic/help.1 @@ -56,4 +56,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa \fB\fCRelease=\fR .PP -The specific release number of the container. For example, Release="4.5.1" +The specific release number of the container. For example, Release="4.5.2" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index 1a12dbc144..73f61740a6 100644 --- a/redhat/atomic/help.md +++ b/redhat/atomic/help.md @@ -45,4 +45,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa `Release=` -The specific release number of the container. For example, Release="4.5.1" +The specific release number of the container. For example, Release="4.5.2" From b38e9df0399380398341ee135b408ea12811f888 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 22 Feb 2021 10:46:07 -0500 Subject: [PATCH 071/129] Fix overly aggressive substitution in Makefile Ensure that the centos7 instructions are still present. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 464bc28483..8527944c29 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,7 @@ ifeq ("$(PGO_BASEOS)", "ubi8") PACKAGER=dnf endif -ifeq ("$(PGO_BASEOS)", "centos8") +ifeq ("$(PGO_BASEOS)", "centos7") DFSET=centos DOCKERBASEREGISTRY=centos: endif From a2a3456b7faec49c138062dc96573bdf961bd150 Mon Sep 17 00:00:00 2001 From: Joseph Mckulka <16840147+jmckulk@users.noreply.github.com> Date: Thu, 14 Jan 2021 18:27:41 -0500 Subject: [PATCH 072/129] Update perms on deployer working directory The working directory for pgo-deployer (/tmp/.pgo) is now created at build time instead of install time. When building, the directory is created with root:root as user:group meaning the installer does not have permission to create the required subdirectories. This change recursively updates the user and group on /tmp/.pgo so that the installer can make changes. --- build/pgo-deployer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/pgo-deployer/Dockerfile b/build/pgo-deployer/Dockerfile index 2f18411334..79c3516d2c 100644 --- a/build/pgo-deployer/Dockerfile +++ b/build/pgo-deployer/Dockerfile @@ -79,7 +79,7 @@ ENV HOME="/tmp" RUN chmod g=u /etc/passwd RUN chmod g=u /uid_daemon.sh -RUN chown -R 2:2 /tmp/.pgo/metrics +RUN chown -R 2:2 /tmp/.pgo ENTRYPOINT ["/uid_daemon.sh"] From a8adcd069f53d33b2b9f2617de2e449b530e8ed3 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 22 Feb 2021 14:27:36 -0500 Subject: [PATCH 073/129] Allow for the existence of no labels when creating a cluster This fell on the trap of the "empty string being split", which by default creates a single entry in an array. As an empty string is not a valid label, this would fail on the default command. --- internal/apiserver/common.go | 5 +++++ internal/apiserver/common_test.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/internal/apiserver/common.go b/internal/apiserver/common.go index b6c665c652..a73e826a8a 100644 --- a/internal/apiserver/common.go +++ b/internal/apiserver/common.go @@ -155,6 +155,11 @@ func IsValidPVC(pvcName, ns string) bool { func ValidateLabel(labelStr string) (map[string]string, error) { labelMap := map[string]string{} + // if this is an empty string, return + if strings.TrimSpace(labelStr) == "" { + return labelMap, nil + } + for _, v := range strings.Split(labelStr, ",") { pair := strings.Split(v, "=") if len(pair) != 2 { diff --git a/internal/apiserver/common_test.go b/internal/apiserver/common_test.go index 992cc134b7..712ca11611 100644 --- a/internal/apiserver/common_test.go +++ b/internal/apiserver/common_test.go @@ -72,12 +72,17 @@ func TestValidateLabel(t *testing.T) { map[string]string{"key": "value"}, map[string]string{"example.com/key": "value"}, map[string]string{"key1": "value1", "key2": "value2"}, + map[string]string{"": ""}, } for _, input := range inputs { labelStr := "" for k, v := range input { + if k == "" && v == "" { + continue + } + labelStr += fmt.Sprintf("%s=%s,", k, v) } From d2b1c5cbd95bbc232e89b7fe598d5bf382e73fc1 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sat, 27 Feb 2021 16:44:49 -0500 Subject: [PATCH 074/129] Revert changes from 05742298 05742298 was designed to workaround an issue with the Docker packaging from Red Hat that introduced a bug which prevented the containers from properly loading. Given we are in a single-user environment that only uses ssh public key authentication for performing pgBackRest operations, we can set "UsePAM" to "no". This allows for one to run the containers with a security context of "allowPrivilegeEscalation" set to "false". Issue: [ch10588] --- .../files/pgo-backrest-repo/sshd_config | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config b/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config index 3a96f209da..f79f039771 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config +++ b/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config @@ -80,18 +80,9 @@ ChallengeResponseAuthentication yes #GSSAPIKeyExchange no #GSSAPIEnablek5users no -# Set this to 'yes' to enable PAM authentication, account processing, -# and session processing. If this is enabled, PAM authentication will -# be allowed through the ChallengeResponseAuthentication and -# PasswordAuthentication. Depending on your PAM configuration, -# PAM authentication via ChallengeResponseAuthentication may bypass -# the setting of "PermitRootLogin without-password". -# If you just want the PAM account and session checks to run without -# PAM authentication, then enable this but set PasswordAuthentication -# and ChallengeResponseAuthentication to 'no'. -# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several -# problems. -UsePAM yes +# This is set explicitly to *no* as we are only using pubkey authentication and +# because each container is isolated to only an unprivileged user. +UsePAM No #AllowAgentForwarding yes #AllowTcpForwarding yes From 6219d05c033e64bb8b5f00fb48569b51aaa3aef6 Mon Sep 17 00:00:00 2001 From: jmckulk Date: Tue, 23 Feb 2021 12:40:16 -0500 Subject: [PATCH 075/129] Update e2e helper functions to user t.Cleanup When these helper functions were added the t.Cleanup function did not exist. This change removes defer calls in favor of t.Cleanup. --- testing/pgo_cli/suite_helpers_test.go | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/testing/pgo_cli/suite_helpers_test.go b/testing/pgo_cli/suite_helpers_test.go index b4db220487..57067a863b 100644 --- a/testing/pgo_cli/suite_helpers_test.go +++ b/testing/pgo_cli/suite_helpers_test.go @@ -327,12 +327,6 @@ func withCluster(t testing.TB, namespace func() string, during func(func() strin var name string var once sync.Once - defer func() { - if name != "" { - teardownCluster(t, namespace(), name, created) - } - }() - during(func() string { once.Do(func() { generated := names.SimpleNameGenerator.GenerateName("pgo-test-") @@ -343,6 +337,10 @@ func withCluster(t testing.TB, namespace func() string, during func(func() strin created = time.Now() name = generated } + + t.Cleanup(func() { + teardownCluster(t, namespace(), name, created) + }) }) return name }) @@ -364,13 +362,6 @@ func withNamespace(t testing.TB, during func(func() string)) { var namespace *core_v1.Namespace var once sync.Once - defer func() { - if namespace != nil { - err := TestContext.Kubernetes.DeleteNamespace(namespace.Name) - assert.NoErrorf(t, err, "unable to tear down namespace %q", namespace.Name) - } - }() - during(func() string { once.Do(func() { ns, err := TestContext.Kubernetes.GenerateNamespace( @@ -381,6 +372,11 @@ func withNamespace(t testing.TB, during func(func() string)) { _, err = pgo("update", "namespace", namespace.Name).Exec(t) assert.NoErrorf(t, err, "unable to take ownership of namespace %q", namespace.Name) } + + t.Cleanup(func() { + err := TestContext.Kubernetes.DeleteNamespace(namespace.Name) + assert.NoErrorf(t, err, "unable to tear down namespace %q", namespace.Name) + }) }) return namespace.Name From bcb00ca188c5737a3e3518a505c2035d19650f03 Mon Sep 17 00:00:00 2001 From: jmckulk Date: Tue, 23 Feb 2021 12:53:42 -0500 Subject: [PATCH 076/129] Add annotation e2e test This change adds an end-to-end test for the annotation functionality for the operator. Tests are added to create, update, and remove annotations from the cluster deployment. --- testing/kubeapi/deployment.go | 10 + testing/pgo_cli/cluster_annotation_test.go | 247 +++++++++++++++++++++ testing/pgo_cli/suite_helpers_test.go | 10 + 3 files changed, 267 insertions(+) create mode 100644 testing/pgo_cli/cluster_annotation_test.go diff --git a/testing/kubeapi/deployment.go b/testing/kubeapi/deployment.go index 4b864d326a..52ab85e4c9 100644 --- a/testing/kubeapi/deployment.go +++ b/testing/kubeapi/deployment.go @@ -22,3 +22,13 @@ func (k *KubeAPI) ListDeployments(namespace string, labels map[string]string) ([ return list.Items, err } + +// GetDeployment returns deployment by name, if exists. +func (k *KubeAPI) GetDeployment(namespace, name string) *apps_v1.Deployment { + deployment, err := k.Client.AppsV1().Deployments(namespace).Get(name, meta_v1.GetOptions{}) + if deployment == nil && err != nil { + deployment = &apps_v1.Deployment{} + } + + return deployment +} diff --git a/testing/pgo_cli/cluster_annotation_test.go b/testing/pgo_cli/cluster_annotation_test.go new file mode 100644 index 0000000000..e0a2b9286f --- /dev/null +++ b/testing/pgo_cli/cluster_annotation_test.go @@ -0,0 +1,247 @@ +package pgo_cli_test + +/* + Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + 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. +*/ + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestClusterAnnotation(t *testing.T) { + t.Parallel() + + withNamespace(t, func(namespace func() string) { + t.Run("on create", func(t *testing.T) { + t.Parallel() + tests := []struct { + testName string + annotations map[string]string + clusterFlags []string + addFlags []string + removeFlags []string + deployments []string + }{ + { + testName: "create-global", + annotations: map[string]string{ + "global": "here", + "global2": "foo", + }, + clusterFlags: []string{"--pgbouncer"}, + addFlags: []string{"--annotation=global=here", "--annotation=global2=foo"}, + removeFlags: []string{"--annotation=global-", "--annotation=global2-"}, + deployments: []string{"create-global", "create-global-backrest-shared-repo", "create-global-pgbouncer"}, + }, { + testName: "create-postgres", + annotations: map[string]string{ + "postgres": "present", + }, + clusterFlags: []string{}, + addFlags: []string{"--annotation-postgres=postgres=present"}, + removeFlags: []string{"--annotation-postgres=postgres-"}, + deployments: []string{"create-postgres"}, + }, { + testName: "create-pgbackrest", + annotations: map[string]string{ + "pgbackrest": "what", + }, + clusterFlags: []string{}, + addFlags: []string{"--annotation-pgbackrest=pgbackrest=what"}, + removeFlags: []string{"--annotation-pgbackrest=pgbackrest-"}, + deployments: []string{"create-pgbackrest-backrest-shared-repo"}, + }, { + testName: "create-pgbouncer", + annotations: map[string]string{ + "pgbouncer": "aqui", + }, + clusterFlags: []string{"--pgbouncer"}, + addFlags: []string{"--annotation-pgbouncer=pgbouncer=aqui"}, + removeFlags: []string{"--annotation-pgbouncer=pgbouncer-"}, + deployments: []string{"create-pgbouncer-pgbouncer"}, + }, { + testName: "remove-one", + annotations: map[string]string{ + "leave": "me", + }, + clusterFlags: []string{"--pgbouncer"}, + addFlags: []string{"--annotation=remove=me", "--annotation=leave=me"}, + removeFlags: []string{"--annotation=remove-"}, + deployments: []string{"remove-one", "remove-one-backrest-shared-repo", "remove-one-pgbouncer"}, + }, + } + + for _, test := range tests { + test := test // lock test variable in for each run since it changes across parallel loops + t.Run(test.testName, func(t *testing.T) { + t.Parallel() + createCMD := []string{"create", "cluster", test.testName, "-n", namespace()} + createCMD = append(createCMD, test.clusterFlags...) + createCMD = append(createCMD, test.addFlags...) + output, err := pgo(createCMD...).Exec(t) + t.Cleanup(func() { + teardownCluster(t, namespace(), test.testName, time.Now()) + }) + require.NoError(t, err) + require.Contains(t, output, "created cluster:") + + requireClusterReady(t, namespace(), test.testName, (2 * time.Minute)) + if contains(test.clusterFlags, "--pgbouncer") { + requirePgBouncerReady(t, namespace(), test.testName, (2 * time.Minute)) + } + + t.Run("add", func(t *testing.T) { + for _, deploymentName := range test.deployments { + for expectedKey, expectedValue := range test.annotations { + hasAnnotation := func() bool { + actualAnnotations := TestContext.Kubernetes.GetDeployment(namespace(), deploymentName).Spec.Template.ObjectMeta.GetAnnotations() + actualValue := actualAnnotations[expectedKey] + if actualValue == expectedValue { + return true + } + + return false + } + + requireWaitFor(t, hasAnnotation, time.Minute, time.Second, + "timeout waiting for deployment \"%q\" to have annotation \"%s: %s\"", deploymentName, expectedKey, expectedValue) + } + } + }) + + t.Run("remove", func(t *testing.T) { + t.Skip("Bug: annotation in not removed on update") + updateCMD := []string{"update", "cluster", test.testName, "-n", namespace(), "--no-prompt"} + updateCMD = append(updateCMD, test.removeFlags...) + output, err := pgo(updateCMD...).Exec(t) + require.NoError(t, err) + require.Contains(t, output, "updated pgcluster") + + for _, deploymentName := range test.deployments { + for expectedKey, _ := range test.annotations { + notHasAnnotation := func() bool { + actualAnnotations := TestContext.Kubernetes.GetDeployment(namespace(), deploymentName).Spec.Template.ObjectMeta.GetAnnotations() + actualValue := actualAnnotations[expectedKey] + if actualValue != "" { + return false + } + + return true + } + + requireWaitFor(t, notHasAnnotation, time.Minute, time.Second, + "timeout waiting for annotation key \"%s\" to be removed from deployment \"%s\"", expectedKey, deploymentName) + } + } + }) + }) + } + }) + + t.Run("on update", func(t *testing.T) { + t.Parallel() + + tests := []struct { + testName string + annotations map[string]string + clusterFlags []string + addFlags []string + deployments []string + }{ + { + testName: "update-global", + annotations: map[string]string{ + "global": "here", + "global2": "foo", + }, + clusterFlags: []string{"--pgbouncer"}, + addFlags: []string{"--annotation=global=here", "--annotation=global2=foo"}, + deployments: []string{"update-global", "update-global-backrest-shared-repo", "update-global-pgbouncer"}, + }, { + testName: "update-postgres", + annotations: map[string]string{ + "postgres": "present", + }, + clusterFlags: []string{}, + addFlags: []string{"--annotation-postgres=postgres=present"}, + deployments: []string{"update-postgres"}, + }, { + testName: "update-pgbackrest", + annotations: map[string]string{ + "pgbackrest": "what", + }, + clusterFlags: []string{}, + addFlags: []string{"--annotation-pgbackrest=pgbackrest=what"}, + deployments: []string{"update-pgbackrest-backrest-shared-repo"}, + }, { + testName: "update-pgbouncer", + annotations: map[string]string{ + "pgbouncer": "aqui", + }, + clusterFlags: []string{"--pgbouncer"}, + addFlags: []string{"--annotation-pgbouncer=pgbouncer=aqui"}, + deployments: []string{"update-pgbouncer-pgbouncer"}, + }, + } + + for _, test := range tests { + test := test // lock test variable in for each run since it changes across parallel loops + t.Run(test.testName, func(t *testing.T) { + t.Parallel() + createCMD := []string{"create", "cluster", test.testName, "-n", namespace()} + createCMD = append(createCMD, test.clusterFlags...) + output, err := pgo(createCMD...).Exec(t) + t.Cleanup(func() { + teardownCluster(t, namespace(), test.testName, time.Now()) + }) + require.NoError(t, err) + require.Contains(t, output, "created cluster:") + + requireClusterReady(t, namespace(), test.testName, (2 * time.Minute)) + if contains(test.clusterFlags, "--pgbouncer") { + requirePgBouncerReady(t, namespace(), test.testName, (2 * time.Minute)) + } + + updateCMD := []string{"update", "cluster", test.testName, "-n", namespace(), "--no-prompt"} + updateCMD = append(updateCMD, test.addFlags...) + output, err = pgo(updateCMD...).Exec(t) + require.NoError(t, err) + require.Contains(t, output, "updated pgcluster") + + t.Run("add", func(t *testing.T) { + for _, deploymentName := range test.deployments { + for expectedKey, expectedValue := range test.annotations { + hasAnnotation := func() bool { + actualAnnotations := TestContext.Kubernetes.GetDeployment(namespace(), deploymentName).Spec.Template.ObjectMeta.GetAnnotations() + actualValue := actualAnnotations[expectedKey] + if actualValue == expectedValue { + return true + } + + return false + } + + requireWaitFor(t, hasAnnotation, time.Minute, time.Second, + "timeout waiting for deployment \"%q\" to have annotation \"%s: %s\"", deploymentName, expectedKey, expectedValue) + } + } + }) + }) + } + }) + }) +} diff --git a/testing/pgo_cli/suite_helpers_test.go b/testing/pgo_cli/suite_helpers_test.go index 57067a863b..811343d8d9 100644 --- a/testing/pgo_cli/suite_helpers_test.go +++ b/testing/pgo_cli/suite_helpers_test.go @@ -44,6 +44,16 @@ type Pool struct { func (p *Pool) Close() error { p.Pool.Close(); return p.Proxy.Close() } +// contains will take a string slice and check if it contains a string +func contains(s []string, str string) bool { + for _, v := range s { + if v == str { + return true + } + } + return false +} + // clusterConnection opens a PostgreSQL connection to a database pod. Any error // will cause t to FailNow. func clusterConnection(t testing.TB, namespace, cluster, dsn string) *Pool { From 9ef764f1933e7b2c8dbb62de0f374edc600e3c54 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 10 Mar 2021 17:37:16 -0500 Subject: [PATCH 077/129] Allow for startup to proceed even if status subresource is missing We have a guard to only allow a cluster to be started up if we know that it is in a shut down state. However, there appears to be cases independentof the Operator where the pgclusters.crunchydata.com "status" subresource is missing, which would cause that guard to be too aggressive. This change allows for the condition that there is no state registered in the status subresource, which allows for the start up to proceed regardless. Issue: [ch10811] --- internal/controller/pgcluster/pgclustercontroller.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/controller/pgcluster/pgclustercontroller.go b/internal/controller/pgcluster/pgclustercontroller.go index fef1a54734..4568f87b50 100644 --- a/internal/controller/pgcluster/pgclustercontroller.go +++ b/internal/controller/pgcluster/pgclustercontroller.go @@ -184,10 +184,16 @@ func (c *Controller) onUpdate(oldObj, newObj interface{}) { // if the 'shutdown' parameter in the pgcluster update shows that the cluster should be either // shutdown or started but its current status does not properly reflect that it is, then // proceed with the logic needed to either shutdown or start the cluster + // + // we do need to check if the status has info in it. There have been cases + // where the entire status has been removed that could be external to the + // operator itself. In the case of checking that the state is in a shutdown + // phase, we also want to check if the status is completely empty. If it is, + // we will proceed with the shutdown. if newcluster.Spec.Shutdown && newcluster.Status.State != crv1.PgclusterStateShutdown { clusteroperator.ShutdownCluster(c.Client, *newcluster) } else if !newcluster.Spec.Shutdown && - newcluster.Status.State == crv1.PgclusterStateShutdown { + (newcluster.Status.State == crv1.PgclusterStateShutdown || newcluster.Status.State == "") { clusteroperator.StartupCluster(c.Client, *newcluster) } From 51a44cb185a57d7bda7b1bd38cccd18df6c47d70 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Mon, 15 Mar 2021 20:23:00 +0000 Subject: [PATCH 078/129] Fix UsePAM Setting in sshd_config File Fixes the UsePAM setting in sshd_config by changing the value from 'No' to 'no'. --- .../roles/pgo-operator/files/pgo-backrest-repo/sshd_config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config b/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config index f79f039771..5a0f61e8f9 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config +++ b/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config @@ -82,7 +82,7 @@ ChallengeResponseAuthentication yes # This is set explicitly to *no* as we are only using pubkey authentication and # because each container is isolated to only an unprivileged user. -UsePAM No +UsePAM no #AllowAgentForwarding yes #AllowTcpForwarding yes From 6987ee81cb4ff363eac023f6e051ee95e6ec6310 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 18 Mar 2021 12:51:10 -0400 Subject: [PATCH 079/129] Documentation updates Documentation updates in prep for the upcoming releaes. --- docs/layouts/partials/flex/body-aftercontent.html | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/layouts/partials/flex/body-aftercontent.html diff --git a/docs/layouts/partials/flex/body-aftercontent.html b/docs/layouts/partials/flex/body-aftercontent.html new file mode 100644 index 0000000000..42949426a4 --- /dev/null +++ b/docs/layouts/partials/flex/body-aftercontent.html @@ -0,0 +1,3 @@ +
+

© 2017 - 2021 Crunchy Data Solutions, Inc.

+
From 03d7d27b72a3d317677c0422fbde054aeb9f786d Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 22 Mar 2021 11:03:39 -0400 Subject: [PATCH 080/129] Clarify different Pod anti-affinity options in docs It is possible to fine tune the Pod anti-affinity settings for the managed Deployments in a PostgreSQL cluster, though this was not particularly clear in that section of the docs. Issue: #2342 --- .../architecture/high-availability/_index.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/content/architecture/high-availability/_index.md b/docs/content/architecture/high-availability/_index.md index c5f05eaf96..aa1908f3a5 100644 --- a/docs/content/architecture/high-availability/_index.md +++ b/docs/content/architecture/high-availability/_index.md @@ -219,6 +219,30 @@ number of nodes are available to support this configuration, certain deployments will fail, since it will not be possible for Kubernetes to successfully schedule the pods for each deployment. +It is possible to fine tune the pod anti-affinity rules further, specifically, +set different affinity rules for the PostgreSQL, pgBackRest, and pgBouncer +Deployments. These can be handled by the following flags on [`pgo create cluster`]({{< relref "pgo-client/reference/pgo_create_cluster.md">}}): + +- `--pod-anti-affinity`: Sets the pod anti-affinity rules for all the managed +Deployments in the cluster (PostgreSQL, pgBackRest, pgBouncer) +- `--pod-anti-affinity-pgbackrest`: Sets the pod anti-affinity rules for _only_ +the pgBackRest Deployment. This takes precedence over the value of +`--pod-anti-affinity`. +- `--pod-anti-affinity-pgbouncer`: Sets the pod anti-affinity rules for _only_ +the pgBouncer Deployment. This takes precedence over the value of +`--pod-anti-affinity`. + +For example, to use `required` pod anti-affinity between PostgreSQL instances +but use only `preferred` anti-affinity for pgBackRest and pgBouncer, you could +use the following command: + +``` +pgo create cluster hippo --replicas=2 --pgbouncer \ + --pod-anti-affinity=required \ + --pod-anti-affinity=preferred \ + --pod-anti-afinity=preferred +``` + ## Synchronous Replication: Guarding Against Transactions Loss Clusters managed by the Crunchy PostgreSQL Operator can be deployed with From d5f517dbac50a2642730c6f41a41dae81ac59224 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 22 Mar 2021 15:22:35 -0400 Subject: [PATCH 081/129] Fix issue with documentation updates Some of the interactive features were not loading due to the last round of documentation updates. This fixes those issues. --- .../partials/flex/body-aftercontent.html | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/layouts/partials/flex/body-aftercontent.html b/docs/layouts/partials/flex/body-aftercontent.html index 42949426a4..8d5f330f56 100644 --- a/docs/layouts/partials/flex/body-aftercontent.html +++ b/docs/layouts/partials/flex/body-aftercontent.html @@ -1,3 +1,44 @@ +
+ {{ partial "next-prev-page.html" . }} +
+ + + + +
+ +
+ {{if .Params.tags }} +
+ {{ range $index, $tag := .Params.tags }} + {{ $tag }} + {{ end }} +
+ {{end}} + + {{with .Params.LastModifierDisplayName}} +
+ {{ . }} +
+ {{end}} + +{{ if not .Page.Lastmod.IsZero }} +
+ {{T "last-update-on"}} {{ .Page.Lastmod.Format "02/01/2006" }} +
+ {{end}} + +
+ + +
+
+

© 2017 - 2021 Crunchy Data Solutions, Inc.

+ + +
+ +{{ partial "flex/scripts.html" . }} From 1bd5a2296fbb1f9928a0e98c562e1ff071328f81 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 24 Mar 2021 12:15:15 -0400 Subject: [PATCH 082/129] Update descriptions for the different backrest/backup storage configs Some of the legacy purposes of what this parameter did, which was both confusing and inaccurate. This adds some clarity. Reported by: Andreas Karlsson --- docs/content/Configuration/pgo-yaml-configuration.md | 4 ++-- docs/content/installation/configuration.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/content/Configuration/pgo-yaml-configuration.md b/docs/content/Configuration/pgo-yaml-configuration.md index c1b6a894e1..942eafd229 100644 --- a/docs/content/Configuration/pgo-yaml-configuration.md +++ b/docs/content/Configuration/pgo-yaml-configuration.md @@ -45,9 +45,9 @@ The *pgo.yaml* file is broken into major sections as described below: | Setting|Definition | |---|---| |PrimaryStorage |required, the value of the storage configuration to use for the primary PostgreSQL deployment -|BackupStorage |required, the value of the storage configuration to use for backups, including the storage for pgbackrest repo volumes |ReplicaStorage |required, the value of the storage configuration to use for the replica PostgreSQL deployments -|BackrestStorage |required, the value of the storage configuration to use for the pgbackrest shared repository deployment created when a user specifies pgbackrest to be enabled on a cluster +|BackrestStorage |required, the value of the storage configuration to use for the pgBackRest repository. +|BackupStorage |required, the value of the storage configuration to use for backups generated by `pg_dump`. |WALStorage | optional, the value of the storage configuration to use for PostgreSQL Write Ahead Log |StorageClass | optional, for a dynamic storage type, you can specify the storage class used for storage provisioning (e.g. standard, gold, fast) |AccessMode |the access mode for new PVCs (e.g. ReadWriteMany, ReadWriteOnce, ReadOnlyMany). See below for descriptions of these. diff --git a/docs/content/installation/configuration.md b/docs/content/installation/configuration.md index ce097d2753..b9b22f0c5a 100644 --- a/docs/content/installation/configuration.md +++ b/docs/content/installation/configuration.md @@ -135,8 +135,8 @@ other storage classes in production deployments. | Name | Default | Required | Description | |------|---------|----------|-------------| -| `backrest_storage` | hostpathstorage | **Required** | Set the value of the storage configuration to use for the pgbackrest shared repository deployment created when a user specifies pgbackrest to be enabled on a cluster. | -| `backup_storage` | hostpathstorage | **Required** | Set the value of the storage configuration to use for backups, including the storage for pgbackrest repo volumes. | +| `backrest_storage` | hostpathstorage | **Required** | Set the value of the storage configuration to use for the pgBackRest repository. | +| `backup_storage` | hostpathstorage | **Required** | required, the value of the storage configuration to use for backups generated by `pg_dump`. | | `primary_storage` | hostpathstorage | **Required** | Set to configure which storage definition to use when creating volumes used by PostgreSQL primaries on all newly created clusters. | | `replica_storage` | hostpathstorage | **Required** | Set to configure which storage definition to use when creating volumes used by PostgreSQL replicas on all newly created clusters. | | `wal_storage` | | | Set to configure which storage definition to use when creating volumes used for PostgreSQL Write-Ahead Log. | From e0e95ea56c5efe83655bb22ce481a8a2d384fde2 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 24 Mar 2021 16:28:30 -0400 Subject: [PATCH 083/129] Add clarification on disabling FSGroup for metrics installation This makes it abundantly clear that you may need to toggle the "disable_fsgroup" attribute in the PostgreSQL Operator Monitoring stack installer based upon the type of OpenShift / CRC environment you are deploying into. --- .../metrics/metrics-configuration.md | 2 +- .../other/ansible/metrics-prerequisites.md | 8 ++++++-- .../installation/metrics/other/helm-metrics.md | 13 +++++++++---- .../metrics/postgres-operator-metrics.md | 16 +++++++++++++--- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/docs/content/installation/metrics/metrics-configuration.md b/docs/content/installation/metrics/metrics-configuration.md index d65cd47aef..580f8e264a 100644 --- a/docs/content/installation/metrics/metrics-configuration.md +++ b/docs/content/installation/metrics/metrics-configuration.md @@ -25,7 +25,7 @@ These variables affect the general configuration of PostgreSQL Operator Monitori | `create_rbac` | true | **Required** | Set to true if the installer should create the RBAC resources required to run the PostgreSQL Operator Monitoring infrastructure. | | `db_port` | 5432 | **Required** | Set to configure the PostgreSQL port used by all PostgreSQL clusters. | | `delete_metrics_namespace` | false | | Set to configure whether or not the metrics namespace (defined using variable `metrics_namespace`) is deleted when uninstalling the monitoring infrastructure. | -| `disable_fsgroup` | false | | Set to `true` for deployments where you do not want to have the default PostgreSQL fsGroup (26) set. The typical usage is in OpenShift environments that have a `restricted` Security Context Constraints. | +| `disable_fsgroup` | false | | Set to `true` for deployments where you do not want to have the default PostgreSQL fsGroup (26) set. The typical usage is in OpenShift environments that have a `restricted` Security Context Constraints. If you use the `anyuid` SCC, you would want to set this to `false`. The Postgres Operator will set this value appropriately by default, except for when using the `anyuid` SCC. | | `grafana_admin_password` | admin | **Required** | Set to configure the login password for the Grafana administrator. | | `grafana_admin_username` | admin | **Required** | Set to configure the login username for the Grafana administrator. | | `grafana_install` | true | **Required** | Set to true to install Grafana to visualize metrics. | diff --git a/docs/content/installation/metrics/other/ansible/metrics-prerequisites.md b/docs/content/installation/metrics/other/ansible/metrics-prerequisites.md index 1e9d31164d..116559ea30 100644 --- a/docs/content/installation/metrics/other/ansible/metrics-prerequisites.md +++ b/docs/content/installation/metrics/other/ansible/metrics-prerequisites.md @@ -62,7 +62,6 @@ if you are being using them for your environment. Both sets of variables cannot be used at the same time. The unused variables should be left commented out or removed. {{% /notice %}} - | Name | Default | Required | Description | |-----------------------------------|-------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `kubernetes_context` | | **Required**, if deploying to Kubernetes |When deploying to Kubernetes, set to configure the context name of the kubeconfig to be used for authentication. | @@ -83,10 +82,15 @@ kubectl config current-context ## Configuring - `values.yaml` The `values.yaml` file contains all of the configuration parameters -for deploying the PostgreSQL Operator Monitoring infrastructure. +for deploying the PostgreSQL Operator Monitoring infrastructure. The [example file](https://github.com/CrunchyData/postgres-operator/blob/v{{< param operatorVersion >}}/installers/metrics/ansible/values.yaml) contains defaults that should work in most Kubernetes environments, but it may require some customization. +Note that in OpenShift and CodeReady Containers you will need to set the +`disable_fsgroup` to `true` attribute to `true` if you are using the +`restricted` Security Context Constraint (SCC). If you are using the `anyuid` +SCC, you will need to set `disable_fsgroup` to `false`. + For a detailed description of each configuration parameter, please read the [PostgreSQL Operator Installer Metrics Configuration Reference](<{{< relref "/installation/metrics/metrics-configuration.md">}}>) diff --git a/docs/content/installation/metrics/other/helm-metrics.md b/docs/content/installation/metrics/other/helm-metrics.md index fb94918003..e09a1ae5c8 100644 --- a/docs/content/installation/metrics/other/helm-metrics.md +++ b/docs/content/installation/metrics/other/helm-metrics.md @@ -57,10 +57,15 @@ file will be used to populate the configuation options in the ConfigMap. ### Configuration - `values.yaml` The `values.yaml` file contains all of the configuration parameters for deploying -the PostgreSQL Operator Monitoring infrastructure. +the PostgreSQL Operator Monitoring infrastructure. The [values.yaml file](https://github.com/CrunchyData/postgres-operator/blob/master/installers/metrics/helm/values.yaml) contains the defaults that should work in most Kubernetes environments, but it may require some customization. +Note that in OpenShift and CodeReady Containers you will need to set the +`disable_fsgroup` to `true` attribute to `true` if you are using the +`restricted` Security Context Constraint (SCC). If you are using the `anyuid` +SCC, you will need to set `disable_fsgroup` to `false`. + For a detailed description of each configuration parameter, please read the [PostgreSQL Operator Monitoring Installer Configuration Reference](<{{< relref "/installation/metrics/metrics-configuration.md">}}>) @@ -81,11 +86,11 @@ upgrade and uninstall the PostgreSQL Operator. ## Upgrade and Uninstall -Once install has be completed using Helm, it will also be used to upgrade and +Once install has be completed using Helm, it will also be used to upgrade and uninstall your PostgreSQL Operator. {{% notice tip %}} -The `name` and `namespace` in the following sections should match the options +The `name` and `namespace` in the following sections should match the options provided at install. {{% /notice %}} @@ -111,7 +116,7 @@ helm uninstall -n ## Debugging -When the `pgo-deployer` job does not complete successfully, the resources that +When the `pgo-deployer` job does not complete successfully, the resources that are created and normally cleaned up by Helm will be left in your Kubernetes cluster. This will allow you to use the failed job and its logs to debug the issue. The following command will show the logs for the `pgo-deployer` diff --git a/docs/content/installation/metrics/postgres-operator-metrics.md b/docs/content/installation/metrics/postgres-operator-metrics.md index a077862ba9..2440ebfa66 100644 --- a/docs/content/installation/metrics/postgres-operator-metrics.md +++ b/docs/content/installation/metrics/postgres-operator-metrics.md @@ -18,6 +18,11 @@ kubectl create namespace pgo kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v{{< param operatorVersion >}}/installers/metrics/kubectl/postgres-operator-metrics.yml ``` +Note that in OpenShift and CodeReady Containers you will need to set the +`disable_fsgroup` to `true` attribute to `true` if you are using the +`restricted` Security Context Constraint (SCC). If you are using the `anyuid` +SCC, you will need to set `disable_fsgroup` to `false`. + However, we still advise that you read onward to see how to properly configure the PostgreSQL Operator Monitoring infrastructure. @@ -53,13 +58,13 @@ environmental requirements. By default, the `pgo-deployer` uses a ServiceAccount called `pgo-metrics-deployer-sa` that has a ClusterRoleBinding (`pgo-metrics-deployer-crb`) with several ClusterRole permissions. This ClusterRole is needed for the initial configuration and deployment -of the various applications comprising the monitoring infrastructure. This includes permissions +of the various applications comprising the monitoring infrastructure. This includes permissions to create: * RBAC for use by Prometheus and/or Grafana * The metrics namespace -The required list of privileges are available in the +The required list of privileges are available in the [postgres-operator-metrics.yml](https://raw.githubusercontent.com/CrunchyData/postgres-operator/v{{< param operatorVersion >}}/installers/metrics/kubectl/postgres-operator-metrics.yml) file: @@ -95,6 +100,11 @@ for deploying PostgreSQL Operator Monitoring. The [example file](https://github. contains defaults that should work in most Kubernetes environments, but it may require some customization. +Note that in OpenShift and CodeReady Containers you will need to set the +`disable_fsgroup` to `true` attribute to `true` if you are using the +`restricted` Security Context Constraint (SCC). If you are using the `anyuid` +SCC, you will need to set `disable_fsgroup` to `false`. + For a detailed description of each configuration parameter, please read the [PostgreSQL Operator Monitoring Installer Configuration Reference](<{{< relref "/installation/metrics/metrics-configuration.md">}}>) @@ -103,7 +113,7 @@ For a detailed description of each configuration parameter, please read the The deploy job can be used to perform different deployment actions for the PostgreSQL Operator Monitoring infrastructure. When you run the job it will install the monitoring infrastructure by default but you can change the deployment action to -uninstall or update. The `DEPLOY_ACTION` environment variable in the `postgres-operator-metrics.yml` +uninstall or update. The `DEPLOY_ACTION` environment variable in the `postgres-operator-metrics.yml` file can be set to `install-metrics`, `update-metrics`, and `uninstall-metrics`. ### Image Pull Secrets From ea3ce14a5e7b1940878085e24e71b328a3804b2a Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 5 Apr 2021 12:27:34 -0400 Subject: [PATCH 084/129] Update general descriptions This provides some updates around the geneal description for PGO. --- README.md | 122 +++++++++++++++++++++++++++-------------- docs/config.toml | 2 +- docs/content/_index.md | 69 +++++++++++++++-------- 3 files changed, 128 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index fdd72b8cb9..0acc5d9339 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,22 @@ -

Crunchy Data PostgreSQL Operator

+

PGO: The Postgres Operator from Crunchy Data

Crunchy Data

[![Go Report Card](https://goreportcard.com/badge/github.com/CrunchyData/postgres-operator)](https://goreportcard.com/report/github.com/CrunchyData/postgres-operator) -# Run your own production-grade PostgreSQL-as-a-Service on Kubernetes! +# Run Cloud Native PostgreSQL on Kubernetes with PGO: The Postgres Operator from Crunchy Data! -The [Crunchy PostgreSQL Operator][documentation] automates and simplifies deploying and managing -open source PostgreSQL clusters on Kubernetes and other Kubernetes-enabled Platforms by providing -the essential features you need to keep your PostgreSQL clusters up and running, including: +[PGO][documentation], the [Postgres Operator][documentation] developed by +[Crunchy Data](https://crunchydata.com/) and included in [Crunchy PostgreSQL for Kubernetes](https://www.crunchydata.com/products/crunchy-postgresql-for-kubernetes/), automates and simplifies deploying and managing open source +PostgreSQL clusters on Kubernetes. -#### PostgreSQL Cluster [Provisioning][provisioning] +Whether you need to get a simple Postgres cluster up and running, need to deploy +a high availability, fault tolerant cluster in production, or are running your +own database-as-a-service, the PostgreSQL Operator provides the essential +features you need to keep your cloud native Postgres clusters healthy, including: + +#### Postgres Cluster [Provisioning][provisioning] [Create, Scale, & Delete PostgreSQL clusters with ease][provisioning], while fully customizing your Pods and PostgreSQL configuration! @@ -33,7 +38,7 @@ Set how long you want your backups retained for. Works great with very large dat #### TLS Secure communication between your applications and data servers by [enabling TLS for your PostgreSQL servers][pgo-task-tls], -including the ability to enforce that all of your connections to use TLS. +including the ability to enforce all of your connections to use TLS. #### [Monitoring][monitoring] @@ -76,16 +81,22 @@ the S3 protocol. The PostgreSQL Operator can backup, restore, and create new clu #### Multi-Namespace Support -You can control how the PostgreSQL Operator leverages [Kubernetes Namespaces][k8s-namespaces] with several different deployment models: +You can control how PGO, the Postgres Operator, leverages [Kubernetes Namespaces][k8s-namespaces] with several different deployment models: -- Deploy the PostgreSQL Operator and all PostgreSQL clusters to the same namespace -- Deploy the PostgreSQL Operator to one namespaces, and all PostgreSQL clusters to a different namespace -- Deploy the PostgreSQL Operator to one namespace, and have your PostgreSQL clusters managed across multiple namespaces -- Dynamically add and remove namespaces managed by the PostgreSQL Operator using the `pgo create namespace` and `pgo delete namespace` commands +- Deploy PGO and all PostgreSQL clusters to the same namespace +- Deploy PGO to one namespaces, and all PostgreSQL clusters to a different +namespace +- Deploy PGO to one namespace, and have your PostgreSQL clusters managed across +multiple namespaces +- Dynamically add and remove namespaces managed by the PostgreSQL Operator using +the `pgo` client to run `pgo create namespace` and `pgo delete namespace` #### Full Customizability -The Crunchy PostgreSQL Operator makes it easy to get your own PostgreSQL-as-a-Service up and running on Kubernetes-enabled platforms, but we know that there are further customizations that you can make. As such, the Crunchy PostgreSQL Operator allows you to further customize your deployments, including: +The Postgres Operator (PGO) makes it easy to get Postgres up and running on +Kubernetes-enabled platforms, but we know that there are further customizations +that you can make. As such, PGO allows you to further customize your +deployments, including: - Selecting different storage classes for your primary, replica, and backup storage - Select your own container resources class for each PostgreSQL cluster deployment; differentiate between resources applied for primary and replica clusters! @@ -94,7 +105,6 @@ The Crunchy PostgreSQL Operator makes it easy to get your own PostgreSQL-as-a-Se - Bring your own trusted certificate authority (CA) for use with the Operator API server - Override your PostgreSQL configuration for each cluster - [disaster-recovery]: https://access.crunchydata.com/documentation/postgres-operator/latest/architecture/disaster-recovery/ [disaster-recovery-s3]: https://access.crunchydata.com/documentation/postgres-operator/latest/architecture/disaster-recovery/#using-s3 [disaster-recovery-scheduling]: https://access.crunchydata.com/documentation/postgres-operator/latest/architecture/disaster-recovery/#scheduling-backups @@ -117,47 +127,58 @@ The Crunchy PostgreSQL Operator makes it easy to get your own PostgreSQL-as-a-Se ## Deployment Requirements -The PostgreSQL Operator is validated for deployment on Kubernetes, OpenShift, and VMware Enterprise PKS clusters. Some form of storage is required, NFS, hostPath, and Storage Classes are currently supported. +PGO, the Postgres Operator, is validated for deployment on Kubernetes, +OpenShift, GKE, Anthos, AKS, EKS, and VMware Tanzu clusters. PGO is cloud native +and storage agnostic, working with a wide variety of storage classes, hostPath, +and NFS. -The PostgreSQL Operator includes various components that get deployed to your -Kubernetes cluster as shown in the following diagram and detailed -in the Design section of the documentation for the version you are running. +PGO includes various components that get deployed to your Kubernetes cluster as +shown in the following diagram and detailed in the Design section of the +documentation for the version you are running. ![Reference](https://access.crunchydata.com/documentation/postgres-operator/latest/Operator-Architecture.png) -The PostgreSQL Operator is developed and tested on CentOS and RHEL linux platforms but is known to run on other Linux variants. +PGO is developed and tested on CentOS and RHEL linux platforms but is known to +run on other Linux variants. ### Supported Platforms -The Crunchy PostgreSQL Operator is tested on the following Platforms: +PGO, the Postgres Operator, is Kubernetes-native and maintains backwards +compatibility to Kubernetes 1.11 and is tested is tested against the following +platforms: - Kubernetes 1.13+ - OpenShift 3.11+ - Google Kubernetes Engine (GKE), including Anthos - Amazon EKS -- VMware Enterprise PKS 1.3+ - -### Storage +- Microsoft AKS +- VMware Tanzu -The Crunchy PostgreSQL Operator is tested with a variety of different types of Kubernetes storage and Storage Classes, including: +This list only includes the platforms that the Postgres Operator is specifically +tested on as part of the release process: PGO works on other Kubernetes +distributions as well. -- Google Compute Engine persistent volumes -- HostPath -- NFS -- Rook -- StorageOS +### Storage -and more. +PGO, the Postgres Operator, is tested with a variety of different types of +Kubernetes storage and Storage Classes, as well as hostPath and NFS. -We know there are a variety of different types of [Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/) available for Kubernetes and we do our best to test each one, but due to the breadth of this area we are unable to verify PostgreSQL Operator functionality in each one. With that said, the PostgreSQL Operator is designed to be storage class agnostic and has been demonstrated to work with additional Storage Classes. +We know there are a variety of different types of [Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/) +available for Kubernetes and we do our best to test each one, but due to the +breadth of this area we are unable to verify Postgres Operator functionality in +each one. With that said, the PostgreSQL Operator is designed to be storage +class agnostic and has been demonstrated to work with additional Storage +Classes. ## Installation -### PostgreSQL Operator Installation +### Postgres Operator (PGO) Installation -The PostgreSQL Operator provides a few different methods for installation based on your use case. +PGO provides a few different methods for installation methods to get up and +running with cloud native Postgres. -Based on your storage settings in your Kubernetes environment, you may be able to start as quickly as: +Based on your storage settings in your Kubernetes environment, you may be able +to start as quickly as: ```shell kubectl create namespace pgo @@ -176,7 +197,7 @@ Installations methods include: ### `pgo` Client Installation -If you have the PostgreSQL Operator installed in your environment, and are interested in installation of the client interface, please start here: +If you have the Postgres Operator installed in your environment, and are interested in installation of the client interface, please start here: - [pgo Client Install](https://access.crunchydata.com/documentation/postgres-operator/latest/installation/pgo-client/) @@ -223,16 +244,24 @@ Additional containers that are not directly integrated with the PostgreSQL Opera For more information about which versions of the PostgreSQL Operator include which components, please visit the [compatibility](https://access.crunchydata.com/documentation/postgres-operator/latest/configuration/compatibility/) section of the documentation. -## Using the PostgreSQL Operator +## Using the PostgreSQL Operator (PGO) + +If you are new to PGO, you can follow along the [tutorial](https://access.crunchydata.com/documentation/postgres-operator/latest/tutorial/) +to learn how to install the PostgreSQL Operator and how to use many of its +features! -If you have the PostgreSQL and Client Interface installed in your environment and are interested in guidance on the use of the Crunchy PostgreSQL Operator, please start here: +- [PostgreSQL Operator Tutorial](https://access.crunchydata.com/documentation/postgres-operator/latest/tutorial/) -- [PostgreSQL Operator Documentation](https://access.crunchydata.com/documentation/postgres-operator/) +If you have the PostgreSQL and client interface installed in your environment +and are interested in guidance on the use of the Crunchy PostgreSQL Operator, +please start here: + +- [PostgreSQL Operator (PGO) Documentation](https://access.crunchydata.com/documentation/postgres-operator/) - [`pgo` Client User Guide](https://access.crunchydata.com/documentation/postgres-operator/latest/pgo-client/) ## Contributing to the Project -Want to contribute to the PostgreSQL Operator project? Great! We've put together +Want to contribute to the PGO Project? Great! We've put together as set of contributing guidelines that you can review here: - [Contributing Guidelines](CONTRIBUTING.md) @@ -265,7 +294,7 @@ For other information, please visit the [Support](https://access.crunchydata.com ## Documentation For additional information regarding design, configuration and operation of the -PostgreSQL Operator, pleases see the [Official Project Documentation][documentation]. +PostgreSQL Operator (PGO), please see the [Official Project Documentation][documentation]. If you are looking for the [nightly builds of the documentation](https://crunchydata.github.io/postgres-operator/latest/), you can view them at: @@ -276,3 +305,16 @@ https://crunchydata.github.io/postgres-operator/latest/ ## Past Versions Documentation for previous releases can be found at the [Crunchy Data Access Portal](https://access.crunchydata.com/documentation/) + +## Releases + +When a PGO general availability (GA) release occurs, the container images are +distributed on the following platforms in order: + +- [Crunchy Data Customer Portal](https://access.crunchydata.com/) +- [Crunchy Data Developer Portal](https://www.crunchydata.com/developers) +- [DockerHub](https://hub.docker.com/u/crunchydata) + +The image rollout can occur over the course of several days. + +To stay up-to-date on when releases are made available in the [Crunchy Data Developer Portal](https://www.crunchydata.com/developers), please sign up for the [Crunchy Data Developer Program Newsletter](https://www.crunchydata.com/developers/newsletter) diff --git a/docs/config.toml b/docs/config.toml index 7d328e9564..9e8853f125 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -2,7 +2,7 @@ baseURL= "" languageCode = "en-us" DefaultContentLanguage = "en" -title = "Crunchy PostgreSQL Operator Documentation" +title = "PGO: PostgreSQL Operator from Crunchy Data Documentation" theme = "crunchy-hugo-theme" pygmentsCodeFences = true pygmentsStyle = "monokailight" diff --git a/docs/content/_index.md b/docs/content/_index.md index b879f3db2a..a97ab4d1d6 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -1,20 +1,30 @@ --- -title: "Crunchy PostgreSQL Operator" +title: "PGO: The Postgres Operator from Crunchy Data" date: draft: false --- -# Crunchy PostgreSQL Operator +# PGO: The Postgres Operator from Crunchy Data -## Run your own production-grade PostgreSQL-as-a-Service on Kubernetes! +## Run [Cloud Native PostgreSQL on Kubernetes](https://www.crunchydata.com/products/crunchy-postgresql-for-kubernetes/) with PGO: The [Postgres Operator](https://github.com/CrunchyData/postgres-operator) from [Crunchy Data](https://www.crunchydata.com/)! Latest Release: {{< param operatorVersion >}} -The [Crunchy PostgreSQL Operator](https://www.crunchydata.com/developers/download-postgres/containers/postgres-operator) automates and simplifies deploying and managing open source PostgreSQL clusters on Kubernetes and other Kubernetes-enabled Platforms by providing the essential features you need to keep your PostgreSQL clusters up and running, including: +[PGO](https://www.crunchydata.com/developers/download-postgres/containers/postgres-operator), +the [Postgres Operator](https://github.com/CrunchyData/postgres-operator) +developed by [Crunchy Data](https://crunchydata.com/) and included in +[Crunchy PostgreSQL for Kubernetes](https://www.crunchydata.com/products/crunchy-postgresql-for-kubernetes/), +automates and simplifies deploying and managing open source PostgreSQL clusters +on Kubernetes. -#### PostgreSQL Cluster [Provisioning]({{< relref "/architecture/provisioning.md" >}}) +Whether you need to get a simple Postgres cluster up and running, need to deploy +a high availability, fault tolerant cluster in production, or are running your +own database-as-a-service, the PostgreSQL Operator provides the essential +features you need to keep your cloud native Postgres clusters healthy, including: + +#### Postgres Cluster [Provisioning]({{< relref "/architecture/provisioning.md" >}}) [Create, Scale, & Delete PostgreSQL clusters with ease](/architecture/provisioning/), while fully customizing your Pods and PostgreSQL configuration! @@ -30,7 +40,7 @@ Backups and restores leverage the open source [pgBackRest](https://www.pgbackres #### TLS -Secure communication between your applications and data servers by [enabling TLS for your PostgreSQL servers](/pgo-client/common-tasks/#enable-tls), including the ability to enforce that all of your connections to use TLS. +Secure communication between your applications and data servers by [enabling TLS for your PostgreSQL servers](/pgo-client/common-tasks/#enable-tls), including the ability to enforce all of your connections to use TLS. #### [Monitoring]({{< relref "/architecture/monitoring.md" >}}) @@ -72,16 +82,22 @@ Choose the type of backup (full, incremental, differential) and [how frequently #### Multi-Namespace Support -You can control how the PostgreSQL Operator leverages [Kubernetes Namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) with several different deployment models: +You can control how PGO, the Postgres Operator, leverages [Kubernetes Namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) with several different deployment models: -- Deploy the PostgreSQL Operator and all PostgreSQL clusters to the same namespace -- Deploy the PostgreSQL Operator to one namespaces, and all PostgreSQL clusters to a different namespace -- Deploy the PostgreSQL Operator to one namespace, and have your PostgreSQL clusters managed acrossed multiple namespaces -- Dynamically add and remove namespaces managed by the PostgreSQL Operator using the `pgo create namespace` and `pgo delete namespace` commands +- Deploy PGO and all PostgreSQL clusters to the same namespace +- Deploy PGO to one namespaces, and all PostgreSQL clusters to a different +namespace +- Deploy PGO to one namespace, and have your PostgreSQL clusters managed across +multiple namespaces +- Dynamically add and remove namespaces managed by the PostgreSQL Operator using +the `pgo` client to run `pgo create namespace` and `pgo delete namespace` #### Full Customizability -The Crunchy PostgreSQL Operator makes it easy to get your own PostgreSQL-as-a-Service up and running on Kubernetes-enabled platforms, but we know that there are further customizations that you can make. As such, the Crunchy PostgreSQL Operator allows you to further customize your deployments, including: +The Postgres Operator (PGO) makes it easy to get Postgres up and running on +Kubernetes-enabled platforms, but we know that there are further customizations +that you can make. As such, PGO allows you to further customize your +deployments, including: - Selecting different storage classes for your primary, replica, and backup storage - Select your own container resources class for each PostgreSQL cluster deployment; differentiate between resources applied for primary and replica clusters! @@ -140,24 +156,29 @@ For more information about which versions of the PostgreSQL Operator include whi # Supported Platforms -The Crunchy PostgreSQL Operator is tested on the following Platforms: +PGO, the Postgres Operator, is Kubernetes-native and maintains backwards +compatibility to Kubernetes 1.11 and is tested is tested against the following +platforms: - Kubernetes 1.13+ - OpenShift 3.11+ - Google Kubernetes Engine (GKE), including Anthos - Amazon EKS -- VMware Enterprise PKS 1.3+ - -## Storage +- Microsoft AKS +- VMware Tanzu -The Crunchy PostgreSQL Operator is tested with a variety of different types of Kubernetes storage and Storage Classes, including: +This list only includes the platforms that the Postgres Operator is specifically +tested on as part of the release process: PGO works on other Kubernetes +distributions as well. -- Rook -- StorageOS -- Google Compute Engine persistent volumes -- NFS -- HostPath +## Storage -and more. We have had reports of people using the PostgreSQL Operator with other [Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/) as well. +PGO, the Postgres Operator, is tested with a variety of different types of +Kubernetes storage and Storage Classes, as well as hostPath and NFS. -We know there are a variety of different types of [Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/) available for Kubernetes and we do our best to test each one, but due to the breadth of this area we are unable to verify PostgreSQL Operator functionality in each one. With that said, the PostgreSQL Operator is designed to be storage class agnostic and has been demonstrated to work with additional Storage Classes. Storage is a rapidly evolving field in Kubernetes and we will continue to adapt the PostgreSQL Operator to modern Kubernetes storage standards. +We know there are a variety of different types of [Storage Classes](https://kubernetes.io/docs/concepts/storage/storage-classes/) +available for Kubernetes and we do our best to test each one, but due to the +breadth of this area we are unable to verify Postgres Operator functionality in +each one. With that said, the PostgreSQL Operator is designed to be storage +class agnostic and has been demonstrated to work with additional Storage +Classes. From bcd1d417d509c222bce47d7cb466fc9bc3e4b686 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sat, 10 Apr 2021 14:47:51 -0400 Subject: [PATCH 085/129] Updates to installation instructions and other guidance A periodic pass through the installation instructions and other general updates to the documentation. --- README.md | 2 +- crunchy_logo.png | Bin 169205 -> 0 bytes docs/content/_index.md | 2 +- docs/content/installation/_index.md | 4 +- docs/content/installation/configuration.md | 4 +- .../metrics/other/ansible/_index.md | 8 +- docs/content/installation/other/_index.md | 2 +- .../installation/other/ansible/_index.md | 8 +- docs/content/installation/other/bash.md | 76 +++++++++--------- .../other/google-cloud-marketplace.md | 26 +++--- docs/content/installation/other/helm.md | 13 +-- .../installation/other/operator-hub.md | 10 +-- docs/content/installation/pgo-client.md | 14 ++-- .../content/installation/postgres-operator.md | 20 ++--- docs/content/installation/prerequisites.md | 14 ++-- docs/content/pgo-client/_index.md | 4 +- docs/content/quickstart/_index.md | 45 ++++++----- docs/content/support/_index.md | 6 +- docs/content/tutorial/_index.md | 4 +- docs/content/tutorial/create-cluster.md | 4 + docs/content/tutorial/getting-started.md | 14 ++-- docs/static/crunchy-logo.jpg | Bin 100361 -> 0 bytes docs/static/pgo.png | Bin 0 -> 234696 bytes docs/static/pgo.svg | 1 + installers/ansible/README.md | 8 +- installers/gcp-marketplace/README.md | 4 +- installers/helm/Chart.yaml | 4 +- installers/helm/README.md | 16 ++-- installers/metrics/ansible/README.md | 10 +-- installers/metrics/helm/Chart.yaml | 2 +- installers/olm/README.md | 4 +- 31 files changed, 167 insertions(+), 162 deletions(-) delete mode 100644 crunchy_logo.png delete mode 100644 docs/static/crunchy-logo.jpg create mode 100644 docs/static/pgo.png create mode 100644 docs/static/pgo.svg diff --git a/README.md b/README.md index 0acc5d9339..d4faf35d54 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

PGO: The Postgres Operator from Crunchy Data

- Crunchy Data + PGO: The Postgres Operator from Crunchy Data

[![Go Report Card](https://goreportcard.com/badge/github.com/CrunchyData/postgres-operator)](https://goreportcard.com/report/github.com/CrunchyData/postgres-operator) diff --git a/crunchy_logo.png b/crunchy_logo.png deleted file mode 100644 index 2fbf3352c1dc55d5941d1b3faba7d687deaad4be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169205 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%0D9u9fjOYB8#LD=NGMvsSxpVkmHQ{vJ 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Ìzq_*4>VdgPf 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 + PGO: The Postgres Operator from Crunchy Data ## Run [Cloud Native PostgreSQL on Kubernetes](https://www.crunchydata.com/products/crunchy-postgresql-for-kubernetes/) with PGO: The [Postgres Operator](https://github.com/CrunchyData/postgres-operator) from [Crunchy Data](https://www.crunchydata.com/)! diff --git a/docs/content/installation/_index.md b/docs/content/installation/_index.md index 909561ce46..036a080a4e 100644 --- a/docs/content/installation/_index.md +++ b/docs/content/installation/_index.md @@ -5,10 +5,10 @@ draft: false weight: 40 --- -There are several different ways to install and deploy the [PostgreSQL Operator](https://www.crunchydata.com/developers/download-postgres/containers/postgres-operator) +There are several different ways to install and deploy the [PGO, the Postgres Operator](https://www.crunchydata.com/developers/download-postgres/containers/postgres-operator) based upon your use case. -For the vast majority of use cases, we recommend using the [PostgreSQL Operator Installer]({{< relref "/installation/postgres-operator.md" >}}), +For the vast majority of use cases, we recommend using the [Postgres Operator Installer]({{< relref "/installation/postgres-operator.md" >}}), which uses the `pgo-deployer` container to set up all of the objects required to run the PostgreSQL Operator. diff --git a/docs/content/installation/configuration.md b/docs/content/installation/configuration.md index b9b22f0c5a..da4226a2f2 100644 --- a/docs/content/installation/configuration.md +++ b/docs/content/installation/configuration.md @@ -5,9 +5,9 @@ draft: false weight: 40 --- -# PostgreSQL Operator Installer Configuration +# PGO Installer Configuration -When installing the PostgreSQL Operator you have many configuration options, these +When installing PGO, the Postgres Operator you have many configuration options, these options are listed in this section. ## General Configuration diff --git a/docs/content/installation/metrics/other/ansible/_index.md b/docs/content/installation/metrics/other/ansible/_index.md index cede0bb875..e48c6801dd 100644 --- a/docs/content/installation/metrics/other/ansible/_index.md +++ b/docs/content/installation/metrics/other/ansible/_index.md @@ -5,17 +5,17 @@ draft: false weight: 10 --- -# Crunchy Data PostgreSQL Operator Monitoring Playbooks +# PGO: Postgres Operator Monitoring Playbooks -The Crunchy Data PostgreSQL Operator Monitoring Playbooks contain [Ansible](https://www.ansible.com/) +PGO, the Postgres Operator from Crunchy Data, Monitoring Playbooks contain [Ansible](https://www.ansible.com/) roles for installing and managing the [Crunchy Data PostgreSQL Operator Monitoring infrastructure]({{< relref "/installation/other/ansible/installing-operator.md" >}}). ## Features The playbooks provided allow users to: -* install PostgreSQL Operator Monitoring on Kubernetes and OpenShift -* install PostgreSQL Operator from a Linux, Mac or Windows (Ubuntu subsystem) host +* install PGO Monitoring on Kubernetes and OpenShift +* install PGO from a Linux, Mac or Windows (Ubuntu subsystem) host * support a variety of deployment models ## Resources diff --git a/docs/content/installation/other/_index.md b/docs/content/installation/other/_index.md index 54722b3e61..1dc5fd84b8 100644 --- a/docs/content/installation/other/_index.md +++ b/docs/content/installation/other/_index.md @@ -6,6 +6,6 @@ weight: 50 --- Though the years, we have built up several other methods for installing the -PostgreSQL Operator. The next few sections provide some alternative ways of +PGO. The next few sections provide some alternative ways of deploying the PostgreSQL Operator. Some of these methods are deprecated and may be removed in a future release. diff --git a/docs/content/installation/other/ansible/_index.md b/docs/content/installation/other/ansible/_index.md index 0cd09a034d..69a647511e 100644 --- a/docs/content/installation/other/ansible/_index.md +++ b/docs/content/installation/other/ansible/_index.md @@ -5,17 +5,17 @@ draft: false weight: 100 --- -# Crunchy Data PostgreSQL Operator Playbooks +# PGO: Postgres Operator Playbooks -The Crunchy Data PostgreSQL Operator Playbooks contain [Ansible](https://www.ansible.com/) +PGO, the Postgres Operator from Crunchy Data, Playbooks contain [Ansible](https://www.ansible.com/) roles for installing and managing the [Crunchy Data PostgreSQL Operator]({{< relref "/installation/other/ansible/installing-operator.md" >}}). ## Features The playbooks provided allow users to: -* install PostgreSQL Operator on Kubernetes and OpenShift -* install PostgreSQL Operator from a Linux, Mac or Windows (Ubuntu subsystem) host +* install PGO on Kubernetes and OpenShift +* install PGO from a Linux, Mac or Windows (Ubuntu subsystem) host * generate TLS certificates required by the PostgreSQL Operator * support a variety of deployment models diff --git a/docs/content/installation/other/bash.md b/docs/content/installation/other/bash.md index 52f4b5cdc6..e1994654f7 100644 --- a/docs/content/installation/other/bash.md +++ b/docs/content/installation/other/bash.md @@ -5,18 +5,18 @@ draft: false weight: 100 --- -A full installation of the Operator includes the following steps: +A full installation of PGO includes the following steps: - create a project structure - configure your environment variables - - configure Operator templates + - configure PGO templates - create security resources - deploy the operator - - install pgo CLI (end user command tool) + - install `pgo` client (end user command tool) -Operator end-users are only required to install the pgo CLI client on their host and can skip the server-side installation steps. pgo CLI clients are provided for Linux, Mac, and Windows clients. +PGO end-users are only required to install the `pgo` client on their host and can skip the server-side installation steps. `pgo` clients are provided for Linux, Mac, and Windows clients. -The Operator can be deployed by multiple methods including: +PGO can be deployed by multiple methods including: * default installation * Ansible playbook installation @@ -25,7 +25,7 @@ The Operator can be deployed by multiple methods including: ## Default Installation - Create Project Structure -The Operator follows a golang project structure, you can create a structure as follows on your local Linux host: +PGO follows a golang project structure, you can create a structure as follows on your local Linux host: mkdir -p $HOME/odev/src/github.com/crunchydata $HOME/odev/bin $HOME/odev/pkg cd $HOME/odev/src/github.com/crunchydata @@ -59,9 +59,9 @@ for Kubernetes events. This value is set as follows: This means namespaces called *pgouser1* and *pgouser2* will be created as part of the default installation. -{{% notice warning %}}In Kubernetes versions prior to 1.12 (including Openshift up through 3.11), there is a limitation that requires an extra step during installation for the operator to function properly with watched namespaces. This limitation does not exist when using Kubernetes 1.12+. When a list of namespaces are provided through the NAMESPACE environment variable, the setupnamespaces.sh script handles the limitation properly in both the bash and ansible installation. +{{% notice warning %}}In Kubernetes versions prior to 1.12 (including Openshift up through 3.11), there is a limitation that requires an extra step during installation for PGO to function properly with watched namespaces. This limitation does not exist when using Kubernetes 1.12+. When a list of namespaces are provided through the NAMESPACE environment variable, the setupnamespaces.sh script handles the limitation properly in both the bash and ansible installation. -However, if the user wishes to add a new watched namespace after installation, where the user would normally use pgo create namespace to add the new namespace, they should instead run the add-targeted-namespace.sh script or they may give themselves cluster-admin privileges instead of having to run setupnamespaces.sh script. Again, this is only required when running on a Kubernetes distribution whose version is below 1.12. In Kubernetes version 1.12+ the pgo create namespace command works as expected. +However, if the user wishes to add a new watched namespace after installation, where the user would normally use `pgo create namespace` to add the new namespace, they should instead run the add-targeted-namespace.sh script or they may give themselves cluster-admin privileges instead of having to run setupnamespaces.sh script. Again, this is only required when running on a Kubernetes distribution whose version is below 1.12. In Kubernetes version 1.12+ the pgo create namespace command works as expected. {{% /notice %}} @@ -83,13 +83,13 @@ Create the Operator namespaces using the Makefile target: The [Design](/design) section of this documentation talks further about the use of namespaces within the Operator. -## Default Installation - Configure Operator Templates +## Default Installation - Configure PGO Templates -Within the Operator [*PGO_CONF_DIR*](/developer-setup/) directory are several configuration files and templates used by the Operator to determine the various resources that it deploys on your Kubernetes cluster, specifically the PostgreSQL clusters it deploys. +Within PGO's [*PGO_CONF_DIR*](/developer-setup/) directory are several configuration files and templates used by PGO to determine the various resources that it deploys on your Kubernetes cluster, specifically the PostgreSQL clusters it deploys. -When you install the Operator you must make choices as to what kind of storage the Operator has to work with for example. Storage varies with each installation. As an installer, you would modify these configuration templates used by the Operator to customize its behavior. +When you install PGO you must make choices as to what kind of storage the Operator has to work with for example. Storage varies with each installation. As an installer, you would modify these configuration templates used by the Operator to customize its behavior. -**Note**: when you want to make changes to these Operator templates and configuration files after your initial installation, you will need to re-deploy the Operator in order for it to pick up any future configuration changes. +**Note**: when you want to make changes to these PGO templates and configuration files after your initial installation, you will need to re-deploy the Operator in order for it to pick up any future configuration changes. Here are some common examples of configuration changes most installers would make: @@ -110,12 +110,10 @@ Listed above are the *pgo.yaml* sections related to storage choices. *PrimarySt This sort of configuration allows for a PostgreSQL primary and replica to use different storage if you want. Other storage settings like *AccessMode*, *Size*, *StorageType*, and *StorageClass* further define the storage configuration. Currently, NFS, HostPath, and Storage Classes are supported in the configuration. -As part of the Operator installation, you will need to adjust these storage settings to suit your deployment requirements. For users wanting to try +As part of PGO installation, you will need to adjust these storage settings to suit your deployment requirements. For users wanting to try out the Operator on Google Kubernetes Engine you would make the following change to the storage configuration in pgo.yaml: - - For NFS Storage, it is assumed that there are sufficient Persistent Volumes (PV) created for the Operator to use when it creates Persistent Volume Claims (PVC). The creation of Persistent Volumes is something a Kubernetes cluster-admin user would typically provide before installing the Operator. There is an example script which can be used to create NFS Persistent Volumes located here: ./pv/create-nfs-pv.sh @@ -135,11 +133,11 @@ Operator. Other settings in *pgo.yaml* are described in the [pgo.yaml Configuration](/configuration/pgo-yaml-configuration) section of the documentation. -## Operator Security +## PGO Security -The Operator implements its own RBAC (Role Based Access Controls) for authenticating Operator users access to the Operator REST API. +PGO implements its own RBAC (Role Based Access Controls) for authenticating Operator users access to the PGO REST API. -A default admin user is created when the operator is deployed. Create a .pgouser in your home directory and insert the text from below: +A default admin user is created when PGO is deployed. Create a .pgouser in your home directory and insert the text from below: ``` admin:examplepassword @@ -157,7 +155,7 @@ To create a unique administrator user on deployment of the operator edit this fi $PGOROOT/deploy/install-bootstrap-creds.sh ``` -After installation users can create optional Operator users as follows: +After installation users can create optional PGO users as follows: ``` pgo create pgouser someuser --pgouser-namespaces="pgouser1,pgouser2" --pgouser-password=somepassword --pgouser-roles="somerole,someotherrole" @@ -166,13 +164,13 @@ pgo create pgouser someuser --pgouser-namespaces="pgouser1,pgouser2" --pgouser-p Note, you can also store the pgouser file in alternate locations, see the Security documentation for details. -Operator security is discussed in the Security section [Security](/security) of the documentation. +PGO security is further discussed in the section [Security]({{< relref "security/_index.md" >}}) section of the documentation. Adjust these settings to meet your local requirements. ## Default Installation - Create Kubernetes RBAC Controls -The Operator installation requires Kubernetes administrators to create Resources required by the Operator. These resources are only allowed to be created by a cluster-admin user. To install on Google Cloud, you will need a user +PGO installation requires Kubernetes administrators to create Resources required by PGO. These resources are only allowed to be created by a cluster-admin user. To install on Google Cloud, you will need a user account with cluster-admin privileges. If you own the GKE cluster you are installing on, you can add cluster-admin role to your account as follows: @@ -185,9 +183,9 @@ Tor create the Kubernetes RBAC used by the Operator, run the following as a clus make installrbac -This set of Resources is created a single time unless a new Operator +This set of Resources is created a single time unless a new PGO release requires these Resources to be recreated. Note that when you -run *make installrbac* the set of keys used by the Operator REST API and +run *make installrbac* the set of keys used by the PGO REST API and also the pgbackrest ssh keys are generated. Verify the Operator Custom Resource Definitions are created as follows: @@ -199,14 +197,15 @@ You should see the *pgclusters* CRD among the listed CRD resource types. See the Security documentation for a description of the various RBAC resources created and used by the Operator. -## Default Installation - Deploy the Operator +## Default Installation - Deploy PGO + At this point, you as a normal Kubernetes user should be able to deploy the Operator. To do this, run the following Makefile target: make deployoperator -This will cause any existing Operator to be removed first, then the configuration to be bundled into a ConfigMap, then the Operator Deployment to be created. +This will cause any existing PGO installation to be removed first, then the configuration to be bundled into a ConfigMap, then the Operator Deployment to be created. -This will create a postgres-operator Deployment and a postgres-operator Service.Operator administrators needing to make changes to the Operator +This will create a postgres-operator Deployment and a postgres-operator Service.Operator administrators needing to make changes to the PGO configuration would run this make target to pick up any changes to pgo.yaml, pgo users/roles, or the Operator templates. @@ -217,17 +216,20 @@ created using the default installation by running the following: make cleannamespaces -This will permanently delete each namespace the Operator installation +This will permanently delete each namespace the PGO installation created previously. -## pgo CLI Installation -Most users will work with the Operator using the *pgo* CLI tool. That tool is downloaded from the GitHub Releases page for the Operator (https://github.com/crunchydata/postgres-operator/releases). Crunchy Enterprise Customer can download the pgo binaries from https://access.crunchydata.com/ on the downloads page. +## `pgo` client Installation -The *pgo* client is provided in Mac, Windows, and Linux binary formats, +Most users will work with the Operator using the `pgo` client. That tool is downloaded from the GitHub Releases page for the Operator (https://github.com/crunchydata/postgres-operator/releases). Crunchy Data customers can download the `pgo` binaries from https://access.crunchydata.com/ on the downloads page. + +The `pgo` client is provided in Mac, Windows, and Linux binary formats, download the appropriate client to your local laptop or workstation to work with a remote Operator. +You can also use the `pgo-client` container. + {{% notice info %}} If TLS authentication was disabled during installation, please see the [TLS Configuration Page] ({{< relref "Configuration/tls.md" >}}) for additional configuration information. @@ -245,9 +247,9 @@ Prior to using *pgo*, users testing the Operator on a single host can specify th pgo version ``` -That URL address needs to be reachable from your local *pgo* client host. Your Kubernetes administrator will likely need to create a network route, ingress, or LoadBalancer service to expose the Operator REST API to applications outside of the Kubernetes cluster. Your Kubernetes administrator might also allow you to run the Kubernetes port-forward command, contact your administrator for details. +That URL address needs to be reachable from your local `pgo` client host. Your Kubernetes administrator will likely need to create a network route, ingress, or LoadBalancer service to expose the PGO REST API to applications outside of the Kubernetes cluster. Your Kubernetes administrator might also allow you to run the Kubernetes port-forward command, contact your administrator for details. -Next, the *pgo* client needs to reference the keys used to secure the Operator REST API: +Next, the `pgo` client needs to reference the keys used to secure the PGO REST API: ``` export PGO_CA_CERT=$PGOROOT/conf/postgres-operator/server.crt @@ -259,7 +261,7 @@ You can also specify these keys on the command line as follows: pgo version --pgo-ca-cert=$PGOROOT/conf/postgres-operator/server.crt --pgo-client-cert=$PGOROOT/conf/postgres-operator/server.crt --pgo-client-key=$PGOROOT/conf/postgres-operator/server.key -{{% notice tip %}} if you are running the Operator on Google Cloud, you would open up another terminal and run *kubectl port-forward ...* to forward the Operator pod port 8443 to your localhost where you can access the Operator API from your local workstation. +{{% notice tip %}} if you are running PGO on Google Cloud, you would open up another terminal and run *kubectl port-forward ...* to forward the Postgres Operator pod port 8443 to your localhost where you can access the PGO API from your local workstation. {{% /notice %}} At this point, you can test connectivity between your laptop or workstation and the Postgres Operator deployed on a Kubernetes cluster as follows: @@ -270,7 +272,7 @@ You should get back a valid response showing the client and server version numbe ## Verify the Installation -Now that you have deployed the Operator, you can verify that it is running correctly. +Now that you have deployed PGO, you can verify that it is running correctly. You should see a pod running that contains the Operator: @@ -281,10 +283,10 @@ You should see a pod running that contains the Operator: That pod should show 3 of 3 containers in *running* state and that the operator is installed into the *pgo* namespace. -The sample environment script, examples/env.sh, if used creates some bash functions that you can use to view the Operator logs. This is useful in case you find one of the Operator containers not in a running status. +The sample environment script, examples/env.sh, if used creates some bash functions that you can use to view the Postgres Operator logs. This is useful in case you find one of the PGO containers not in a running status. -Using the pgo CLI, you can verify the versions of the client and server match as follows: +Using the `pgo` client, you can verify the versions of the client and server match as follows: pgo version -This also tests connectivity between your pgo client host and the Operator server. +This also tests connectivity between your `pgo` client host and Postgres Operator container. diff --git a/docs/content/installation/other/google-cloud-marketplace.md b/docs/content/installation/other/google-cloud-marketplace.md index 64fa52a684..78885dc7af 100644 --- a/docs/content/installation/other/google-cloud-marketplace.md +++ b/docs/content/installation/other/google-cloud-marketplace.md @@ -5,7 +5,7 @@ draft: false weight: 200 --- -The PostgreSQL Operator is installed as part of [Crunchy PostgreSQL for GKE][gcm-listing] +PGO: the PostgreSQL Operator from Crunchy Data is installed as part of [Crunchy PostgreSQL for GKE][gcm-listing] that is available in the Google Cloud Marketplace. [gcm-listing]: https://console.cloud.google.com/marketplace/details/crunchydata/crunchy-postgresql-operator @@ -16,7 +16,6 @@ that is available in the Google Cloud Marketplace. Install [Crunchy PostgreSQL for GKE][gcm-listing] to a Google Kubernetes Engine cluster using Google Cloud Marketplace. - ## Step 2: Verify Installation Install `kubectl` using the `gcloud components` command of the [Google Cloud SDK][sdk-install] or @@ -25,7 +24,7 @@ by following the [Kubernetes documentation][kubectl-install]. [kubectl-install]: https://kubernetes.io/docs/tasks/tools/install-kubectl/ [sdk-install]: https://cloud.google.com/sdk/docs/install -Using the `gcloud` utility, ensure you are logged into the GKE cluster in which you installed the +Using the `gcloud` utility, ensure you are logged into the GKE cluster in which you installed PGO, the PostgreSQL Operator, and see that it is running in the namespace in which you installed it. For example, in the `pgo` namespace: @@ -44,7 +43,7 @@ pod/postgres-operator-56d6ccb97-tmz7m 4/4 Running 0 2m ``` -## Step 3: Install the PostgreSQL Operator User Keys +## Step 3: Install the PGO User Keys You will need to get TLS keys used to secure the Operator REST API. Again, in the `pgo` namespace: @@ -54,9 +53,9 @@ kubectl -n pgo get secret pgo.tls -o 'go-template={{ index .data "tls.key" | bas ``` -## Step 4: Setup PostgreSQL Operator User +## Step 4: Setup PGO User -The PostgreSQL Operator implements its own role-based access control (RBAC) system for authenticating and authorization PostgreSQL Operator users access to its REST API. A default PostgreSQL Operator user (aka a "pgouser") is created as part of the marketplace installation (these credentials are set during the marketplace deployment workflow). +PGO implements its own role-based access control (RBAC) system for authenticating and authorization PostgreSQL Operator users access to its REST API. A default PostgreSQL Operator user (aka a "pgouser") is created as part of the marketplace installation (these credentials are set during the marketplace deployment workflow). Create the pgouser file in `${HOME?}/.pgo//pgouser` and insert the user and password you created on deployment of the PostgreSQL Operator via GCP Marketplace. For example, if you set up a user with the username of `username` and a password of `hippo`: @@ -67,7 +66,7 @@ username:hippo ## Step 5: Setup Environment variables -The PostgreSQL Operator Client uses several environmental variables to make it easier for interfacing with the PostgreSQL Operator. +The `pgo` Client uses several environmental variables to make it easier for interfacing with the PGO, the Postgres Operator. Set the environmental variables to use the key / certificate pair that you pulled in Step 3 was deployed via the marketplace. Using the previous examples, You can set up environment variables with the following command: @@ -98,13 +97,13 @@ source ~/.bashrc **NOTE**: For macOS users, you must use `~/.bash_profile` instead of `~/.bashrc` -## Step 6: Install the PostgreSQL Operator Client `pgo` +## Step 6: Install the `pgo` Client -The [`pgo` client](/pgo-client/) provides a helpful command-line interface to perform key operations on a PostgreSQL Operator, such as creating a PostgreSQL cluster. +The [`pgo` client](/pgo-client/) provides a helpful command-line interface to perform key operations on a PGO Deployment, such as creating a PostgreSQL cluster. The `pgo` client can be downloaded from GitHub [Releases](https://github.com/crunchydata/postgres-operator/releases) (subscribers can download it from the [Crunchy Data Customer Portal](https://access.crunchydata.com)). -Note that the `pgo` client's version must match the version of the PostgreSQL Operator that you have deployed. For example, if you have deployed version {{< param operatorVersion >}} of the PostgreSQL Operator, you must use the `pgo` for {{< param operatorVersion >}}. +Note that the `pgo` client's version must match the deployed version of PGO. For example, if you have deployed version {{< param operatorVersion >}} of the PostgreSQL Operator, you must use the `pgo` for {{< param operatorVersion >}}. Once you have download the `pgo` client, change the permissions on the file to be executable if need be as shown below: @@ -112,9 +111,9 @@ Once you have download the `pgo` client, change the permissions on the file to b chmod +x pgo ``` -## Step 7: Connect to the PostgreSQL Operator +## Step 7: Connect to PGO -Finally, let's see if we can connect to the PostgreSQL Operator from the `pgo` client. In order to communicate with the PostgreSQL Operator API server, you will first need to set up a [port forward](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) to your local environment. +Finally, let's see if we can connect to the Postgres Operator from the `pgo` client. In order to communicate with the PGO API server, you will first need to set up a [port forward](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) to your local environment. In a new console window, run the following command to set up a port forward: @@ -137,7 +136,7 @@ pgo-apiserver version {{< param operatorVersion >}} ## Step 8: Create a Namespace -We are almost there! You can optionally add a namespace that can be managed by the PostgreSQL Operator to watch and to deploy a PostgreSQL cluster into. +We are almost there! You can optionally add a namespace that can be managed by PGO to watch and to deploy a PostgreSQL cluster into. ```shell pgo create namespace wateringhole @@ -194,4 +193,3 @@ cluster : hippo ``` The `pgo test` command provides you the basic information you need to connect to your PostgreSQL cluster from within your Kubernetes environment. For more detailed information, you can use `pgo show cluster -n wateringhole hippo`. - diff --git a/docs/content/installation/other/helm.md b/docs/content/installation/other/helm.md index b4bab8ff26..43da7fd553 100644 --- a/docs/content/installation/other/helm.md +++ b/docs/content/installation/other/helm.md @@ -5,12 +5,13 @@ draft: false weight: 100 --- -# The PostgreSQL Operator Helm Chart +# PGO: The Postgres Operator Helm Chart ## Overview -The PostgreSQL Operator comes with a container called `pgo-deployer` which -handles a variety of lifecycle actions for the PostgreSQL Operator, including: +PGO, the Postgres Operator from Crunchy Data, comes with a +container called `pgo-deployer` which handles a variety of +lifecycle actions for the PostgreSQL Operator, including: - Installation - Upgrading @@ -178,11 +179,11 @@ pgo-apiserver version {{< param operatorVersion >}} ## Upgrade and Uninstall -Once install has be completed using Helm, it will also be used to upgrade and +Once install has be completed using Helm, it will also be used to upgrade and uninstall your PostgreSQL Operator. {{% notice tip %}} -The `name` and `namespace` in the following sections should match the options +The `name` and `namespace` in the following sections should match the options provided at install. {{% /notice %}} @@ -208,7 +209,7 @@ helm uninstall -n ## Debugging -When the `pgo-deployer` job does not complete successfully, the resources that +When the `pgo-deployer` job does not complete successfully, the resources that are created and normally cleaned up by Helm will be left in your Kubernetes cluster. This will allow you to use the failed job and its logs to debug the issue. The following command will show the logs for the `pgo-deployer` diff --git a/docs/content/installation/other/operator-hub.md b/docs/content/installation/other/operator-hub.md index b610ee2664..0f2b5fd029 100644 --- a/docs/content/installation/other/operator-hub.md +++ b/docs/content/installation/other/operator-hub.md @@ -6,7 +6,7 @@ weight: 200 --- If your Kubernetes cluster is already running the [Operator Lifecycle Manager][OLM], -the PostgreSQL Operator can be installed as part of [Crunchy PostgreSQL for Kubernetes][hub-listing] +then PGO, the Postgres Operator from Crunchy Data, can be installed as part of [Crunchy PostgreSQL for Kubernetes][hub-listing] that is available in OperatorHub.io. [hub-listing]: https://operatorhub.io/operator/postgresql @@ -15,7 +15,7 @@ that is available in OperatorHub.io. ## Before You Begin -There are a few manual steps that the cluster administrator must perform prior to installing the PostgreSQL Operator. +There are a few manual steps that the cluster administrator must perform prior to installing PGO. At the very least, it must be provided with an initial configuration. First, make sure OLM and the OperatorHub.io catalog are installed by running @@ -59,7 +59,7 @@ kubectl -n "$PGO_OPERATOR_NAMESPACE" create secret generic pgo-backrest-repo-con ### Certificates (optional) -The PostgreSQL Operator has an API that uses TLS to communicate securely with clients. If you have +PGO has an API that uses TLS to communicate securely with clients. If you have a certificate bundle validated by your organization, you can install it now. If not, the API will automatically generate and use a self-signed certificate. @@ -104,7 +104,7 @@ YAML ## After You Install -Once the PostgreSQL Operator is installed in your Kubernetes cluster, you will need to do a few things +Once PGO is installed in your Kubernetes cluster, you will need to do a few things to use the [PostgreSQL Operator Client]({{< relref "/pgo-client/_index.md" >}}). Install the first set of client credentials and download the `pgo` binary and client certificates. @@ -114,7 +114,7 @@ PGO_CMD=kubectl ./deploy/install-bootstrap-creds.sh PGO_CMD=kubectl ./installers/kubectl/client-setup.sh ``` -The client needs to be able to reach the PostgreSQL Operator API from outside the Kubernetes cluster. +The client needs to be able to reach the PGO API from outside the Kubernetes cluster. Create an external service or forward a port locally. ``` diff --git a/docs/content/installation/pgo-client.md b/docs/content/installation/pgo-client.md index 69dae759e1..6c584168df 100644 --- a/docs/content/installation/pgo-client.md +++ b/docs/content/installation/pgo-client.md @@ -1,5 +1,5 @@ --- -title: "Install `pgo` Client" +title: "Install \"pgo\" Client" date: draft: false weight: 30 @@ -8,23 +8,22 @@ weight: 30 # Install the PostgreSQL Operator (`pgo`) Client The following will install and configure the `pgo` client on all systems. For the -purpose of these instructions it's assumed that the Crunchy PostgreSQL Operator -is already deployed. +purpose of these instructions it's assumed that PGO: the Postgres Operator from Crunchy +Data is already deployed. ## Prerequisites * For Kubernetes deployments: [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) configured to communicate with Kubernetes * For OpenShift deployments: [oc](https://docs.openshift.com/container-platform/3.11/cli_reference/get_started_cli.html) configured to communicate with OpenShift -To authenticate with the Crunchy PostgreSQL Operator API: +To authenticate with the PGO API: * Client CA Certificate * Client TLS Certificate * Client Key * `pgouser` file containing `:` -All of the requirements above should be obtained from an administrator who installed the Crunchy -PostgreSQL Operator. +All of the requirements above should be obtained from an administrator who installed PGO. ## Linux and macOS @@ -288,5 +287,4 @@ properly by simply running the following: pgo version ``` -If the above command outputs versions of both the client and API server, the Crunchy PostgreSQL -Operator client has been installed successfully. +If the above command outputs versions of both the client and API server, the `pgo` client has been installed successfully. diff --git a/docs/content/installation/postgres-operator.md b/docs/content/installation/postgres-operator.md index 0cbd542dd5..0a79ef9019 100644 --- a/docs/content/installation/postgres-operator.md +++ b/docs/content/installation/postgres-operator.md @@ -1,11 +1,11 @@ --- -title: Install the PostgreSQL Operator +title: Install PGO the Postgres Operator date: draft: false weight: 20 --- -# The PostgreSQL Operator Installer +# PGO: Postgres Operator Installer ## Quickstart @@ -23,8 +23,8 @@ the PostgreSQL Operator. ## Overview -The PostgreSQL Operator comes with a container called `pgo-deployer` which -handles a variety of lifecycle actions for the PostgreSQL Operator, including: +PGO comes with a container called `pgo-deployer` which +handles a variety of lifecycle actions for the Postgres Operator, including: - Installation - Upgrading @@ -52,7 +52,7 @@ environmental requirements. By default, the `pgo-deployer` uses a ServiceAccount called `pgo-deployer-sa` that has a ClusterRoleBinding (`pgo-deployer-crb`) with several ClusterRole permissions. This is required to create the [Custom Resource Definitions](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) -that power the PostgreSQL Operator. While the PostgreSQL Operator itself can be +that power PGO. While the Postgres Operator itself can be scoped to a specific namespace, you will need to have `cluster-admin` for the initial deployment, or privileges that allow you to install Custom Resource Definitions. The required list of privileges are available in the [postgres-operator.yml](https://raw.githubusercontent.com/CrunchyData/postgres-operator/v{{< param operatorVersion >}}/installers/kubectl/postgres-operator.yml) file: @@ -82,7 +82,7 @@ For example, to create the `pgo` namespace: kubectl create namespace pgo ``` -The PostgreSQL Operator has the ability to manage PostgreSQL clusters across +The Postgres Operator has the ability to manage PostgreSQL clusters across multiple Kubernetes [Namespaces](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/), including the ability to add and remove Namespaces that it watches. Doing so does require the PostgreSQL Operator to have elevated privileges, and as such, @@ -120,7 +120,7 @@ PostgreSQL Operator cannot create the RBAC itself. ## Configuration - `postgres-operator.yml` The `postgres-operator.yml` file contains all of the configuration parameters -for deploying the PostgreSQL Operator. The [example file](https://github.com/CrunchyData/postgres-operator/blob/v{{< param operatorVersion >}}/installers/kubectl/postgres-operator.yml) +for deploying PGO. The [example file](https://github.com/CrunchyData/postgres-operator/blob/v{{< param operatorVersion >}}/installers/kubectl/postgres-operator.yml) contains defaults that should work in most Kubernetes environments, but it may require some customization. @@ -138,7 +138,7 @@ set to `install`, `update`, and `uninstall`. ### Image Pull Secrets -If you are pulling the PostgreSQL Operator images from a private registry, you +If you are pulling PGO images from a private registry, you will need to setup an [imagePullSecret](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/) with access to the registry. The image pull secret will need to be added to the @@ -174,7 +174,7 @@ oc secrets link --for=pull --namespace=}}) for instructions on how to install the PostgreSQL Operator Monitoring infrastructure. diff --git a/docs/content/installation/prerequisites.md b/docs/content/installation/prerequisites.md index 2df54859d9..0a70756057 100644 --- a/docs/content/installation/prerequisites.md +++ b/docs/content/installation/prerequisites.md @@ -7,11 +7,11 @@ weight: 10 # Prerequisites -The following is required prior to installing PostgreSQL Operator. +The following is required prior to installing PGO. ## Environment -The PostgreSQL Operator is tested in the following environments: +PGO is tested in the following environments: * Kubernetes v1.13+ * Red Hat OpenShift v3.11+ @@ -22,7 +22,7 @@ The PostgreSQL Operator is tested in the following environments: #### IBM Cloud Pak Data -If you install the PostgreSQL Operator, which comes with Crunchy +If you install PGO, which comes with Crunchy PostgreSQL for Kubernetes, on IBM Cloud Pak Data, please note the following additional requirements: @@ -33,14 +33,14 @@ additional requirements: * Minimum Memory Requirements: 120MB * Minimum Storage Requirements: 5MB -**Note**: PostgreSQL clusters deployed by the PostgreSQL Operator with +**Note**: PostgreSQL clusters deployed by PGO with Crunchy PostgreSQL for Kubernetes are workload dependent. As such, users should allocate enough resources for their PostgreSQL clusters. ## Client Interfaces -The PostgreSQL Operator installer will install the [`pgo` client]({{< relref "/pgo-client/_index.md" >}}) interface -to help with using the PostgreSQL Operator. However, it is also recommend that +The Postgres Operator installer will install the [`pgo` client]({{< relref "/pgo-client/_index.md" >}}) interface +to help with using PGO. However, it is also recommend that you have access to [`kubectl`](https://kubernetes.io/docs/tasks/tools/install-kubectl/) or [`oc`](https://www.okd.io/download.html) and are able to communicate with the Kubernetes or OpenShift cluster that you are working with. @@ -63,7 +63,7 @@ access to these ports. ### Application Ports -The PostgreSQL Operator deploys different services to support a production +PGO deploys different services to support a production PostgreSQL environment. Below is a list of the applications and their default Service ports. diff --git a/docs/content/pgo-client/_index.md b/docs/content/pgo-client/_index.md index b155e3a3e8..5be07b540d 100644 --- a/docs/content/pgo-client/_index.md +++ b/docs/content/pgo-client/_index.md @@ -6,11 +6,11 @@ weight: 50 --- The PostgreSQL Operator Client, aka `pgo`, is the most convenient way to -interact with the PostgreSQL Operator. `pgo` provides many convenience methods +interact with the Postgres Operator. `pgo` provides many convenience methods for creating, managing, and deleting PostgreSQL clusters through a series of simple commands. The `pgo` client interfaces with the API that is provided by the PostgreSQL Operator and can leverage the RBAC and TLS systems that are -provided by the PostgreSQL Operator +provided by the PGO: PostgreSQL Operator. ![Architecture](/Operator-Architecture.png) diff --git a/docs/content/quickstart/_index.md b/docs/content/quickstart/_index.md index dd29d467be..3809578b77 100644 --- a/docs/content/quickstart/_index.md +++ b/docs/content/quickstart/_index.md @@ -5,26 +5,27 @@ draft: false weight: 10 --- -# PostgreSQL Operator Quickstart +# PGO: PostgreSQL Operator Quickstart -Can't wait to try out the PostgreSQL Operator? Let us show you the quickest possible path to getting up and running. +Can't wait to try out PGO, the Postgres Operator from Crunchy Data? Let us show +you the quickest possible path to getting up and running. -There are two paths to quickly get you up and running with the PostgreSQL Operator: +There are two paths to quickly get you up and running with PGO: -- [Installation via the PostgreSQL Operator Installer](#postgresql-operator-installer) +- [Installation via the Postgres Operator Installer](#postgresql-operator-installer) - Installation via a Marketplace - Installation via [Operator Lifecycle Manager]({{< relref "/installation/other/operator-hub.md" >}}) - Installation via [Google Cloud Marketplace]({{< relref "/installation/other/google-cloud-marketplace.md" >}}) Marketplaces can help you get more quickly started in your environment as they provide a mostly automated process, but there are a few steps you will need to take to ensure you can fully utilize your PostgreSQL Operator environment. You can find out more information about how to get started with one of those installers in the [Installation]({{< relref "/installation/_index.md" >}}) section. -# PostgreSQL Operator Installer +# Postgres Operator Installer Below will guide you through the steps for installing and using the PostgreSQL Operator using an installer that works with Ansible. ## Installation -### Install the PostgreSQL Operator +### Install PGO: the PostgreSQL Operator On environments that have a [default storage class](https://kubernetes.io/docs/tasks/administer-cluster/change-default-storage-class/) set up (which is most modern Kubernetes environments), the below command should work: @@ -39,14 +40,14 @@ If your install is unsuccessful, you may need to modify your configuration. Plea ### Install the `pgo` Client -During or after the installation of the PostgreSQL Operator, download the `pgo` client set up script. This will help set up your local environment for using the PostgreSQL Operator: +During or after the installation of PGO: the Postgres Operator, download the `pgo` client set up script. This will help set up your local environment for using the Postgres Operator: ``` curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v{{< param operatorVersion >}}/installers/kubectl/client-setup.sh > client-setup.sh chmod +x client-setup.sh ``` -When the PostgreSQL Operator is done installing, run the client setup script: +When the Postgres Operator is done installing, run the client setup script: ``` ./client-setup.sh @@ -83,9 +84,9 @@ source ~/.bashrc ### Post-Installation Setup -Below are a few steps to check if the PostgreSQL Operator is up and running. +Below are a few steps to check if PGO: the Postgres Operator is up and running. -By default, the PostgreSQL Operator installs into a namespace called `pgo`. First, see that the Kubernetes Deployment of the Operator exists and is healthy: +By default, PGO installs into a namespace called `pgo`. First, see that the Kubernetes Deployment of PGO exists and is healthy: ``` kubectl -n pgo get deployments @@ -111,7 +112,7 @@ NAME READY STATUS RESTARTS AGE postgres-operator-56d6ccb97-tmz7m 4/4 Running 0 2m ``` -Finally, let's see if we can connect to the PostgreSQL Operator from the `pgo` command-line client. The Ansible installer installs the `pgo` command line client into your environment, along with the username/password file that allows you to access the PostgreSQL Operator. In order to communicate with the PostgreSQL Operator API server, you will first need to set up a [port forward](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) to your local environment. +Finally, let's see if we can connect to the Postgres Operator from the `pgo` command-line client. The Ansible installer installs the `pgo` command line client into your environment, along with the username/password file that allows you to access the PostgreSQL Operator. In order to communicate with the PostgreSQL Operator API server, you will first need to set up a [port forward](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) to your local environment. In a new console window, run the following command to set up a port forward: @@ -134,7 +135,7 @@ pgo-apiserver version {{< param operatorVersion >}} ## Create a PostgreSQL Cluster -The quickstart installation method creates a namespace called `pgo` where the PostgreSQL Operator manages PostgreSQL clusters. Try creating a PostgreSQL cluster called `hippo`: +The quickstart installation method creates a namespace called `pgo` where PGO, the Postgres Operator, manages PostgreSQL clusters. Try creating a PostgreSQL cluster called `hippo`: ``` pgo create cluster -n pgo hippo @@ -155,7 +156,7 @@ created Pgcluster hippo workflow id 1cd0d225-7cd4-4044-b269-aa7bedae219b ``` -This will create a PostgreSQL cluster named `hippo`. It may take a few moments for the cluster to be provisioned. You can see the status of this cluster using the [`pgo test`]({{< relref "pgo-client/reference/pgo_test.md" >}}) command: +This will create a Postgres cluster named `hippo`. It may take a few moments for the cluster to be provisioned. You can see the status of this cluster using the [`pgo test`]({{< relref "pgo-client/reference/pgo_test.md" >}}) command: ``` pgo test -n pgo hippo @@ -175,7 +176,7 @@ The `pgo test` command provides you the basic information you need to connect to ## Connect to a PostgreSQL Cluster -By default, the PostgreSQL Operator creates a database inside the cluster with the same name of the cluster, in this case, `hippo`. Below demonstrates how we can connect to `hippo`. +By default, PGO creates a database inside the cluster with the same name of the cluster, in this case, `hippo`. Below demonstrates how we can connect to `hippo`. ### How Users Work @@ -193,7 +194,7 @@ CLUSTER USERNAME PASSWORD EXPIRES STATUS ERROR hippo testuser datalake never ok ``` -To get the information about all PostgreSQL users that the PostgreSQL Operator is managing, you will need to use the `--show-system-accounts` flag: +To get the information about all PostgreSQL users that PGO is managing, you will need to use the `--show-system-accounts` flag: ``` pgo show user -n pgo hippo --show-system-accounts @@ -217,7 +218,7 @@ The `primaryuser` is the used for replication and [high availability]({{< relref Let's see how we can connect to `hippo` using [`psql`](https://www.postgresql.org/docs/current/app-psql.html), the command-line tool for accessing PostgreSQL. Ensure you have [installed the `psql` client](https://www.crunchydata.com/developers/download-postgres/binaries/postgresql12). -The PostgreSQL Operator creates a service with the same name as the cluster. See for yourself! Get a list of all of the Services available in the `pgo` namespace: +PGO, the Postgres Operator, creates a service with the same name as the cluster. See for yourself! Get a list of all of the Services available in the `pgo` namespace: ``` kubectl -n pgo get svc @@ -293,7 +294,7 @@ For more information, please see the section on [pgAdmin 4]({{< relref "architec Some Kubernetes environments may require you to customize the configuration for the PostgreSQL Operator installer. The below provides a guide on the common parameters that require modification, though this may vary based on your installation. For a full reference, please visit the [Installation]({{< relref "/installation/_index.md" >}}) section. -If you already attempted to install the PostgreSQL Operator and that failed, the easiest way to clean up that installation is to delete the [Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) that you attempted to install the PostgreSQL Operator into. **Note: This deletes all of the other objects in the Namespace, so please be sure this is OK!** +If you already attempted to install PGO and that failed, the easiest way to clean up that installation is to delete the [Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) that you attempted to install the Postgres Operator into. **Note: This deletes all of the other objects in the Namespace, so please be sure this is OK!** To delete the namespace, you can run the following command: @@ -301,15 +302,15 @@ To delete the namespace, you can run the following command: kubectl delete namespace pgo ``` -#### Get the PostgreSQL Operator Installer Manifest +#### Get the Postgres Operator Installer Manifest -You will need to download the PostgreSQL Operator Installer manifest to your environment, which you can do with the following command: +You will need to download the Postgres Operator Installer manifest to your environment, which you can do with the following command: ``` curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v{{< param operatorVersion >}}/installers/kubectl/postgres-operator.yml > postgres-operator.yml ``` -#### Configure the PostgreSQL Operator Installer +#### Configure the Postgres Operator Installer There are many [configuration parameters]({{< relref "/installation/configuration.md">}}) to help you fine tune your installation, but there are a few that you may want to change to get the PostgreSQL Operator to run in your environment. Open up the `postgres-operator.yml` file and edit a few variables. @@ -326,11 +327,11 @@ primary_storage: "nfsstorage" replica_storage: "nfsstorage" ``` -If you are using either Openshift or CodeReady Containers and you have a `restricted` Security Context Constraint, you will need to set `disable_fsgroup` to `true` in order to deploy the PostgreSQL Operator. +If you are using either OpenShift or CodeReady Containers and you have a `restricted` Security Context Constraint, you will need to set `disable_fsgroup` to `true` in order to deploy PGO. For a full list of available storage types that can be used with this installation method, please review the [configuration parameters]({{< relref "/installation/configuration.md">}}). -When you are done editing the file, you can install the PostgreSQL Operator by running the following commands: +When you are done editing the file, you can install PGO by running the following commands: ``` kubectl create namespace pgo diff --git a/docs/content/support/_index.md b/docs/content/support/_index.md index a1cb419443..0a2ca60346 100644 --- a/docs/content/support/_index.md +++ b/docs/content/support/_index.md @@ -5,10 +5,10 @@ draft: false weight: 110 --- -There are a few options available for community support of the [PostgreSQL Operator](https://github.com/CrunchyData/postgres-operator): +There are a few options available for community support of the [PGO: the Postgres Operator](https://github.com/CrunchyData/postgres-operator): -- **If you believe you have found a bug** or have a detailed feature request: please open [an issue on GitHub](https://github.com/CrunchyData/postgres-operator/issues/new/choose). The PostgreSQL Operator community and the Crunchy Data team behind the PostgreSQL Operator is generally active in responding to issues. -- **For general questions or community support**: please join the PostgreSQL Operator community mailing list at [postgres-operator@crunchydata.com](mailto:postgres-operator@crunchydata.com), +- **If you believe you have found a bug** or have a detailed feature request: please open [an issue on GitHub](https://github.com/CrunchyData/postgres-operator/issues/new/choose). The Postgres Operator community and the Crunchy Data team behind the PGO is generally active in responding to issues. +- **For general questions or community support**: please join the [PostgreSQL Operator community mailing list](https://groups.google.com/a/crunchydata.com/forum/#!forum/postgres-operator/join) at [https://groups.google.com/a/crunchydata.com/forum/#!forum/postgres-operator/join](https://groups.google.com/a/crunchydata.com/forum/#!forum/postgres-operator/join), In all cases, please be sure to provide as many details as possible in regards to your issue, including: diff --git a/docs/content/tutorial/_index.md b/docs/content/tutorial/_index.md index 2919cc6a25..0babd127dc 100644 --- a/docs/content/tutorial/_index.md +++ b/docs/content/tutorial/_index.md @@ -4,10 +4,10 @@ draft: false weight: 15 --- -The PostgreSQL Operator provides functionality that lets you run your own database-as-a-service: from deploying PostgreSQL clusters with [high availability]({{< relref "architecture/high-availability/_index.md" >}}), to a [full stack monitoring]({{< relref "architecture/high-availability/_index.md" >}}) solution, essential [disaster recovery and backup tools]({{< relref "architecture/disaster-recovery.md" >}}), the ability to secure your cluster with TLS, and much more! +PGO, the Postgres Operator, provides functionality that lets you run your own database-as-a-service: from deploying PostgreSQL clusters with [high availability]({{< relref "architecture/high-availability/_index.md" >}}), to a [full stack monitoring]({{< relref "architecture/high-availability/_index.md" >}}) solution, essential [disaster recovery and backup tools]({{< relref "architecture/disaster-recovery.md" >}}), the ability to secure your cluster with TLS, and much more! What's more, you can manage your PostgreSQL clusters with the convenient [`pgo` client]({{< relref "pgo-client/_index.md" >}}) or by interfacing directly with the PostgreSQL Operator [custom resources]({{< relref "custom-resources/_index.md" >}}). -Given the robustness of the PostgreSQL Operator, we think it's helpful to break down the functionality in this step-by-step tutorial. The tutorial covers the essential functions the PostgreSQL Operator can perform and covers many common basic and advanced use cases. +Given the robustness of PGO, we think it's helpful to break down the functionality in this step-by-step tutorial. The tutorial covers the essential functions the Postgres Operator can perform and covers many common basic and advanced use cases. So what are you waiting for? Let's [get started]({{< relref "tutorial/getting-started.md" >}})! diff --git a/docs/content/tutorial/create-cluster.md b/docs/content/tutorial/create-cluster.md index 3012787e93..6db4090269 100644 --- a/docs/content/tutorial/create-cluster.md +++ b/docs/content/tutorial/create-cluster.md @@ -143,6 +143,10 @@ has successfully started. - The password for the `ccp_monitoring` user has changed. In this case you will need to update the Secret with the monitoring credentials. +## Custom Resources + +You may also be curious about how to perform the same actions directly with [custom resources]({{< relref "custom-resources/_index.md" >}}). If that is the case, we encourage to skip ahead to the [Custom Resources]({{< relref "custom-resources/_index.md" >}}) section of the documentation. + ## Next Steps Once your cluster is created, the next step is to [connect to your PostgreSQL cluster]({{< relref "tutorial/connect-cluster.md" >}}). You can also [learn how to customize your PostgreSQL cluster]({{< relref "tutorial/customize-cluster.md" >}})! diff --git a/docs/content/tutorial/getting-started.md b/docs/content/tutorial/getting-started.md index 8422487ed1..c02fd355a4 100644 --- a/docs/content/tutorial/getting-started.md +++ b/docs/content/tutorial/getting-started.md @@ -6,17 +6,17 @@ weight: 100 ## Installation -If you have not installed the PostgreSQL Operator yet, we recommend you take a look at our [quickstart]({{< relref "quickstart/_index.md" >}}) or the [installation]({{< relref "installation/_index.md" >}}) sections. +If you have not installed PGO, the Postgres Operator, yet, we recommend you take a look at our [quickstart]({{< relref "quickstart/_index.md" >}}) or the [installation]({{< relref "installation/_index.md" >}}) sections. ### Customizing an Installation -How to customize a PostgreSQL Operator installation is a lengthy topic. The details are covered in the [installation]({{< relref "installation/postgres-operator.md" >}}) section, as well as a list of all the [configuration variables]({{< relref "installation/configuration.md" >}}) available. +How to customize a PGO installation is a lengthy topic. The details are covered in the [installation]({{< relref "installation/postgres-operator.md" >}}) section, as well as a list of all the [configuration variables]({{< relref "installation/configuration.md" >}}) available. ## Setup the `pgo` Client -This tutorial will be using the [`pgo` client]({{< relref "pgo-client/_index.md" >}}) to interact with the PostgreSQL Operator. Please follow the instructions in the [quickstart]({{< relref "quickstart/_index.md" >}}) or the [installation]({{< relref "installation/pgo-client.md" >}}) sections for how to configure the `pgo` client. +This tutorial will be using the [`pgo` client]({{< relref "pgo-client/_index.md" >}}) to interact with the Postgres Operator. Please follow the instructions in the [quickstart]({{< relref "quickstart/_index.md" >}}) or the [installation]({{< relref "installation/pgo-client.md" >}}) sections for how to configure the `pgo` client. -The PostgreSQL Operator and `pgo` client are designed to work in a [multi-namespace deployment environment]({{< relref "architecture/namespace.md" >}}) and many `pgo` commands require that the namespace flag (`-n`) are passed into it. You can use the `PGO_NAMESPACE` environmental variable to set which namespace a `pgo` command can use. For example: +The Postgres Operator and `pgo` client are designed to work in a [multi-namespace deployment environment]({{< relref "architecture/namespace.md" >}}) and many `pgo` commands require that the namespace flag (`-n`) are passed into it. You can use the `PGO_NAMESPACE` environmental variable to set which namespace a `pgo` command can use. For example: ``` export PGO_NAMESPACE=pgo @@ -39,13 +39,13 @@ export PGO_NAMESPACE=pgo ## Next Steps -Before proceeding, please make sure that your `pgo` client setup can communicate with your PostgreSQL Operator. In a separate terminal window, set up a port forward to your PostgreSQL Operator: +Before proceeding, please make sure that your `pgo` client setup can communicate with your PGO Deployment. In a separate terminal window, set up a port forward to your PostgreSQL Operator: ``` kubectl port-forward -n pgo svc/postgres-operator 8443:8443 ``` -The [`pgo version`]({{< relref "pgo-client/reference/pgo_version.md" >}}) command is a great way to check connectivity with the PostgreSQL Operator, as it is a very simple, safe operation. Try it out: +The [`pgo version`]({{< relref "pgo-client/reference/pgo_version.md" >}}) command is a great way to check connectivity with the Postgres Operator, as it is a very simple, safe operation. Try it out: ``` pgo version @@ -72,4 +72,4 @@ which yields results similar to: pgo client version {{< param operatorVersion >}} ``` -Alright, we're now ready to start our journey with the PostgreSQL Operator! +Alright, we're now ready to start our journey with PGO! diff --git a/docs/static/crunchy-logo.jpg b/docs/static/crunchy-logo.jpg deleted file mode 100644 index 01f9c9b1a4555771126876f02adde2d155b93b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100361 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%0D^7vAL#$8yS%RkpRNIxJ2#Z0GK6VT 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 nVRx*w^&2WZ&EbkI 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 literal 0 HcmV?d00001 diff --git a/docs/static/pgo.svg b/docs/static/pgo.svg new file mode 100644 index 0000000000..b017c9851d --- /dev/null +++ b/docs/static/pgo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/installers/ansible/README.md b/installers/ansible/README.md index 238f1398bb..9353da7615 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -1,15 +1,15 @@ -# Crunchy Data PostgreSQL Operator Playbook +# PGO: Postgres Operator Playbook

- Crunchy Data + PGO: The Postgres Operator from Crunchy Data

Latest Release: 4.5.2 ## General -This repository contains Ansible Roles for deploying the Crunchy PostgreSQL Operator -for Kubernetes and OpenShift. +This repository contains Ansible Roles for deploying PGO: the Postgres Operator +from [Crunchy Data](https://www.crunchydata.com) for Kubernetes and OpenShift. See the [official documentation for more information](https://crunchydata.github.io/postgres-operator/stable/) on installing Crunchy PostgreSQL Operator. diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index 6a5c1429c8..ddff9894e8 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -1,11 +1,11 @@ - This directory contains the files that are used to install [Crunchy PostgreSQL for GKE][gcp-details], -which uses the PostgreSQL Operator, from the Google Cloud Marketplace. +which uses PGO: the PostgreSQL Operator from [Crunchy Data][crunchy-data], from the Google Cloud Marketplace. The integration centers around a container [image](./Dockerfile) that contains an installation [schema](./schema.yaml) and an [Application][k8s-app] [manifest](./application.yaml). Consult the [technical requirements][gcp-k8s-requirements] when making changes. +[crunchy-data]: https://www.crunchydata.com [k8s-app]: https://github.com/kubernetes-sigs/application/ [gcp-k8s]: https://cloud.google.com/marketplace/docs/kubernetes-apps/ [gcp-k8s-requirements]: https://cloud.google.com/marketplace/docs/partners/kubernetes-solutions/create-app-package diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index 6b32ef6d5e..1b05779521 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -1,11 +1,11 @@ apiVersion: v2 name: postgres-operator -description: Crunchy PostgreSQL Operator Helm chart for Kubernetes +description: PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes type: application version: 0.1.0 appVersion: 4.5.2 home: https://github.com/CrunchyData/postgres-operator -icon: https://github.com/CrunchyData/postgres-operator/raw/master/crunchy_logo.png +icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/pgo.svg keywords: - PostgreSQL - Operator diff --git a/installers/helm/README.md b/installers/helm/README.md index bde966f9f9..0dbe9ac5a3 100644 --- a/installers/helm/README.md +++ b/installers/helm/README.md @@ -1,10 +1,10 @@ -# Crunchy PostgreSQL Operator +# PGO: The Postgres Operator from Crunchy Data -This Helm chart installs the Crunchy PostgreSQL Operator by using its “pgo-deployer” -container. Helm will setup the ServiceAccount, RBAC, and ConfigMap needed to run -the container as a Kubernetes Job. Then a job will be created based on `helm` -`install`, `upgrade`, or `uninstall`. After the job has completed the RBAC will -be cleaned up. +This Helm chart installs PGO: the Postgres Operator from Crunchy Data by using +its “pgo-deployer” container. Helm will setup the ServiceAccount, RBAC, and +ConfigMap needed to run the container as a Kubernetes Job. Then a job will +be created based on `helm` `install`, `upgrade`, or `uninstall`. After the +job has completed the RBAC will be cleaned up. ## Prerequisites @@ -39,10 +39,10 @@ cd postgres-operator/installers/helm helm uninstall postgres-operator -n pgo ``` -## Configuraiton +## Configuration The following shows the configurable parameters that are relevant to the Helm -Chart. A full list of all Crunchy PostgreSQL Operator configuration options can +Chart. A full list of all PGO configuration options can be found in the [documentation](https://access.crunchydata.com/documentation/postgres-operator/latest/installation/configuration/). | Name | Default | Description | diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index 319de0231f..8c113c3617 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -1,15 +1,15 @@ -# Crunchy Data PostgreSQL Operator Monitoring Playbook +# PGO: Postgres Operator Monitoring Playbook

- Crunchy Data + Crunchy Data

Latest Release: 4.5.2 ## General -This repository contains Ansible Roles for deploying the metrics stack for the -Crunchy PostgreSQL Operator. +This repository contains Ansible Roles for deploying the metrics stack for PGO, +the Postgres Operator from [Crunchy Data](https://www.crunchydata.com). -See the [official Crunchy PostgreSQL Operator documentation](https://access.crunchydata.com/documentation/postgres-operator/) +See the [PGO documentation](https://access.crunchydata.com/documentation/postgres-operator/) for more information. diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index 91853271ac..d76ebf626c 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -5,4 +5,4 @@ type: application version: 0.1.0 appVersion: 4.5.2 home: https://github.com/CrunchyData/postgres-operator -icon: https://github.com/CrunchyData/postgres-operator/raw/master/crunchy_logo.png \ No newline at end of file +icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/pgo.svg diff --git a/installers/olm/README.md b/installers/olm/README.md index 207f85daa8..6e31ba4d0b 100644 --- a/installers/olm/README.md +++ b/installers/olm/README.md @@ -1,11 +1,11 @@ - This directory contains the files that are used to install [Crunchy PostgreSQL for Kubernetes][hub-listing], -which uses the PostgreSQL Operator, using [Operator Lifecycle Manager][OLM]. +which includes PGO, the Postgres Operator from [Crunchy Data][crunchy-data], using [Operator Lifecycle Manager][OLM]. The integration centers around a [ClusterServiceVersion][olm-csv] [manifest](./postgresoperator.csv.yaml) that gets packaged for OperatorHub. Changes there are accepted only if they pass all the [scorecard][] tests. Consult the [technical requirements][hub-contrib] when making changes. +[crunchy-data]: https://www.crunchydata.com [hub-contrib]: https://github.com/operator-framework/community-operators/blob/master/docs/contributing.md [hub-listing]: https://operatorhub.io/operator/postgresql [olm-csv]: https://github.com/operator-framework/operator-lifecycle-manager/blob/master/doc/design/building-your-csv.md From 0648ee571045e9a61e34206a8f654b7cbee37323 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 12 Apr 2021 21:26:12 -0400 Subject: [PATCH 086/129] Update logo file This allows for the logo to render better when using GitHub's dark mode. --- docs/static/pgo.png | Bin 234696 -> 262650 bytes docs/static/pgo.svg | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/static/pgo.png b/docs/static/pgo.png index 08b03dd59e9f6690909643370237b9cc7a8ae565..9d38c8f85958df48e081f1abeaf6ddefb957d87d 100644 GIT binary patch delta 126895 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
$ON-f4wP*9|lo348Q@_sbS@mRX{nMpXGhy@{7)+ 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 delta 101900 zcmbSzcRZEv|NnK4bwnH~P7&v5Xvj#}DR!(LyR@-KU&LNb8MKBuyew_AXQs zy-Ua*A!N(u_qvaU_xOB2-|z4K!=uuDU9amkpRaM$l&V_+f`ryQGr+ znn#mQhZp*k^4#X>ZshKNJb$Oe%AE##Y&PoJPI@0PWLq;|z;Mr~XOC1ZXNShvo@FJvN zkb-5X3#l3(`*tQBX=B{fgLhmBOqGe0onAv)V-1mrh;M@7KXPyTiz6x3@I1*K0}}(c zti}zqEKkcg*gH6C5lOYjBOR}!{Pla|H9WdQ`~D21brn$ZUrU7YqFm?I*^~PhE2m;& zs+5W*wo^aO;z%UPboQ(+-z$D{c;NBOMy!1-U>^(l5yKB^)1En%-p_>;u~p`YI}cvu z;HI7|^2)X$k`z;&o8_1q$+^g;*MvJL5txtQ|0p+5L!7g^fLBj|S4X1c zx9K4QzBK+=Tzbiml&s}PS`I~E-t)DMS0|f)yQmJZ5Gg#0vmmNKItC4 zI*S>%&x<1`>~cxN-W@{|1GT{QNvodPRIRjIzqzr-JZ*~{(}$v?boht_Lj6gVm3cPo zOXeMcPdTD-u_E zbYzc=I|%LV{gK*w%xF=R&vS#53sh4BQT|7Ea=NG!Suf43ALUz;ER)7Me0-FJBO-pY zjot$~BzwK2p<>7I#DFjy%>6{4Sq)Qd`YgQMtWm#~z~qasi6iF=_w6bocPPqil4Fh? z8)|QpTq(?sa<4bJV*4}5s+8%4Ycq-pu-W2&O(fNyBPYi^(P-}}4Vq9GwaJ0T6-4uN{+_906oH9-pr}_K$j$#CNdLi8gxc5iv7vZ7`H`Uy>eHDT zOX_TatD3rGhmx#cicCww71_~xO~D7vNMLI;RU0eq=SF2`@bifTEUvkJdI6C%x$LK+ z2+gBEWIK(kHt*^{Nyg93FjS`3#DyLW4V~*%@Y$jGWuVj**Y1D<*XGuyQ6Zpr@$hH} zcn{An4h8Z86`@6qQs z%yr|eE%)MEN-$(cN*ch1Q!e1Ae1#1+T`#vYzl5}1YufgMSv8MOXSJFH1=wL4$6k`Z zTazur?07g(h;CoTi|6DEw(SjZljFo35ufSdROL z*AtQXzPG$WJhR>YY3)4vuWi~n`q&up+*BzY6je9kfxFcO+Lityz8vKEDW8cMw|9GZ zTD4CCU){#J-C`br8OuH6pfHw)(tlq0f}C$VG{nWVP%2fmSajC%+_1bTi7HiK+Y6pV z24`DgeJwe^d`X*35a(%Vb@mT_q z1c6}AG{z+tdACh5ZIKlsUKOysYP5bXtTCnK%}(C8oRM&Mc$!;_*6c_EWt=v zC!-V}fo1PLnuC4jp>^FlhJ@&3y0I*Qsg^ozes9XmO_JGEd;L0Sf%4*W5*@B6oAl-g$r5u$-sUmC>^qOBlZ-bZHr|um)JT8#Ugp z^fq+-T*XaOBhyp+`TMaYjIy-^b^=q6D`!DzT@A0qM@PO+vNo?oSJ8_6_jiog(Otud zqDI|7k;m($Qyel$1SWG<09e0W=b=LE6U~}p_dn9ezs2_I;s}9$k)0f}l3@^e#xWMQ z%~|247%?>A>qDZR)J0JcYr*$n{Mn0S%$Z~{zoZrUhXQG$>+-=xzu0l}>wL8K)Rvap z-qYJ-V;9gjZ$_4fe>kpfyhH3SBkToUl-_(s*-A!zv<) z`-gtw>gkL7$YR@#UbA^R7kGLTw0=K|(vYt=0uL#}JgmrUvJF22-sdM*jkqwG3kGWA zdXugCfwY?&1umrYi0`S6RMK08-mcK)Gs3LeEe59!3#B|j+S+qF1+2{-0S5sqRywc&uB)JPewWS2C4|wCz~xN@XPU=JmWR&T3s(Fp%@nPG9|e zX!QH)!{b+@H%bxF*u#*4E7c#lJrK;HiP+(L%anqc#E9x^L6^p?=xRI*n8-~_4ym!1bs;3H0D)ZN~3)r z4<}=E{9c}y>2N~cnoX#Y6OT-?!}mPJUvPO}+`JKCztH1t zL43<4jD%;nb9ho=H{X0^vUv}f#*X1ocCyM(m0Ic}V|8OExiO%1dcH2YeJqKCFCKpP z-oj`9MU+1mj7!<#qTXr2Xs&Udg}1=Z{_+D$aXD@RUQXh?9NYeM(p?5)_F7FyHHS`f z5SZ^s)Mwj}7NWgwSot7rRiG2)1!+8pp1Ck*$3i2& z*_}FuLg;;tTq!zz(uZZIlA9Cq!2hc(I_gv`Ku;y$YSm@6a>#n*R!1kl`Lpcht-tXO zy2J#>SPzb4lILP*a>-8Du6xg`UUrtY^PTd~S zoT{)73GMr~!napC#9*?xbo-doF@p2XiR!!+2NRrMf9dKQrFtI~ptsx4*0?XbviWI8 z4b3sPX9?@&GzsiKl>%d&6VyZ$B7t2-Nh5#-6gu_y?x)>6=9D!d$T3^(BqMFT1%<|@ zrn42lf4@c9>?WwKbl7ye6_vJUx<6^MFNaNbPeIP)sbx&7WrcG;HI>(#cdW2-vQ;6H zMg@O6@YMEunf~v6vX&mP@+Oj4`5%iI9}Lp5oO~?QgY%89_FpLWD9>L1K9x1 zkD{liSZb2`@SfVE$c#tXQ&^dGYqkLWCp(Za1r&uQK<_=<{Lnqy%u$V{t%aogal7ch zn0|!kjnU`x=&A1xPYmc;tIAz*`phfwl74nGF~K0{p_ctiUZbXE+X9&fUN8R^@IyO} zAFXBJup~L{S}2Vf2in1pEuUK4KTACl$lwKZmM|JPisqIN3_(^lWJa=-WcD^p?f@GL z{N;M^{g-i5P1}sDul5;UW|9@po_ng4zcVv)a=JWc;_Y%d<6Q+gQ>WIWmES}@l^ z@s1Ra)z$ACiKNAI6;i(_B|FdouwaC?18)umignp0NPMO;e(|A91?R&&oDaSoqwZN} zPC^Jjkdr!9;32Yu<9C2t>VvC=2_S;<3B`_p;;HRRt{JHE7E~MLztZBBH0?hw5Hmex z{yiggS8iI9`E>gGkzSWT%DSNG(Sk57p?WOi=%3k;!m|8G(I=MsYIy7|9+R-!YoPJ9 zmG1-jSrIU99_Z>STvx?*tD8SjWH^A5C|a{Oe#$5X?)-MlICq9tF`NWrtt%SqT5|TE zYr-aaTBntQjx#SuyDdy3?;>w!oG8e_fJ46A`O64Cf4D6)$>>c@noA@t{F}PC3CiGE zxuUq(bH$}qv$VxNXoQe^iJR({*S9RDtuv$GduJ9o--y)M_b>F!RbV*zbUHN(ItCTY zizi7k`<(K_v8M*w@`1f(8=}T~rVAE&zuwjNWIFA=afQwMv(HR|E-6UZ_3b zey+JPo#kILw@=#i(%ilspWypbKIb7?z0}2tp zy*zjqED~w!?ft$zGq7gqO(%-BeIdDHnE##T=r^p0ZO#&|a!sC66y07*bm(cbTgNo`nPch->*qlwaK^{>HZW^!$J!?aJd1PJ(c-r6%g!LK+v zVYX_jblQ}g_PD0EJ5jEn?eWXvr74m%ds`Jh)S4q&l>|E(jO)@R>mw}eSUKoLvc$P| zM9g&!jpYP?_@Dbrq0S}6PR?u?nFD4w>CR>b(Q!31K`_P%aQzY@2`XJ=`sTH6{fEGt z%jTBU4BJj5U6))l)i&+nvm^U`*+PGwl+*hW?aSXbb)!HeKE|h_G)s@SHEwcP%2>85 zhm2(h?>peK!_j90=#Na3$$6~4I{a``y2r_LV{Vb9W39KGkL!$lZ^AO14ecxOhGGdFpwsn);a4nq676>6aeE8s8j^{r=Ej|@WDY=OPaL82MAe(7-S|ES>pYO7o9b8G9SewLC&@Cp(mPAwLazif z;d5;4+Pgk`%O3FU{z_f;(U6DHNsyvcbS5qS>q|$C}*}7xfldJdEIQ>~y z_hb=|_-E@sug3>lFRzl|JdTNE%)1!1=Lb>kodX&l>?e=7HWP9n=h{>6>GrX86&CVt zt$LAbW4gPu;7?XGsDKX!G(ha`#|sauUJwvd<}v5^Z5n zEiP6%bhLH5(j%k|31hz*6KPLD)yes&J`~`-5zKv|pyQ~aW`Cmf-tyo6HFueJi!Q;~ z3LD~S9Dn$rxI3exYRqA=7Kx_DO}qKMwPRam&S3k+j~%-N5A-~CtXnCp$n06)J$-=B zJ6=(7n0bzG%s6aR@I&XpLp(R1r3}Y*{OQVNdB3wcENx#v0OjRmTzdbDy3S_n?}u!L zp93**PfEwPMGwU)9M4sxG0oxlsWi_7gcT2pny-g?&(CKOC`HIEL{vetJCvF6^TlsE?uZLx^6&_o^V~Y z@h)Hq0lG2zdq`JY*t?F|yOfz=1X07GI$Hj#t@#}h-QNJPVXLOg0O~cG)E>FhUVm&S zOXZQp{*s123b=iwOkF$3p->1=aJO^$fZ86ZXd9!%(%0plVXT5s59x|IP*|Cwu53@(x z?cW!-ESkk~y`D|Q-fT$rzBkQNeCQ-rrL%hzImWK@6lw%aqF7~?k;kmuZ%G|HbM^aoZ^Hv)-PE@yy+q~r9yyMm z-*B&YrH7a2TaCD`Y@>^DP}&0))J(*bzxT1Z0EB$o67V@t7TR6!5kSHOAL*`H)WMw|qose3Y`I5a?xnGj|4R2@G z{lZSR*ZMBN{x4n(L;u;08NWl?i`7Rq4wY;Yf#AP*=>b8-*--5om`d0-bSC7Z0F#`* z5BGPC>td_Re~9USMK;#S86wFj0|4fleE;6MHm_~Jb=Kl5UZG!4VBfb(eZS_Th&V_F zjS>T>l_>jFo=T*x0$xF3B`g!{abcf4?jF-fq>oD^$API5y@~n-) z5OK{Lg|im_H-me@L%q3?U+lbCiw>(S^K;qUE09dILoGnXY{|_ysU;)@hKzH+?;DrT?$=PR^yC7aR0tl^TAo$ykP$7BDD~p3Kx$@-W#*K8nm+EN<

_J3jm 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

&*Jca^0D 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 ME7mhpZCpeD1I1gC;Q#;t diff --git a/docs/static/pgo.svg b/docs/static/pgo.svg index b017c9851d..d72f9d7810 100644 --- a/docs/static/pgo.svg +++ b/docs/static/pgo.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 58ae4dbd8c95f8dc35cd2bbb6c94e7ff0a97303a Mon Sep 17 00:00:00 2001 From: Mathieu Parent Date: Wed, 14 Apr 2021 15:13:34 +0200 Subject: [PATCH 087/129] Allow overrides in install-bootstrap-creds.sh Allows for for credential variables to be overridden during the bootstrapping process on certain install methods (i.e. for development purposes and OLM). These variables include: - `PGOADMIN_USERNAME` - `PGOADMIN_PASSWORD` - `PGOADMIN_ROLENAME` --- deploy/install-bootstrap-creds.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/install-bootstrap-creds.sh b/deploy/install-bootstrap-creds.sh index e25253104c..6eb2ff13b2 100755 --- a/deploy/install-bootstrap-creds.sh +++ b/deploy/install-bootstrap-creds.sh @@ -17,9 +17,9 @@ set -eu # fill out these variables if you want to change the # default pgo bootstrap user and role -PGOADMIN_USERNAME=admin -PGOADMIN_PASSWORD=examplepassword -PGOADMIN_ROLENAME=pgoadmin +PGOADMIN_USERNAME="${PGOADMIN_USERNAME:-admin}" +PGOADMIN_PASSWORD="${PGOADMIN_PASSWORD:-examplepassword}" +PGOADMIN_ROLENAME="${PGOADMIN_ROLENAME:-pgoadmin}" PGOADMIN_PERMS="*" From 18f0796a49ce29323db53d2469879cec36560140 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 14 Apr 2021 22:20:38 -0400 Subject: [PATCH 088/129] Properly identify pgAdmin Service from `pgo test` This was previously showing up as a "primary", which it certainly isn't. Now it is properly identified as its own thing, i.e. pgAdmin. Issue: [ch11100] --- internal/apiserver/clusterservice/clusterimpl.go | 9 +++++++-- pkg/apiservermsgs/clustermsgs.go | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index 1bf31a84ec..915573408f 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -301,12 +301,15 @@ func getServices(cluster *crv1.Pgcluster, ns string) ([]msgs.ShowClusterService, for _, p := range services.Items { d := msgs.ShowClusterService{} d.Name = p.Name - if strings.Contains(p.Name, "-backrest-repo") { + if strings.HasSuffix(p.Name, "-backrest-repo") { d.BackrestRepo = true d.ClusterName = cluster.Name - } else if strings.Contains(p.Name, "-pgbouncer") { + } else if strings.HasSuffix(p.Name, "-pgbouncer") { d.Pgbouncer = true d.ClusterName = cluster.Name + } else if strings.HasSuffix(p.Name, "-pgadmin") { + d.PGAdmin = true + d.ClusterName = cluster.Name } d.ClusterIP = p.Spec.ClusterIP for _, port := range p.Spec.Ports { @@ -487,6 +490,8 @@ func TestCluster(name, selector, ns, pgouser string, allFlag bool) msgs.ClusterT endpoint.InstanceType = msgs.ClusterTestInstanceTypePrimary case (strings.HasSuffix(service.Name, "-"+msgs.PodTypeReplica) && strings.Count(service.Name, "-"+msgs.PodTypeReplica) == 1): endpoint.InstanceType = msgs.ClusterTestInstanceTypeReplica + case service.PGAdmin: + endpoint.InstanceType = msgs.ClusterTestInstanceTypePGAdmin case service.Pgbouncer: endpoint.InstanceType = msgs.ClusterTestInstanceTypePGBouncer case service.BackrestRepo: diff --git a/pkg/apiservermsgs/clustermsgs.go b/pkg/apiservermsgs/clustermsgs.go index d23aa6af38..4e11751cde 100644 --- a/pkg/apiservermsgs/clustermsgs.go +++ b/pkg/apiservermsgs/clustermsgs.go @@ -248,6 +248,7 @@ type ShowClusterService struct { ClusterName string Pgbouncer bool BackrestRepo bool + PGAdmin bool } const PodTypePrimary = "primary" @@ -452,6 +453,7 @@ type ClusterTestRequest struct { const ( ClusterTestInstanceTypePrimary = "primary" ClusterTestInstanceTypeReplica = "replica" + ClusterTestInstanceTypePGAdmin = "pgadmin" ClusterTestInstanceTypePGBouncer = "pgbouncer" ClusterTestInstanceTypeBackups = "backups" ClusterTestInstanceTypeUnknown = "unknown" From deedc889e2f7b5e73457d8cf226450ac7663f735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20R=C3=A1=C4=8Dek?= Date: Wed, 21 Apr 2021 04:10:56 +0200 Subject: [PATCH 089/129] Several updates to Helm charts This provides several updates to Helm charts to match commonly accepted conventions. It provide unique names for each of the jobs and wrap the description in quotes. Issue: #2390 --- installers/helm/Chart.yaml | 2 +- installers/helm/templates/postgres-operator-install.yaml | 2 +- installers/helm/templates/postgres-operator-uninstall.yaml | 2 +- installers/helm/templates/postgres-operator-upgrade.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index 1b05779521..b90efb8632 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v2 name: postgres-operator -description: PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes +description: 'PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes' type: application version: 0.1.0 appVersion: 4.5.2 diff --git a/installers/helm/templates/postgres-operator-install.yaml b/installers/helm/templates/postgres-operator-install.yaml index 43b0604c3b..8196dfb2a9 100644 --- a/installers/helm/templates/postgres-operator-install.yaml +++ b/installers/helm/templates/postgres-operator-install.yaml @@ -3,7 +3,7 @@ apiVersion: batch/v1 kind: Job metadata: - name: pgo-deploy + name: pgo-deploy-install namespace: {{ .Release.Namespace }} labels: {{ include "postgres-operator.labels" . | indent 4 }} diff --git a/installers/helm/templates/postgres-operator-uninstall.yaml b/installers/helm/templates/postgres-operator-uninstall.yaml index 0b7553b0e7..945295836b 100644 --- a/installers/helm/templates/postgres-operator-uninstall.yaml +++ b/installers/helm/templates/postgres-operator-uninstall.yaml @@ -3,7 +3,7 @@ apiVersion: batch/v1 kind: Job metadata: - name: pgo-deploy + name: pgo-deploy-uninstall namespace: {{ .Release.Namespace }} labels: {{ include "postgres-operator.labels" . | indent 4 }} diff --git a/installers/helm/templates/postgres-operator-upgrade.yaml b/installers/helm/templates/postgres-operator-upgrade.yaml index 4ba8954b14..30a450c8d4 100644 --- a/installers/helm/templates/postgres-operator-upgrade.yaml +++ b/installers/helm/templates/postgres-operator-upgrade.yaml @@ -3,7 +3,7 @@ apiVersion: batch/v1 kind: Job metadata: - name: pgo-deploy + name: pgo-deploy-upgrade namespace: {{ .Release.Namespace }} labels: {{ include "postgres-operator.labels" . | indent 4 }} From 0216449a33cf9d61ae9460b4925c47750c81789a Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 20 Apr 2021 10:26:14 -0400 Subject: [PATCH 090/129] Updates to various project assets This provides updates to various asset files available within the PGO project. --- README.md | 4 +- docs/content/_index.md | 4 +- docs/static/logos/TRADEMARKS.md | 143 +++++++++++++++++++++++++++ docs/static/{ => logos}/pgo.png | Bin docs/static/{ => logos}/pgo.svg | 0 installers/ansible/README.md | 2 +- installers/helm/Chart.yaml | 2 +- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- 9 files changed, 153 insertions(+), 6 deletions(-) create mode 100644 docs/static/logos/TRADEMARKS.md rename docs/static/{ => logos}/pgo.png (100%) rename docs/static/{ => logos}/pgo.svg (100%) diff --git a/README.md b/README.md index d4faf35d54..074aaacb8b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

PGO: The Postgres Operator from Crunchy Data

- PGO: The Postgres Operator from Crunchy Data + PGO: The Postgres Operator from Crunchy Data

[![Go Report Card](https://goreportcard.com/badge/github.com/CrunchyData/postgres-operator)](https://goreportcard.com/report/github.com/CrunchyData/postgres-operator) @@ -318,3 +318,5 @@ distributed on the following platforms in order: The image rollout can occur over the course of several days. To stay up-to-date on when releases are made available in the [Crunchy Data Developer Portal](https://www.crunchydata.com/developers), please sign up for the [Crunchy Data Developer Program Newsletter](https://www.crunchydata.com/developers/newsletter) + +The PGO Postgres Operator project source code is available subject to the [Apache 2.0 license](LICENSE.md) with the PGO logo and branding assets covered by [our trademark guidelines](docs/static/logos/TRADEMARKS.md). diff --git a/docs/content/_index.md b/docs/content/_index.md index b4123b2b58..59564e4991 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -6,7 +6,7 @@ draft: false # PGO: The Postgres Operator from Crunchy Data - PGO: The Postgres Operator from Crunchy Data + PGO: The Postgres Operator from Crunchy Data ## Run [Cloud Native PostgreSQL on Kubernetes](https://www.crunchydata.com/products/crunchy-postgresql-for-kubernetes/) with PGO: The [Postgres Operator](https://github.com/CrunchyData/postgres-operator) from [Crunchy Data](https://www.crunchydata.com/)! @@ -182,3 +182,5 @@ breadth of this area we are unable to verify Postgres Operator functionality in each one. With that said, the PostgreSQL Operator is designed to be storage class agnostic and has been demonstrated to work with additional Storage Classes. + +The PGO Postgres Operator project source code is available subject to the [Apache 2.0 license](https://raw.githubusercontent.com/CrunchyData/postgres-operator/master/LICENSE.md) with the PGO logo and branding assets covered by [our trademark guidelines](/logos/TRADEMARKS.md). diff --git a/docs/static/logos/TRADEMARKS.md b/docs/static/logos/TRADEMARKS.md new file mode 100644 index 0000000000..e97d80757d --- /dev/null +++ b/docs/static/logos/TRADEMARKS.md @@ -0,0 +1,143 @@ +# PGO Trademark Guidelines + +## 1. Introduction + +This document - the "Policy" - outlines the policy of The PGO Project (the "Project") for the use of our trademarks. + +A trademark’s role is to assure consumers about the quality of the associated products or services. Because an open source license allows you to modify the copyrighted software, we cannot be sure your modified software will not mislead recipients if it is distributed under our trademarks. So, this Policy describes when you may or may not use our trademarks. + +In this Policy, we are not trying to limit the lawful use of our trademarks, but rather describe what we consider lawful use. Trademark law can be ambiguous, so we hope to clarify whether we will consider your use permitted or non-infringing. + +The following sections describe the trademarks this Policy covers, as well as trademark uses we permit. If you want to use our trademarks in ways this Policy doesn’t address, please see "Where to get further information" below for contact information. Any use that does not comply with this Policy, or for which we have not separately provided written permission, is not a use we have approved. + +## 2. We are committed to open source principles + +We want to encourage and facilitate community use of our trademarks in a way that ensures the trademarks are meaningful source and quality indicators for our software and the associated goods and services and continue to embody the high reputation of the software and its associated community. This Policy therefore balances our need to ensure our trademarks remain reliable quality indicators and our community members’ desire to be full Project participants. + +## 3. Trademarks subject to the Policy + +Our trademarks + +This Policy covers: + +### 3.1 Our word trademarks and service marks (the "Word Marks"): + +PGO + +### 3.2. Our logo (the "Logo"): + +PGO: The Postgres Operator from Crunchy Data + +### 3.3 And the unique visual styling of our website (the "Trade Dress"). + +This Policy encompasses all Project trademarks and service marks, whether Word Marks, Logos or Trade Dress, which we collectively call the “Marks." We might not have registered some Marks, but this Policy covers our Marks regardless. + +## 4. Universal considerations for all uses + +Whenever you use a Mark, you must not mislead anyone, either directly or by omission, about what they are getting and from whom. The law reflects this requirement in two major ways described below: it prohibits creating a "likelihood of confusion," but allows for "nominative use." + +For example, you cannot say you are distributing PGO software when you're distributing a modified version of it, because you likely would confuse people, since they are not getting the same features and functionality they would get if they downloaded the software from us. You also cannot use our Logo on your website to suggest your website is an official website or we endorse your website. + +You can, though, say, for example, you like the PGO software, you are a PGO community participant, you are providing unmodified PGO software, or you wrote a book describing how to use the PGO software. + +This fundamental requirement - that it is always clear to people what they are getting and from whom - is reflected throughout this Policy. It should guide you if you are unsure about how you are using the Marks. + +In addition: + +You may not use the Marks in association with software use or distribution if you don’t comply with the license for the software. + +You may not use or register the Marks as part of your own trademark, service mark, domain name, company name, trade name, product name or service name. + +Trademark law does not allow you to use names or trademarks that are too similar to ours. You therefore may not use an obvious Mark variant or phonetic equivalent, foreign language equivalent, takeoff, or abbreviation for a similar or compatible product or service. + +You will not acquire rights in the Marks, and any goodwill you generate using the Marks inures solely to our benefit. +## 5. Use for software + +See universal considerations for all uses, above, which also apply. + +### 5.1 Uses we consider non-infringing + +#### 5.1.1 Distributing unmodified source code or unmodified executable code we have compiled + +When you redistribute our unmodified software, you are not changing its quality or nature. Therefore, you may retain the Word Marks and Logos we have placed on the software, to identify your redistributed software whether you redistribute by optical media, memory stick or download of unmodified source and executable code. This only applies if you are redistributing official software from this Project that you have not changed. You can find the Logo files [here](/). + +#### 5.1.2 Distributing executable code you have compiled, or modified code + +You may use the Word Marks, but not the Logos, to describe the software’s origin, that is, that the code you are distributing is a modification of our software. You may say, for example, "this software is derived from the source code from the PGO Project." +Of course, you can place your own trademarks or logos on software to which you have made substantive modifications, because by modifying the software, you have become the origin of the modified software. + +#### 5.1.3 Statements about compatibility, interoperability or derivation + +You may use the Word Marks, but not the Logos, to describe the relationship between your software and ours. You should use Our Mark after a verb or preposition that describes that relationship. So, you may say, for example, "Bob's plug-in for PGO," but may not say "Bob's PGO plug-in." + +#### 5.1.4 Using trademarks to show community affiliation + +This section discusses using our Marks for application themes, skins and personas. We discuss using our Marks on websites below. +You may use the Word Marks and the Logos in themes, personas, or skins to show your Project support, provided the use is non-commercial and clearly decorative, as contrasted with a use that appears to be the branding for a website or application. + +### 5.2 Permitted uses + +#### 5.2.1 Distributing unmodified software + +You may use the Word Marks and Logos to distribute executable code if you make the code from official Project source code using the procedure for creating an executable found at [https://access.crunchydata.com/documentation/postgres-operator/latest/installation/](https://access.crunchydata.com/documentation/postgres-operator/latest/installation/). + +#### 5.3 Unpermitted uses we consider infringing + +We will likely consider it an infringement to use the Marks in software that combines our software with another software program. In addition to creating a single executable for both software programs, we would consider your software "combined" with ours if installing our software automatically installs yours. We would not consider your software "combined" with ours if it is on the same media but requires separate, independent action to install. + +## 6. Use for non-software goods and services + +See universal considerations for all uses, above, which also apply. + +### 6.1 Uses we consider non-infringing + +#### 6.1.1 Websites + +You may use the Word Marks and Logos on your webpage to show your Project support if: + +- Your own branding or naming is more prominent than any Project Marks; +- The Logos hyperlink to the Project website: [https://github.com/CrunchyData/postgres-operator](https://github.com/CrunchyData/postgres-operator); +- The site does not mislead customers into thinking your website, service, or product is our website, service, or product; and +- The site clearly states the Project does not affiliate with or endorse you. + +#### 6.1.2 Publishing and presenting + +You can use the Word Marks in book and article titles, and the Logo in illustrations within a document, if the use does not suggest we published, endorse, or agree with your work. + +#### 6.1.3 Events + +You can use the Logo to promote the software and Project at events. + +### 6.2 Permitted uses + +#### 6.2.1 Meetups and user groups + +You can use the Word Marks as part of your meetup or user group name if: + +- The group’s main focus is the software; +- Any software or services the group provides are without cost; +- The group does not make a profit; +- Any charge to attend meetings is only to cover the cost of the venue, food and drink. + +The universal considerations for all uses, above, still apply: specifically, you may not use or register the Marks as part of your own trademark, service mark, domain name, company name, trade name, product name or service name. + +### 6.3 Unpermitted uses we consider infringing + +We will likely consider it an infringement to use the Marks as part of a domain name or subdomain. +We also would likely consider it an infringement to use the Marks on for-sale promotional goods. + +## 7 General Information + +### 7.1 Trademark legends + +If you are using our Marks in a way described in the sections entitled "Permitted uses," put the following notice at the foot of the page where you have used the Mark (or, if in a book, on the credits page), on packaging or labeling, and on advertising or marketing materials: "The PGO Project is a trademark of Crunchy Data Solutions, Inc., used with permission." + +### 7.2 What to do when you see abuse + +If you are aware of a confusing use or misuse of the Marks, we would appreciate you bringing it to our attention. Please contact us at [trademarks@crunchydata.com](mailto:trademarks@crunchydata.com) so we can investigate it further. + +### 7.3 Where to get further information + +If you have questions, wish to speak about using our Marks in ways the Policy doesn’t address, or see abuse of our Marks, please send an email to [trademarks@crunchydata.com](mailto:trademarks@crunchydata.com). + +We based these guidelines on the Model Trademark Guidelines, available at [http://www.modeltrademarkguidelines.org](http://www.modeltrademarkguidelines.org), used under a Creative Commons Attribution 3.0 Unported license: [https://creativecommons.org/licenses/by/3.0/deed.en_US](https://creativecommons.org/licenses/by/3.0/deed.en_US). diff --git a/docs/static/pgo.png b/docs/static/logos/pgo.png similarity index 100% rename from docs/static/pgo.png rename to docs/static/logos/pgo.png diff --git a/docs/static/pgo.svg b/docs/static/logos/pgo.svg similarity index 100% rename from docs/static/pgo.svg rename to docs/static/logos/pgo.svg diff --git a/installers/ansible/README.md b/installers/ansible/README.md index 9353da7615..d280200461 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -1,7 +1,7 @@ # PGO: Postgres Operator Playbook

- PGO: The Postgres Operator from Crunchy Data + PGO: The Postgres Operator from Crunchy Data

Latest Release: 4.5.2 diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index b90efb8632..b39a5ca232 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -5,7 +5,7 @@ type: application version: 0.1.0 appVersion: 4.5.2 home: https://github.com/CrunchyData/postgres-operator -icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/pgo.svg +icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg keywords: - PostgreSQL - Operator diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index 8c113c3617..b673f08c1d 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -1,7 +1,7 @@ # PGO: Postgres Operator Monitoring Playbook

- Crunchy Data + Crunchy Data

Latest Release: 4.5.2 diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index d76ebf626c..fbb8d58c20 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -5,4 +5,4 @@ type: application version: 0.1.0 appVersion: 4.5.2 home: https://github.com/CrunchyData/postgres-operator -icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/pgo.svg +icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg From 80b29f127997e25cc435765b6e238d05a2b0b3c6 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Wed, 21 Apr 2021 20:58:17 +0200 Subject: [PATCH 091/129] Fix typo Fixes incorrect spelling of "primary". --- .../architecture/high-availability/multi-cluster-kubernetes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/architecture/high-availability/multi-cluster-kubernetes.md b/docs/content/architecture/high-availability/multi-cluster-kubernetes.md index f2be1e03c5..182fda58bf 100644 --- a/docs/content/architecture/high-availability/multi-cluster-kubernetes.md +++ b/docs/content/architecture/high-availability/multi-cluster-kubernetes.md @@ -226,7 +226,7 @@ cluster : standby (crunchy-postgres-ha:{{< param centosBase >}}-{{< param postgr There comes a time where a standby cluster needs to be promoted to an active cluster. Promoting a standby cluster means that a PostgreSQL instance within -it will become a priary and start accepting both reads and writes. This has the +it will become a primary and start accepting both reads and writes. This has the net effect of pushing WAL (transaction archives) to the pgBackRest repository, so we need to take a few steps first to ensure we don't accidentally create a split-brain scenario. From 6e91c0cec3f05d2fbd3fb81d5a52ee7e93d61590 Mon Sep 17 00:00:00 2001 From: andrewlecuyer <43458182+andrewlecuyer@users.noreply.github.com> Date: Fri, 23 Apr 2021 20:51:14 -0500 Subject: [PATCH 092/129] Installs Required Packages for pgo-scheduler When building the 'pgo-scheduler' image using ubi8-minimal, the 'findutils' and 'procps' packages are now installed. This ensures the 'find' utility is present as required by the scheduler's liveness probe, while also ensuring the 'pgrep' and 'pidof' utilities are present as required by the scheduler's 'start.sh' script. --- build/pgo-scheduler/Dockerfile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/build/pgo-scheduler/Dockerfile b/build/pgo-scheduler/Dockerfile index 49e3700e4e..ab1788a2ff 100644 --- a/build/pgo-scheduler/Dockerfile +++ b/build/pgo-scheduler/Dockerfile @@ -3,6 +3,7 @@ ARG BASEVER ARG PREFIX FROM ${PREFIX}/pgo-base:${BASEOS}-${BASEVER} +ARG BASEOS ARG PGVERSION ARG BACKREST_VERSION ARG PACKAGER @@ -30,6 +31,13 @@ RUN if [ "$DFSET" = "rhel" ] ; then \ && chown -R 2:2 /opt/cpm /pgo-config ; \ fi +RUN if [ "$BASEOS" = "ubi8" ]; then \ + ${PACKAGER} -y install \ + findutils \ + procps \ + && ${PACKAGER} -y clean all ; \ +fi + ADD bin/pgo-scheduler /opt/cpm/bin ADD installers/ansible/roles/pgo-operator/files/pgo-configs /default-pgo-config ADD conf/postgres-operator/pgo.yaml /default-pgo-config/pgo.yaml From 8151e175ba08c68edc44f43f6b826236fdf776a9 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 3 May 2021 13:12:35 -0400 Subject: [PATCH 093/129] Remove TLS cert generation for API server from installer The apiserver will reconcile its own TLS certificate -- it has been doing so for awhile. This unifies the method to ensure that only the apiserver will generate its certificate, unless the user explicitly provides one. Issue: [ch11380] --- .../other/ansible/installing-operator.md | 51 +++++++++++------- .../roles/pgo-operator/tasks/certs.yml | 54 ------------------- .../ansible/roles/pgo-operator/tasks/main.yml | 22 -------- 3 files changed, 33 insertions(+), 94 deletions(-) delete mode 100644 installers/ansible/roles/pgo-operator/tasks/certs.yml diff --git a/docs/content/installation/other/ansible/installing-operator.md b/docs/content/installation/other/ansible/installing-operator.md index 8cc82d1448..520732ce72 100644 --- a/docs/content/installation/other/ansible/installing-operator.md +++ b/docs/content/installation/other/ansible/installing-operator.md @@ -56,38 +56,53 @@ oc get deployments -n oc get pods -n ``` -## Configure Environment Variables - -After the Crunchy PostgreSQL Operator has successfully been installed we will need -to configure local environment variables before using the `pgo` client. +## Install the `pgo` Client {{% notice info %}} - If TLS authentication was disabled during installation, please see the [TLS Configuration Page] ({{< relref "Configuration/tls.md" >}}) for additional configuration information. - {{% / notice %}} -To configure the environment variables used by `pgo` run the following command: +During or after the installation of PGO: the Postgres Operator, download the `pgo` client set up script. This will help set up your local environment for using the Postgres Operator: -Note: `` should be replaced with the namespace the Crunchy PostgreSQL -Operator was deployed to. +``` +curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v{{< param operatorVersion >}}/installers/kubectl/client-setup.sh > client-setup.sh +chmod +x client-setup.sh +``` -```bash -cat <> ~/.bashrc -export PGOUSER="${HOME?}/.pgo//pgouser" -export PGO_CA_CERT="${HOME?}/.pgo//client.crt" -export PGO_CLIENT_CERT="${HOME?}/.pgo//client.crt" -export PGO_CLIENT_KEY="${HOME?}/.pgo//client.key" +When the Postgres Operator is done installing, run the client setup script: + +``` +./client-setup.sh +``` + +This will download the `pgo` client and provide instructions for how to easily use it in your environment. It will prompt you to add some environmental variables for you to set up in your session, which you can do with the following commands: + +``` +export PGOUSER="${HOME?}/.pgo/pgo/pgouser" +export PGO_CA_CERT="${HOME?}/.pgo/pgo/client.crt" +export PGO_CLIENT_CERT="${HOME?}/.pgo/pgo/client.crt" +export PGO_CLIENT_KEY="${HOME?}/.pgo/pgo/client.key" export PGO_APISERVER_URL='https://127.0.0.1:8443' -EOF +export PGO_NAMESPACE=pgo ``` -Apply those changes to the current session by running: +If you wish to permanently add these variables to your environment, you can run the following: + +``` +cat <> ~/.bashrc +export PGOUSER="${HOME?}/.pgo/pgo/pgouser" +export PGO_CA_CERT="${HOME?}/.pgo/pgo/client.crt" +export PGO_CLIENT_CERT="${HOME?}/.pgo/pgo/client.crt" +export PGO_CLIENT_KEY="${HOME?}/.pgo/pgo/client.key" +export PGO_APISERVER_URL='https://127.0.0.1:8443' +export PGO_NAMESPACE=pgo +EOF -```bash source ~/.bashrc ``` +**NOTE**: For macOS users, you must use `~/.bash_profile` instead of `~/.bashrc` + ## Verify `pgo` Connection In a separate terminal we need to setup a port forward to the Crunchy PostgreSQL diff --git a/installers/ansible/roles/pgo-operator/tasks/certs.yml b/installers/ansible/roles/pgo-operator/tasks/certs.yml deleted file mode 100644 index 4c66e89892..0000000000 --- a/installers/ansible/roles/pgo-operator/tasks/certs.yml +++ /dev/null @@ -1,54 +0,0 @@ ---- -- name: Ensure directory exists for local self-signed TLS certs. - file: - path: '{{ output_dir }}' - state: directory - tags: - - install - -- name: Generate RSA Key - command: openssl genrsa -out "{{ output_dir }}/server.key" 2048 - args: - creates: "{{ output_dir }}/server.key" - tags: - - install - -- name: Generate CSR - command: openssl req \ - -new \ - -subj '/C=US/ST=SC/L=Charleston/O=CrunchyData/CN=pg-operator' \ - -key "{{ output_dir }}/server.key" \ - -out "{{ output_dir }}/server.csr" - args: - creates: "{{ output_dir }}/server.csr" - tags: - - install - -- name: Generate Self-signed Certificate - command: openssl req \ - -x509 \ - -days 1825 \ - -key "{{ output_dir }}/server.key" \ - -in "{{ output_dir }}/server.csr" \ - -out "{{ output_dir }}/server.crt" - args: - creates: "{{ output_dir }}/server.crt" - tags: - - install - -- name: Ensure {{ pgo_keys_dir }} Directory Exists - file: - path: '{{ pgo_keys_dir }}' - state: directory - tags: - - install - -- name: Copy certificates to {{ pgo_keys_dir }} - command: "cp {{ output_dir }}/server.crt {{ pgo_keys_dir }}/client.crt" - tags: - - install - -- name: Copy keys to {{ pgo_keys_dir }} - command: "cp {{ output_dir }}/server.key {{ pgo_keys_dir }}/client.key" - tags: - - install diff --git a/installers/ansible/roles/pgo-operator/tasks/main.yml b/installers/ansible/roles/pgo-operator/tasks/main.yml index c9fc36e6a0..423c4469be 100644 --- a/installers/ansible/roles/pgo-operator/tasks/main.yml +++ b/installers/ansible/roles/pgo-operator/tasks/main.yml @@ -44,10 +44,6 @@ tags: - uninstall -- include_tasks: certs.yml - tags: - - install - - name: Use kubectl or oc set_fact: kubectl_or_oc: "{{ openshift_oc_bin if openshift_oc_bin is defined else 'kubectl' }}" @@ -274,24 +270,6 @@ -n {{ pgo_operator_namespace }} when: pgo_backrest_repo_config_result.rc == 1 - - name: PGO API Secret - tags: - - install - - update - block: - - name: Check PGO API Secret - shell: "{{ kubectl_or_oc }} get secret pgo.tls -n {{ pgo_operator_namespace }}" - register: pgo_tls_result - failed_when: false - - - name: Create PGO API Secret - command: | - {{ kubectl_or_oc }} create secret tls pgo.tls \ - --cert='{{ output_dir }}/server.crt' \ - --key='{{ output_dir }}/server.key' \ - -n {{ pgo_operator_namespace }} - when: pgo_tls_result.rc == 1 - - name: PGO ConfigMap tags: - install From dd0261263473f0f1be435d3a4298a0aab9b5d554 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 3 May 2021 13:37:57 -0400 Subject: [PATCH 094/129] Remove explicit package installation in deployer As we are no longer calling openssl from the Ansible scripts, we do not need to install it explicitly. However, this is included in most, if not all, of the base images we use. --- build/pgo-deployer/Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/build/pgo-deployer/Dockerfile b/build/pgo-deployer/Dockerfile index 79c3516d2c..e6532886d2 100644 --- a/build/pgo-deployer/Dockerfile +++ b/build/pgo-deployer/Dockerfile @@ -22,7 +22,6 @@ RUN if [ "$DFSET" = "centos" ] ; then \ ansible-${ANSIBLE_VERSION} \ which \ gettext \ - openssl \ && ${PACKAGER} -y clean all ; \ fi @@ -36,7 +35,6 @@ RUN if [ "$BASEOS" = "rhel7" ] ; then \ ansible-${ANSIBLE_VERSION} \ which \ gettext \ - openssl \ && ${PACKAGER} -y clean all --enablerepo='rhel-7-server-ose-4.4-rpms' ; \ fi @@ -50,7 +48,6 @@ RUN if [ "$BASEOS" = "ubi7" ] ; then \ ansible-${ANSIBLE_VERSION} \ which \ gettext \ - openssl \ && ${PACKAGER} -y clean all --enablerepo='rhel-7-server-ose-4.4-rpms' ; \ fi @@ -64,7 +61,6 @@ RUN if [ "$BASEOS" = "ubi8" ] ; then \ ansible-${ANSIBLE_VERSION} \ which \ gettext \ - openssl \ && ${PACKAGER} -y clean all --enablerepo='rhocp-4.5-for-rhel-8-x86_64-rpms' ; \ fi From eaffb86dc0c3e504fa59af2cc7b903e8ca35ab7e Mon Sep 17 00:00:00 2001 From: Heath Lord Date: Fri, 23 Apr 2021 17:15:06 -0400 Subject: [PATCH 095/129] Dynamic collection of license files This allows for the dynamic inclusion of license files in the built container images. --- .gitignore | 2 + Makefile | 11 +- bin/license_aggregator.sh | 38 ++ build/pgo-base/Dockerfile | 1 - {redhat/licenses => licenses}/LICENSE.txt | 0 .../github.com/PuerkitoBio/purell/LICENSE | 12 - .../github.com/PuerkitoBio/urlesc/LICENSE | 27 -- .../github.com/cpuguy83/go-md2man/LICENSE.md | 21 - licenses/github.com/davecgh/go-spew/LICENSE | 15 - licenses/github.com/docker/spdystream/LICENSE | 191 --------- .../github.com/emicklei/go-restful/LICENSE | 22 - .../github.com/evanphx/json-patch/LICENSE | 25 -- licenses/github.com/fatih/color/LICENSE.md | 20 - licenses/github.com/ghodss/yaml/LICENSE | 50 --- .../github.com/go-openapi/jsonpointer/LICENSE | 202 --------- .../go-openapi/jsonreference/LICENSE | 202 --------- licenses/github.com/go-openapi/spec/LICENSE | 202 --------- licenses/github.com/go-openapi/swag/LICENSE | 202 --------- licenses/github.com/gogo/protobuf/LICENSE | 36 -- licenses/github.com/golang/glog/LICENSE | 191 --------- licenses/github.com/golang/protobuf/LICENSE | 28 -- licenses/github.com/google/btree/LICENSE | 202 --------- licenses/github.com/google/gofuzz/LICENSE | 202 --------- .../github.com/googleapis/gnostic/LICENSE | 203 --------- licenses/github.com/gorilla/context/LICENSE | 27 -- licenses/github.com/gorilla/mux/LICENSE | 27 -- .../gregjones/httpcache/LICENSE.txt | 7 - .../github.com/hashicorp/golang-lru/LICENSE | 362 ----------------- licenses/github.com/howeyc/gopass/LICENSE.txt | 15 - .../howeyc/gopass/OPENSOLARIS.LICENSE | 384 ------------------ licenses/github.com/imdario/mergo/LICENSE | 28 -- .../inconshreveable/mousetrap/LICENSE | 13 - licenses/github.com/json-iterator/go/LICENSE | 21 - licenses/github.com/juju/ratelimit/LICENSE | 191 --------- licenses/github.com/lib/pq/LICENSE.md | 8 - licenses/github.com/mailru/easyjson/LICENSE | 7 - .../github.com/mattn/go-colorable/LICENSE | 21 - licenses/github.com/mattn/go-isatty/LICENSE | 9 - .../github.com/modern-go/concurrent/LICENSE | 201 --------- .../github.com/modern-go/reflect2/LICENSE | 201 --------- licenses/github.com/petar/GoLLRB/LICENSE | 27 -- .../github.com/peterbourgon/diskv/LICENSE | 19 - .../russross/blackfriday/LICENSE.txt | 29 -- licenses/github.com/sirupsen/logrus/LICENSE | 21 - licenses/github.com/spf13/cobra/LICENSE.txt | 174 -------- licenses/github.com/spf13/pflag/LICENSE | 28 -- licenses/golang.org/x/crypto/LICENSE | 27 -- licenses/golang.org/x/net/LICENSE | 27 -- licenses/golang.org/x/sys/LICENSE | 27 -- licenses/golang.org/x/text/LICENSE | 27 -- licenses/gopkg.in/inf.v0/LICENSE | 28 -- licenses/gopkg.in/robfig/cron.v2/LICENSE | 21 - licenses/gopkg.in/yaml.v2/LICENSE | 201 --------- licenses/k8s.io/api/LICENSE | 202 --------- licenses/k8s.io/apimachinery/LICENSE | 202 --------- licenses/k8s.io/client-go/LICENSE | 202 --------- licenses/k8s.io/kube-openapi/LICENSE | 202 --------- 57 files changed, 48 insertions(+), 5043 deletions(-) create mode 100755 bin/license_aggregator.sh rename {redhat/licenses => licenses}/LICENSE.txt (100%) delete mode 100644 licenses/github.com/PuerkitoBio/purell/LICENSE delete mode 100644 licenses/github.com/PuerkitoBio/urlesc/LICENSE delete mode 100644 licenses/github.com/cpuguy83/go-md2man/LICENSE.md delete mode 100644 licenses/github.com/davecgh/go-spew/LICENSE delete mode 100644 licenses/github.com/docker/spdystream/LICENSE delete mode 100644 licenses/github.com/emicklei/go-restful/LICENSE delete mode 100644 licenses/github.com/evanphx/json-patch/LICENSE delete mode 100644 licenses/github.com/fatih/color/LICENSE.md delete mode 100644 licenses/github.com/ghodss/yaml/LICENSE delete mode 100644 licenses/github.com/go-openapi/jsonpointer/LICENSE delete mode 100644 licenses/github.com/go-openapi/jsonreference/LICENSE delete mode 100644 licenses/github.com/go-openapi/spec/LICENSE delete mode 100644 licenses/github.com/go-openapi/swag/LICENSE delete mode 100644 licenses/github.com/gogo/protobuf/LICENSE delete mode 100644 licenses/github.com/golang/glog/LICENSE delete mode 100644 licenses/github.com/golang/protobuf/LICENSE delete mode 100644 licenses/github.com/google/btree/LICENSE delete mode 100644 licenses/github.com/google/gofuzz/LICENSE delete mode 100644 licenses/github.com/googleapis/gnostic/LICENSE delete mode 100644 licenses/github.com/gorilla/context/LICENSE delete mode 100644 licenses/github.com/gorilla/mux/LICENSE delete mode 100644 licenses/github.com/gregjones/httpcache/LICENSE.txt delete mode 100644 licenses/github.com/hashicorp/golang-lru/LICENSE delete mode 100644 licenses/github.com/howeyc/gopass/LICENSE.txt delete mode 100644 licenses/github.com/howeyc/gopass/OPENSOLARIS.LICENSE delete mode 100644 licenses/github.com/imdario/mergo/LICENSE delete mode 100644 licenses/github.com/inconshreveable/mousetrap/LICENSE delete mode 100644 licenses/github.com/json-iterator/go/LICENSE delete mode 100644 licenses/github.com/juju/ratelimit/LICENSE delete mode 100644 licenses/github.com/lib/pq/LICENSE.md delete mode 100644 licenses/github.com/mailru/easyjson/LICENSE delete mode 100644 licenses/github.com/mattn/go-colorable/LICENSE delete mode 100644 licenses/github.com/mattn/go-isatty/LICENSE delete mode 100644 licenses/github.com/modern-go/concurrent/LICENSE delete mode 100644 licenses/github.com/modern-go/reflect2/LICENSE delete mode 100644 licenses/github.com/petar/GoLLRB/LICENSE delete mode 100644 licenses/github.com/peterbourgon/diskv/LICENSE delete mode 100644 licenses/github.com/russross/blackfriday/LICENSE.txt delete mode 100644 licenses/github.com/sirupsen/logrus/LICENSE delete mode 100644 licenses/github.com/spf13/cobra/LICENSE.txt delete mode 100644 licenses/github.com/spf13/pflag/LICENSE delete mode 100644 licenses/golang.org/x/crypto/LICENSE delete mode 100644 licenses/golang.org/x/net/LICENSE delete mode 100644 licenses/golang.org/x/sys/LICENSE delete mode 100644 licenses/golang.org/x/text/LICENSE delete mode 100644 licenses/gopkg.in/inf.v0/LICENSE delete mode 100644 licenses/gopkg.in/robfig/cron.v2/LICENSE delete mode 100644 licenses/gopkg.in/yaml.v2/LICENSE delete mode 100644 licenses/k8s.io/api/LICENSE delete mode 100644 licenses/k8s.io/apimachinery/LICENSE delete mode 100644 licenses/k8s.io/client-go/LICENSE delete mode 100644 licenses/k8s.io/kube-openapi/LICENSE diff --git a/.gitignore b/.gitignore index 210f4ef69a..6542af05bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .DS_Store /vendor/ tools +licenses/* +!licenses/LICENSE.txt diff --git a/Makefile b/Makefile index 8527944c29..cddf45eef7 100644 --- a/Makefile +++ b/Makefile @@ -95,8 +95,8 @@ images = pgo-apiserver \ postgres-operator .PHONY: all installrbac setup setupnamespaces cleannamespaces bounce \ - deployoperator runmain runapiserver cli-docs clean push pull \ - release default + deployoperator cli-docs clean push pull \ + release default license #======= Main functions ======= @@ -127,6 +127,8 @@ deployoperator: #======= Binary builds ======= +build: build-postgres-operator build-pgo-apiserver build-pgo-client build-pgo-rmdata build-pgo-scheduler license + build-pgo-apiserver: go install -gcflags='$(GCFLAGS)' apiserver.go cp $(GOBIN)/apiserver bin/ @@ -196,7 +198,7 @@ endif pgo-base: pgo-base-$(IMGBUILDER) -pgo-base-build: $(PGOROOT)/build/pgo-base/Dockerfile +pgo-base-build: build $(PGOROOT)/build/pgo-base/Dockerfile $(IMGCMDSTEM) \ -f $(PGOROOT)/build/pgo-base/Dockerfile \ -t $(PGO_IMAGE_PREFIX)/pgo-base:$(PGO_IMAGE_TAG) \ @@ -225,6 +227,9 @@ cli-docs: clean: rm -rf $(GOPATH)/pkg/* $(GOBIN)/postgres-operator $(GOBIN)/apiserver $(GOBIN)/*pgo +license: + ./bin/license_aggregator.sh + push: $(images:%=push-%) ; push-%: diff --git a/bin/license_aggregator.sh b/bin/license_aggregator.sh new file mode 100755 index 0000000000..044f8c016c --- /dev/null +++ b/bin/license_aggregator.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Copyright 2021 Crunchy Data Solutions, Inc. +# 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. + +# Inputs / outputs +SCAN_DIR=${GOPATH}/pkg/mod +OUT_DIR=licenses + +# Fail on error +set -e + +# Clean up before we start our work +rm -rf $OUT_DIR/*/ + +# Get any file in the vendor directory with the word "license" in it. Note that we'll also keep its path +myLicenses=$(find $SCAN_DIR -type f | grep -i license) +for licensefile in $myLicenses +do + # make a new license directory matching the same vendor structure + licensedir=$(dirname $licensefile) + newlicensedir=$(echo $licensedir | sed "s:$SCAN_DIR:$OUT_DIR:" | sed 's:@[0-9a-zA-Z.\\-]*/:/:' | sed 's:@[0-9a-zA-Z.\\-]*::') + mkdir -p $newlicensedir + # And, copy over the license + cp -f $licensefile $newlicensedir +done + +sudo chmod -R 755 licenses diff --git a/build/pgo-base/Dockerfile b/build/pgo-base/Dockerfile index e9a80bea5c..d852c3855b 100644 --- a/build/pgo-base/Dockerfile +++ b/build/pgo-base/Dockerfile @@ -21,7 +21,6 @@ LABEL vendor="Crunchy Data" \ io.openshift.tags="postgresql,postgres,sql,nosql,crunchy" \ io.k8s.description="Trusted open source PostgreSQL-as-a-Service" -COPY redhat/licenses /licenses COPY redhat/atomic/help.1 /help.1 COPY redhat/atomic/help.md /help.md COPY licenses /licenses diff --git a/redhat/licenses/LICENSE.txt b/licenses/LICENSE.txt similarity index 100% rename from redhat/licenses/LICENSE.txt rename to licenses/LICENSE.txt diff --git a/licenses/github.com/PuerkitoBio/purell/LICENSE b/licenses/github.com/PuerkitoBio/purell/LICENSE deleted file mode 100644 index 4b9986dea7..0000000000 --- a/licenses/github.com/PuerkitoBio/purell/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) 2012, Martin Angers -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/github.com/PuerkitoBio/urlesc/LICENSE b/licenses/github.com/PuerkitoBio/urlesc/LICENSE deleted file mode 100644 index 7448756763..0000000000 --- a/licenses/github.com/PuerkitoBio/urlesc/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/github.com/cpuguy83/go-md2man/LICENSE.md b/licenses/github.com/cpuguy83/go-md2man/LICENSE.md deleted file mode 100644 index 1cade6cef6..0000000000 --- a/licenses/github.com/cpuguy83/go-md2man/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Brian Goff - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/github.com/davecgh/go-spew/LICENSE b/licenses/github.com/davecgh/go-spew/LICENSE deleted file mode 100644 index bc52e96f2b..0000000000 --- a/licenses/github.com/davecgh/go-spew/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2012-2016 Dave Collins - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/licenses/github.com/docker/spdystream/LICENSE b/licenses/github.com/docker/spdystream/LICENSE deleted file mode 100644 index 9e4bd4dbee..0000000000 --- a/licenses/github.com/docker/spdystream/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ - - 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 - - Copyright 2014-2015 Docker, Inc. - - 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. diff --git a/licenses/github.com/emicklei/go-restful/LICENSE b/licenses/github.com/emicklei/go-restful/LICENSE deleted file mode 100644 index ece7ec61ef..0000000000 --- a/licenses/github.com/emicklei/go-restful/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2012,2013 Ernest Micklei - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/licenses/github.com/evanphx/json-patch/LICENSE b/licenses/github.com/evanphx/json-patch/LICENSE deleted file mode 100644 index 0eb9b72d84..0000000000 --- a/licenses/github.com/evanphx/json-patch/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2014, Evan Phoenix -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. -* Neither the name of the Evan Phoenix nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/github.com/fatih/color/LICENSE.md b/licenses/github.com/fatih/color/LICENSE.md deleted file mode 100644 index 25fdaf639d..0000000000 --- a/licenses/github.com/fatih/color/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Fatih Arslan - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/github.com/ghodss/yaml/LICENSE b/licenses/github.com/ghodss/yaml/LICENSE deleted file mode 100644 index 7805d36de7..0000000000 --- a/licenses/github.com/ghodss/yaml/LICENSE +++ /dev/null @@ -1,50 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Sam Ghods - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/github.com/go-openapi/jsonpointer/LICENSE b/licenses/github.com/go-openapi/jsonpointer/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/licenses/github.com/go-openapi/jsonpointer/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/licenses/github.com/go-openapi/jsonreference/LICENSE b/licenses/github.com/go-openapi/jsonreference/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/licenses/github.com/go-openapi/jsonreference/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/licenses/github.com/go-openapi/spec/LICENSE b/licenses/github.com/go-openapi/spec/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/licenses/github.com/go-openapi/spec/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/licenses/github.com/go-openapi/swag/LICENSE b/licenses/github.com/go-openapi/swag/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/licenses/github.com/go-openapi/swag/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/licenses/github.com/gogo/protobuf/LICENSE b/licenses/github.com/gogo/protobuf/LICENSE deleted file mode 100644 index 7be0cc7b62..0000000000 --- a/licenses/github.com/gogo/protobuf/LICENSE +++ /dev/null @@ -1,36 +0,0 @@ -Protocol Buffers for Go with Gadgets - -Copyright (c) 2013, The GoGo Authors. All rights reserved. -http://github.com/gogo/protobuf - -Go support for Protocol Buffers - Google's data interchange format - -Copyright 2010 The Go Authors. All rights reserved. -https://github.com/golang/protobuf - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/licenses/github.com/golang/glog/LICENSE b/licenses/github.com/golang/glog/LICENSE deleted file mode 100644 index 37ec93a14f..0000000000 --- a/licenses/github.com/golang/glog/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -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: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -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 -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. diff --git a/licenses/github.com/golang/protobuf/LICENSE b/licenses/github.com/golang/protobuf/LICENSE deleted file mode 100644 index 0f646931a4..0000000000 --- a/licenses/github.com/golang/protobuf/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/licenses/github.com/google/btree/LICENSE b/licenses/github.com/google/btree/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/licenses/github.com/google/btree/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/licenses/github.com/google/gofuzz/LICENSE b/licenses/github.com/google/gofuzz/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/licenses/github.com/google/gofuzz/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/licenses/github.com/googleapis/gnostic/LICENSE b/licenses/github.com/googleapis/gnostic/LICENSE deleted file mode 100644 index 6b0b1270ff..0000000000 --- a/licenses/github.com/googleapis/gnostic/LICENSE +++ /dev/null @@ -1,203 +0,0 @@ - - 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. - diff --git a/licenses/github.com/gorilla/context/LICENSE b/licenses/github.com/gorilla/context/LICENSE deleted file mode 100644 index 0e5fb87280..0000000000 --- a/licenses/github.com/gorilla/context/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 Rodrigo Moraes. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/github.com/gorilla/mux/LICENSE b/licenses/github.com/gorilla/mux/LICENSE deleted file mode 100644 index 0e5fb87280..0000000000 --- a/licenses/github.com/gorilla/mux/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2012 Rodrigo Moraes. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/github.com/gregjones/httpcache/LICENSE.txt b/licenses/github.com/gregjones/httpcache/LICENSE.txt deleted file mode 100644 index 81316beb0c..0000000000 --- a/licenses/github.com/gregjones/httpcache/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -Copyright © 2012 Greg Jones (greg.jones@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/licenses/github.com/hashicorp/golang-lru/LICENSE b/licenses/github.com/hashicorp/golang-lru/LICENSE deleted file mode 100644 index be2cc4dfb6..0000000000 --- a/licenses/github.com/hashicorp/golang-lru/LICENSE +++ /dev/null @@ -1,362 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. "Contributor" - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. "Contributor Version" - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the terms of - a Secondary License. - -1.6. "Executable Form" - - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - - means a work that combines Covered Software with other material, in a - separate file or files, that is not Covered Software. - -1.8. "License" - - means this document. - -1.9. "Licensable" - - means having the right to grant, to the maximum extent possible, whether - at the time of the initial grant or subsequently, any and all of the - rights conveyed by this License. - -1.10. "Modifications" - - means any of the following: - - a. any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. "Patent Claims" of a Contributor - - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the License, - by the making, using, selling, offering for sale, having made, import, - or transfer of either its Contributions or its Contributor Version. - -1.12. "Secondary License" - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. "Source Code Form" - - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, "control" means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution - become effective for each Contribution on the date the Contributor first - distributes such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under - this License. No additional rights or licenses will be implied from the - distribution or licensing of Covered Software under this License. - Notwithstanding Section 2.1(b) above, no patent license is granted by a - Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of - its Contributions. - - This License does not grant any rights in the trademarks, service marks, - or logos of any Contributor (except as may be necessary to comply with - the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this - License (see Section 10.2) or under the terms of a Secondary License (if - permitted under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its - Contributions are its original creation(s) or it has sufficient rights to - grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under - applicable copyright doctrines of fair use, fair dealing, or other - equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under - the terms of this License. You must inform recipients that the Source - Code Form of the Covered Software is governed by the terms of this - License, and how they can obtain a copy of this License. You may not - attempt to alter or restrict the recipients' rights in the Source Code - Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter the - recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for - the Covered Software. If the Larger Work is a combination of Covered - Software with a work governed by one or more Secondary Licenses, and the - Covered Software is not Incompatible With Secondary Licenses, this - License permits You to additionally distribute such Covered Software - under the terms of such Secondary License(s), so that the recipient of - the Larger Work may, at their option, further distribute the Covered - Software under the terms of either this License or such Secondary - License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices - (including copyright notices, patent notices, disclaimers of warranty, or - limitations of liability) contained within the Source Code Form of the - Covered Software, except that You may alter any license notices to the - extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on - behalf of any Contributor. You must make it absolutely clear that any - such warranty, support, indemnity, or liability obligation is offered by - You alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, - judicial order, or regulation then You must: (a) comply with the terms of - this License to the maximum extent possible; and (b) describe the - limitations and the code they affect. Such description must be placed in a - text file included with all distributions of the Covered Software under - this License. Except to the extent prohibited by statute or regulation, - such description must be sufficiently detailed for a recipient of ordinary - skill to be able to understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing - basis, if such Contributor fails to notify You of the non-compliance by - some reasonable means prior to 60 days after You have come back into - compliance. Moreover, Your grants from a particular Contributor are - reinstated on an ongoing basis if such Contributor notifies You of the - non-compliance by some reasonable means, this is the first time You have - received notice of non-compliance with this License from such - Contributor, and You become compliant prior to 30 days after Your receipt - of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, - counter-claims, and cross-claims) alleging that a Contributor Version - directly or indirectly infringes any patent, then the rights granted to - You by any and all Contributors for the Covered Software under Section - 2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an "as is" basis, - without warranty of any kind, either expressed, implied, or statutory, - including, without limitation, warranties that the Covered Software is free - of defects, merchantable, fit for a particular purpose or non-infringing. - The entire risk as to the quality and performance of the Covered Software - is with You. Should any Covered Software prove defective in any respect, - You (not any Contributor) assume the cost of any necessary servicing, - repair, or correction. This disclaimer of warranty constitutes an essential - part of this License. No use of any Covered Software is authorized under - this License except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from - such party's negligence to the extent applicable law prohibits such - limitation. Some jurisdictions do not allow the exclusion or limitation of - incidental or consequential damages, so this exclusion and limitation may - not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts - of a jurisdiction where the defendant maintains its principal place of - business and such litigation shall be governed by laws of that - jurisdiction, without reference to its conflict-of-law provisions. Nothing - in this Section shall prevent a party's ability to bring cross-claims or - counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. Any law or regulation which provides that - the language of a contract shall be construed against the drafter shall not - be used to construe this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version - of the License under which You originally received the Covered Software, - or under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a - modified version of this License if you rename the license and remove - any references to the name of the license steward (except to note that - such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary - Licenses If You choose to distribute Source Code Form that is - Incompatible With Secondary Licenses under the terms of this version of - the License, the notice described in Exhibit B of this License must be - attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, -then You may include the notice in a location (such as a LICENSE file in a -relevant directory) where a recipient would be likely to look for such a -notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice - - This Source Code Form is "Incompatible - With Secondary Licenses", as defined by - the Mozilla Public License, v. 2.0. diff --git a/licenses/github.com/howeyc/gopass/LICENSE.txt b/licenses/github.com/howeyc/gopass/LICENSE.txt deleted file mode 100644 index 14f74708a4..0000000000 --- a/licenses/github.com/howeyc/gopass/LICENSE.txt +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2012 Chris Howey - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/licenses/github.com/howeyc/gopass/OPENSOLARIS.LICENSE b/licenses/github.com/howeyc/gopass/OPENSOLARIS.LICENSE deleted file mode 100644 index da23621dc8..0000000000 --- a/licenses/github.com/howeyc/gopass/OPENSOLARIS.LICENSE +++ /dev/null @@ -1,384 +0,0 @@ -Unless otherwise noted, all files in this distribution are released -under the Common Development and Distribution License (CDDL). -Exceptions are noted within the associated source files. - --------------------------------------------------------------------- - - -COMMON DEVELOPMENT AND DISTRIBUTION LICENSE Version 1.0 - -1. Definitions. - - 1.1. "Contributor" means each individual or entity that creates - or contributes to the creation of Modifications. - - 1.2. "Contributor Version" means the combination of the Original - Software, prior Modifications used by a Contributor (if any), - and the Modifications made by that particular Contributor. - - 1.3. "Covered Software" means (a) the Original Software, or (b) - Modifications, or (c) the combination of files containing - Original Software with files containing Modifications, in - each case including portions thereof. - - 1.4. "Executable" means the Covered Software in any form other - than Source Code. - - 1.5. "Initial Developer" means the individual or entity that first - makes Original Software available under this License. - - 1.6. "Larger Work" means a work which combines Covered Software or - portions thereof with code not governed by the terms of this - License. - - 1.7. "License" means this document. - - 1.8. "Licensable" means having the right to grant, to the maximum - extent possible, whether at the time of the initial grant or - subsequently acquired, any and all of the rights conveyed - herein. - - 1.9. "Modifications" means the Source Code and Executable form of - any of the following: - - A. Any file that results from an addition to, deletion from or - modification of the contents of a file containing Original - Software or previous Modifications; - - B. Any new file that contains any part of the Original - Software or previous Modifications; or - - C. Any new file that is contributed or otherwise made - available under the terms of this License. - - 1.10. "Original Software" means the Source Code and Executable - form of computer software code that is originally released - under this License. - - 1.11. "Patent Claims" means any patent claim(s), now owned or - hereafter acquired, including without limitation, method, - process, and apparatus claims, in any patent Licensable by - grantor. - - 1.12. "Source Code" means (a) the common form of computer software - code in which modifications are made and (b) associated - documentation included in or with such code. - - 1.13. "You" (or "Your") means an individual or a legal entity - exercising rights under, and complying with all of the terms - of, this License. For legal entities, "You" includes any - entity which controls, is controlled by, or is under common - control with You. For purposes of this definition, - "control" means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of more than fifty - percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants. - - 2.1. The Initial Developer Grant. - - Conditioned upon Your compliance with Section 3.1 below and - subject to third party intellectual property claims, the Initial - Developer hereby grants You a world-wide, royalty-free, - non-exclusive license: - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Initial Developer, to use, - reproduce, modify, display, perform, sublicense and - distribute the Original Software (or portions thereof), - with or without Modifications, and/or as part of a Larger - Work; and - - (b) under Patent Claims infringed by the making, using or - selling of Original Software, to make, have made, use, - practice, sell, and offer for sale, and/or otherwise - dispose of the Original Software (or portions thereof). - - (c) The licenses granted in Sections 2.1(a) and (b) are - effective on the date Initial Developer first distributes - or otherwise makes the Original Software available to a - third party under the terms of this License. - - (d) Notwithstanding Section 2.1(b) above, no patent license is - granted: (1) for code that You delete from the Original - Software, or (2) for infringements caused by: (i) the - modification of the Original Software, or (ii) the - combination of the Original Software with other software - or devices. - - 2.2. Contributor Grant. - - Conditioned upon Your compliance with Section 3.1 below and - subject to third party intellectual property claims, each - Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Contributor to use, reproduce, - modify, display, perform, sublicense and distribute the - Modifications created by such Contributor (or portions - thereof), either on an unmodified basis, with other - Modifications, as Covered Software and/or as part of a - Larger Work; and - - (b) under Patent Claims infringed by the making, using, or - selling of Modifications made by that Contributor either - alone and/or in combination with its Contributor Version - (or portions of such combination), to make, use, sell, - offer for sale, have made, and/or otherwise dispose of: - (1) Modifications made by that Contributor (or portions - thereof); and (2) the combination of Modifications made by - that Contributor with its Contributor Version (or portions - of such combination). - - (c) The licenses granted in Sections 2.2(a) and 2.2(b) are - effective on the date Contributor first distributes or - otherwise makes the Modifications available to a third - party. - - (d) Notwithstanding Section 2.2(b) above, no patent license is - granted: (1) for any code that Contributor has deleted - from the Contributor Version; (2) for infringements caused - by: (i) third party modifications of Contributor Version, - or (ii) the combination of Modifications made by that - Contributor with other software (except as part of the - Contributor Version) or other devices; or (3) under Patent - Claims infringed by Covered Software in the absence of - Modifications made by that Contributor. - -3. Distribution Obligations. - - 3.1. Availability of Source Code. - - Any Covered Software that You distribute or otherwise make - available in Executable form must also be made available in Source - Code form and that Source Code form must be distributed only under - the terms of this License. You must include a copy of this - License with every copy of the Source Code form of the Covered - Software You distribute or otherwise make available. You must - inform recipients of any such Covered Software in Executable form - as to how they can obtain such Covered Software in Source Code - form in a reasonable manner on or through a medium customarily - used for software exchange. - - 3.2. Modifications. - - The Modifications that You create or to which You contribute are - governed by the terms of this License. You represent that You - believe Your Modifications are Your original creation(s) and/or - You have sufficient rights to grant the rights conveyed by this - License. - - 3.3. Required Notices. - - You must include a notice in each of Your Modifications that - identifies You as the Contributor of the Modification. You may - not remove or alter any copyright, patent or trademark notices - contained within the Covered Software, or any notices of licensing - or any descriptive text giving attribution to any Contributor or - the Initial Developer. - - 3.4. Application of Additional Terms. - - You may not offer or impose any terms on any Covered Software in - Source Code form that alters or restricts the applicable version - of this License or the recipients' rights hereunder. You may - choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of - Covered Software. However, you may do so only on Your own behalf, - and not on behalf of the Initial Developer or any Contributor. - You must make it absolutely clear that any such warranty, support, - indemnity or liability obligation is offered by You alone, and You - hereby agree to indemnify the Initial Developer and every - Contributor for any liability incurred by the Initial Developer or - such Contributor as a result of warranty, support, indemnity or - liability terms You offer. - - 3.5. Distribution of Executable Versions. - - You may distribute the Executable form of the Covered Software - under the terms of this License or under the terms of a license of - Your choice, which may contain terms different from this License, - provided that You are in compliance with the terms of this License - and that the license for the Executable form does not attempt to - limit or alter the recipient's rights in the Source Code form from - the rights set forth in this License. If You distribute the - Covered Software in Executable form under a different license, You - must make it absolutely clear that any terms which differ from - this License are offered by You alone, not by the Initial - Developer or Contributor. You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred - by the Initial Developer or such Contributor as a result of any - such terms You offer. - - 3.6. Larger Works. - - You may create a Larger Work by combining Covered Software with - other code not governed by the terms of this License and - distribute the Larger Work as a single product. In such a case, - You must make sure the requirements of this License are fulfilled - for the Covered Software. - -4. Versions of the License. - - 4.1. New Versions. - - Sun Microsystems, Inc. is the initial license steward and may - publish revised and/or new versions of this License from time to - time. Each version will be given a distinguishing version number. - Except as provided in Section 4.3, no one other than the license - steward has the right to modify this License. - - 4.2. Effect of New Versions. - - You may always continue to use, distribute or otherwise make the - Covered Software available under the terms of the version of the - License under which You originally received the Covered Software. - If the Initial Developer includes a notice in the Original - Software prohibiting it from being distributed or otherwise made - available under any subsequent version of the License, You must - distribute and make the Covered Software available under the terms - of the version of the License under which You originally received - the Covered Software. Otherwise, You may also choose to use, - distribute or otherwise make the Covered Software available under - the terms of any subsequent version of the License published by - the license steward. - - 4.3. Modified Versions. - - When You are an Initial Developer and You want to create a new - license for Your Original Software, You may create and use a - modified version of this License if You: (a) rename the license - and remove any references to the name of the license steward - (except to note that the license differs from this License); and - (b) otherwise make it clear that the license contains terms which - differ from this License. - -5. DISCLAIMER OF WARRANTY. - - COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" - BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, - INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED - SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR - PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND - PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY - COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE - INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY - NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF - WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF - ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS - DISCLAIMER. - -6. TERMINATION. - - 6.1. This License and the rights granted hereunder will terminate - automatically if You fail to comply with terms herein and fail to - cure such breach within 30 days of becoming aware of the breach. - Provisions which, by their nature, must remain in effect beyond - the termination of this License shall survive. - - 6.2. If You assert a patent infringement claim (excluding - declaratory judgment actions) against Initial Developer or a - Contributor (the Initial Developer or Contributor against whom You - assert such claim is referred to as "Participant") alleging that - the Participant Software (meaning the Contributor Version where - the Participant is a Contributor or the Original Software where - the Participant is the Initial Developer) directly or indirectly - infringes any patent, then any and all rights granted directly or - indirectly to You by such Participant, the Initial Developer (if - the Initial Developer is not the Participant) and all Contributors - under Sections 2.1 and/or 2.2 of this License shall, upon 60 days - notice from Participant terminate prospectively and automatically - at the expiration of such 60 day notice period, unless if within - such 60 day period You withdraw Your claim with respect to the - Participant Software against such Participant either unilaterally - or pursuant to a written agreement with Participant. - - 6.3. In the event of termination under Sections 6.1 or 6.2 above, - all end user licenses that have been validly granted by You or any - distributor hereunder prior to termination (excluding licenses - granted to You by any distributor) shall survive termination. - -7. LIMITATION OF LIABILITY. - - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT - (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE - INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF - COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE - LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR - CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT - LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK - STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER - COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN - INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF - LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL - INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT - APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO - NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR - CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT - APPLY TO YOU. - -8. U.S. GOVERNMENT END USERS. - - The Covered Software is a "commercial item," as that term is - defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial - computer software" (as that term is defined at 48 - C.F.R. 252.227-7014(a)(1)) and "commercial computer software - documentation" as such terms are used in 48 C.F.R. 12.212 - (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 - C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all - U.S. Government End Users acquire Covered Software with only those - rights set forth herein. This U.S. Government Rights clause is in - lieu of, and supersedes, any other FAR, DFAR, or other clause or - provision that addresses Government rights in computer software - under this License. - -9. MISCELLANEOUS. - - This License represents the complete agreement concerning subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. This License shall be governed - by the law of the jurisdiction specified in a notice contained - within the Original Software (except to the extent applicable law, - if any, provides otherwise), excluding such jurisdiction's - conflict-of-law provisions. Any litigation relating to this - License shall be subject to the jurisdiction of the courts located - in the jurisdiction and venue specified in a notice contained - within the Original Software, with the losing party responsible - for costs, including, without limitation, court costs and - reasonable attorneys' fees and expenses. The application of the - United Nations Convention on Contracts for the International Sale - of Goods is expressly excluded. Any law or regulation which - provides that the language of a contract shall be construed - against the drafter shall not apply to this License. You agree - that You alone are responsible for compliance with the United - States export administration regulations (and the export control - laws and regulation of any other countries) when You use, - distribute or otherwise make available any Covered Software. - -10. RESPONSIBILITY FOR CLAIMS. - - As between Initial Developer and the Contributors, each party is - responsible for claims and damages arising, directly or - indirectly, out of its utilization of rights under this License - and You agree to work with Initial Developer and Contributors to - distribute such responsibility on an equitable basis. Nothing - herein is intended or shall be deemed to constitute any admission - of liability. - --------------------------------------------------------------------- - -NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND -DISTRIBUTION LICENSE (CDDL) - -For Covered Software in this distribution, this License shall -be governed by the laws of the State of California (excluding -conflict-of-law provisions). - -Any litigation relating to this License shall be subject to the -jurisdiction of the Federal Courts of the Northern District of -California and the state courts of the State of California, with -venue lying in Santa Clara County, California. diff --git a/licenses/github.com/imdario/mergo/LICENSE b/licenses/github.com/imdario/mergo/LICENSE deleted file mode 100644 index 686680298d..0000000000 --- a/licenses/github.com/imdario/mergo/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2013 Dario Castañé. All rights reserved. -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/github.com/inconshreveable/mousetrap/LICENSE b/licenses/github.com/inconshreveable/mousetrap/LICENSE deleted file mode 100644 index 5f0d1fb6a7..0000000000 --- a/licenses/github.com/inconshreveable/mousetrap/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2014 Alan Shreve - -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. diff --git a/licenses/github.com/json-iterator/go/LICENSE b/licenses/github.com/json-iterator/go/LICENSE deleted file mode 100644 index 2cf4f5ab28..0000000000 --- a/licenses/github.com/json-iterator/go/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 json-iterator - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/github.com/juju/ratelimit/LICENSE b/licenses/github.com/juju/ratelimit/LICENSE deleted file mode 100644 index ade9307b39..0000000000 --- a/licenses/github.com/juju/ratelimit/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -All files in this repository are licensed as follows. If you contribute -to this repository, it is assumed that you license your contribution -under the same license unless you state otherwise. - -All files Copyright (C) 2015 Canonical Ltd. unless otherwise specified in the file. - -This software is licensed under the LGPLv3, included below. - -As a special exception to the GNU Lesser General Public License version 3 -("LGPL3"), the copyright holders of this Library give you permission to -convey to a third party a Combined Work that links statically or dynamically -to this Library without providing any Minimal Corresponding Source or -Minimal Application Code as set out in 4d or providing the installation -information set out in section 4e, provided that you comply with the other -provisions of LGPL3 and provided that you meet, for the Application the -terms and conditions of the license(s) which apply to the Application. - -Except as stated in this special exception, the provisions of LGPL3 will -continue to comply in full to this Library. If you modify this Library, you -may apply this exception to your version of this Library, but you are not -obliged to do so. If you do not wish to do so, delete this exception -statement from your version. This exception does not (and cannot) modify any -license terms which apply to the Application, with which you must still -comply. - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/licenses/github.com/lib/pq/LICENSE.md b/licenses/github.com/lib/pq/LICENSE.md deleted file mode 100644 index 5773904a30..0000000000 --- a/licenses/github.com/lib/pq/LICENSE.md +++ /dev/null @@ -1,8 +0,0 @@ -Copyright (c) 2011-2013, 'pq' Contributors -Portions Copyright (C) 2011 Blake Mizerany - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/github.com/mailru/easyjson/LICENSE b/licenses/github.com/mailru/easyjson/LICENSE deleted file mode 100644 index fbff658f70..0000000000 --- a/licenses/github.com/mailru/easyjson/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -Copyright (c) 2016 Mail.Ru Group - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/github.com/mattn/go-colorable/LICENSE b/licenses/github.com/mattn/go-colorable/LICENSE deleted file mode 100644 index 91b5cef30e..0000000000 --- a/licenses/github.com/mattn/go-colorable/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Yasuhiro Matsumoto - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/licenses/github.com/mattn/go-isatty/LICENSE b/licenses/github.com/mattn/go-isatty/LICENSE deleted file mode 100644 index 65dc692b6b..0000000000 --- a/licenses/github.com/mattn/go-isatty/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) Yasuhiro MATSUMOTO - -MIT License (Expat) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/github.com/modern-go/concurrent/LICENSE b/licenses/github.com/modern-go/concurrent/LICENSE deleted file mode 100644 index 261eeb9e9f..0000000000 --- a/licenses/github.com/modern-go/concurrent/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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. diff --git a/licenses/github.com/modern-go/reflect2/LICENSE b/licenses/github.com/modern-go/reflect2/LICENSE deleted file mode 100644 index 261eeb9e9f..0000000000 --- a/licenses/github.com/modern-go/reflect2/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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. diff --git a/licenses/github.com/petar/GoLLRB/LICENSE b/licenses/github.com/petar/GoLLRB/LICENSE deleted file mode 100644 index b75312c787..0000000000 --- a/licenses/github.com/petar/GoLLRB/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2010, Petar Maymounkov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -(*) Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. - -(*) Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -(*) Neither the name of Petar Maymounkov nor the names of its contributors may be -used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/github.com/peterbourgon/diskv/LICENSE b/licenses/github.com/peterbourgon/diskv/LICENSE deleted file mode 100644 index 41ce7f16e1..0000000000 --- a/licenses/github.com/peterbourgon/diskv/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011-2012 Peter Bourgon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/licenses/github.com/russross/blackfriday/LICENSE.txt b/licenses/github.com/russross/blackfriday/LICENSE.txt deleted file mode 100644 index 2885af3602..0000000000 --- a/licenses/github.com/russross/blackfriday/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -Blackfriday is distributed under the Simplified BSD License: - -> Copyright © 2011 Russ Ross -> All rights reserved. -> -> Redistribution and use in source and binary forms, with or without -> modification, are permitted provided that the following conditions -> are met: -> -> 1. Redistributions of source code must retain the above copyright -> notice, this list of conditions and the following disclaimer. -> -> 2. Redistributions in binary form must reproduce the above -> copyright notice, this list of conditions and the following -> disclaimer in the documentation and/or other materials provided with -> the distribution. -> -> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -> FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -> COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -> INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -> BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -> LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -> ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -> POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/github.com/sirupsen/logrus/LICENSE b/licenses/github.com/sirupsen/logrus/LICENSE deleted file mode 100644 index f090cb42f3..0000000000 --- a/licenses/github.com/sirupsen/logrus/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Simon Eskildsen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/licenses/github.com/spf13/cobra/LICENSE.txt b/licenses/github.com/spf13/cobra/LICENSE.txt deleted file mode 100644 index 298f0e2665..0000000000 --- a/licenses/github.com/spf13/cobra/LICENSE.txt +++ /dev/null @@ -1,174 +0,0 @@ - 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. diff --git a/licenses/github.com/spf13/pflag/LICENSE b/licenses/github.com/spf13/pflag/LICENSE deleted file mode 100644 index 63ed1cfea1..0000000000 --- a/licenses/github.com/spf13/pflag/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2012 Alex Ogier. All rights reserved. -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/golang.org/x/crypto/LICENSE b/licenses/golang.org/x/crypto/LICENSE deleted file mode 100644 index 6a66aea5ea..0000000000 --- a/licenses/golang.org/x/crypto/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/golang.org/x/net/LICENSE b/licenses/golang.org/x/net/LICENSE deleted file mode 100644 index 6a66aea5ea..0000000000 --- a/licenses/golang.org/x/net/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/golang.org/x/sys/LICENSE b/licenses/golang.org/x/sys/LICENSE deleted file mode 100644 index 6a66aea5ea..0000000000 --- a/licenses/golang.org/x/sys/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/golang.org/x/text/LICENSE b/licenses/golang.org/x/text/LICENSE deleted file mode 100644 index 6a66aea5ea..0000000000 --- a/licenses/golang.org/x/text/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/gopkg.in/inf.v0/LICENSE b/licenses/gopkg.in/inf.v0/LICENSE deleted file mode 100644 index 87a5cede33..0000000000 --- a/licenses/gopkg.in/inf.v0/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go -Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/gopkg.in/robfig/cron.v2/LICENSE b/licenses/gopkg.in/robfig/cron.v2/LICENSE deleted file mode 100644 index 3a0f627ffe..0000000000 --- a/licenses/gopkg.in/robfig/cron.v2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (C) 2012 Rob Figueiredo -All Rights Reserved. - -MIT LICENSE - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/licenses/gopkg.in/yaml.v2/LICENSE b/licenses/gopkg.in/yaml.v2/LICENSE deleted file mode 100644 index 8dada3edaf..0000000000 --- a/licenses/gopkg.in/yaml.v2/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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. diff --git a/licenses/k8s.io/api/LICENSE b/licenses/k8s.io/api/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/licenses/k8s.io/api/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/licenses/k8s.io/apimachinery/LICENSE b/licenses/k8s.io/apimachinery/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/licenses/k8s.io/apimachinery/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/licenses/k8s.io/client-go/LICENSE b/licenses/k8s.io/client-go/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/licenses/k8s.io/client-go/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/licenses/k8s.io/kube-openapi/LICENSE b/licenses/k8s.io/kube-openapi/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/licenses/k8s.io/kube-openapi/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. From 96b803399b1768a80af4b3371c8c362f56a94361 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 29 Apr 2021 14:50:21 -0400 Subject: [PATCH 096/129] Update defaults for running aggregator script If $GOPATH is unset, this will default to using the standard module GOPATH. --- bin/license_aggregator.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/license_aggregator.sh b/bin/license_aggregator.sh index 044f8c016c..c965e51940 100755 --- a/bin/license_aggregator.sh +++ b/bin/license_aggregator.sh @@ -14,7 +14,7 @@ # limitations under the License. # Inputs / outputs -SCAN_DIR=${GOPATH}/pkg/mod +SCAN_DIR=${GOPATH:-~/go}/pkg/mod OUT_DIR=licenses # Fail on error From 9f1fd42657abe8544b52f609cdc41a35ab21aea0 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 2 May 2021 13:24:20 -0400 Subject: [PATCH 097/129] Small tweak to script This ensures the file perms on LICENSE.txt do not change when script is run. --- bin/license_aggregator.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/license_aggregator.sh b/bin/license_aggregator.sh index c965e51940..c16070cfa7 100755 --- a/bin/license_aggregator.sh +++ b/bin/license_aggregator.sh @@ -36,3 +36,4 @@ do done sudo chmod -R 755 licenses +sudo chmod 0644 licenses/LICENSE.txt From 76ad54b9134197ca132013dee49421cf921416fb Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 13 May 2021 18:16:30 -0400 Subject: [PATCH 098/129] Fix panic when parsing backup options with extra space There existed a condition where checking for new backup options in the "pgo backup" command could cause a panic. This resolves the issue both by adding a guard on the array and trimming whitespace. --- internal/apiserver/backupoptions/backupoptionsutil.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/internal/apiserver/backupoptions/backupoptionsutil.go b/internal/apiserver/backupoptions/backupoptionsutil.go index c8efed16b5..3c0fb5e6a5 100644 --- a/internal/apiserver/backupoptions/backupoptionsutil.go +++ b/internal/apiserver/backupoptions/backupoptionsutil.go @@ -37,7 +37,8 @@ type backupOptions interface { func ValidateBackupOpts(backupOpts string, request interface{}) error { // some quick checks to make sure backup opts string is valid and should be processed and validated - if strings.TrimSpace(backupOpts) == "" { + backupOpts = strings.TrimSpace(backupOpts) + if backupOpts == "" { return nil } else if !strings.HasPrefix(strings.TrimSpace(backupOpts), "-") && !strings.HasPrefix(strings.TrimSpace(backupOpts), "--") { @@ -114,7 +115,7 @@ func parseBackupOpts(backupOpts string) []string { var newField string for i, c := range backupOpts { // if another option is found, add current option to newFields array - if !(c == ' ' && backupOpts[i+1] == '-') { + if !(c == ' ' && i+1 < len(backupOpts) && backupOpts[i+1] == '-') { newField = newField + string(c) } From 54e74279dd96169e4021ec94aabd7886b40ac3bb Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 21 May 2021 13:16:17 -0400 Subject: [PATCH 099/129] Bump pgMonitor version --- bin/get-pgmonitor.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/get-pgmonitor.sh b/bin/get-pgmonitor.sh index b6cceb2af4..f48d842399 100755 --- a/bin/get-pgmonitor.sh +++ b/bin/get-pgmonitor.sh @@ -14,7 +14,7 @@ # limitations under the License. echo "Getting pgMonitor..." -PGMONITOR_COMMIT='v4.4-RC7' +PGMONITOR_COMMIT='4.4-1' # pgMonitor Setup if [[ -d ${PGOROOT?}/tools/pgmonitor ]] From 53f6f9e4d60f8fef67cc39fc67e4973e16cdc106 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 28 May 2021 15:06:19 -0400 Subject: [PATCH 100/129] Bump v4.5.3 --- Makefile | 4 +-- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 +-- docs/config.toml | 14 ++++---- docs/content/Configuration/compatibility.md | 6 ++++ docs/content/releases/4.5.3.md | 33 +++++++++++++++++++ docs/content/tutorial/pgbouncer.md | 2 +- examples/create-by-resource/fromcrd.json | 6 ++-- examples/envs.sh | 2 +- examples/helm/README.md | 4 +-- .../create-cluster/templates/pgcluster.yaml | 2 +- examples/helm/create-cluster/values.yaml | 4 +-- installers/ansible/README.md | 2 +- installers/ansible/values.yaml | 6 ++-- installers/gcp-marketplace/Makefile | 2 +- installers/gcp-marketplace/README.md | 2 +- installers/gcp-marketplace/values.yaml | 6 ++-- installers/helm/Chart.yaml | 2 +- installers/helm/values.yaml | 6 ++-- installers/kubectl/client-setup.sh | 2 +- .../kubectl/postgres-operator-ocp311.yml | 8 ++--- installers/kubectl/postgres-operator.yml | 8 ++--- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- installers/metrics/helm/helm_template.yaml | 2 +- installers/metrics/helm/values.yaml | 2 +- .../postgres-operator-metrics-ocp311.yml | 2 +- .../kubectl/postgres-operator-metrics.yml | 2 +- installers/olm/Makefile | 4 +-- pkg/apis/crunchydata.com/v1/doc.go | 8 ++--- pkg/apiservermsgs/common.go | 2 +- redhat/atomic/help.1 | 2 +- redhat/atomic/help.md | 2 +- 34 files changed, 99 insertions(+), 60 deletions(-) create mode 100644 docs/content/releases/4.5.3.md diff --git a/Makefile b/Makefile index cddf45eef7..6ea53a145b 100644 --- a/Makefile +++ b/Makefile @@ -9,9 +9,9 @@ PGO_CMD ?= kubectl PGO_IMAGE_PREFIX ?= crunchydata PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) PGO_OPERATOR_NAMESPACE ?= pgo -PGO_VERSION ?= 4.5.2 +PGO_VERSION ?= 4.5.3 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.6 +PGO_PG_FULLVERSION ?= 12.7 PGO_BACKREST_VERSION ?= 2.29 PACKAGER ?= yum diff --git a/README.md b/README.md index 074aaacb8b..39f7145b73 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ to start as quickly as: ```shell kubectl create namespace pgo -kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.2/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.3/installers/kubectl/postgres-operator.yml ``` Otherwise, we highly recommend following the instructions from our [Quickstart](https://access.crunchydata.com/documentation/postgres-operator/latest/quickstart/). diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index 5a293622b5..e405220498 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -16,7 +16,7 @@ GCR_IMAGE_PREFIX=gcr.io/crunchy-dev-test CCP_IMAGE_PREFIX=crunchydata -CCP_IMAGE_TAG=centos8-12.6-4.5.2 +CCP_IMAGE_TAG=centos8-12.7-4.5.3 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index c98c69aa98..56e82a1000 100644 --- a/conf/postgres-operator/pgo.yaml +++ b/conf/postgres-operator/pgo.yaml @@ -2,7 +2,7 @@ Cluster: CCPImagePrefix: registry.developers.crunchydata.com/crunchydata Metrics: false Badger: false - CCPImageTag: centos8-12.6-4.5.2 + CCPImageTag: centos8-12.7-4.5.3 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -82,4 +82,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos8-4.5.2 + PGOImageTag: centos8-4.5.3 diff --git a/docs/config.toml b/docs/config.toml index 9e8853f125..5b63a9eb58 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,13 +25,13 @@ disableNavChevron = false # set true to hide next/prev chevron, default is false highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter menushortcutsnewtab = true # set true to open shortcuts links to a new tab/window enableGitInfo = true -operatorVersion = "4.5.2" -postgresVersion = "12.6" -postgresVersion13 = "13.2" -postgresVersion12 = "12.6" -postgresVersion11 = "11.11" -postgresVersion10 = "10.16" -postgresVersion96 = "9.6.21" +operatorVersion = "4.5.3" +postgresVersion = "12.7" +postgresVersion13 = "13.3" +postgresVersion12 = "12.7" +postgresVersion11 = "11.12" +postgresVersion10 = "10.17" +postgresVersion96 = "9.6.22" postgresVersion95 = "9.5.25" postgisVersion = "3.0" centosBase = "centos8" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index 57e86019b8..550dd315f7 100644 --- a/docs/content/Configuration/compatibility.md +++ b/docs/content/Configuration/compatibility.md @@ -12,6 +12,12 @@ version dependencies between the two projects. Below are the operator releases a | Operator Release | Container Release | Postgres | PgBackrest Version |:----------|:-------------|:------------|:-------------- +| 4.5.3 | 4.5.3 | 13.3 | 2.29 | +|||12.7|2.29| +|||11.12|2.29| +|||10.17|2.29| +|||9.6.22|2.29| +|||| | 4.5.2 | 4.5.2 | 13.2 | 2.29 | |||12.6|2.29| |||11.11|2.29| diff --git a/docs/content/releases/4.5.3.md b/docs/content/releases/4.5.3.md new file mode 100644 index 0000000000..c50fe9e248 --- /dev/null +++ b/docs/content/releases/4.5.3.md @@ -0,0 +1,33 @@ +--- +title: "4.5.3" +date: +draft: false +weight: 67 +--- + +Crunchy Data announces the release of the PostgreSQL Operator 4.5.3 on June 2, 2021. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +PostgreSQL Operator 4.5.3 release includes the following software versions upgrades: + +- [PostgreSQL](https://www.postgresql.org) is at 13.3, 12.7, 11.12, 10.17, and 9.6.22. +- [Patroni](https://patroni.readthedocs.io/) is now at version 2.0.2. +- [pgBouncer](https://www.pgbouncer.org/) for CentOS 8 / UBI 8 is rebuilt to use the libc for its async DNS backend. + +## Changes + +- Revert setting "UsePAM" to "yes" by default as the bug fix in Docker that required that change was applied roughly one year ago. +- Allow for the `PGOADMIN_USERNAME`, `PGOADMIN_PASSWORD`, `PGOADMIN_ROLENAME` credential bootstrap variables to be overriden as part of the OLM and development install process. Contributed by Mathieu Parent (@sathieu). +- Update Helm installer to follow appropriate conventions. Contributed by Jakub Ráček (@kubaracek). + +## Fixes + +- Fix crash due to superfluous trailing whitespace when parsing `--backup-opts` in `pgo backup`. Reported by Samir Faci (@safaci2000). +- Fix issue where metrics about pgBackRest backups could not be scraped if the backups were stored in a S3-like environment that requires the use of disabling TLS verification. Reported by (@lphan-clv) and (@dakine1111). +- Fix issue where certain pgAdmin 4 functions did not work (e.g. taking a backup) due to `python` references in EL8 containers. Reported by (@douggutaby). +- Fix how the pgAdmin 4 Service is identified in `pgo test`. Prior to this, it was identified as a "primary"; now it is "pgadmin". +- Ensure a Postgres cluster shutdown can execute even if the `status` subresource of a `pgclusters.crunchydata.com` custom resource is missing. +- Ensure major upgrades via `crunchy-upgrade` support PostgreSQL 12 and PostgreSQL 13. Reported by (@lbartnicki92). +- Fix nonbreaking error message that occurs when `pgo-scheduler` container shuts down in the UBI 8 base container. +- The `pgo-deployer` and Ansible installer will no longer create an initial TLS secret for the PGO apiserver. PGO apiserver has been able to self-create this for a long time, and PGO defers to that. This fixes an issue that occurred on newer builds where certificates generated by OpenSSL contained incomplete usage blocks, which could cause for these certificates to be properly outright rejected. diff --git a/docs/content/tutorial/pgbouncer.md b/docs/content/tutorial/pgbouncer.md index 2e189bb76f..a44d46ca7f 100644 --- a/docs/content/tutorial/pgbouncer.md +++ b/docs/content/tutorial/pgbouncer.md @@ -116,7 +116,7 @@ PGPASSWORD=randompassword psql -h localhost -p 5432 -U pgbouncer pgbouncer You should see something similar to this: ``` -psql (12.6, server 1.14.0/bouncer) +psql (12.7, server 1.14.0/bouncer) Type "help" for help. pgbouncer=# diff --git a/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index 81fa142821..e2b85a6537 100644 --- a/examples/create-by-resource/fromcrd.json +++ b/examples/create-by-resource/fromcrd.json @@ -16,7 +16,7 @@ "pg-cluster": "fromcrd", "pg-pod-anti-affinity": "", "pgo-backrest": "true", - "pgo-version": "4.5.2", + "pgo-version": "4.5.3", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos8-12.6-4.5.2", + "ccpimagetag": "centos8-12.7-4.5.3", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy-postgres-exporter": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.5.2", + "pgo-version": "4.5.3", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index 9d00960260..be237ca105 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -23,7 +23,7 @@ export PGO_CONF_DIR=$PGOROOT/installers/ansible/roles/pgo-operator/files # the version of the Operator you run is set by these vars export PGO_IMAGE_PREFIX=registry.developers.crunchydata.com/crunchydata export PGO_BASEOS=centos8 -export PGO_VERSION=4.5.2 +export PGO_VERSION=4.5.3 export PGO_IMAGE_TAG=$PGO_BASEOS-$PGO_VERSION # for setting the pgo apiserver port, disabling TLS or not verifying TLS diff --git a/examples/helm/README.md b/examples/helm/README.md index 230906684c..6936a6ea86 100644 --- a/examples/helm/README.md +++ b/examples/helm/README.md @@ -22,10 +22,10 @@ https://access.crunchydata.com/documentation/postgres-operator/latest/custom-res ## Setup -If you are running Postgres Operator 4.5.2 or later, you can skip the below +If you are running Postgres Operator 4.5.3 or later, you can skip the below step. -### Before 4.5.2 +### Before 4.5.3 ``` cd postgres-operator/examples/helm/create-cluster diff --git a/examples/helm/create-cluster/templates/pgcluster.yaml b/examples/helm/create-cluster/templates/pgcluster.yaml index fab6c18d93..f469e0972d 100644 --- a/examples/helm/create-cluster/templates/pgcluster.yaml +++ b/examples/helm/create-cluster/templates/pgcluster.yaml @@ -13,7 +13,7 @@ metadata: pg-cluster: {{ .Values.pgclustername }} pg-pod-anti-affinity: "" pgo-backrest: "true" - pgo-version: 4.5.2 + pgo-version: 4.5.3 pgouser: admin name: {{ .Values.pgclustername }} namespace: {{ .Values.namespace }} diff --git a/examples/helm/create-cluster/values.yaml b/examples/helm/create-cluster/values.yaml index f334830007..f975cb0e12 100644 --- a/examples/helm/create-cluster/values.yaml +++ b/examples/helm/create-cluster/values.yaml @@ -4,11 +4,11 @@ # The values is for the namespace and the postgresql cluster name ccpimage: crunchy-postgres-ha ccpimageprefix: registry.developers.crunchydata.com/crunchydata -ccpimagetag: centos8-12.6-4.5.2 +ccpimagetag: centos8-12.7-4.5.3 namespace: pgo pgclustername: hippo pgoimageprefix: registry.developers.crunchydata.com/crunchydata -pgoversion: 4.5.2 +pgoversion: 4.5.3 hipposecretuser: "hippo" hipposecretpassword: "Supersecurepassword*" postgressecretuser: "postgres" diff --git a/installers/ansible/README.md b/installers/ansible/README.md index d280200461..b17af2f44f 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ PGO: The Postgres Operator from Crunchy Data

-Latest Release: 4.5.2 +Latest Release: 4.5.3 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index acde59ad02..c636869d79 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -17,7 +17,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.6-4.5.2" +ccp_image_tag: "centos8-12.7-4.5.3" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -50,14 +50,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.2" +pgo_client_version: "4.5.3" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.2" +pgo_image_tag: "centos8-4.5.3" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index a5ca4e43e1..e9d4b6d59c 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -6,7 +6,7 @@ MARKETPLACE_TOOLS ?= gcr.io/cloud-marketplace-tools/k8s/dev:$(MARKETPLACE_VERSIO MARKETPLACE_VERSION ?= 0.9.4 KUBECONFIG ?= $(HOME)/.kube/config PARAMETERS ?= {} -PGO_VERSION ?= 4.5.2 +PGO_VERSION ?= 4.5.3 IMAGE_BUILD_ARGS = --build-arg MARKETPLACE_VERSION='$(MARKETPLACE_VERSION)' \ --build-arg PGO_VERSION='$(PGO_VERSION)' diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index ddff9894e8..317cb15d76 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -59,7 +59,7 @@ Google Cloud Marketplace. ```shell IMAGE_REPOSITORY=gcr.io/crunchydata-public/postgres-operator - export PGO_VERSION=4.5.2 + export PGO_VERSION=4.5.3 export INSTALLER_IMAGE=${IMAGE_REPOSITORY}/deployer:${PGO_VERSION} export OPERATOR_IMAGE=${IMAGE_REPOSITORY}:${PGO_VERSION} export OPERATOR_IMAGE_API=${IMAGE_REPOSITORY}/pgo-apiserver:${PGO_VERSION} diff --git a/installers/gcp-marketplace/values.yaml b/installers/gcp-marketplace/values.yaml index 4c514f533f..d76ae318de 100644 --- a/installers/gcp-marketplace/values.yaml +++ b/installers/gcp-marketplace/values.yaml @@ -10,7 +10,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.6-4.5.2" +ccp_image_tag: "centos8-12.7-4.5.3" create_rbac: "true" db_name: "" db_password_age_days: "0" @@ -32,9 +32,9 @@ pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" pgo_client_container_install: "false" pgo_client_install: 'false' -pgo_client_version: "4.5.2" +pgo_client_version: "4.5.3" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.2" +pgo_image_tag: "centos8-4.5.3" pgo_installation_name: '${OPERATOR_NAME}' pgo_operator_namespace: '${OPERATOR_NAMESPACE}' scheduler_timeout: "3600" diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index b39a5ca232..553a372ee6 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -3,7 +3,7 @@ name: postgres-operator description: 'PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes' type: application version: 0.1.0 -appVersion: 4.5.2 +appVersion: 4.5.3 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg keywords: diff --git a/installers/helm/values.yaml b/installers/helm/values.yaml index f7bb96330c..7d8affc13d 100644 --- a/installers/helm/values.yaml +++ b/installers/helm/values.yaml @@ -37,7 +37,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.6-4.5.2" +ccp_image_tag: "centos8-12.7-4.5.3" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -70,14 +70,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.2" +pgo_client_version: "4.5.3" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.2" +pgo_image_tag: "centos8-4.5.3" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index 455c91bd63..69a5e1b2f8 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -14,7 +14,7 @@ # This script should be run after the operator has been deployed PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}" PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}" -PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.2}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.3}" PGO_CLIENT_URL="https://github.com/CrunchyData/postgres-operator/releases/download/${PGO_CLIENT_VERSION}" PGO_CMD="${PGO_CMD-kubectl}" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 33567fa374..4f51b7abca 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -44,7 +44,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.6-4.5.2" + ccp_image_tag: "centos8-12.7-4.5.3" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -77,14 +77,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.2" + pgo_client_version: "4.5.3" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.2" + pgo_image_tag: "centos8-4.5.3" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -161,7 +161,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.2 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.3 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index a26a841742..7bd0364820 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -139,7 +139,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.6-4.5.2" + ccp_image_tag: "centos8-12.7-4.5.3" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -172,14 +172,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.2" + pgo_client_version: "4.5.3" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.2" + pgo_image_tag: "centos8-4.5.3" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -269,7 +269,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.2 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.3 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index b673f08c1d..c3613a5439 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.2 +Latest Release: 4.5.3 ## General diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index fbb8d58c20..529cb73318 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-monitoring description: Install for Crunchy PostgreSQL Operator Monitoring type: application version: 0.1.0 -appVersion: 4.5.2 +appVersion: 4.5.3 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg diff --git a/installers/metrics/helm/helm_template.yaml b/installers/metrics/helm/helm_template.yaml index 5af724ab41..b1fe826565 100644 --- a/installers/metrics/helm/helm_template.yaml +++ b/installers/metrics/helm/helm_template.yaml @@ -20,5 +20,5 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.2" +pgo_image_tag: "centos8-4.5.3" diff --git a/installers/metrics/helm/values.yaml b/installers/metrics/helm/values.yaml index d10e50ddf0..50c7397a19 100644 --- a/installers/metrics/helm/values.yaml +++ b/installers/metrics/helm/values.yaml @@ -20,7 +20,7 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.2" +pgo_image_tag: "centos8-4.5.3" # ===================== # Configuration Options diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index aa38708858..87021526d8 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -96,7 +96,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.2 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.3 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index e1630c8601..86eeb9254c 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -165,7 +165,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.2 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.3 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index 8706e15016..ad275e3c15 100644 --- a/installers/olm/Makefile +++ b/installers/olm/Makefile @@ -2,7 +2,7 @@ .SUFFIXES: CCP_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -CCP_PG_FULLVERSION ?= 12.6 +CCP_PG_FULLVERSION ?= 12.7 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.15.1 @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.15.1 PGO_BASEOS ?= centos8 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.5.2 +PGO_VERSION ?= 4.5.3 PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) CCP_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(PGO_VERSION) CCP_POSTGIS_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(CCP_POSTGIS_VERSION)-$(PGO_VERSION) diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 630f69fe82..244cd1a1c1 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -53,7 +53,7 @@ cluster. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.2", + '{"ClientVersion":"4.5.3", "Namespace":"pgouser1", "Name":"mycluster", $PGO_APISERVER_URL/clusters @@ -72,7 +72,7 @@ show all of the clusters that are in the given namespace. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.2", + '{"ClientVersion":"4.5.3", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/showclusters @@ -82,7 +82,7 @@ $PGO_APISERVER_URL/showclusters curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.2", + '{"ClientVersion":"4.5.3", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.5.2 + Version: 4.5.3 License: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 Contact: Crunchy Data https://www.crunchydata.com/ diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index 1f2307540b..78df048fa0 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -const PGO_VERSION = "4.5.2" +const PGO_VERSION = "4.5.3" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index 69852f8802..c9decb4050 100644 --- a/redhat/atomic/help.1 +++ b/redhat/atomic/help.1 @@ -56,4 +56,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa \fB\fCRelease=\fR .PP -The specific release number of the container. For example, Release="4.5.2" +The specific release number of the container. For example, Release="4.5.3" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index 73f61740a6..7cd7c0bee2 100644 --- a/redhat/atomic/help.md +++ b/redhat/atomic/help.md @@ -45,4 +45,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa `Release=` -The specific release number of the container. For example, Release="4.5.2" +The specific release number of the container. For example, Release="4.5.3" From b993a533d28943243980fdbfc2a5d4f7cc4ff5c5 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 30 May 2021 12:39:31 -0400 Subject: [PATCH 101/129] Ensure "vendor" label is present on PGO objects Though PGO leverages a lot of stable naming, this label is a helpful identifier among the objects that PGO is managing. Some derived objects (e.g. Secrets from SAs) do not get the label, but they are tightly coulpled to the object that does get the label. Most objects had the "vendor" label already, but this should bring everything inline. Issue: #2470 --- deploy/cluster-role-bindings.yaml | 2 ++ deploy/cluster-roles-readonly.yaml | 2 ++ deploy/cluster-roles.yaml | 2 ++ deploy/deploy.sh | 5 ++++- deploy/local-namespace-rbac.yaml | 6 ++++++ deploy/role-bindings.yaml | 2 ++ deploy/roles.yaml | 2 ++ deploy/service-accounts.yaml | 2 ++ deploy/service.json | 3 ++- docs/content/installation/other/operator-hub.md | 2 ++ .../pgo-operator/files/crds/pgclusters-crd.yaml | 2 ++ .../pgo-operator/files/crds/pgpolicies-crd.yaml | 2 ++ .../pgo-operator/files/crds/pgreplicas-crd.yaml | 2 ++ .../roles/pgo-operator/files/crds/pgtasks-crd.yaml | 2 ++ .../files/pgo-configs/pgo-backrest-role-binding.json | 5 ++++- .../files/pgo-configs/pgo-backrest-role.json | 5 ++++- .../files/pgo-configs/pgo-backrest-sa.json | 5 ++++- .../files/pgo-configs/pgo-default-sa.json | 5 ++++- .../files/pgo-configs/pgo-target-role-binding.json | 5 ++++- .../files/pgo-configs/pgo-target-role.json | 5 ++++- .../files/pgo-configs/pgo-target-sa.json | 5 ++++- installers/ansible/roles/pgo-operator/tasks/main.yml | 3 ++- .../templates/cluster-rbac-readonly.yaml.j2 | 4 ++++ .../pgo-operator/templates/cluster-rbac.yaml.j2 | 4 ++++ .../templates/local-namespace-rbac.yaml.j2 | 6 ++++++ .../pgo-operator/templates/pgo-role-rbac.yaml.j2 | 4 ++++ .../templates/pgo-service-account.yaml.j2 | 2 ++ .../roles/pgo-operator/templates/service.json.j2 | 3 ++- installers/kubectl/postgres-operator-ocp311.yml | 10 ++++++++++ installers/kubectl/postgres-operator.yml | 12 ++++++++++++ .../kubectl/postgres-operator-metrics-ocp311.yml | 5 +++++ .../metrics/kubectl/postgres-operator-metrics.yml | 6 ++++++ installers/olm/description.openshift.md | 1 + installers/olm/description.upstream.md | 1 + installers/olm/postgresoperator.crd.yaml | 8 ++++++++ internal/config/pgoconfig.go | 3 +++ 36 files changed, 132 insertions(+), 11 deletions(-) diff --git a/deploy/cluster-role-bindings.yaml b/deploy/cluster-role-bindings.yaml index be7d75bb2f..1f6f9a2b35 100644 --- a/deploy/cluster-role-bindings.yaml +++ b/deploy/cluster-role-bindings.yaml @@ -3,6 +3,8 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: pgo-cluster-role + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole diff --git a/deploy/cluster-roles-readonly.yaml b/deploy/cluster-roles-readonly.yaml index 773e6cd07e..900e83d434 100644 --- a/deploy/cluster-roles-readonly.yaml +++ b/deploy/cluster-roles-readonly.yaml @@ -2,6 +2,8 @@ kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pgo-cluster-role + labels: + vendor: crunchydata rules: - apiGroups: - '' diff --git a/deploy/cluster-roles.yaml b/deploy/cluster-roles.yaml index d760492836..e2a90137c4 100644 --- a/deploy/cluster-roles.yaml +++ b/deploy/cluster-roles.yaml @@ -3,6 +3,8 @@ kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pgo-cluster-role + labels: + vendor: crunchydata rules: - apiGroups: - '' diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 139bba7c08..77da25e51a 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -52,6 +52,8 @@ $PGO_CMD --namespace=$PGO_OPERATOR_NAMESPACE create secret generic pgo-backrest- --from-file=aws-s3-ca.crt=${PGO_CONF_DIR}/pgo-backrest-repo/aws-s3-ca.crt \ --from-literal=aws-s3-key="${pgbackrest_aws_s3_key}" \ --from-literal=aws-s3-key-secret="${pgbackrest_aws_s3_key_secret}" +$PGO_CMD --namespace=$PGO_OPERATOR_NAMESPACE label secret pgo-backrest-repo-config \ + vendor=crunchydata # # credentials for pgo-apiserver TLS REST API @@ -63,11 +65,12 @@ then fi $PGO_CMD --namespace=$PGO_OPERATOR_NAMESPACE create secret tls pgo.tls --key=${PGOROOT}/conf/postgres-operator/server.key --cert=${PGOROOT}/conf/postgres-operator/server.crt +$PGO_CMD --namespace=$PGO_OPERATOR_NAMESPACE label secret pgo.tls vendor=crunchydata $PGO_CMD --namespace=$PGO_OPERATOR_NAMESPACE create configmap pgo-config \ --from-file=${PGOROOT}/conf/postgres-operator/pgo.yaml \ --from-file=${PGO_CONF_DIR}/pgo-configs - +$PGO_CMD --namespace=$PGO_OPERATOR_NAMESPACE label configmap pgo-config vendor=crunchydata # # check if custom port value is set, otherwise set default values diff --git a/deploy/local-namespace-rbac.yaml b/deploy/local-namespace-rbac.yaml index d74f947653..29277675c6 100644 --- a/deploy/local-namespace-rbac.yaml +++ b/deploy/local-namespace-rbac.yaml @@ -3,6 +3,8 @@ kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pgo-local-ns + labels: + vendor: crunchydata rules: - apiGroups: - '' @@ -28,6 +30,8 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: pgo-local-ns + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: Role @@ -41,6 +45,8 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: pgo-target-role-binding + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: Role diff --git a/deploy/role-bindings.yaml b/deploy/role-bindings.yaml index b8f21c2391..916858e8ed 100644 --- a/deploy/role-bindings.yaml +++ b/deploy/role-bindings.yaml @@ -4,6 +4,8 @@ kind: RoleBinding metadata: name: pgo-role namespace: "$PGO_OPERATOR_NAMESPACE" + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: Role diff --git a/deploy/roles.yaml b/deploy/roles.yaml index 899551f6a1..e800165f15 100644 --- a/deploy/roles.yaml +++ b/deploy/roles.yaml @@ -4,6 +4,8 @@ apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pgo-role namespace: "$PGO_OPERATOR_NAMESPACE" + labels: + vendor: crunchydata rules: - apiGroups: - '' diff --git a/deploy/service-accounts.yaml b/deploy/service-accounts.yaml index f631c8e06b..d48909d647 100644 --- a/deploy/service-accounts.yaml +++ b/deploy/service-accounts.yaml @@ -4,3 +4,5 @@ kind: ServiceAccount metadata: name: postgres-operator namespace: $PGO_OPERATOR_NAMESPACE + labels: + vendor: crunchydata diff --git a/deploy/service.json b/deploy/service.json index f026f5d7d5..97b76e4bc9 100644 --- a/deploy/service.json +++ b/deploy/service.json @@ -4,7 +4,8 @@ "metadata": { "name": "postgres-operator", "labels": { - "name": "postgres-operator" + "name": "postgres-operator", + "vendor": "crunchydata" } }, "spec": { diff --git a/docs/content/installation/other/operator-hub.md b/docs/content/installation/other/operator-hub.md index 0f2b5fd029..52a50bc9ee 100644 --- a/docs/content/installation/other/operator-hub.md +++ b/docs/content/installation/other/operator-hub.md @@ -55,6 +55,8 @@ kubectl -n "$PGO_OPERATOR_NAMESPACE" create secret generic pgo-backrest-repo-con --from-file=./installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt \ --from-literal=aws-s3-key="" \ --from-literal=aws-s3-key-secret="" +kubectl -n "$PGO_OPERATOR_NAMESPACE" label secret pgo-backrest-repo-config \ + vendor=crunchydata ``` ### Certificates (optional) diff --git a/installers/ansible/roles/pgo-operator/files/crds/pgclusters-crd.yaml b/installers/ansible/roles/pgo-operator/files/crds/pgclusters-crd.yaml index bea777b436..c6d414d74b 100644 --- a/installers/ansible/roles/pgo-operator/files/crds/pgclusters-crd.yaml +++ b/installers/ansible/roles/pgo-operator/files/crds/pgclusters-crd.yaml @@ -3,6 +3,8 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: pgclusters.crunchydata.com + labels: + vendor: crunchydata spec: group: crunchydata.com names: diff --git a/installers/ansible/roles/pgo-operator/files/crds/pgpolicies-crd.yaml b/installers/ansible/roles/pgo-operator/files/crds/pgpolicies-crd.yaml index 32e0d2014c..73d84f0173 100644 --- a/installers/ansible/roles/pgo-operator/files/crds/pgpolicies-crd.yaml +++ b/installers/ansible/roles/pgo-operator/files/crds/pgpolicies-crd.yaml @@ -3,6 +3,8 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: pgpolicies.crunchydata.com + labels: + vendor: crunchydata spec: group: crunchydata.com names: diff --git a/installers/ansible/roles/pgo-operator/files/crds/pgreplicas-crd.yaml b/installers/ansible/roles/pgo-operator/files/crds/pgreplicas-crd.yaml index 303f77f1ce..167474a41f 100644 --- a/installers/ansible/roles/pgo-operator/files/crds/pgreplicas-crd.yaml +++ b/installers/ansible/roles/pgo-operator/files/crds/pgreplicas-crd.yaml @@ -3,6 +3,8 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: pgreplicas.crunchydata.com + labels: + vendor: crunchydata spec: group: crunchydata.com names: diff --git a/installers/ansible/roles/pgo-operator/files/crds/pgtasks-crd.yaml b/installers/ansible/roles/pgo-operator/files/crds/pgtasks-crd.yaml index 20fce21e7a..14ae07386d 100644 --- a/installers/ansible/roles/pgo-operator/files/crds/pgtasks-crd.yaml +++ b/installers/ansible/roles/pgo-operator/files/crds/pgtasks-crd.yaml @@ -3,6 +3,8 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: pgtasks.crunchydata.com + labels: + vendor: crunchydata spec: group: crunchydata.com names: diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-role-binding.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-role-binding.json index 84f1c031fc..5c4163b892 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-role-binding.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-role-binding.json @@ -3,7 +3,10 @@ "kind": "RoleBinding", "metadata": { "name": "pgo-backrest-role-binding", - "namespace": "{{.TargetNamespace}}" + "namespace": "{{.TargetNamespace}}", + "labels": { + "vendor": "crunchydata" + } }, "roleRef": { "apiGroup": "rbac.authorization.k8s.io", diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-role.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-role.json index ca1c5b4e0b..f14634c7c1 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-role.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-role.json @@ -3,7 +3,10 @@ "kind": "Role", "metadata": { "name": "pgo-backrest-role", - "namespace": "{{.TargetNamespace}}" + "namespace": "{{.TargetNamespace}}", + "labels": { + "vendor": "crunchydata" + } }, "rules": [ { diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-sa.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-sa.json index d3d8d19c4b..cf5607a504 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-sa.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-backrest-sa.json @@ -3,6 +3,9 @@ "kind": "ServiceAccount", "metadata": { "name": "pgo-backrest", - "namespace": "{{.TargetNamespace}}" + "namespace": "{{.TargetNamespace}}", + "labels": { + "vendor": "crunchydata" + } } } diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-default-sa.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-default-sa.json index 5a8a52865c..f35dd542bd 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-default-sa.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-default-sa.json @@ -3,7 +3,10 @@ "kind": "ServiceAccount", "metadata": { "name": "pgo-default", - "namespace": "{{.TargetNamespace}}" + "namespace": "{{.TargetNamespace}}", + "labels": { + "vendor": "crunchydata" + } }, "automountServiceAccountToken": false } diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role-binding.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role-binding.json index df279ee347..5b23bcd927 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role-binding.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role-binding.json @@ -3,7 +3,10 @@ "kind": "RoleBinding", "metadata": { "name": "pgo-target-role-binding", - "namespace": "{{.TargetNamespace}}" + "namespace": "{{.TargetNamespace}}", + "labels": { + "vendor": "crunchydata" + } }, "roleRef": { "apiGroup": "rbac.authorization.k8s.io", diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role.json index 09b77ef469..612307356d 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-role.json @@ -3,7 +3,10 @@ "kind": "Role", "metadata": { "name": "pgo-target-role", - "namespace": "{{.TargetNamespace}}" + "namespace": "{{.TargetNamespace}}", + "labels": { + "vendor": "crunchydata" + } }, "rules": [ { diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-sa.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-sa.json index 5d31bd4441..28cfb06565 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-sa.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgo-target-sa.json @@ -3,6 +3,9 @@ "kind": "ServiceAccount", "metadata": { "name": "pgo-target", - "namespace": "{{.TargetNamespace}}" + "namespace": "{{.TargetNamespace}}", + "labels": { + "vendor": "crunchydata" + } } } diff --git a/installers/ansible/roles/pgo-operator/tasks/main.yml b/installers/ansible/roles/pgo-operator/tasks/main.yml index 423c4469be..4cb6bf439f 100644 --- a/installers/ansible/roles/pgo-operator/tasks/main.yml +++ b/installers/ansible/roles/pgo-operator/tasks/main.yml @@ -215,7 +215,8 @@ command: | {{ kubectl_or_oc }} create clusterrolebinding pgo-cluster-admin \ --clusterrole cluster-admin \ - --serviceaccount "{{ pgo_operator_namespace }}:postgres-operator" + --serviceaccount "{{ pgo_operator_namespace }}:postgres-operator" && \ + {{ kubectl_or_oc }} label clusterrolebinding pgo-cluster-admin vendor=crunchydata when: pgo_cluster_admin_result.rc == 1 diff --git a/installers/ansible/roles/pgo-operator/templates/cluster-rbac-readonly.yaml.j2 b/installers/ansible/roles/pgo-operator/templates/cluster-rbac-readonly.yaml.j2 index 3021d4a058..f34e1b9579 100644 --- a/installers/ansible/roles/pgo-operator/templates/cluster-rbac-readonly.yaml.j2 +++ b/installers/ansible/roles/pgo-operator/templates/cluster-rbac-readonly.yaml.j2 @@ -3,6 +3,8 @@ kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pgo-cluster-role + labels: + vendor: crunchydata rules: - apiGroups: - '' @@ -17,6 +19,8 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: pgo-cluster-role + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole diff --git a/installers/ansible/roles/pgo-operator/templates/cluster-rbac.yaml.j2 b/installers/ansible/roles/pgo-operator/templates/cluster-rbac.yaml.j2 index 4212d9107b..03783810da 100644 --- a/installers/ansible/roles/pgo-operator/templates/cluster-rbac.yaml.j2 +++ b/installers/ansible/roles/pgo-operator/templates/cluster-rbac.yaml.j2 @@ -3,6 +3,8 @@ kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pgo-cluster-role + labels: + vendor: crunchydata rules: - apiGroups: - '' @@ -111,6 +113,8 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: pgo-cluster-role + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole diff --git a/installers/ansible/roles/pgo-operator/templates/local-namespace-rbac.yaml.j2 b/installers/ansible/roles/pgo-operator/templates/local-namespace-rbac.yaml.j2 index 4a878395ae..6eb3fe6144 100644 --- a/installers/ansible/roles/pgo-operator/templates/local-namespace-rbac.yaml.j2 +++ b/installers/ansible/roles/pgo-operator/templates/local-namespace-rbac.yaml.j2 @@ -3,6 +3,8 @@ kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pgo-local-ns + labels: + vendor: crunchydata rules: - apiGroups: - '' @@ -28,6 +30,8 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: pgo-local-ns + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: Role @@ -41,6 +45,8 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: pgo-target-role-binding + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: Role diff --git a/installers/ansible/roles/pgo-operator/templates/pgo-role-rbac.yaml.j2 b/installers/ansible/roles/pgo-operator/templates/pgo-role-rbac.yaml.j2 index 76af49dbcd..62ecb0a1b3 100644 --- a/installers/ansible/roles/pgo-operator/templates/pgo-role-rbac.yaml.j2 +++ b/installers/ansible/roles/pgo-operator/templates/pgo-role-rbac.yaml.j2 @@ -4,6 +4,8 @@ apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pgo-role namespace: {{ pgo_operator_namespace }} + labels: + vendor: crunchydata rules: - apiGroups: - '' @@ -28,6 +30,8 @@ kind: RoleBinding metadata: name: pgo-role namespace: {{ pgo_operator_namespace }} + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: Role diff --git a/installers/ansible/roles/pgo-operator/templates/pgo-service-account.yaml.j2 b/installers/ansible/roles/pgo-operator/templates/pgo-service-account.yaml.j2 index b8a8de6a95..3baaa4a9f8 100644 --- a/installers/ansible/roles/pgo-operator/templates/pgo-service-account.yaml.j2 +++ b/installers/ansible/roles/pgo-operator/templates/pgo-service-account.yaml.j2 @@ -4,6 +4,8 @@ kind: ServiceAccount metadata: name: postgres-operator namespace: {{ pgo_operator_namespace }} + labels: + vendor: crunchydata imagePullSecrets: {% if ccp_image_pull_secret %} - name: {{ ccp_image_pull_secret }} diff --git a/installers/ansible/roles/pgo-operator/templates/service.json.j2 b/installers/ansible/roles/pgo-operator/templates/service.json.j2 index 766a060a72..b50985fa92 100644 --- a/installers/ansible/roles/pgo-operator/templates/service.json.j2 +++ b/installers/ansible/roles/pgo-operator/templates/service.json.j2 @@ -4,7 +4,8 @@ "metadata": { "name": "postgres-operator", "labels": { - "name": "postgres-operator" + "name": "postgres-operator", + "vendor": "crunchydata" } }, "spec": { diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 4f51b7abca..b6356ed22b 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -3,12 +3,16 @@ kind: ServiceAccount metadata: name: pgo-deployer-sa namespace: pgo + labels: + vendor: crunchydata --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: pgo-deployer-crb namespace: pgo + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole @@ -23,6 +27,8 @@ kind: ConfigMap metadata: name: pgo-deployer-cm namespace: pgo + labels: + vendor: crunchydata data: values.yaml: |- # ===================== @@ -151,11 +157,15 @@ kind: Job metadata: name: pgo-deploy namespace: pgo + labels: + vendor: crunchydata spec: backoffLimit: 0 template: metadata: name: pgo-deploy + labels: + vendor: crunchydata spec: serviceAccountName: pgo-deployer-sa restartPolicy: Never diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index 7bd0364820..093ed35f70 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -3,11 +3,15 @@ kind: ServiceAccount metadata: name: pgo-deployer-sa namespace: pgo + labels: + vendor: crunchydata --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pgo-deployer-cr + labels: + vendor: crunchydata rules: - apiGroups: - '' @@ -118,6 +122,8 @@ kind: ConfigMap metadata: name: pgo-deployer-cm namespace: pgo + labels: + vendor: crunchydata data: values.yaml: |- # ===================== @@ -245,6 +251,8 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: pgo-deployer-crb + labels: + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole @@ -259,11 +267,15 @@ kind: Job metadata: name: pgo-deploy namespace: pgo + labels: + vendor: crunchydata spec: backoffLimit: 0 template: metadata: name: pgo-deploy + labels: + vendor: crunchydata spec: serviceAccountName: pgo-deployer-sa restartPolicy: Never diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index 87021526d8..7e70b4b616 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -5,6 +5,7 @@ metadata: namespace: pgo labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding @@ -13,6 +14,7 @@ metadata: namespace: pgo labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole @@ -29,6 +31,7 @@ metadata: namespace: pgo labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata data: values.yaml: |- # ===================== @@ -84,6 +87,7 @@ metadata: namespace: pgo labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata spec: backoffLimit: 0 template: @@ -91,6 +95,7 @@ spec: name: pgo-metrics-deploy labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata spec: serviceAccountName: pgo-metrics-deployer-sa restartPolicy: Never diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index 86eeb9254c..c9047d7b60 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -5,6 +5,7 @@ metadata: namespace: pgo labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 @@ -12,6 +13,7 @@ metadata: name: pgo-metrics-deployer-cr labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata rules: - apiGroups: - '' @@ -83,6 +85,7 @@ metadata: namespace: pgo labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata data: values.yaml: |- # ===================== @@ -137,6 +140,7 @@ metadata: name: pgo-metrics-deployer-crb labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole @@ -153,6 +157,7 @@ metadata: namespace: pgo labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata spec: backoffLimit: 0 template: @@ -160,6 +165,7 @@ spec: name: pgo-metrics-deploy labels: app.kubernetes.io/name: postgres-operator-monitoring + vendor: crunchydata spec: serviceAccountName: pgo-metrics-deployer-sa restartPolicy: Never diff --git a/installers/olm/description.openshift.md b/installers/olm/description.openshift.md index 76be0028da..756deda512 100644 --- a/installers/olm/description.openshift.md +++ b/installers/olm/description.openshift.md @@ -72,6 +72,7 @@ oc -n "$PGO_OPERATOR_NAMESPACE" create secret generic pgo-backrest-repo-config \ --from-file=./aws-s3-ca.crt \ --from-literal=aws-s3-key="" \ --from-literal=aws-s3-key-secret="" +oc -n "$PGO_OPERATOR_NAMESPACE" label secret pgo-backrest-repo-config vendor=crunchydata ``` ### Certificates (optional) diff --git a/installers/olm/description.upstream.md b/installers/olm/description.upstream.md index 7d1dcce69d..5e22485bf7 100644 --- a/installers/olm/description.upstream.md +++ b/installers/olm/description.upstream.md @@ -65,6 +65,7 @@ kubectl -n "$PGO_OPERATOR_NAMESPACE" create secret generic pgo-backrest-repo-con --from-file=./aws-s3-ca.crt \ --from-literal=aws-s3-key="" \ --from-literal=aws-s3-key-secret="" +kubectl -n "$PGO_OPERATOR_NAMESPACE" label secret pgo-backrest-repo-config vendor=crunchydata ``` ### Certificates (optional) diff --git a/installers/olm/postgresoperator.crd.yaml b/installers/olm/postgresoperator.crd.yaml index f39ac244fc..5a94377396 100644 --- a/installers/olm/postgresoperator.crd.yaml +++ b/installers/olm/postgresoperator.crd.yaml @@ -3,6 +3,8 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: pgclusters.crunchydata.com + labels: + vendor: crunchydata spec: group: crunchydata.com names: @@ -40,6 +42,8 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: pgpolicies.crunchydata.com + labels: + vendor: crunchydata spec: group: crunchydata.com names: @@ -61,6 +65,8 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: pgreplicas.crunchydata.com + labels: + vendor: crunchydata spec: group: crunchydata.com names: @@ -82,6 +88,8 @@ apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: pgtasks.crunchydata.com + labels: + vendor: crunchydata spec: group: crunchydata.com names: diff --git a/internal/config/pgoconfig.go b/internal/config/pgoconfig.go index 8d3f1d7790..c48b122b1f 100644 --- a/internal/config/pgoconfig.go +++ b/internal/config/pgoconfig.go @@ -754,6 +754,9 @@ func initialize(clientset kubernetes.Interface, namespace string) (*v1.ConfigMap cm := &v1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: CustomConfigMapName, + Labels: map[string]string{ + LABEL_VENDOR: LABEL_CRUNCHY, + }, }, Data: map[string]string{}, } From ee10409675f00d60e56cbed8da093d0d054b7d96 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 1 Jun 2021 13:57:27 -0400 Subject: [PATCH 102/129] Modify search path for aggregation script This release still uses dep and requires a different path to search over. --- bin/license_aggregator.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/license_aggregator.sh b/bin/license_aggregator.sh index c16070cfa7..dedd6ac31f 100755 --- a/bin/license_aggregator.sh +++ b/bin/license_aggregator.sh @@ -14,7 +14,7 @@ # limitations under the License. # Inputs / outputs -SCAN_DIR=${GOPATH:-~/go}/pkg/mod +SCAN_DIR=${PGOROOT:-~/go/src/github.com/crunchydata/postgres-operator}/vendor OUT_DIR=licenses # Fail on error From 141eb6356b0bc9548798ef87d216ee4165dfe2b4 Mon Sep 17 00:00:00 2001 From: jmckulk Date: Thu, 8 Jul 2021 16:48:02 -0400 Subject: [PATCH 103/129] Update label for policy The policy logic uses the service name and role label to determine which pod is the primary and where to run SQL. This change uses the pg-cluster label instead of the service name label. --- internal/apiserver/policyservice/policyimpl.go | 6 +++--- internal/util/policy.go | 11 +++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/internal/apiserver/policyservice/policyimpl.go b/internal/apiserver/policyservice/policyimpl.go index 8fb0c3d751..995b9648a8 100644 --- a/internal/apiserver/policyservice/policyimpl.go +++ b/internal/apiserver/policyservice/policyimpl.go @@ -203,7 +203,7 @@ func ApplyPolicy(request *msgs.ApplyPolicyRequest, ns, pgouser string) msgs.Appl if request.DryRun { for _, d := range allDeployments { - log.Debugf("deployment : %s", d.ObjectMeta.Name) + log.Debugf("deployment: %s", d.ObjectMeta.Name) resp.Name = append(resp.Name, d.ObjectMeta.Name) } return resp @@ -223,7 +223,7 @@ func ApplyPolicy(request *msgs.ApplyPolicyRequest, ns, pgouser string) msgs.Appl cl, err := apiserver.Clientset. CrunchydataV1().Pgclusters(ns). - Get(d.ObjectMeta.Labels[config.LABEL_SERVICE_NAME], metav1.GetOptions{}) + Get(d.ObjectMeta.Labels[config.LABEL_PG_CLUSTER], metav1.GetOptions{}) if err != nil { resp.Status.Code = msgs.Error resp.Status.Msg = err.Error() @@ -231,7 +231,7 @@ func ApplyPolicy(request *msgs.ApplyPolicyRequest, ns, pgouser string) msgs.Appl } if err := util.ExecPolicy(apiserver.Clientset, apiserver.RESTConfig, - ns, request.Name, d.ObjectMeta.Labels[config.LABEL_SERVICE_NAME], cl.Spec.Port); err != nil { + ns, request.Name, d.ObjectMeta.Labels[config.LABEL_PG_CLUSTER], cl.Spec.Port); err != nil { log.Error(err) resp.Status.Code = msgs.Error resp.Status.Msg = err.Error() diff --git a/internal/util/policy.go b/internal/util/policy.go index 2d3180b0d0..d27be80503 100644 --- a/internal/util/policy.go +++ b/internal/util/policy.go @@ -40,8 +40,8 @@ import ( ) // ExecPolicy execute a sql policy against a cluster -func ExecPolicy(clientset kubeapi.Interface, restconfig *rest.Config, namespace, policyName, serviceName, port string) error { - //fetch the policy sql +func ExecPolicy(clientset kubeapi.Interface, restconfig *rest.Config, namespace, policyName, clusterName, port string) error { + // fetch the policy sql sql, err := GetPolicySQL(clientset, namespace, policyName) if err != nil { @@ -53,11 +53,10 @@ func ExecPolicy(clientset kubeapi.Interface, restconfig *rest.Config, namespace, stdin := strings.NewReader(sql) // now, we need to ensure we can get the Pod name of the primary PostgreSQL - // instance. Thname being passed in is actually the "serviceName" of the Pod - // We can isolate the exact Pod we want by using this (LABEL_SERVICE_NAME) and - // the LABEL_PGHA_ROLE labels + // instance. We can isolate the exact Pod we want by using the + // LABEL_PG_CLUSTER and LABEL_PGHA_ROLE labels selector := fmt.Sprintf("%s=%s,%s=%s", - config.LABEL_SERVICE_NAME, serviceName, + config.LABEL_PG_CLUSTER, clusterName, config.LABEL_PGHA_ROLE, config.LABEL_PGHA_ROLE_PRIMARY) podList, err := clientset.CoreV1().Pods(namespace).List(metav1.ListOptions{LabelSelector: selector}) From da4d4bb16a2379f61388f0a18c147c57d95b8d1b Mon Sep 17 00:00:00 2001 From: TJ Moore Date: Fri, 9 Jul 2021 15:28:58 -0400 Subject: [PATCH 104/129] Allow backup config change when recreated cluster Previously, when attempting to change the backup configuration on an existing cluster, stanza-create job will error out due to missing S3 configuration parameters despite being provided as part of the pgo create cluster command. This update corrects that issue by ensuring the existing pgBackRest repo config secret is updated to include the necessary configuration values. --- .../apiserver/clusterservice/clusterimpl.go | 94 +++++++++++++------ 1 file changed, 67 insertions(+), 27 deletions(-) diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index 915573408f..93724648c1 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -970,31 +970,41 @@ func CreateCluster(request *msgs.CreateClusterRequest, ns, pgouser string) msgs. // the deployment template always tries to mount /sshd volume secretName := fmt.Sprintf("%s-%s", clusterName, config.LABEL_BACKREST_REPO_SECRET) - if _, err := apiserver.Clientset. - CoreV1().Secrets(request.Namespace). - Get(secretName, metav1.GetOptions{}); kubeapi.IsNotFound(err) { - // determine if a custom CA secret should be used - backrestS3CACert := []byte{} + // determine if a custom CA secret should be used + backrestS3CACert := []byte{} - if request.BackrestS3CASecretName != "" { - backrestSecret, err := apiserver.Clientset. - CoreV1().Secrets(request.Namespace). - Get(request.BackrestS3CASecretName, metav1.GetOptions{}) + if request.BackrestS3CASecretName != "" { + backrestSecret, err := apiserver.Clientset. + CoreV1().Secrets(request.Namespace). + Get(request.BackrestS3CASecretName, metav1.GetOptions{}) + if err != nil { + log.Error(err) + resp.Status.Code = msgs.Error + resp.Status.Msg = fmt.Sprintf("Error finding pgBackRest S3 CA secret \"%s\": %s", + request.BackrestS3CASecretName, err.Error()) + return resp + } - if err != nil { - log.Error(err) - resp.Status.Code = msgs.Error - resp.Status.Msg = fmt.Sprintf("Error finding pgBackRest S3 CA secret \"%s\": %s", - request.BackrestS3CASecretName, err.Error()) - return resp - } + // attempt to retrieves the custom CA, assuming it has the name + // "aws-s3-ca.crt" + backrestS3CACert = backrestSecret.Data[util.BackRestRepoSecretKeyAWSS3KeyAWSS3CACert] + } - // attempt to retrieves the custom CA, assuming it has the name - // "aws-s3-ca.crt" - backrestS3CACert = backrestSecret.Data[util.BackRestRepoSecretKeyAWSS3KeyAWSS3CACert] - } + // save the S3 credentials in a single map so it can be used to either create a new + // secret or update an existing one + s3Credentials := map[string][]byte{ + util.BackRestRepoSecretKeyAWSS3KeyAWSS3CACert: backrestS3CACert, + util.BackRestRepoSecretKeyAWSS3KeyAWSS3Key: []byte(request.BackrestS3Key), + util.BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret: []byte(request.BackrestS3KeySecret), + } - // set up the secret for the cluster that contains the pgBackRest + _, err = apiserver.Clientset.CoreV1().Secrets(request.Namespace). + Get(secretName, metav1.GetOptions{}) + + switch { + case kubeapi.IsNotFound(err): + // The pgBackRest repo config secret was not found, create it. + // Set up the secret for the cluster that contains the pgBackRest // information secret := &v1.Secret{ ObjectMeta: metav1.ObjectMeta{ @@ -1005,11 +1015,7 @@ func CreateCluster(request *msgs.CreateClusterRequest, ns, pgouser string) msgs. config.LABEL_PGO_BACKREST_REPO: "true", }, }, - Data: map[string][]byte{ - util.BackRestRepoSecretKeyAWSS3KeyAWSS3CACert: backrestS3CACert, - util.BackRestRepoSecretKeyAWSS3KeyAWSS3Key: []byte(request.BackrestS3Key), - util.BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret: []byte(request.BackrestS3KeySecret), - }, + Data: s3Credentials, } if _, err := apiserver.Clientset.CoreV1().Secrets(ns).Create(secret); err != nil && !kubeapi.IsAlreadyExists(err) { @@ -1017,10 +1023,22 @@ func CreateCluster(request *msgs.CreateClusterRequest, ns, pgouser string) msgs. resp.Status.Msg = fmt.Sprintf("could not create backrest repo secret: %s", err) return resp } - } else if err != nil { + + case err != nil: + // An error occurred other than 'not found'. Log the error received when + // attempting to get the pgBackRest repo config secret, then return. resp.Status.Code = msgs.Error resp.Status.Msg = fmt.Sprintf("could not query if backrest repo secret exits: %s", err) return resp + default: + // the pgBackRest repo config secret already exists, update any provided + // S3 credential information + err = updateRepoSecret(apiserver.Clientset, secretName, request.Namespace, s3Credentials) + if err != nil { + resp.Status.Code = msgs.Error + resp.Status.Msg = fmt.Sprintf("could not update backrest repo secret: %s", err) + return resp + } } //create a workflow for this new cluster @@ -1053,6 +1071,28 @@ func CreateCluster(request *msgs.CreateClusterRequest, ns, pgouser string) msgs. return resp } +// updateRepoSecret updates the existing pgBackRest repo config secret with any +// provided S3/GCS connection information. +func updateRepoSecret(clientset kubernetes.Interface, secretName, + namespace string, connectionInfo map[string][]byte) error { + + // Get the secret + secret, err := clientset.CoreV1().Secrets(namespace). + Get(secretName, metav1.GetOptions{}) + // The secret should already exist at this point. If there is any error, + // return. + if err != nil { + return err + } + + // update the secret data + for k, v := range connectionInfo { + secret.Data[k] = v + } + _, err = clientset.CoreV1().Secrets(secret.Namespace).Update(secret) + return err +} + func validateConfigPolicies(clusterName, PoliciesFlag, ns string) error { var err error var configPolicies string From c39a25d1701ee449679236e12f30a1d016d659b2 Mon Sep 17 00:00:00 2001 From: Heath Lord Date: Wed, 4 Aug 2021 12:09:06 -0400 Subject: [PATCH 105/129] Update pgo-apiserver for newer buildah versions Must add ARG for PGVERSION after the FROM or it doesn't get set with newer buildah versions. --- build/pgo-apiserver/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/pgo-apiserver/Dockerfile b/build/pgo-apiserver/Dockerfile index a2ec3c3b3a..505ea1b4a9 100644 --- a/build/pgo-apiserver/Dockerfile +++ b/build/pgo-apiserver/Dockerfile @@ -5,6 +5,10 @@ ARG PGVERSION ARG BACKREST_VERSION FROM ${PREFIX}/pgo-base:${BASEOS}-${BASEVER} +ARG BASEOS +ARG PACKAGER +ARG PGVERSION + LABEL name="pgo-apiserver" \ summary="Crunchy PostgreSQL Operator - Apiserver" \ description="Crunchy PostgreSQL Operator - Apiserver" From 1c6e59299821f88af67fb15e235884eaffa5c155 Mon Sep 17 00:00:00 2001 From: vagrant Date: Mon, 30 Aug 2021 21:52:54 +0000 Subject: [PATCH 106/129] bump pg versions and pgo version --- Makefile | 4 +-- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 +-- docs/config.toml | 15 ++++++----- docs/content/Configuration/compatibility.md | 6 +++++ docs/content/releases/4.5.4.md | 25 +++++++++++++++++++ docs/content/tutorial/pgbouncer.md | 2 +- examples/create-by-resource/fromcrd.json | 6 ++--- examples/envs.sh | 2 +- .../create-cluster/templates/pgcluster.yaml | 2 +- examples/helm/create-cluster/values.yaml | 4 +-- installers/ansible/README.md | 2 +- installers/ansible/values.yaml | 6 ++--- installers/gcp-marketplace/Makefile | 2 +- installers/gcp-marketplace/README.md | 2 +- installers/gcp-marketplace/values.yaml | 6 ++--- installers/helm/Chart.yaml | 2 +- installers/helm/values.yaml | 6 ++--- installers/kubectl/client-setup.sh | 2 +- .../kubectl/postgres-operator-ocp311.yml | 8 +++--- installers/kubectl/postgres-operator.yml | 8 +++--- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- installers/metrics/helm/helm_template.yaml | 2 +- installers/metrics/helm/values.yaml | 2 +- .../postgres-operator-metrics-ocp311.yml | 2 +- .../kubectl/postgres-operator-metrics.yml | 2 +- installers/olm/Makefile | 4 +-- pkg/apis/crunchydata.com/v1/doc.go | 8 +++--- pkg/apiservermsgs/common.go | 2 +- redhat/atomic/help.1 | 2 +- redhat/atomic/help.md | 2 +- 33 files changed, 89 insertions(+), 59 deletions(-) create mode 100644 docs/content/releases/4.5.4.md diff --git a/Makefile b/Makefile index 6ea53a145b..00c59d666f 100644 --- a/Makefile +++ b/Makefile @@ -9,9 +9,9 @@ PGO_CMD ?= kubectl PGO_IMAGE_PREFIX ?= crunchydata PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) PGO_OPERATOR_NAMESPACE ?= pgo -PGO_VERSION ?= 4.5.3 +PGO_VERSION ?= 4.5.4-rc.1 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.7 +PGO_PG_FULLVERSION ?= 12.8 PGO_BACKREST_VERSION ?= 2.29 PACKAGER ?= yum diff --git a/README.md b/README.md index 39f7145b73..d10bc73499 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ to start as quickly as: ```shell kubectl create namespace pgo -kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.3/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.4-rc.1/installers/kubectl/postgres-operator.yml ``` Otherwise, we highly recommend following the instructions from our [Quickstart](https://access.crunchydata.com/documentation/postgres-operator/latest/quickstart/). diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index e405220498..6612303f79 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -16,7 +16,7 @@ GCR_IMAGE_PREFIX=gcr.io/crunchy-dev-test CCP_IMAGE_PREFIX=crunchydata -CCP_IMAGE_TAG=centos8-12.7-4.5.3 +CCP_IMAGE_TAG=centos8-12.8-4.5.4-rc.1 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index 56e82a1000..81298c57b0 100644 --- a/conf/postgres-operator/pgo.yaml +++ b/conf/postgres-operator/pgo.yaml @@ -2,7 +2,7 @@ Cluster: CCPImagePrefix: registry.developers.crunchydata.com/crunchydata Metrics: false Badger: false - CCPImageTag: centos8-12.7-4.5.3 + CCPImageTag: centos8-12.8-4.5.4-rc.1 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -82,4 +82,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos8-4.5.3 + PGOImageTag: centos8-4.5.4-rc.1 diff --git a/docs/config.toml b/docs/config.toml index 5b63a9eb58..c185e01c86 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,14 +25,13 @@ disableNavChevron = false # set true to hide next/prev chevron, default is false highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter menushortcutsnewtab = true # set true to open shortcuts links to a new tab/window enableGitInfo = true -operatorVersion = "4.5.3" -postgresVersion = "12.7" -postgresVersion13 = "13.3" -postgresVersion12 = "12.7" -postgresVersion11 = "11.12" -postgresVersion10 = "10.17" -postgresVersion96 = "9.6.22" -postgresVersion95 = "9.5.25" +operatorVersion = "4.5.4-rc.1" +postgresVersion = "12.8" +postgresVersion13 = "13.4" +postgresVersion12 = "12.8" +postgresVersion11 = "11.13" +postgresVersion10 = "10.18" +postgresVersion96 = "9.6.23" postgisVersion = "3.0" centosBase = "centos8" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index 550dd315f7..8fa4429729 100644 --- a/docs/content/Configuration/compatibility.md +++ b/docs/content/Configuration/compatibility.md @@ -12,6 +12,12 @@ version dependencies between the two projects. Below are the operator releases a | Operator Release | Container Release | Postgres | PgBackrest Version |:----------|:-------------|:------------|:-------------- +| 4.5.4 | 4.5.4 | 13.8 | 2.29 | +|||12.8|2.29| +|||11.13|2.29| +|||10.18|2.29| +|||9.6.23|2.29| +|||| | 4.5.3 | 4.5.3 | 13.3 | 2.29 | |||12.7|2.29| |||11.12|2.29| diff --git a/docs/content/releases/4.5.4.md b/docs/content/releases/4.5.4.md new file mode 100644 index 0000000000..8f16f24a0b --- /dev/null +++ b/docs/content/releases/4.5.4.md @@ -0,0 +1,25 @@ +--- +title: "4.5.4" +date: +draft: false +weight: 66 +--- + +Crunchy Data announces the release of PGO, the Postgres Operator 4.5.4. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +PostgreSQL Operator 4.5.4 release includes the following software versions upgrades: + +- [PostgreSQL](https://www.postgresql.org) is updated to 13.4, 12.8, 11.13, 10.18, and 9.6.23. +- [pgaudit_analyze](https://github.com/pgaudit/pgaudit_analyze) is now at 1.0.8. +- [set_user](https://github.com/pgaudit/set_user) is now at version 2.0.1. + +# Changes + +- Ensure `vendor` label is propagated to all PGO managed objects. Reported by @mdraijer. + +# Fixes + +- Allow backup configuration to be changed when a cluster is recreated. For example, allow backup configuration to change from `posix` to `s3` within a new cluster. +- Ensure a SQL policy that contains writes can be applied to a Postgres cluster after a failover. \ No newline at end of file diff --git a/docs/content/tutorial/pgbouncer.md b/docs/content/tutorial/pgbouncer.md index a44d46ca7f..a150e19c70 100644 --- a/docs/content/tutorial/pgbouncer.md +++ b/docs/content/tutorial/pgbouncer.md @@ -116,7 +116,7 @@ PGPASSWORD=randompassword psql -h localhost -p 5432 -U pgbouncer pgbouncer You should see something similar to this: ``` -psql (12.7, server 1.14.0/bouncer) +psql (12.8, server 1.14.0/bouncer) Type "help" for help. pgbouncer=# diff --git a/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index e2b85a6537..fffac9ce7c 100644 --- a/examples/create-by-resource/fromcrd.json +++ b/examples/create-by-resource/fromcrd.json @@ -16,7 +16,7 @@ "pg-cluster": "fromcrd", "pg-pod-anti-affinity": "", "pgo-backrest": "true", - "pgo-version": "4.5.3", + "pgo-version": "4.5.4-rc.1", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos8-12.7-4.5.3", + "ccpimagetag": "centos8-12.8-4.5.4-rc.1", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy-postgres-exporter": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.5.3", + "pgo-version": "4.5.4-rc.1", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index be237ca105..540229dc7b 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -23,7 +23,7 @@ export PGO_CONF_DIR=$PGOROOT/installers/ansible/roles/pgo-operator/files # the version of the Operator you run is set by these vars export PGO_IMAGE_PREFIX=registry.developers.crunchydata.com/crunchydata export PGO_BASEOS=centos8 -export PGO_VERSION=4.5.3 +export PGO_VERSION=4.5.4-rc.1 export PGO_IMAGE_TAG=$PGO_BASEOS-$PGO_VERSION # for setting the pgo apiserver port, disabling TLS or not verifying TLS diff --git a/examples/helm/create-cluster/templates/pgcluster.yaml b/examples/helm/create-cluster/templates/pgcluster.yaml index f469e0972d..482db7e38a 100644 --- a/examples/helm/create-cluster/templates/pgcluster.yaml +++ b/examples/helm/create-cluster/templates/pgcluster.yaml @@ -13,7 +13,7 @@ metadata: pg-cluster: {{ .Values.pgclustername }} pg-pod-anti-affinity: "" pgo-backrest: "true" - pgo-version: 4.5.3 + pgo-version: 4.5.4-rc.1 pgouser: admin name: {{ .Values.pgclustername }} namespace: {{ .Values.namespace }} diff --git a/examples/helm/create-cluster/values.yaml b/examples/helm/create-cluster/values.yaml index f975cb0e12..27230bfdfc 100644 --- a/examples/helm/create-cluster/values.yaml +++ b/examples/helm/create-cluster/values.yaml @@ -4,11 +4,11 @@ # The values is for the namespace and the postgresql cluster name ccpimage: crunchy-postgres-ha ccpimageprefix: registry.developers.crunchydata.com/crunchydata -ccpimagetag: centos8-12.7-4.5.3 +ccpimagetag: centos8-12.8-4.5.4-rc.1 namespace: pgo pgclustername: hippo pgoimageprefix: registry.developers.crunchydata.com/crunchydata -pgoversion: 4.5.3 +pgoversion: 4.5.4-rc.1 hipposecretuser: "hippo" hipposecretpassword: "Supersecurepassword*" postgressecretuser: "postgres" diff --git a/installers/ansible/README.md b/installers/ansible/README.md index b17af2f44f..c763b6cfb8 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ PGO: The Postgres Operator from Crunchy Data

-Latest Release: 4.5.3 +Latest Release: 4.5.4-rc.1 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index c636869d79..31c2dd7591 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -17,7 +17,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.7-4.5.3" +ccp_image_tag: "centos8-12.8-4.5.4-rc.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -50,14 +50,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.3" +pgo_client_version: "4.5.4-rc.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.3" +pgo_image_tag: "centos8-4.5.4-rc.1" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index e9d4b6d59c..59e98da86f 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -6,7 +6,7 @@ MARKETPLACE_TOOLS ?= gcr.io/cloud-marketplace-tools/k8s/dev:$(MARKETPLACE_VERSIO MARKETPLACE_VERSION ?= 0.9.4 KUBECONFIG ?= $(HOME)/.kube/config PARAMETERS ?= {} -PGO_VERSION ?= 4.5.3 +PGO_VERSION ?= 4.5.4-rc.1 IMAGE_BUILD_ARGS = --build-arg MARKETPLACE_VERSION='$(MARKETPLACE_VERSION)' \ --build-arg PGO_VERSION='$(PGO_VERSION)' diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index 317cb15d76..5f44f0758b 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -59,7 +59,7 @@ Google Cloud Marketplace. ```shell IMAGE_REPOSITORY=gcr.io/crunchydata-public/postgres-operator - export PGO_VERSION=4.5.3 + export PGO_VERSION=4.5.4-rc.1 export INSTALLER_IMAGE=${IMAGE_REPOSITORY}/deployer:${PGO_VERSION} export OPERATOR_IMAGE=${IMAGE_REPOSITORY}:${PGO_VERSION} export OPERATOR_IMAGE_API=${IMAGE_REPOSITORY}/pgo-apiserver:${PGO_VERSION} diff --git a/installers/gcp-marketplace/values.yaml b/installers/gcp-marketplace/values.yaml index d76ae318de..f3297b44fb 100644 --- a/installers/gcp-marketplace/values.yaml +++ b/installers/gcp-marketplace/values.yaml @@ -10,7 +10,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.7-4.5.3" +ccp_image_tag: "centos8-12.8-4.5.4-rc.1" create_rbac: "true" db_name: "" db_password_age_days: "0" @@ -32,9 +32,9 @@ pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" pgo_client_container_install: "false" pgo_client_install: 'false' -pgo_client_version: "4.5.3" +pgo_client_version: "4.5.4-rc.1" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.3" +pgo_image_tag: "centos8-4.5.4-rc.1" pgo_installation_name: '${OPERATOR_NAME}' pgo_operator_namespace: '${OPERATOR_NAMESPACE}' scheduler_timeout: "3600" diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index 553a372ee6..48fe53e26d 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -3,7 +3,7 @@ name: postgres-operator description: 'PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes' type: application version: 0.1.0 -appVersion: 4.5.3 +appVersion: 4.5.4-rc.1 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg keywords: diff --git a/installers/helm/values.yaml b/installers/helm/values.yaml index 7d8affc13d..8dd98b2cff 100644 --- a/installers/helm/values.yaml +++ b/installers/helm/values.yaml @@ -37,7 +37,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.7-4.5.3" +ccp_image_tag: "centos8-12.8-4.5.4-rc.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -70,14 +70,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.3" +pgo_client_version: "4.5.4-rc.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.3" +pgo_image_tag: "centos8-4.5.4-rc.1" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index 69a5e1b2f8..9575574040 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -14,7 +14,7 @@ # This script should be run after the operator has been deployed PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}" PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}" -PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.3}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.4-rc.1}" PGO_CLIENT_URL="https://github.com/CrunchyData/postgres-operator/releases/download/${PGO_CLIENT_VERSION}" PGO_CMD="${PGO_CMD-kubectl}" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index b6356ed22b..5829496e3e 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -50,7 +50,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.7-4.5.3" + ccp_image_tag: "centos8-12.8-4.5.4-rc.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -83,14 +83,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.3" + pgo_client_version: "4.5.4-rc.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.3" + pgo_image_tag: "centos8-4.5.4-rc.1" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.3 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4-rc.1 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index 093ed35f70..1bf1b767ec 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -145,7 +145,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.7-4.5.3" + ccp_image_tag: "centos8-12.8-4.5.4-rc.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -178,14 +178,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.3" + pgo_client_version: "4.5.4-rc.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.3" + pgo_image_tag: "centos8-4.5.4-rc.1" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -281,7 +281,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.3 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4-rc.1 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index c3613a5439..5229e38d12 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.3 +Latest Release: 4.5.4-rc.1 ## General diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index 529cb73318..1733f69758 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-monitoring description: Install for Crunchy PostgreSQL Operator Monitoring type: application version: 0.1.0 -appVersion: 4.5.3 +appVersion: 4.5.4-rc.1 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg diff --git a/installers/metrics/helm/helm_template.yaml b/installers/metrics/helm/helm_template.yaml index b1fe826565..059cf0a835 100644 --- a/installers/metrics/helm/helm_template.yaml +++ b/installers/metrics/helm/helm_template.yaml @@ -20,5 +20,5 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.3" +pgo_image_tag: "centos8-4.5.4-rc.1" diff --git a/installers/metrics/helm/values.yaml b/installers/metrics/helm/values.yaml index 50c7397a19..10edc1ff08 100644 --- a/installers/metrics/helm/values.yaml +++ b/installers/metrics/helm/values.yaml @@ -20,7 +20,7 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.3" +pgo_image_tag: "centos8-4.5.4-rc.1" # ===================== # Configuration Options diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index 7e70b4b616..20cec1eef3 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -101,7 +101,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.3 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4-rc.1 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index c9047d7b60..ab001b6f05 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.3 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4-rc.1 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index ad275e3c15..e33973674f 100644 --- a/installers/olm/Makefile +++ b/installers/olm/Makefile @@ -2,7 +2,7 @@ .SUFFIXES: CCP_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -CCP_PG_FULLVERSION ?= 12.7 +CCP_PG_FULLVERSION ?= 12.8 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.15.1 @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.15.1 PGO_BASEOS ?= centos8 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.5.3 +PGO_VERSION ?= 4.5.4-rc.1 PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) CCP_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(PGO_VERSION) CCP_POSTGIS_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(CCP_POSTGIS_VERSION)-$(PGO_VERSION) diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 244cd1a1c1..03c3a9090e 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -53,7 +53,7 @@ cluster. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.3", + '{"ClientVersion":"4.5.4-rc.1", "Namespace":"pgouser1", "Name":"mycluster", $PGO_APISERVER_URL/clusters @@ -72,7 +72,7 @@ show all of the clusters that are in the given namespace. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.3", + '{"ClientVersion":"4.5.4-rc.1", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/showclusters @@ -82,7 +82,7 @@ $PGO_APISERVER_URL/showclusters curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.3", + '{"ClientVersion":"4.5.4-rc.1", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.5.3 + Version: 4.5.4-rc.1 License: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 Contact: Crunchy Data https://www.crunchydata.com/ diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index 78df048fa0..f53cd2056d 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -const PGO_VERSION = "4.5.3" +const PGO_VERSION = "4.5.4-rc.1" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index c9decb4050..8a5450b170 100644 --- a/redhat/atomic/help.1 +++ b/redhat/atomic/help.1 @@ -56,4 +56,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa \fB\fCRelease=\fR .PP -The specific release number of the container. For example, Release="4.5.3" +The specific release number of the container. For example, Release="4.5.4-rc.1" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index 7cd7c0bee2..c6b6595a3a 100644 --- a/redhat/atomic/help.md +++ b/redhat/atomic/help.md @@ -45,4 +45,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa `Release=` -The specific release number of the container. For example, Release="4.5.3" +The specific release number of the container. For example, Release="4.5.4-rc.1" From 4bd879ea0dca0ef4a62240c0eb551df9abfaa427 Mon Sep 17 00:00:00 2001 From: Val Date: Thu, 2 Sep 2021 17:59:10 -0400 Subject: [PATCH 107/129] version bump to 4.5.4 (#2668) * version bump to 4.5.4 * fixed typo --- Makefile | 2 +- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 ++-- docs/config.toml | 2 +- docs/content/Configuration/compatibility.md | 2 +- examples/create-by-resource/fromcrd.json | 6 +++--- examples/envs.sh | 2 +- examples/helm/create-cluster/templates/pgcluster.yaml | 2 +- examples/helm/create-cluster/values.yaml | 4 ++-- installers/ansible/README.md | 2 +- installers/ansible/values.yaml | 6 +++--- installers/gcp-marketplace/Makefile | 2 +- installers/gcp-marketplace/README.md | 2 +- installers/gcp-marketplace/values.yaml | 6 +++--- installers/helm/Chart.yaml | 2 +- installers/helm/values.yaml | 6 +++--- installers/kubectl/client-setup.sh | 2 +- installers/kubectl/postgres-operator-ocp311.yml | 8 ++++---- installers/kubectl/postgres-operator.yml | 8 ++++---- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- installers/metrics/helm/helm_template.yaml | 2 +- installers/metrics/helm/values.yaml | 2 +- .../metrics/kubectl/postgres-operator-metrics-ocp311.yml | 2 +- installers/metrics/kubectl/postgres-operator-metrics.yml | 2 +- installers/olm/Makefile | 2 +- pkg/apis/crunchydata.com/v1/doc.go | 8 ++++---- pkg/apiservermsgs/common.go | 2 +- redhat/atomic/help.1 | 2 +- redhat/atomic/help.md | 2 +- 31 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Makefile b/Makefile index 00c59d666f..bf33087416 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ PGO_CMD ?= kubectl PGO_IMAGE_PREFIX ?= crunchydata PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) PGO_OPERATOR_NAMESPACE ?= pgo -PGO_VERSION ?= 4.5.4-rc.1 +PGO_VERSION ?= 4.5.4 PGO_PG_VERSION ?= 12 PGO_PG_FULLVERSION ?= 12.8 PGO_BACKREST_VERSION ?= 2.29 diff --git a/README.md b/README.md index d10bc73499..4bda4e201e 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ to start as quickly as: ```shell kubectl create namespace pgo -kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.4-rc.1/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.4/installers/kubectl/postgres-operator.yml ``` Otherwise, we highly recommend following the instructions from our [Quickstart](https://access.crunchydata.com/documentation/postgres-operator/latest/quickstart/). diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index 6612303f79..3ecbc07f12 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -16,7 +16,7 @@ GCR_IMAGE_PREFIX=gcr.io/crunchy-dev-test CCP_IMAGE_PREFIX=crunchydata -CCP_IMAGE_TAG=centos8-12.8-4.5.4-rc.1 +CCP_IMAGE_TAG=centos8-12.8-4.5.4 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index 81298c57b0..2c68cfe7a9 100644 --- a/conf/postgres-operator/pgo.yaml +++ b/conf/postgres-operator/pgo.yaml @@ -2,7 +2,7 @@ Cluster: CCPImagePrefix: registry.developers.crunchydata.com/crunchydata Metrics: false Badger: false - CCPImageTag: centos8-12.8-4.5.4-rc.1 + CCPImageTag: centos8-12.8-4.5.4 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -82,4 +82,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos8-4.5.4-rc.1 + PGOImageTag: centos8-4.5.4 diff --git a/docs/config.toml b/docs/config.toml index c185e01c86..55d030f571 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,7 +25,7 @@ disableNavChevron = false # set true to hide next/prev chevron, default is false highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter menushortcutsnewtab = true # set true to open shortcuts links to a new tab/window enableGitInfo = true -operatorVersion = "4.5.4-rc.1" +operatorVersion = "4.5.4" postgresVersion = "12.8" postgresVersion13 = "13.4" postgresVersion12 = "12.8" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index 8fa4429729..e9ef3716bf 100644 --- a/docs/content/Configuration/compatibility.md +++ b/docs/content/Configuration/compatibility.md @@ -12,7 +12,7 @@ version dependencies between the two projects. Below are the operator releases a | Operator Release | Container Release | Postgres | PgBackrest Version |:----------|:-------------|:------------|:-------------- -| 4.5.4 | 4.5.4 | 13.8 | 2.29 | +| 4.5.4 | 4.5.4 | 13.4 | 2.29 | |||12.8|2.29| |||11.13|2.29| |||10.18|2.29| diff --git a/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index fffac9ce7c..24b47f0131 100644 --- a/examples/create-by-resource/fromcrd.json +++ b/examples/create-by-resource/fromcrd.json @@ -16,7 +16,7 @@ "pg-cluster": "fromcrd", "pg-pod-anti-affinity": "", "pgo-backrest": "true", - "pgo-version": "4.5.4-rc.1", + "pgo-version": "4.5.4", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos8-12.8-4.5.4-rc.1", + "ccpimagetag": "centos8-12.8-4.5.4", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy-postgres-exporter": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.5.4-rc.1", + "pgo-version": "4.5.4", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index 540229dc7b..64f8c4b833 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -23,7 +23,7 @@ export PGO_CONF_DIR=$PGOROOT/installers/ansible/roles/pgo-operator/files # the version of the Operator you run is set by these vars export PGO_IMAGE_PREFIX=registry.developers.crunchydata.com/crunchydata export PGO_BASEOS=centos8 -export PGO_VERSION=4.5.4-rc.1 +export PGO_VERSION=4.5.4 export PGO_IMAGE_TAG=$PGO_BASEOS-$PGO_VERSION # for setting the pgo apiserver port, disabling TLS or not verifying TLS diff --git a/examples/helm/create-cluster/templates/pgcluster.yaml b/examples/helm/create-cluster/templates/pgcluster.yaml index 482db7e38a..4aa88db4d2 100644 --- a/examples/helm/create-cluster/templates/pgcluster.yaml +++ b/examples/helm/create-cluster/templates/pgcluster.yaml @@ -13,7 +13,7 @@ metadata: pg-cluster: {{ .Values.pgclustername }} pg-pod-anti-affinity: "" pgo-backrest: "true" - pgo-version: 4.5.4-rc.1 + pgo-version: 4.5.4 pgouser: admin name: {{ .Values.pgclustername }} namespace: {{ .Values.namespace }} diff --git a/examples/helm/create-cluster/values.yaml b/examples/helm/create-cluster/values.yaml index 27230bfdfc..576f9a7a93 100644 --- a/examples/helm/create-cluster/values.yaml +++ b/examples/helm/create-cluster/values.yaml @@ -4,11 +4,11 @@ # The values is for the namespace and the postgresql cluster name ccpimage: crunchy-postgres-ha ccpimageprefix: registry.developers.crunchydata.com/crunchydata -ccpimagetag: centos8-12.8-4.5.4-rc.1 +ccpimagetag: centos8-12.8-4.5.4 namespace: pgo pgclustername: hippo pgoimageprefix: registry.developers.crunchydata.com/crunchydata -pgoversion: 4.5.4-rc.1 +pgoversion: 4.5.4 hipposecretuser: "hippo" hipposecretpassword: "Supersecurepassword*" postgressecretuser: "postgres" diff --git a/installers/ansible/README.md b/installers/ansible/README.md index c763b6cfb8..61dfd24a8e 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ PGO: The Postgres Operator from Crunchy Data

-Latest Release: 4.5.4-rc.1 +Latest Release: 4.5.4 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index 31c2dd7591..18cdeae694 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -17,7 +17,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.8-4.5.4-rc.1" +ccp_image_tag: "centos8-12.8-4.5.4" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -50,14 +50,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.4-rc.1" +pgo_client_version: "4.5.4" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.4-rc.1" +pgo_image_tag: "centos8-4.5.4" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index 59e98da86f..87065a596b 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -6,7 +6,7 @@ MARKETPLACE_TOOLS ?= gcr.io/cloud-marketplace-tools/k8s/dev:$(MARKETPLACE_VERSIO MARKETPLACE_VERSION ?= 0.9.4 KUBECONFIG ?= $(HOME)/.kube/config PARAMETERS ?= {} -PGO_VERSION ?= 4.5.4-rc.1 +PGO_VERSION ?= 4.5.4 IMAGE_BUILD_ARGS = --build-arg MARKETPLACE_VERSION='$(MARKETPLACE_VERSION)' \ --build-arg PGO_VERSION='$(PGO_VERSION)' diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index 5f44f0758b..711803fd7c 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -59,7 +59,7 @@ Google Cloud Marketplace. ```shell IMAGE_REPOSITORY=gcr.io/crunchydata-public/postgres-operator - export PGO_VERSION=4.5.4-rc.1 + export PGO_VERSION=4.5.4 export INSTALLER_IMAGE=${IMAGE_REPOSITORY}/deployer:${PGO_VERSION} export OPERATOR_IMAGE=${IMAGE_REPOSITORY}:${PGO_VERSION} export OPERATOR_IMAGE_API=${IMAGE_REPOSITORY}/pgo-apiserver:${PGO_VERSION} diff --git a/installers/gcp-marketplace/values.yaml b/installers/gcp-marketplace/values.yaml index f3297b44fb..29f74db0b8 100644 --- a/installers/gcp-marketplace/values.yaml +++ b/installers/gcp-marketplace/values.yaml @@ -10,7 +10,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.8-4.5.4-rc.1" +ccp_image_tag: "centos8-12.8-4.5.4" create_rbac: "true" db_name: "" db_password_age_days: "0" @@ -32,9 +32,9 @@ pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" pgo_client_container_install: "false" pgo_client_install: 'false' -pgo_client_version: "4.5.4-rc.1" +pgo_client_version: "4.5.4" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.4-rc.1" +pgo_image_tag: "centos8-4.5.4" pgo_installation_name: '${OPERATOR_NAME}' pgo_operator_namespace: '${OPERATOR_NAMESPACE}' scheduler_timeout: "3600" diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index 48fe53e26d..e1922423bd 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -3,7 +3,7 @@ name: postgres-operator description: 'PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes' type: application version: 0.1.0 -appVersion: 4.5.4-rc.1 +appVersion: 4.5.4 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg keywords: diff --git a/installers/helm/values.yaml b/installers/helm/values.yaml index 8dd98b2cff..ea495b2532 100644 --- a/installers/helm/values.yaml +++ b/installers/helm/values.yaml @@ -37,7 +37,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.8-4.5.4-rc.1" +ccp_image_tag: "centos8-12.8-4.5.4" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -70,14 +70,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.4-rc.1" +pgo_client_version: "4.5.4" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.4-rc.1" +pgo_image_tag: "centos8-4.5.4" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index 9575574040..b0af92ee84 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -14,7 +14,7 @@ # This script should be run after the operator has been deployed PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}" PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}" -PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.4-rc.1}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.4}" PGO_CLIENT_URL="https://github.com/CrunchyData/postgres-operator/releases/download/${PGO_CLIENT_VERSION}" PGO_CMD="${PGO_CMD-kubectl}" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 5829496e3e..20e8043baf 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -50,7 +50,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.8-4.5.4-rc.1" + ccp_image_tag: "centos8-12.8-4.5.4" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -83,14 +83,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.4-rc.1" + pgo_client_version: "4.5.4" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.4-rc.1" + pgo_image_tag: "centos8-4.5.4" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4-rc.1 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index 1bf1b767ec..297bdf0ebc 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -145,7 +145,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.8-4.5.4-rc.1" + ccp_image_tag: "centos8-12.8-4.5.4" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -178,14 +178,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.4-rc.1" + pgo_client_version: "4.5.4" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.4-rc.1" + pgo_image_tag: "centos8-4.5.4" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -281,7 +281,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4-rc.1 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index 5229e38d12..288c9b4ebc 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.4-rc.1 +Latest Release: 4.5.4 ## General diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index 1733f69758..ba5dc201dd 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-monitoring description: Install for Crunchy PostgreSQL Operator Monitoring type: application version: 0.1.0 -appVersion: 4.5.4-rc.1 +appVersion: 4.5.4 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg diff --git a/installers/metrics/helm/helm_template.yaml b/installers/metrics/helm/helm_template.yaml index 059cf0a835..d2f332f5b6 100644 --- a/installers/metrics/helm/helm_template.yaml +++ b/installers/metrics/helm/helm_template.yaml @@ -20,5 +20,5 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.4-rc.1" +pgo_image_tag: "centos8-4.5.4" diff --git a/installers/metrics/helm/values.yaml b/installers/metrics/helm/values.yaml index 10edc1ff08..e37a24a248 100644 --- a/installers/metrics/helm/values.yaml +++ b/installers/metrics/helm/values.yaml @@ -20,7 +20,7 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.4-rc.1" +pgo_image_tag: "centos8-4.5.4" # ===================== # Configuration Options diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index 20cec1eef3..382de39aea 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -101,7 +101,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4-rc.1 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index ab001b6f05..b5171af550 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4-rc.1 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index e33973674f..3eb56c6a35 100644 --- a/installers/olm/Makefile +++ b/installers/olm/Makefile @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.15.1 PGO_BASEOS ?= centos8 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.5.4-rc.1 +PGO_VERSION ?= 4.5.4 PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) CCP_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(PGO_VERSION) CCP_POSTGIS_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(CCP_POSTGIS_VERSION)-$(PGO_VERSION) diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 03c3a9090e..19d9b9a021 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -53,7 +53,7 @@ cluster. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.4-rc.1", + '{"ClientVersion":"4.5.4", "Namespace":"pgouser1", "Name":"mycluster", $PGO_APISERVER_URL/clusters @@ -72,7 +72,7 @@ show all of the clusters that are in the given namespace. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.4-rc.1", + '{"ClientVersion":"4.5.4", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/showclusters @@ -82,7 +82,7 @@ $PGO_APISERVER_URL/showclusters curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.4-rc.1", + '{"ClientVersion":"4.5.4", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.5.4-rc.1 + Version: 4.5.4 License: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 Contact: Crunchy Data https://www.crunchydata.com/ diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index f53cd2056d..4194282e5a 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -const PGO_VERSION = "4.5.4-rc.1" +const PGO_VERSION = "4.5.4" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index 8a5450b170..43f15d7517 100644 --- a/redhat/atomic/help.1 +++ b/redhat/atomic/help.1 @@ -56,4 +56,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa \fB\fCRelease=\fR .PP -The specific release number of the container. For example, Release="4.5.4-rc.1" +The specific release number of the container. For example, Release="4.5.4" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index c6b6595a3a..61e09d1cba 100644 --- a/redhat/atomic/help.md +++ b/redhat/atomic/help.md @@ -45,4 +45,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa `Release=` -The specific release number of the container. For example, Release="4.5.4-rc.1" +The specific release number of the container. For example, Release="4.5.4" From 3cea12a344108945b520764885d2ae777e693881 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 3 Sep 2021 10:54:22 -0400 Subject: [PATCH 108/129] Fix doc build error There was still a reference to Postgres 9.5 in one of the variables, which we no longer support. --- docs/content/advanced/crunchy-postgres-exporter.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/content/advanced/crunchy-postgres-exporter.md b/docs/content/advanced/crunchy-postgres-exporter.md index b9b2a3ba09..1704ffb6aa 100644 --- a/docs/content/advanced/crunchy-postgres-exporter.md +++ b/docs/content/advanced/crunchy-postgres-exporter.md @@ -23,9 +23,9 @@ can be specified for the API to collect. For an example of a queries.yml file, s The crunchy-postgres-exporter Docker image contains the following packages (versions vary depending on PostgreSQL version): -* PostgreSQL ({{< param postgresVersion13 >}}, {{< param postgresVersion12 >}}, {{< param postgresVersion11 >}}, {{< param postgresVersion10 >}}, {{< param postgresVersion96 >}} and {{< param postgresVersion95 >}}) -* CentOS7 - publicly available -* UBI7 - customers only +* PostgreSQL ({{< param postgresVersion13 >}}, {{< param postgresVersion12 >}}, {{< param postgresVersion11 >}}, {{< param postgresVersion10 >}}, and {{< param postgresVersion96 >}} +* CentOS 7, 8 - publicly available +* UBI 7, 8 - customers only * [PostgreSQL Exporter](https://github.com/wrouesnel/postgres_exporter) ## Environment Variables From d6c05356999599a8b6bbe5e4f5a7bed505098ceb Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 12 Nov 2021 11:18:18 -0500 Subject: [PATCH 109/129] Ensure pgBouncer resource limits can be set on create This only affects the `pgo create pgbouncer` command; the resource limits were not being set in the custom resource from the API. However, this functionally works correctly if set directly on the custom resource. Issue: [sc-13146] --- internal/apiserver/pgbouncerservice/pgbouncerimpl.go | 1 + pgo/cmd/create.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/apiserver/pgbouncerservice/pgbouncerimpl.go b/internal/apiserver/pgbouncerservice/pgbouncerimpl.go index e7ef6ff768..172cc01e01 100644 --- a/internal/apiserver/pgbouncerservice/pgbouncerimpl.go +++ b/internal/apiserver/pgbouncerservice/pgbouncerimpl.go @@ -130,6 +130,7 @@ func CreatePgbouncer(request *msgs.CreatePgbouncerRequest, ns, pgouser string) m } cluster.Spec.PgBouncer.Resources = resources + cluster.Spec.PgBouncer.Limits = limits // update the cluster CRD with these udpates. If there is an error if _, err := apiserver.Clientset.CrunchydataV1().Pgclusters(request.Namespace).Update(&cluster); err != nil { diff --git a/pgo/cmd/create.go b/pgo/cmd/create.go index 180904305b..3e6efcbb0d 100644 --- a/pgo/cmd/create.go +++ b/pgo/cmd/create.go @@ -496,7 +496,7 @@ func init() { // pgo create pgbouncer createPgbouncerCmd.Flags().StringVar(&PgBouncerCPURequest, "cpu", "", "Set the number of millicores to request for CPU "+ "for pgBouncer. Defaults to being unset.") - createPgbouncerCmd.Flags().StringVar(&PgBouncerCPULimit, "cpu-limit", "", "Set the number of millicores to request for CPU "+ + createPgbouncerCmd.Flags().StringVar(&PgBouncerCPULimit, "cpu-limit", "", "Set the number of millicores to limit for CPU "+ "for pgBouncer.") createPgbouncerCmd.Flags().StringVar(&PgBouncerMemoryRequest, "memory", "", "Set the amount of memory to request for "+ "pgBouncer. Defaults to server value (24Mi).") From 19a8b2c96cbf12b0a924194ce0e70ba445580eba Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 19 Nov 2021 14:29:09 -0500 Subject: [PATCH 110/129] Update AWS CA bundle for interfacing with S3 This bundle was changed per URL below: https://aws.amazon.com/blogs/security/how-to-prepare-for-aws-move-to-its-own-certificate-authority/ Issue: [sc-13185] --- .../files/pgo-backrest-repo/aws-s3-ca.crt | 141 +++++++++++++++--- 1 file changed, 122 insertions(+), 19 deletions(-) diff --git a/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt b/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt index 519028c63b..31ebd8a6e5 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt +++ b/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt @@ -1,21 +1,124 @@ -----BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- From 8b68b8b1b4bc692ad39889645847b288e8fb5e01 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 17 Nov 2020 13:49:57 -0500 Subject: [PATCH 111/129] Allow for Operator generation of deafult pgBackRest configuration The "pgo-backrest-repo-config" consists of several default files that can be generated when the Operator is initially loaded (and reconciled on initialization as well). This removes additional manual steps required when deploying the Operator through methods such as OLM, making it easier to get started. --- build/postgres-operator/Dockerfile | 1 + deploy/deploy.sh | 16 ++-- .../installation/other/operator-hub.md | 39 +-------- .../ansible/roles/pgo-operator/tasks/main.yml | 22 ++--- installers/olm/description.openshift.md | 12 +-- installers/olm/description.upstream.md | 12 +-- internal/config/secrets.go | 18 ++++ internal/operator/common.go | 87 +++++++++++++++++-- internal/util/cluster.go | 2 +- 9 files changed, 126 insertions(+), 83 deletions(-) create mode 100644 internal/config/secrets.go diff --git a/build/postgres-operator/Dockerfile b/build/postgres-operator/Dockerfile index d88621d73f..dd9895987e 100644 --- a/build/postgres-operator/Dockerfile +++ b/build/postgres-operator/Dockerfile @@ -28,6 +28,7 @@ RUN if [ "$DFSET" = "rhel" ] ; then \ fi ADD bin/postgres-operator /usr/local/bin +ADD installers/ansible/roles/pgo-operator/files/pgo-backrest-repo /default-pgo-backrest-repo ADD installers/ansible/roles/pgo-operator/files/pgo-configs /default-pgo-config ADD conf/postgres-operator/pgo.yaml /default-pgo-config/pgo.yaml diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 77da25e51a..34cb7332a4 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -46,14 +46,14 @@ fi pgbackrest_aws_s3_key=$(awsKeySecret "aws-s3-key") pgbackrest_aws_s3_key_secret=$(awsKeySecret "aws-s3-key-secret") -$PGO_CMD --namespace=$PGO_OPERATOR_NAMESPACE create secret generic pgo-backrest-repo-config \ - --from-file=config=${PGO_CONF_DIR}/pgo-backrest-repo/config \ - --from-file=sshd_config=${PGO_CONF_DIR}/pgo-backrest-repo/sshd_config \ - --from-file=aws-s3-ca.crt=${PGO_CONF_DIR}/pgo-backrest-repo/aws-s3-ca.crt \ - --from-literal=aws-s3-key="${pgbackrest_aws_s3_key}" \ - --from-literal=aws-s3-key-secret="${pgbackrest_aws_s3_key_secret}" -$PGO_CMD --namespace=$PGO_OPERATOR_NAMESPACE label secret pgo-backrest-repo-config \ - vendor=crunchydata +if [[ ! -z $pgbackrest_aws_s3_key ]] || [[ ! -z $pgbackrest_aws_s3_key_secret ]] +then + $PGO_CMD --namespace=$PGO_OPERATOR_NAMESPACE create secret generic pgo-backrest-repo-config \ + --from-literal=aws-s3-key="${pgbackrest_aws_s3_key}" \ + --from-literal=aws-s3-key-secret="${pgbackrest_aws_s3_key_secret}" + $PGO_CMD --namespace=$PGO_OPERATOR_NAMESPACE label secret pgo-backrest-repo-config \ + vendor=crunchydata +fi # # credentials for pgo-apiserver TLS REST API diff --git a/docs/content/installation/other/operator-hub.md b/docs/content/installation/other/operator-hub.md index 52a50bc9ee..f0fbdb0c52 100644 --- a/docs/content/installation/other/operator-hub.md +++ b/docs/content/installation/other/operator-hub.md @@ -15,44 +15,14 @@ that is available in OperatorHub.io. ## Before You Begin -There are a few manual steps that the cluster administrator must perform prior to installing PGO. -At the very least, it must be provided with an initial configuration. +There are some optional Secrets you can add before installing the PostgreSQL Operator into your cluster. -First, make sure OLM and the OperatorHub.io catalog are installed by running -`kubectl get CatalogSources --all-namespaces`. You should see something similar to the following: +### Secrets (optional) -``` -NAMESPACE NAME DISPLAY TYPE PUBLISHER -olm operatorhubio-catalog Community Operators grpc OperatorHub.io -``` - -Take note of the name and namespace above, you will need them later on. - -Next, select a namespace in which to install the PostgreSQL Operator. PostgreSQL clusters will also be deployed here. -If it does not exist, create it now. - -``` -export PGO_OPERATOR_NAMESPACE=pgo -kubectl create namespace "$PGO_OPERATOR_NAMESPACE" -``` - -Next, clone the PostgreSQL Operator repository locally. - -``` -git clone -b v{{< param operatorVersion >}} https://github.com/CrunchyData/postgres-operator.git -cd postgres-operator -``` - -### Secrets - -Configure pgBackRest for your environment. If you do not plan to use AWS S3 to store backups, you can omit -the `aws-s3` keys below. +If you plan to use AWS S3 to store backups and would like to have the keys available for every backup, you can create a Secret as described below: ``` kubectl -n "$PGO_OPERATOR_NAMESPACE" create secret generic pgo-backrest-repo-config \ - --from-file=./installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/config \ - --from-file=./installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config \ - --from-file=./installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt \ --from-literal=aws-s3-key="" \ --from-literal=aws-s3-key-secret="" kubectl -n "$PGO_OPERATOR_NAMESPACE" label secret pgo-backrest-repo-config \ @@ -71,9 +41,6 @@ kubectl -n "$PGO_OPERATOR_NAMESPACE" create secret tls pgo.tls \ --key=/path/to/server.key ``` -Once these resources are in place, the PostgreSQL Operator can be installed into the cluster. - - ## Installation Create an `OperatorGroup` and a `Subscription` in your chosen namespace. diff --git a/installers/ansible/roles/pgo-operator/tasks/main.yml b/installers/ansible/roles/pgo-operator/tasks/main.yml index 4cb6bf439f..205c7385ed 100644 --- a/installers/ansible/roles/pgo-operator/tasks/main.yml +++ b/installers/ansible/roles/pgo-operator/tasks/main.yml @@ -102,7 +102,7 @@ when: pgorole_pgoadmin_result.rc == 1 - name: PGO Service Account - when: + when: - create_rbac|bool tags: - install @@ -124,7 +124,7 @@ when: pgo_service_account_result.rc == 1 - name: Cluster RBAC (namespace_mode 'dynamic') - when: + when: - create_rbac|bool - namespace_mode == "dynamic" tags: @@ -147,7 +147,7 @@ when: cluster_rbac_result.rc == 1 - name: Cluster RBAC (namespace_mode 'readonly') - when: + when: - create_rbac|bool - namespace_mode == "readonly" tags: @@ -175,7 +175,7 @@ tags: - install - update - when: + when: - create_rbac|bool - namespace_mode == "disabled" @@ -263,13 +263,13 @@ - name: Create PGO BackRest Repo Secret command: | {{ kubectl_or_oc }} create secret generic pgo-backrest-repo-config \ - --from-file=config='{{ role_path }}/files/pgo-backrest-repo/config' \ - --from-file=sshd_config='{{ role_path }}/files/pgo-backrest-repo/sshd_config' \ - --from-file=aws-s3-ca.crt='{{ role_path }}/files/pgo-backrest-repo/aws-s3-ca.crt' \ --from-literal=aws-s3-key='{{ backrest_aws_s3_key }}' \ --from-literal=aws-s3-key-secret='{{ backrest_aws_s3_secret }}' \ -n {{ pgo_operator_namespace }} - when: pgo_backrest_repo_config_result.rc == 1 + when: + - pgo_backrest_repo_config_result.rc == 1 + - (backrest_aws_s3_key | default('') != '') or + (backrest_aws_s3_secret | default('') != '') - name: PGO ConfigMap tags: @@ -286,7 +286,7 @@ shell: "{{ kubectl_or_oc }} get configmap pgo-config -n {{ pgo_operator_namespace }}" register: pgo_config_result failed_when: false - + - name: Create PGO ConfigMap command: | {{ kubectl_or_oc }} create configmap pgo-config \ @@ -382,8 +382,8 @@ shell: "{{ kubectl_or_oc }} get -f {{ output_dir }}/pgo-client.json" register: pgo_client_json_result failed_when: false - + - name: Create PGO-Client deployment command: | {{ kubectl_or_oc }} create --filename='{{ output_dir }}/pgo-client.json' - when: pgo_client_json_result.rc == 1 \ No newline at end of file + when: pgo_client_json_result.rc == 1 diff --git a/installers/olm/description.openshift.md b/installers/olm/description.openshift.md index 756deda512..6618ccb6f0 100644 --- a/installers/olm/description.openshift.md +++ b/installers/olm/description.openshift.md @@ -56,20 +56,12 @@ edit `conf/postgres-operator/pgo.yaml` and set `DisableFSGroup` to `true`. [Security Context Constraint]: https://docs.openshift.com/container-platform/latest/authentication/managing-security-context-constraints.html -### Secrets +### Secrets (optional) -Configure pgBackRest for your environment. If you do not plan to use AWS S3 to store backups, you can omit -the `aws-s3` keys below. +If you plan to use AWS S3 to store backups, you can configure your environment to automatically provide your AWS S3 credentials to all newly created PostgreSQL clusters: ``` -curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/config > config -curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config > sshd_config -curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt > aws-s3-ca.crt - oc -n "$PGO_OPERATOR_NAMESPACE" create secret generic pgo-backrest-repo-config \ - --from-file=./config \ - --from-file=./sshd_config \ - --from-file=./aws-s3-ca.crt \ --from-literal=aws-s3-key="" \ --from-literal=aws-s3-key-secret="" oc -n "$PGO_OPERATOR_NAMESPACE" label secret pgo-backrest-repo-config vendor=crunchydata diff --git a/installers/olm/description.upstream.md b/installers/olm/description.upstream.md index 5e22485bf7..8e1e3a50da 100644 --- a/installers/olm/description.upstream.md +++ b/installers/olm/description.upstream.md @@ -49,20 +49,12 @@ export PGO_OPERATOR_NAMESPACE=pgo kubectl create namespace "$PGO_OPERATOR_NAMESPACE" ``` -### Secrets +### Secrets (optional) -Configure pgBackRest for your environment. If you do not plan to use AWS S3 to store backups, you can omit -the `aws-s3` keys below. +If you plan to use AWS S3 to store backups, you can configure your environment to automatically provide your AWS S3 credentials to all newly created PostgreSQL clusters: ``` -curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/config > config -curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/sshd_config > sshd_config -curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/v${PGO_VERSION}/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt > aws-s3-ca.crt - kubectl -n "$PGO_OPERATOR_NAMESPACE" create secret generic pgo-backrest-repo-config \ - --from-file=./config \ - --from-file=./sshd_config \ - --from-file=./aws-s3-ca.crt \ --from-literal=aws-s3-key="" \ --from-literal=aws-s3-key-secret="" kubectl -n "$PGO_OPERATOR_NAMESPACE" label secret pgo-backrest-repo-config vendor=crunchydata diff --git a/internal/config/secrets.go b/internal/config/secrets.go new file mode 100644 index 0000000000..2cc2b5ba1b --- /dev/null +++ b/internal/config/secrets.go @@ -0,0 +1,18 @@ +package config + +/* + Copyright 2020 Crunchy Data Solutions, Inc. + 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. +*/ + +const SecretOperatorBackrestRepoConfig = "pgo-backrest-repo-config" diff --git a/internal/operator/common.go b/internal/operator/common.go index 03d69d5329..cbe549dcfe 100644 --- a/internal/operator/common.go +++ b/internal/operator/common.go @@ -18,7 +18,9 @@ package operator import ( "bytes" "encoding/json" + "io/ioutil" "os" + "path" "strings" "github.com/crunchydata/postgres-operator/internal/config" @@ -27,10 +29,15 @@ import ( log "github.com/sirupsen/logrus" v1 "k8s.io/api/core/v1" + kerrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) const ( + // defaultBackrestRepoConfigPath contains the default configuration that are used + // to set up a pgBackRest repository + defaultBackrestRepoConfigPath = "/default-pgo-backrest-repo/" // defaultRegistry is the default registry to pull the container images from defaultRegistry = "registry.developers.crunchydata.com/crunchydata" ) @@ -62,6 +69,10 @@ type containerResourcesTemplateFields struct { RequestsMemory, RequestsCPU string } +// defaultBackrestRepoConfigKeys are the default keys expected to be in the +// pgBackRest repo config secret +var defaultBackrestRepoConfigKeys = []string{"config", "sshd_config", "aws-s3-ca.crt"} + func Initialize(clientset kubernetes.Interface) { tmp := os.Getenv("CRUNCHY_DEBUG") @@ -89,16 +100,15 @@ func Initialize(clientset kubernetes.Interface) { os.Exit(2) } - var err error - - err = Pgo.GetConfig(clientset, PgoNamespace) - if err != nil { + if err := Pgo.GetConfig(clientset, PgoNamespace); err != nil { log.Error(err) - log.Error("pgo-config files and templates did not load") - os.Exit(2) + log.Fatal("pgo-config files and templates did not load") } - log.Printf("PrimaryStorage=%v\n", Pgo.Storage["storage1"]) + // initialize the general pgBackRest secret + if err := initializeOperatorBackrestSecret(clientset, PgoNamespace); err != nil { + log.Fatal(err) + } if Pgo.Cluster.CCPImagePrefix == "" { log.Debugf("pgo.yaml CCPImagePrefix not set, using default %q", defaultRegistry) @@ -360,6 +370,69 @@ func initializeControllerWorkerCounts() { } } +// initializeOperatorBackrestSecret ensures the generic pgBackRest configuration +// is available +func initializeOperatorBackrestSecret(clientset kubernetes.Interface, namespace string) error { + var isNew, isModified bool + + // determine if the Secret already exists + secret, err := clientset. + CoreV1().Secrets(namespace). + Get(config.SecretOperatorBackrestRepoConfig, metav1.GetOptions{}) + + // if there is a true error, return. Otherwise, initialize a new Secret + if err != nil { + if !kerrors.IsNotFound(err) { + return err + } + + secret = &v1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: config.SecretOperatorBackrestRepoConfig, + }, + Data: map[string][]byte{}, + } + isNew = true + } + + // set any missing defaults + for _, filename := range defaultBackrestRepoConfigKeys { + // skip if there is already content + if len(secret.Data[filename]) != 0 { + continue + } + + file := path.Join(defaultBackrestRepoConfigPath, filename) + + // if we can't read the contents of the file for whatever reason, warn, + // but continue + // otherwise, update the entry in the Secret + if contents, err := ioutil.ReadFile(file); err != nil { + log.Warn(err) + continue + } else { + secret.Data[filename] = contents + } + + isModified = true + } + + // do not make any updates if the secret is not modified at all + if !isModified { + return nil + } + + // make the API calls based on if we are creating or updating + if isNew { + _, err := clientset.CoreV1().Secrets(namespace).Create(secret) + return err + } + + _, err = clientset.CoreV1().Secrets(namespace).Update(secret) + + return err +} + // SetupNamespaces is responsible for the initial namespace configuration for the Operator // install. This includes setting the proper namespace operating mode, creating and/or updating // namespaces as needed (or as permitted by the current operator mode), and returning a valid list diff --git a/internal/util/cluster.go b/internal/util/cluster.go index ef5a324f4f..61666b2a1a 100644 --- a/internal/util/cluster.go +++ b/internal/util/cluster.go @@ -150,7 +150,7 @@ func CreateBackrestRepoSecrets(clientset kubernetes.Interface, // SSHD(...?) and possible S3 credentials configs, configErr := clientset. CoreV1().Secrets(backrestRepoConfig.OperatorNamespace). - Get("pgo-backrest-repo-config", metav1.GetOptions{}) + Get(config.SecretOperatorBackrestRepoConfig, metav1.GetOptions{}) if configErr != nil { log.Error(configErr) From 6f0732f352da3ea479c85880fd13d0f1758d5905 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 19 Nov 2021 15:21:32 -0500 Subject: [PATCH 112/129] Allow for seamless upgrade to new AWS S3 CA bundle This updates the autodetection logic to add the new AWS S3 CA bundle to the general PGO Secret, which is then applied to clusters on upgrade. The logic is such that it will only overwrite the default template if it is unmodified, i.e. it is using the CA bundle that is provided. --- internal/operator/cluster/upgrade.go | 19 +++++++++++++++++++ internal/operator/common.go | 18 ++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/internal/operator/cluster/upgrade.go b/internal/operator/cluster/upgrade.go index 692eb544d1..3ad3f66795 100644 --- a/internal/operator/cluster/upgrade.go +++ b/internal/operator/cluster/upgrade.go @@ -16,9 +16,11 @@ package cluster */ import ( + "crypto/sha256" "errors" "fmt" "io/ioutil" + "path" "strconv" "time" @@ -50,6 +52,10 @@ const ( // store the replica postfix string const replicaServicePostfix = "-replica" +// legacyS3CASHA256Digest informs us if we should override the S3 CA with the +// new bundle +const legacyS3CASHA256Digest = "d1c290ea1e4544dec1934931fbfa1fb2060eb3a0f2239ba191f444ecbce35cbb" + // AddUpgrade implements the upgrade workflow in accordance with the received pgtask // the general process is outlined below: // 1) get the existing pgcluster CRD instance that matches the name provided in the pgtask @@ -433,6 +439,19 @@ func recreateBackrestRepoSecret(clientset kubernetes.Interface, clustername, nam if err == nil { if b, ok := secret.Data["aws-s3-ca.crt"]; ok { config.BackrestS3CA = b + + // if this matches the old AWS S3 CA bundle, update to the new one. + if fmt.Sprintf("%x", sha256.Sum256(config.BackrestS3CA)) == legacyS3CASHA256Digest { + file := path.Join("/default-pgo-backrest-repo/aws-s3-ca.crt") + + // if we can't read the contents of the file for whatever reason, warn, + // otherwise, update the entry in the Secret + if contents, err := ioutil.ReadFile(file); err != nil { + log.Warn(err) + } else { + config.BackrestS3CA = contents + } + } } if b, ok := secret.Data["aws-s3-key"]; ok { config.BackrestS3Key = string(b) diff --git a/internal/operator/common.go b/internal/operator/common.go index cbe549dcfe..00a34c9302 100644 --- a/internal/operator/common.go +++ b/internal/operator/common.go @@ -17,7 +17,9 @@ package operator import ( "bytes" + "crypto/sha256" "encoding/json" + "fmt" "io/ioutil" "os" "path" @@ -40,6 +42,9 @@ const ( defaultBackrestRepoConfigPath = "/default-pgo-backrest-repo/" // defaultRegistry is the default registry to pull the container images from defaultRegistry = "registry.developers.crunchydata.com/crunchydata" + // legacyS3CASHA256Digest informs us if we should override the S3 CA with the + // new bundle + legacyS3CASHA256Digest = "d1c290ea1e4544dec1934931fbfa1fb2060eb3a0f2239ba191f444ecbce35cbb" ) var CRUNCHY_DEBUG bool @@ -397,9 +402,18 @@ func initializeOperatorBackrestSecret(clientset kubernetes.Interface, namespace // set any missing defaults for _, filename := range defaultBackrestRepoConfigKeys { - // skip if there is already content + // skip if there is already content, unless this is aws-s3-ca.crt due to + // the change in the CA bundle if len(secret.Data[filename]) != 0 { - continue + if filename != "aws-s3-ca.crt" { + continue + } + + // in the case of aws-s3-ca.crt, check that this is the default + // certificate. if it is, override it + if fmt.Sprintf("%x", sha256.Sum256(secret.Data[filename])) != legacyS3CASHA256Digest { + continue + } } file := path.Join(defaultBackrestRepoConfigPath, filename) From 5e92400a41f73d0693e85b27b0963b5ae17ae9f3 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 22 Nov 2021 14:32:00 -0500 Subject: [PATCH 113/129] Version bump v4.5.5 --- Makefile | 4 +-- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 +-- docs/config.toml | 14 +++++------ docs/content/Configuration/compatibility.md | 6 +++++ docs/content/releases/4.5.5.md | 25 +++++++++++++++++++ docs/content/tutorial/pgbouncer.md | 2 +- examples/create-by-resource/fromcrd.json | 6 ++--- examples/envs.sh | 2 +- .../create-cluster/templates/pgcluster.yaml | 2 +- examples/helm/create-cluster/values.yaml | 4 +-- installers/ansible/README.md | 2 +- installers/ansible/values.yaml | 6 ++--- installers/gcp-marketplace/Makefile | 2 +- installers/gcp-marketplace/README.md | 2 +- installers/gcp-marketplace/values.yaml | 6 ++--- installers/helm/Chart.yaml | 2 +- installers/helm/values.yaml | 6 ++--- installers/kubectl/client-setup.sh | 2 +- .../kubectl/postgres-operator-ocp311.yml | 8 +++--- installers/kubectl/postgres-operator.yml | 8 +++--- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- installers/metrics/helm/helm_template.yaml | 2 +- installers/metrics/helm/values.yaml | 2 +- .../postgres-operator-metrics-ocp311.yml | 2 +- .../kubectl/postgres-operator-metrics.yml | 2 +- installers/olm/Makefile | 4 +-- pkg/apis/crunchydata.com/v1/doc.go | 8 +++--- pkg/apiservermsgs/common.go | 2 +- redhat/atomic/help.1 | 2 +- redhat/atomic/help.md | 2 +- 33 files changed, 89 insertions(+), 58 deletions(-) create mode 100644 docs/content/releases/4.5.5.md diff --git a/Makefile b/Makefile index bf33087416..a690179d74 100644 --- a/Makefile +++ b/Makefile @@ -9,9 +9,9 @@ PGO_CMD ?= kubectl PGO_IMAGE_PREFIX ?= crunchydata PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) PGO_OPERATOR_NAMESPACE ?= pgo -PGO_VERSION ?= 4.5.4 +PGO_VERSION ?= 4.5.5 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.8 +PGO_PG_FULLVERSION ?= 12.9 PGO_BACKREST_VERSION ?= 2.29 PACKAGER ?= yum diff --git a/README.md b/README.md index 4bda4e201e..67bc97115d 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ to start as quickly as: ```shell kubectl create namespace pgo -kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.4/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.5/installers/kubectl/postgres-operator.yml ``` Otherwise, we highly recommend following the instructions from our [Quickstart](https://access.crunchydata.com/documentation/postgres-operator/latest/quickstart/). diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index 3ecbc07f12..4edc5c605a 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -16,7 +16,7 @@ GCR_IMAGE_PREFIX=gcr.io/crunchy-dev-test CCP_IMAGE_PREFIX=crunchydata -CCP_IMAGE_TAG=centos8-12.8-4.5.4 +CCP_IMAGE_TAG=centos8-12.9-4.5.5 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index 2c68cfe7a9..e380c50ece 100644 --- a/conf/postgres-operator/pgo.yaml +++ b/conf/postgres-operator/pgo.yaml @@ -2,7 +2,7 @@ Cluster: CCPImagePrefix: registry.developers.crunchydata.com/crunchydata Metrics: false Badger: false - CCPImageTag: centos8-12.8-4.5.4 + CCPImageTag: centos8-12.9-4.5.5 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -82,4 +82,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos8-4.5.4 + PGOImageTag: centos8-4.5.5 diff --git a/docs/config.toml b/docs/config.toml index 55d030f571..f2224e5190 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,13 +25,13 @@ disableNavChevron = false # set true to hide next/prev chevron, default is false highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter menushortcutsnewtab = true # set true to open shortcuts links to a new tab/window enableGitInfo = true -operatorVersion = "4.5.4" -postgresVersion = "12.8" -postgresVersion13 = "13.4" -postgresVersion12 = "12.8" -postgresVersion11 = "11.13" -postgresVersion10 = "10.18" -postgresVersion96 = "9.6.23" +operatorVersion = "4.5.5" +postgresVersion = "12.9" +postgresVersion13 = "13.5" +postgresVersion12 = "12.9" +postgresVersion11 = "11.14" +postgresVersion10 = "10.19" +postgresVersion96 = "9.6.24" postgisVersion = "3.0" centosBase = "centos8" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index e9ef3716bf..1f25dee1a6 100644 --- a/docs/content/Configuration/compatibility.md +++ b/docs/content/Configuration/compatibility.md @@ -12,6 +12,12 @@ version dependencies between the two projects. Below are the operator releases a | Operator Release | Container Release | Postgres | PgBackrest Version |:----------|:-------------|:------------|:-------------- +| 4.5.5 | 4.5.5 | 13.5 | 2.29 | +|||12.9|2.29| +|||11.14|2.29| +|||10.19|2.29| +|||9.6.24|2.29| +|||| | 4.5.4 | 4.5.4 | 13.4 | 2.29 | |||12.8|2.29| |||11.13|2.29| diff --git a/docs/content/releases/4.5.5.md b/docs/content/releases/4.5.5.md new file mode 100644 index 0000000000..3bc709aaf8 --- /dev/null +++ b/docs/content/releases/4.5.5.md @@ -0,0 +1,25 @@ +--- +title: "4.5.5" +date: +draft: false +weight: 65 +--- + +Crunchy Data announces the release of PGO, the Postgres Operator 4.5.5. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +PostgreSQL Operator 4.5.5 release includes the following software versions upgrades: + +- [PostgreSQL](https://www.postgresql.org) versions 13.5, 12.9, 11.14, 10.19 and 9.6.24 are now available. +- The [pgnodemx](https://github.com/CrunchyData/pgnodemx) extension is now at version 1.0.6. +- [pgBouncer](https://www.pgbouncer.org/) is now at version 1.16.1 + +## Changes + +- The default `pgo-backrest-repo-config` Secret can now be automatically generated by the Operator. This functionality was backpatched from v4.6 to help support the fix around automatically updating the AWS CA values. + +## Fixes + +- Ensure the `pgo create pgbouncer` command can set CPU and memory limits via `--cpu-limit` and `--memory-limit` respectively. +- Update the `aws-s3-ca.crt` value to use the newer CAs provided by AWS. If a PostgreSQL cluster is using the old default CA, PGO will update the general one kept in the `pgo-backrest-repo-config` Secret and `pgo upgrade` will update it for a specific cluster. diff --git a/docs/content/tutorial/pgbouncer.md b/docs/content/tutorial/pgbouncer.md index a150e19c70..a818d6a9bd 100644 --- a/docs/content/tutorial/pgbouncer.md +++ b/docs/content/tutorial/pgbouncer.md @@ -116,7 +116,7 @@ PGPASSWORD=randompassword psql -h localhost -p 5432 -U pgbouncer pgbouncer You should see something similar to this: ``` -psql (12.8, server 1.14.0/bouncer) +psql (12.9, server 1.14.0/bouncer) Type "help" for help. pgbouncer=# diff --git a/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index 24b47f0131..639115207a 100644 --- a/examples/create-by-resource/fromcrd.json +++ b/examples/create-by-resource/fromcrd.json @@ -16,7 +16,7 @@ "pg-cluster": "fromcrd", "pg-pod-anti-affinity": "", "pgo-backrest": "true", - "pgo-version": "4.5.4", + "pgo-version": "4.5.5", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos8-12.8-4.5.4", + "ccpimagetag": "centos8-12.9-4.5.5", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy-postgres-exporter": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.5.4", + "pgo-version": "4.5.5", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index 64f8c4b833..62c468db5f 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -23,7 +23,7 @@ export PGO_CONF_DIR=$PGOROOT/installers/ansible/roles/pgo-operator/files # the version of the Operator you run is set by these vars export PGO_IMAGE_PREFIX=registry.developers.crunchydata.com/crunchydata export PGO_BASEOS=centos8 -export PGO_VERSION=4.5.4 +export PGO_VERSION=4.5.5 export PGO_IMAGE_TAG=$PGO_BASEOS-$PGO_VERSION # for setting the pgo apiserver port, disabling TLS or not verifying TLS diff --git a/examples/helm/create-cluster/templates/pgcluster.yaml b/examples/helm/create-cluster/templates/pgcluster.yaml index 4aa88db4d2..551c18a9d5 100644 --- a/examples/helm/create-cluster/templates/pgcluster.yaml +++ b/examples/helm/create-cluster/templates/pgcluster.yaml @@ -13,7 +13,7 @@ metadata: pg-cluster: {{ .Values.pgclustername }} pg-pod-anti-affinity: "" pgo-backrest: "true" - pgo-version: 4.5.4 + pgo-version: 4.5.5 pgouser: admin name: {{ .Values.pgclustername }} namespace: {{ .Values.namespace }} diff --git a/examples/helm/create-cluster/values.yaml b/examples/helm/create-cluster/values.yaml index 576f9a7a93..21ace0ad7a 100644 --- a/examples/helm/create-cluster/values.yaml +++ b/examples/helm/create-cluster/values.yaml @@ -4,11 +4,11 @@ # The values is for the namespace and the postgresql cluster name ccpimage: crunchy-postgres-ha ccpimageprefix: registry.developers.crunchydata.com/crunchydata -ccpimagetag: centos8-12.8-4.5.4 +ccpimagetag: centos8-12.9-4.5.5 namespace: pgo pgclustername: hippo pgoimageprefix: registry.developers.crunchydata.com/crunchydata -pgoversion: 4.5.4 +pgoversion: 4.5.5 hipposecretuser: "hippo" hipposecretpassword: "Supersecurepassword*" postgressecretuser: "postgres" diff --git a/installers/ansible/README.md b/installers/ansible/README.md index 61dfd24a8e..f537090af9 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ PGO: The Postgres Operator from Crunchy Data

-Latest Release: 4.5.4 +Latest Release: 4.5.5 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index 18cdeae694..1445729bd5 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -17,7 +17,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.8-4.5.4" +ccp_image_tag: "centos8-12.9-4.5.5" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -50,14 +50,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.4" +pgo_client_version: "4.5.5" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.4" +pgo_image_tag: "centos8-4.5.5" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index 87065a596b..08ce60da3d 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -6,7 +6,7 @@ MARKETPLACE_TOOLS ?= gcr.io/cloud-marketplace-tools/k8s/dev:$(MARKETPLACE_VERSIO MARKETPLACE_VERSION ?= 0.9.4 KUBECONFIG ?= $(HOME)/.kube/config PARAMETERS ?= {} -PGO_VERSION ?= 4.5.4 +PGO_VERSION ?= 4.5.5 IMAGE_BUILD_ARGS = --build-arg MARKETPLACE_VERSION='$(MARKETPLACE_VERSION)' \ --build-arg PGO_VERSION='$(PGO_VERSION)' diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index 711803fd7c..500fe54619 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -59,7 +59,7 @@ Google Cloud Marketplace. ```shell IMAGE_REPOSITORY=gcr.io/crunchydata-public/postgres-operator - export PGO_VERSION=4.5.4 + export PGO_VERSION=4.5.5 export INSTALLER_IMAGE=${IMAGE_REPOSITORY}/deployer:${PGO_VERSION} export OPERATOR_IMAGE=${IMAGE_REPOSITORY}:${PGO_VERSION} export OPERATOR_IMAGE_API=${IMAGE_REPOSITORY}/pgo-apiserver:${PGO_VERSION} diff --git a/installers/gcp-marketplace/values.yaml b/installers/gcp-marketplace/values.yaml index 29f74db0b8..a0f6be4197 100644 --- a/installers/gcp-marketplace/values.yaml +++ b/installers/gcp-marketplace/values.yaml @@ -10,7 +10,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.8-4.5.4" +ccp_image_tag: "centos8-12.9-4.5.5" create_rbac: "true" db_name: "" db_password_age_days: "0" @@ -32,9 +32,9 @@ pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" pgo_client_container_install: "false" pgo_client_install: 'false' -pgo_client_version: "4.5.4" +pgo_client_version: "4.5.5" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.4" +pgo_image_tag: "centos8-4.5.5" pgo_installation_name: '${OPERATOR_NAME}' pgo_operator_namespace: '${OPERATOR_NAMESPACE}' scheduler_timeout: "3600" diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index e1922423bd..1347ec4003 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -3,7 +3,7 @@ name: postgres-operator description: 'PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes' type: application version: 0.1.0 -appVersion: 4.5.4 +appVersion: 4.5.5 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg keywords: diff --git a/installers/helm/values.yaml b/installers/helm/values.yaml index ea495b2532..a3a7cc0fe6 100644 --- a/installers/helm/values.yaml +++ b/installers/helm/values.yaml @@ -37,7 +37,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.8-4.5.4" +ccp_image_tag: "centos8-12.9-4.5.5" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -70,14 +70,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.4" +pgo_client_version: "4.5.5" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.4" +pgo_image_tag: "centos8-4.5.5" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index b0af92ee84..6c32646128 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -14,7 +14,7 @@ # This script should be run after the operator has been deployed PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}" PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}" -PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.4}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.5}" PGO_CLIENT_URL="https://github.com/CrunchyData/postgres-operator/releases/download/${PGO_CLIENT_VERSION}" PGO_CMD="${PGO_CMD-kubectl}" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 20e8043baf..64356b2587 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -50,7 +50,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.8-4.5.4" + ccp_image_tag: "centos8-12.9-4.5.5" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -83,14 +83,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.4" + pgo_client_version: "4.5.5" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.4" + pgo_image_tag: "centos8-4.5.5" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.5 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index 297bdf0ebc..abf59303c6 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -145,7 +145,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.8-4.5.4" + ccp_image_tag: "centos8-12.9-4.5.5" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -178,14 +178,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.4" + pgo_client_version: "4.5.5" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.4" + pgo_image_tag: "centos8-4.5.5" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -281,7 +281,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.5 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index 288c9b4ebc..c4358d9df3 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.4 +Latest Release: 4.5.5 ## General diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index ba5dc201dd..727a858bff 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-monitoring description: Install for Crunchy PostgreSQL Operator Monitoring type: application version: 0.1.0 -appVersion: 4.5.4 +appVersion: 4.5.5 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg diff --git a/installers/metrics/helm/helm_template.yaml b/installers/metrics/helm/helm_template.yaml index d2f332f5b6..3312a14bc5 100644 --- a/installers/metrics/helm/helm_template.yaml +++ b/installers/metrics/helm/helm_template.yaml @@ -20,5 +20,5 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.4" +pgo_image_tag: "centos8-4.5.5" diff --git a/installers/metrics/helm/values.yaml b/installers/metrics/helm/values.yaml index e37a24a248..f29c3bbf22 100644 --- a/installers/metrics/helm/values.yaml +++ b/installers/metrics/helm/values.yaml @@ -20,7 +20,7 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.4" +pgo_image_tag: "centos8-4.5.5" # ===================== # Configuration Options diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index 382de39aea..0dd2af1239 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -101,7 +101,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.5 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index b5171af550..8fc454161e 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.4 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.5 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index 3eb56c6a35..33bf44abc6 100644 --- a/installers/olm/Makefile +++ b/installers/olm/Makefile @@ -2,7 +2,7 @@ .SUFFIXES: CCP_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -CCP_PG_FULLVERSION ?= 12.8 +CCP_PG_FULLVERSION ?= 12.9 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.15.1 @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.15.1 PGO_BASEOS ?= centos8 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.5.4 +PGO_VERSION ?= 4.5.5 PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) CCP_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(PGO_VERSION) CCP_POSTGIS_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(CCP_POSTGIS_VERSION)-$(PGO_VERSION) diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 19d9b9a021..8f7b9856c5 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -53,7 +53,7 @@ cluster. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.4", + '{"ClientVersion":"4.5.5", "Namespace":"pgouser1", "Name":"mycluster", $PGO_APISERVER_URL/clusters @@ -72,7 +72,7 @@ show all of the clusters that are in the given namespace. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.4", + '{"ClientVersion":"4.5.5", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/showclusters @@ -82,7 +82,7 @@ $PGO_APISERVER_URL/showclusters curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.4", + '{"ClientVersion":"4.5.5", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.5.4 + Version: 4.5.5 License: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 Contact: Crunchy Data https://www.crunchydata.com/ diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index 4194282e5a..af81b12160 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -const PGO_VERSION = "4.5.4" +const PGO_VERSION = "4.5.5" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index 43f15d7517..68c20b2ea2 100644 --- a/redhat/atomic/help.1 +++ b/redhat/atomic/help.1 @@ -56,4 +56,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa \fB\fCRelease=\fR .PP -The specific release number of the container. For example, Release="4.5.4" +The specific release number of the container. For example, Release="4.5.5" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index 61e09d1cba..34d28d60ca 100644 --- a/redhat/atomic/help.md +++ b/redhat/atomic/help.md @@ -45,4 +45,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa `Release=` -The specific release number of the container. For example, Release="4.5.4" +The specific release number of the container. For example, Release="4.5.5" From 9453e793f36a37ddf4f2d02c782ed213d7d523df Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 1 Dec 2021 17:50:58 -0500 Subject: [PATCH 114/129] Include legacy AWS S3 CA in the bundle It seems the rules for what AWS keep changing, so best to keep all of the CAs in the bundle. --- .../files/pgo-backrest-repo/aws-s3-ca.crt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt b/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt index 31ebd8a6e5..419c8de459 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt +++ b/installers/ansible/roles/pgo-operator/files/pgo-backrest-repo/aws-s3-ca.crt @@ -1,4 +1,25 @@ -----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL From 9606732127233927b804a8a52c1ad363ca1f7187 Mon Sep 17 00:00:00 2001 From: andrewlecuyer <43458182+andrewlecuyer@users.noreply.github.com> Date: Wed, 1 Dec 2021 20:27:15 -0600 Subject: [PATCH 115/129] Allow Scaledown of Original Primary After Upgrade (#2891) --- pgo-rmdata/rmdata/process.go | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/pgo-rmdata/rmdata/process.go b/pgo-rmdata/rmdata/process.go index 4dd5eec16c..e96d4fb6c4 100644 --- a/pgo-rmdata/rmdata/process.go +++ b/pgo-rmdata/rmdata/process.go @@ -63,17 +63,13 @@ func Delete(request Request) { if err := request.Clientset. CrunchydataV1().Pgreplicas(request.Namespace). Delete(request.ReplicaName, &metav1.DeleteOptions{}); err != nil { - // If the name of the replica being deleted matches the scope for the cluster, then - // we assume it was the original primary and the pgreplica deletion will fail with - // a not found error. In this case we allow the rmdata process to continue despite - // the error. This allows for the original primary to be scaled down once it is - // is no longer a primary, and has become a replica. - if !(request.ReplicaName == request.ClusterPGHAScope && kerror.IsNotFound(err)) { + // if the pgreplica is not found, assume we're scaling down the original primary and + // continue with removing the replica + if !kerror.IsNotFound(err) { log.Error(err) - return + } else { + log.Debug("pgreplica not found, assuming scale down of original primary") } - log.Debug("replica name matches PGHA scope, assuming scale down of original primary" + - "and therefore ignoring error attempting to delete nonexistent pgreplica") } err = removeReplica(request) From 82f9a66590f754faf85c0357847559c85c46c143 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 1 Dec 2021 22:07:36 -0500 Subject: [PATCH 116/129] Update 4.5.5 release notes --- docs/content/releases/4.5.5.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/content/releases/4.5.5.md b/docs/content/releases/4.5.5.md index 3bc709aaf8..f5f6c0b823 100644 --- a/docs/content/releases/4.5.5.md +++ b/docs/content/releases/4.5.5.md @@ -23,3 +23,4 @@ PostgreSQL Operator 4.5.5 release includes the following software versions upgra - Ensure the `pgo create pgbouncer` command can set CPU and memory limits via `--cpu-limit` and `--memory-limit` respectively. - Update the `aws-s3-ca.crt` value to use the newer CAs provided by AWS. If a PostgreSQL cluster is using the old default CA, PGO will update the general one kept in the `pgo-backrest-repo-config` Secret and `pgo upgrade` will update it for a specific cluster. +- Allow for the original primary instance to be scaled down after running `pgo upgrade`. From 4f5a14041821529a373b3b5419a25376b87f1268 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 4 Jan 2022 11:37:04 -0500 Subject: [PATCH 117/129] Update Copyrights to 2022 --- LICENSE.md | 2 +- apiserver.go | 2 +- bin/crunchy-postgres-exporter/common_lib.sh | 2 +- bin/crunchy-postgres-exporter/start.sh | 2 +- bin/get-deps.sh | 2 +- bin/get-pgmonitor.sh | 2 +- bin/license_aggregator.sh | 2 +- bin/pgo-backrest-repo-sync/pgo-backrest-repo-sync.sh | 2 +- bin/pgo-backrest-repo/pgo-backrest-repo.sh | 2 +- bin/pgo-backrest-restore/pgo-backrest-restore.sh | 2 +- bin/pgo-backrest/pgo-backrest.sh | 2 +- bin/pgo-event/pgo-event.sh | 2 +- bin/pgo-rmdata/start.sh | 2 +- bin/pgo-scheduler/start.sh | 2 +- bin/pgo-sqlrunner/start.sh | 2 +- bin/pre-pull-crunchy-containers.sh | 2 +- bin/pull-from-gcr.sh | 2 +- bin/push-ccp-to-gcr.sh | 2 +- bin/push-to-gcr.sh | 2 +- bin/uid_daemon.sh | 2 +- bin/upgrade-secret.sh | 2 +- deploy/add-targeted-namespace-reconcile-rbac.sh | 2 +- deploy/add-targeted-namespace.sh | 2 +- deploy/cleannamespaces.sh | 2 +- deploy/cleanup-rbac.sh | 2 +- deploy/cleanup.sh | 2 +- deploy/deploy.sh | 2 +- deploy/gen-api-keys.sh | 2 +- deploy/install-bootstrap-creds.sh | 2 +- deploy/install-rbac.sh | 2 +- deploy/remove-crd.sh | 2 +- deploy/setupnamespaces.sh | 2 +- deploy/show-crd.sh | 2 +- deploy/upgrade-creds.sh | 2 +- deploy/upgrade-pgo.sh | 2 +- docs/layouts/partials/flex/body-aftercontent.html | 2 +- examples/create-by-resource/run.sh | 2 +- examples/custom-config/create.sh | 2 +- examples/custom-config/setup.sql | 2 +- hack/boilerplate.go.txt | 2 +- hack/config_sync.sh | 2 +- hack/update-codegen.sh | 2 +- hack/verify-codegen.sh | 2 +- .../roles/pgo-operator/templates/add-targeted-namespace.sh.j2 | 2 +- installers/image/bin/pgo-deploy.sh | 2 +- installers/kubectl/client-setup.sh | 2 +- internal/apiserver/backrestservice/backrestimpl.go | 2 +- internal/apiserver/backrestservice/backrestservice.go | 2 +- internal/apiserver/backupoptions/backupoptionsutil.go | 2 +- internal/apiserver/backupoptions/backupoptionsutil_test.go | 2 +- internal/apiserver/backupoptions/pgbackrestoptions.go | 2 +- internal/apiserver/backupoptions/pgdumpoptions.go | 2 +- internal/apiserver/catservice/catimpl.go | 2 +- internal/apiserver/catservice/catservice.go | 2 +- internal/apiserver/cloneservice/cloneimpl.go | 2 +- internal/apiserver/cloneservice/cloneservice.go | 2 +- internal/apiserver/clusterservice/clusterimpl.go | 2 +- internal/apiserver/clusterservice/clusterservice.go | 2 +- internal/apiserver/clusterservice/scaleimpl.go | 2 +- internal/apiserver/clusterservice/scaleservice.go | 2 +- internal/apiserver/common.go | 2 +- internal/apiserver/common_test.go | 2 +- internal/apiserver/configservice/configimpl.go | 2 +- internal/apiserver/configservice/configservice.go | 2 +- internal/apiserver/dfservice/dfimpl.go | 2 +- internal/apiserver/dfservice/dfservice.go | 2 +- internal/apiserver/failoverservice/failoverimpl.go | 2 +- internal/apiserver/failoverservice/failoverservice.go | 2 +- internal/apiserver/labelservice/labelimpl.go | 2 +- internal/apiserver/labelservice/labelservice.go | 2 +- internal/apiserver/middleware.go | 2 +- internal/apiserver/namespaceservice/namespaceimpl.go | 2 +- internal/apiserver/namespaceservice/namespaceservice.go | 2 +- internal/apiserver/perms.go | 2 +- internal/apiserver/pgadminservice/pgadminimpl.go | 2 +- internal/apiserver/pgadminservice/pgadminservice.go | 2 +- internal/apiserver/pgbouncerservice/pgbouncerimpl.go | 2 +- internal/apiserver/pgbouncerservice/pgbouncerservice.go | 2 +- internal/apiserver/pgdumpservice/pgdumpimpl.go | 2 +- internal/apiserver/pgdumpservice/pgdumpservice.go | 2 +- internal/apiserver/pgoroleservice/pgoroleimpl.go | 2 +- internal/apiserver/pgoroleservice/pgoroleservice.go | 2 +- internal/apiserver/pgouserservice/pgouserimpl.go | 2 +- internal/apiserver/pgouserservice/pgouserservice.go | 2 +- internal/apiserver/policyservice/policyimpl.go | 2 +- internal/apiserver/policyservice/policyservice.go | 2 +- internal/apiserver/pvcservice/pvcimpl.go | 2 +- internal/apiserver/pvcservice/pvcservice.go | 2 +- internal/apiserver/reloadservice/reloadimpl.go | 2 +- internal/apiserver/reloadservice/reloadservice.go | 2 +- internal/apiserver/restartservice/restartimpl.go | 2 +- internal/apiserver/restartservice/restartservice.go | 2 +- internal/apiserver/root.go | 2 +- internal/apiserver/routing/doc.go | 2 +- internal/apiserver/routing/routes.go | 2 +- internal/apiserver/scheduleservice/scheduleimpl.go | 2 +- internal/apiserver/scheduleservice/scheduleservice.go | 2 +- internal/apiserver/statusservice/statusimpl.go | 2 +- internal/apiserver/statusservice/statusservice.go | 2 +- internal/apiserver/upgradeservice/upgradeimpl.go | 2 +- internal/apiserver/upgradeservice/upgradeservice.go | 2 +- internal/apiserver/userservice/userimpl.go | 2 +- internal/apiserver/userservice/userimpl_test.go | 2 +- internal/apiserver/userservice/userservice.go | 2 +- internal/apiserver/versionservice/versionimpl.go | 2 +- internal/apiserver/versionservice/versionservice.go | 2 +- internal/apiserver/workflowservice/workflowimpl.go | 2 +- internal/apiserver/workflowservice/workflowservice.go | 2 +- internal/config/annotations.go | 2 +- internal/config/defaults.go | 2 +- internal/config/images.go | 2 +- internal/config/labels.go | 2 +- internal/config/pgoconfig.go | 2 +- internal/config/volumes.go | 2 +- internal/controller/configmap/configmapcontroller.go | 2 +- internal/controller/configmap/synchandler.go | 2 +- internal/controller/controllerutil.go | 2 +- internal/controller/job/backresthandler.go | 2 +- internal/controller/job/bootstraphandler.go | 2 +- internal/controller/job/jobcontroller.go | 2 +- internal/controller/job/jobevents.go | 2 +- internal/controller/job/jobutil.go | 2 +- internal/controller/job/pgdumphandler.go | 2 +- internal/controller/job/reposynchandler.go | 2 +- internal/controller/job/rmdatahandler.go | 2 +- internal/controller/manager/controllermanager.go | 2 +- internal/controller/manager/rbac.go | 2 +- internal/controller/namespace/namespacecontroller.go | 2 +- internal/controller/pgcluster/pgclustercontroller.go | 2 +- internal/controller/pgpolicy/pgpolicycontroller.go | 2 +- internal/controller/pgreplica/pgreplicacontroller.go | 2 +- internal/controller/pgtask/backresthandler.go | 2 +- internal/controller/pgtask/pgtaskcontroller.go | 2 +- internal/controller/pod/inithandler.go | 2 +- internal/controller/pod/podcontroller.go | 2 +- internal/controller/pod/podevents.go | 2 +- internal/controller/pod/promotionhandler.go | 2 +- internal/kubeapi/client_config.go | 2 +- internal/kubeapi/deployment.go | 2 +- internal/kubeapi/endpoints.go | 2 +- internal/kubeapi/errors.go | 2 +- internal/kubeapi/exec.go | 2 +- internal/kubeapi/fake/clientset.go | 2 +- internal/kubeapi/fake/fakeclients.go | 2 +- internal/kubeapi/patch.go | 2 +- internal/kubeapi/patch_test.go | 2 +- internal/kubeapi/pod.go | 2 +- internal/kubeapi/volumes.go | 2 +- internal/kubeapi/volumes_test.go | 2 +- internal/logging/loglib.go | 2 +- internal/ns/nslogic.go | 2 +- internal/operator/backrest/backup.go | 2 +- internal/operator/backrest/repo.go | 2 +- internal/operator/backrest/restore.go | 2 +- internal/operator/backrest/stanza.go | 2 +- internal/operator/cluster/clone.go | 2 +- internal/operator/cluster/cluster.go | 2 +- internal/operator/cluster/clusterlogic.go | 2 +- internal/operator/cluster/failover.go | 2 +- internal/operator/cluster/failoverlogic.go | 2 +- internal/operator/cluster/pgadmin.go | 2 +- internal/operator/cluster/pgbouncer.go | 2 +- internal/operator/cluster/pgbouncer_test.go | 2 +- internal/operator/cluster/rmdata.go | 2 +- internal/operator/cluster/service.go | 2 +- internal/operator/cluster/standby.go | 2 +- internal/operator/cluster/upgrade.go | 2 +- internal/operator/clusterutilities.go | 2 +- internal/operator/clusterutilities_test.go | 2 +- internal/operator/common.go | 2 +- internal/operator/config/configutil.go | 2 +- internal/operator/config/dcs.go | 2 +- internal/operator/config/localdb.go | 2 +- internal/operator/operatorupgrade/version-check.go | 2 +- internal/operator/pgbackrest.go | 2 +- internal/operator/pgbackrest_test.go | 2 +- internal/operator/pgdump/dump.go | 2 +- internal/operator/pgdump/restore.go | 2 +- internal/operator/pvc/pvc.go | 2 +- internal/operator/storage.go | 2 +- internal/operator/storage_test.go | 2 +- internal/operator/task/applypolicies.go | 2 +- internal/operator/task/rmbackups.go | 2 +- internal/operator/task/rmdata.go | 2 +- internal/operator/task/workflow.go | 2 +- internal/operator/wal.go | 2 +- internal/patroni/doc.go | 2 +- internal/patroni/patroni.go | 2 +- internal/pgadmin/backoff.go | 2 +- internal/pgadmin/backoff_test.go | 2 +- internal/pgadmin/crypto.go | 2 +- internal/pgadmin/crypto_test.go | 2 +- internal/pgadmin/doc.go | 2 +- internal/pgadmin/hash.go | 2 +- internal/pgadmin/logic.go | 2 +- internal/pgadmin/runner.go | 2 +- internal/pgadmin/server.go | 2 +- internal/postgres/doc.go | 2 +- internal/postgres/password/doc.go | 2 +- internal/postgres/password/md5.go | 2 +- internal/postgres/password/md5_test.go | 2 +- internal/postgres/password/password.go | 2 +- internal/postgres/password/password_test.go | 2 +- internal/postgres/password/scram.go | 2 +- internal/postgres/password/scram_test.go | 2 +- internal/tlsutil/primitives.go | 2 +- internal/tlsutil/primitives_test.go | 2 +- internal/util/backrest.go | 2 +- internal/util/clone.go | 2 +- internal/util/cluster.go | 2 +- internal/util/failover.go | 2 +- internal/util/pgbouncer.go | 2 +- internal/util/policy.go | 2 +- internal/util/secrets.go | 2 +- internal/util/secrets_test.go | 2 +- internal/util/ssh.go | 2 +- internal/util/util.go | 2 +- pgo-backrest/pgo-backrest.go | 2 +- pgo-rmdata/pgo-rmdata.go | 2 +- pgo-rmdata/rmdata/process.go | 2 +- pgo-rmdata/rmdata/types.go | 2 +- pgo-scheduler/pgo-scheduler.go | 2 +- pgo-scheduler/scheduler/configmapcontroller.go | 2 +- pgo-scheduler/scheduler/controllermanager.go | 2 +- pgo-scheduler/scheduler/pgbackrest.go | 2 +- pgo-scheduler/scheduler/policy.go | 2 +- pgo-scheduler/scheduler/scheduler.go | 2 +- pgo-scheduler/scheduler/tasks.go | 2 +- pgo-scheduler/scheduler/types.go | 2 +- pgo-scheduler/scheduler/validate.go | 2 +- pgo-scheduler/scheduler/validate_test.go | 2 +- pgo/api/backrest.go | 2 +- pgo/api/cat.go | 2 +- pgo/api/clone.go | 2 +- pgo/api/cluster.go | 2 +- pgo/api/common.go | 2 +- pgo/api/config.go | 2 +- pgo/api/df.go | 2 +- pgo/api/failover.go | 2 +- pgo/api/label.go | 2 +- pgo/api/namespace.go | 2 +- pgo/api/pgadmin.go | 2 +- pgo/api/pgbouncer.go | 2 +- pgo/api/pgdump.go | 2 +- pgo/api/pgorole.go | 2 +- pgo/api/pgouser.go | 2 +- pgo/api/policy.go | 2 +- pgo/api/pvc.go | 2 +- pgo/api/reload.go | 2 +- pgo/api/restart.go | 2 +- pgo/api/restore.go | 2 +- pgo/api/restoreDump.go | 2 +- pgo/api/scale.go | 2 +- pgo/api/scaledown.go | 2 +- pgo/api/schedule.go | 2 +- pgo/api/status.go | 2 +- pgo/api/test.go | 2 +- pgo/api/upgrade.go | 2 +- pgo/api/user.go | 2 +- pgo/api/version.go | 2 +- pgo/api/workflow.go | 2 +- pgo/cmd/auth.go | 2 +- pgo/cmd/backrest.go | 2 +- pgo/cmd/backup.go | 2 +- pgo/cmd/cat.go | 2 +- pgo/cmd/clone.go | 2 +- pgo/cmd/cluster.go | 2 +- pgo/cmd/common.go | 2 +- pgo/cmd/config.go | 2 +- pgo/cmd/create.go | 2 +- pgo/cmd/delete.go | 2 +- pgo/cmd/df.go | 2 +- pgo/cmd/failover.go | 2 +- pgo/cmd/flags.go | 2 +- pgo/cmd/label.go | 2 +- pgo/cmd/namespace.go | 2 +- pgo/cmd/pgadmin.go | 2 +- pgo/cmd/pgbouncer.go | 2 +- pgo/cmd/pgdump.go | 2 +- pgo/cmd/pgorole.go | 2 +- pgo/cmd/pgouser.go | 2 +- pgo/cmd/policy.go | 2 +- pgo/cmd/pvc.go | 2 +- pgo/cmd/reload.go | 2 +- pgo/cmd/restart.go | 2 +- pgo/cmd/restore.go | 2 +- pgo/cmd/root.go | 2 +- pgo/cmd/scale.go | 2 +- pgo/cmd/scaledown.go | 2 +- pgo/cmd/schedule.go | 2 +- pgo/cmd/show.go | 2 +- pgo/cmd/status.go | 2 +- pgo/cmd/test.go | 2 +- pgo/cmd/update.go | 2 +- pgo/cmd/upgrade.go | 2 +- pgo/cmd/user.go | 2 +- pgo/cmd/version.go | 2 +- pgo/cmd/watch.go | 2 +- pgo/cmd/workflow.go | 2 +- pgo/generatedocs.go | 2 +- pgo/pgo.go | 2 +- pgo/util/confirmation.go | 2 +- pgo/util/pad.go | 2 +- pgo/util/validation.go | 2 +- pkg/apis/crunchydata.com/v1/cluster.go | 2 +- pkg/apis/crunchydata.com/v1/common.go | 2 +- pkg/apis/crunchydata.com/v1/common_test.go | 2 +- pkg/apis/crunchydata.com/v1/doc.go | 2 +- pkg/apis/crunchydata.com/v1/policy.go | 2 +- pkg/apis/crunchydata.com/v1/register.go | 2 +- pkg/apis/crunchydata.com/v1/replica.go | 2 +- pkg/apis/crunchydata.com/v1/task.go | 2 +- pkg/apis/crunchydata.com/v1/zz_generated.deepcopy.go | 2 +- pkg/apiservermsgs/backrestmsgs.go | 2 +- pkg/apiservermsgs/catmsgs.go | 2 +- pkg/apiservermsgs/clonemsgs.go | 2 +- pkg/apiservermsgs/clustermsgs.go | 2 +- pkg/apiservermsgs/common.go | 2 +- pkg/apiservermsgs/configmsgs.go | 2 +- pkg/apiservermsgs/dfmsgs.go | 2 +- pkg/apiservermsgs/failovermsgs.go | 2 +- pkg/apiservermsgs/labelmsgs.go | 2 +- pkg/apiservermsgs/namespacemsgs.go | 2 +- pkg/apiservermsgs/pgadminmsgs.go | 2 +- pkg/apiservermsgs/pgbouncermsgs.go | 2 +- pkg/apiservermsgs/pgdumpmsgs.go | 2 +- pkg/apiservermsgs/pgorolemsgs.go | 2 +- pkg/apiservermsgs/pgousermsgs.go | 2 +- pkg/apiservermsgs/policymsgs.go | 2 +- pkg/apiservermsgs/pvcmsgs.go | 2 +- pkg/apiservermsgs/reloadmsgs.go | 2 +- pkg/apiservermsgs/restartmsgs.go | 2 +- pkg/apiservermsgs/schedulemsgs.go | 2 +- pkg/apiservermsgs/statusmsgs.go | 2 +- pkg/apiservermsgs/upgrademsgs.go | 2 +- pkg/apiservermsgs/usermsgs.go | 2 +- pkg/apiservermsgs/versionmsgs.go | 2 +- pkg/apiservermsgs/watchmsgs.go | 2 +- pkg/apiservermsgs/workflowmsgs.go | 2 +- pkg/events/eventing.go | 2 +- pkg/events/eventtype.go | 2 +- pkg/events/pgoeventtype.go | 2 +- pkg/generated/clientset/versioned/clientset.go | 2 +- pkg/generated/clientset/versioned/doc.go | 2 +- pkg/generated/clientset/versioned/fake/clientset_generated.go | 2 +- pkg/generated/clientset/versioned/fake/doc.go | 2 +- pkg/generated/clientset/versioned/fake/register.go | 2 +- pkg/generated/clientset/versioned/scheme/doc.go | 2 +- pkg/generated/clientset/versioned/scheme/register.go | 2 +- .../typed/crunchydata.com/v1/crunchydata.com_client.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/doc.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/fake/doc.go | 2 +- .../crunchydata.com/v1/fake/fake_crunchydata.com_client.go | 2 +- .../versioned/typed/crunchydata.com/v1/fake/fake_pgcluster.go | 2 +- .../versioned/typed/crunchydata.com/v1/fake/fake_pgpolicy.go | 2 +- .../versioned/typed/crunchydata.com/v1/fake/fake_pgreplica.go | 2 +- .../versioned/typed/crunchydata.com/v1/fake/fake_pgtask.go | 2 +- .../versioned/typed/crunchydata.com/v1/generated_expansion.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/pgcluster.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/pgpolicy.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/pgreplica.go | 2 +- .../clientset/versioned/typed/crunchydata.com/v1/pgtask.go | 2 +- .../informers/externalversions/crunchydata.com/interface.go | 2 +- .../informers/externalversions/crunchydata.com/v1/interface.go | 2 +- .../informers/externalversions/crunchydata.com/v1/pgcluster.go | 2 +- .../informers/externalversions/crunchydata.com/v1/pgpolicy.go | 2 +- .../informers/externalversions/crunchydata.com/v1/pgreplica.go | 2 +- .../informers/externalversions/crunchydata.com/v1/pgtask.go | 2 +- pkg/generated/informers/externalversions/factory.go | 2 +- pkg/generated/informers/externalversions/generic.go | 2 +- .../externalversions/internalinterfaces/factory_interfaces.go | 2 +- pkg/generated/listers/crunchydata.com/v1/expansion_generated.go | 2 +- pkg/generated/listers/crunchydata.com/v1/pgcluster.go | 2 +- pkg/generated/listers/crunchydata.com/v1/pgpolicy.go | 2 +- pkg/generated/listers/crunchydata.com/v1/pgreplica.go | 2 +- pkg/generated/listers/crunchydata.com/v1/pgtask.go | 2 +- postgres-operator.go | 2 +- pv/create-pv-nfs-label.sh | 2 +- pv/create-pv-nfs-legacy.sh | 2 +- pv/create-pv-nfs.sh | 2 +- pv/create-pv.sh | 2 +- pv/delete-pv.sh | 2 +- testing/pgo_cli/cluster_annotation_test.go | 2 +- testing/pgo_cli/cluster_backup_test.go | 2 +- testing/pgo_cli/cluster_cat_test.go | 2 +- testing/pgo_cli/cluster_clone_test.go | 2 +- testing/pgo_cli/cluster_create_test.go | 2 +- testing/pgo_cli/cluster_delete_test.go | 2 +- testing/pgo_cli/cluster_df_test.go | 2 +- testing/pgo_cli/cluster_failover_test.go | 2 +- testing/pgo_cli/cluster_label_test.go | 2 +- testing/pgo_cli/cluster_pgbouncer_test.go | 2 +- testing/pgo_cli/cluster_policy_test.go | 2 +- testing/pgo_cli/cluster_pvc_test.go | 2 +- testing/pgo_cli/cluster_reload_test.go | 2 +- testing/pgo_cli/cluster_restart_test.go | 2 +- testing/pgo_cli/cluster_scale_test.go | 2 +- testing/pgo_cli/cluster_scaledown_test.go | 2 +- testing/pgo_cli/cluster_test_test.go | 2 +- testing/pgo_cli/cluster_user_test.go | 2 +- testing/pgo_cli/operator_namespace_test.go | 2 +- testing/pgo_cli/operator_rbac_test.go | 2 +- testing/pgo_cli/operator_test.go | 2 +- testing/pgo_cli/suite_helpers_test.go | 2 +- testing/pgo_cli/suite_pgo_cmd_test.go | 2 +- testing/pgo_cli/suite_test.go | 2 +- 406 files changed, 406 insertions(+), 406 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index f8ebe3dacd..79e1438a7d 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -176,7 +176,7 @@ END OF TERMS AND CONDITIONS - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/apiserver.go b/apiserver.go index 3df9608796..49ec61657a 100644 --- a/apiserver.go +++ b/apiserver.go @@ -1,7 +1,7 @@ package main /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/bin/crunchy-postgres-exporter/common_lib.sh b/bin/crunchy-postgres-exporter/common_lib.sh index a42a618eb1..5dd828322c 100755 --- a/bin/crunchy-postgres-exporter/common_lib.sh +++ b/bin/crunchy-postgres-exporter/common_lib.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/crunchy-postgres-exporter/start.sh b/bin/crunchy-postgres-exporter/start.sh index 5ecfc1c07c..b98bf56bdd 100755 --- a/bin/crunchy-postgres-exporter/start.sh +++ b/bin/crunchy-postgres-exporter/start.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/get-deps.sh b/bin/get-deps.sh index 6c3e39324e..fa199dca13 100755 --- a/bin/get-deps.sh +++ b/bin/get-deps.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/get-pgmonitor.sh b/bin/get-pgmonitor.sh index f48d842399..5bf97d1475 100755 --- a/bin/get-pgmonitor.sh +++ b/bin/get-pgmonitor.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/license_aggregator.sh b/bin/license_aggregator.sh index dedd6ac31f..0405891d38 100755 --- a/bin/license_aggregator.sh +++ b/bin/license_aggregator.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2021 Crunchy Data Solutions, Inc. +# Copyright 2021 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-backrest-repo-sync/pgo-backrest-repo-sync.sh b/bin/pgo-backrest-repo-sync/pgo-backrest-repo-sync.sh index f4bf1f1709..2eabeedc6e 100644 --- a/bin/pgo-backrest-repo-sync/pgo-backrest-repo-sync.sh +++ b/bin/pgo-backrest-repo-sync/pgo-backrest-repo-sync.sh @@ -1,6 +1,6 @@ #!/bin/bash -x -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-backrest-repo/pgo-backrest-repo.sh b/bin/pgo-backrest-repo/pgo-backrest-repo.sh index 925e5808a3..c470a68210 100755 --- a/bin/pgo-backrest-repo/pgo-backrest-repo.sh +++ b/bin/pgo-backrest-repo/pgo-backrest-repo.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-backrest-restore/pgo-backrest-restore.sh b/bin/pgo-backrest-restore/pgo-backrest-restore.sh index a0373b7a96..8d250ea842 100755 --- a/bin/pgo-backrest-restore/pgo-backrest-restore.sh +++ b/bin/pgo-backrest-restore/pgo-backrest-restore.sh @@ -1,6 +1,6 @@ #!/bin/bash -x -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-backrest/pgo-backrest.sh b/bin/pgo-backrest/pgo-backrest.sh index 86f758a50a..f87aadf4df 100755 --- a/bin/pgo-backrest/pgo-backrest.sh +++ b/bin/pgo-backrest/pgo-backrest.sh @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-event/pgo-event.sh b/bin/pgo-event/pgo-event.sh index 1602e56193..7e16d5f3f1 100755 --- a/bin/pgo-event/pgo-event.sh +++ b/bin/pgo-event/pgo-event.sh @@ -1,6 +1,6 @@ #!/bin/bash -x -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-rmdata/start.sh b/bin/pgo-rmdata/start.sh index 228f891694..bf9dd9f9c2 100755 --- a/bin/pgo-rmdata/start.sh +++ b/bin/pgo-rmdata/start.sh @@ -1,6 +1,6 @@ #!/bin/bash -x -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-scheduler/start.sh b/bin/pgo-scheduler/start.sh index 4549d82d57..758a25bbd3 100755 --- a/bin/pgo-scheduler/start.sh +++ b/bin/pgo-scheduler/start.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pgo-sqlrunner/start.sh b/bin/pgo-sqlrunner/start.sh index 01422d26d7..8a272855f1 100755 --- a/bin/pgo-sqlrunner/start.sh +++ b/bin/pgo-sqlrunner/start.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pre-pull-crunchy-containers.sh b/bin/pre-pull-crunchy-containers.sh index 91cfcb9dc8..2726b2e02d 100755 --- a/bin/pre-pull-crunchy-containers.sh +++ b/bin/pre-pull-crunchy-containers.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/pull-from-gcr.sh b/bin/pull-from-gcr.sh index a180a7a472..e747b434c2 100755 --- a/bin/pull-from-gcr.sh +++ b/bin/pull-from-gcr.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index 4edc5c605a..f049d7d4b1 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/push-to-gcr.sh b/bin/push-to-gcr.sh index f0467affdb..931511bdd7 100755 --- a/bin/push-to-gcr.sh +++ b/bin/push-to-gcr.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/uid_daemon.sh b/bin/uid_daemon.sh index bc988bae79..58f8fd7505 100755 --- a/bin/uid_daemon.sh +++ b/bin/uid_daemon.sh @@ -1,6 +1,6 @@ #!/usr/bin/bash -# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/bin/upgrade-secret.sh b/bin/upgrade-secret.sh index f852008890..b52b751727 100755 --- a/bin/upgrade-secret.sh +++ b/bin/upgrade-secret.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/add-targeted-namespace-reconcile-rbac.sh b/deploy/add-targeted-namespace-reconcile-rbac.sh index 533e8507f9..66eddb96a0 100755 --- a/deploy/add-targeted-namespace-reconcile-rbac.sh +++ b/deploy/add-targeted-namespace-reconcile-rbac.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/add-targeted-namespace.sh b/deploy/add-targeted-namespace.sh index 61647e9feb..9d9b0e58d2 100755 --- a/deploy/add-targeted-namespace.sh +++ b/deploy/add-targeted-namespace.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/cleannamespaces.sh b/deploy/cleannamespaces.sh index 169bae6853..3ad11e8766 100755 --- a/deploy/cleannamespaces.sh +++ b/deploy/cleannamespaces.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/cleanup-rbac.sh b/deploy/cleanup-rbac.sh index df60c14500..61e07e13b4 100755 --- a/deploy/cleanup-rbac.sh +++ b/deploy/cleanup-rbac.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/cleanup.sh b/deploy/cleanup.sh index 711e276823..0068cb0fd7 100755 --- a/deploy/cleanup.sh +++ b/deploy/cleanup.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 34cb7332a4..e2abc5c25c 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/gen-api-keys.sh b/deploy/gen-api-keys.sh index a5444a9020..62b37982c0 100755 --- a/deploy/gen-api-keys.sh +++ b/deploy/gen-api-keys.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/install-bootstrap-creds.sh b/deploy/install-bootstrap-creds.sh index 6eb2ff13b2..28c249b42a 100755 --- a/deploy/install-bootstrap-creds.sh +++ b/deploy/install-bootstrap-creds.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/install-rbac.sh b/deploy/install-rbac.sh index ec7a4d7d49..9c1b900ca7 100755 --- a/deploy/install-rbac.sh +++ b/deploy/install-rbac.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/remove-crd.sh b/deploy/remove-crd.sh index f14bbfd022..3d2182c739 100755 --- a/deploy/remove-crd.sh +++ b/deploy/remove-crd.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/setupnamespaces.sh b/deploy/setupnamespaces.sh index 08aade3518..50f5e874a6 100755 --- a/deploy/setupnamespaces.sh +++ b/deploy/setupnamespaces.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/show-crd.sh b/deploy/show-crd.sh index 091c2b6810..6af0001e7c 100755 --- a/deploy/show-crd.sh +++ b/deploy/show-crd.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/upgrade-creds.sh b/deploy/upgrade-creds.sh index dfea9c10c1..1b1024202a 100755 --- a/deploy/upgrade-creds.sh +++ b/deploy/upgrade-creds.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/deploy/upgrade-pgo.sh b/deploy/upgrade-pgo.sh index 0999cd9b79..7f332c0340 100755 --- a/deploy/upgrade-pgo.sh +++ b/deploy/upgrade-pgo.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/docs/layouts/partials/flex/body-aftercontent.html b/docs/layouts/partials/flex/body-aftercontent.html index 8d5f330f56..1ec038ea12 100644 --- a/docs/layouts/partials/flex/body-aftercontent.html +++ b/docs/layouts/partials/flex/body-aftercontent.html @@ -35,7 +35,7 @@
-

© 2017 - 2021 Crunchy Data Solutions, Inc.

+

© 2017 - 2022 Crunchy Data Solutions, Inc.

diff --git a/examples/create-by-resource/run.sh b/examples/create-by-resource/run.sh index c450490734..271154f8f9 100755 --- a/examples/create-by-resource/run.sh +++ b/examples/create-by-resource/run.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2019 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/examples/custom-config/create.sh b/examples/custom-config/create.sh index 5900132568..519ab0433e 100755 --- a/examples/custom-config/create.sh +++ b/examples/custom-config/create.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/examples/custom-config/setup.sql b/examples/custom-config/setup.sql index 1a05bce487..ca7510ff93 100644 --- a/examples/custom-config/setup.sql +++ b/examples/custom-config/setup.sql @@ -1,5 +1,5 @@ /* - * Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + * Copyright 2017 - 2022 Crunchy Data Solutions, Inc. * 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 diff --git a/hack/boilerplate.go.txt b/hack/boilerplate.go.txt index e681957476..22523257ce 100644 --- a/hack/boilerplate.go.txt +++ b/hack/boilerplate.go.txt @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/hack/config_sync.sh b/hack/config_sync.sh index 6317c556a1..b7a7b95b95 100755 --- a/hack/config_sync.sh +++ b/hack/config_sync.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 97fb0aa383..f010b87f3a 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/hack/verify-codegen.sh b/hack/verify-codegen.sh index 27eccb0eb1..4c359a10bf 100755 --- a/hack/verify-codegen.sh +++ b/hack/verify-codegen.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/installers/ansible/roles/pgo-operator/templates/add-targeted-namespace.sh.j2 b/installers/ansible/roles/pgo-operator/templates/add-targeted-namespace.sh.j2 index ec5e9e82d6..b8f2ab2e9f 100644 --- a/installers/ansible/roles/pgo-operator/templates/add-targeted-namespace.sh.j2 +++ b/installers/ansible/roles/pgo-operator/templates/add-targeted-namespace.sh.j2 @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/installers/image/bin/pgo-deploy.sh b/installers/image/bin/pgo-deploy.sh index 92fc955e9a..088d37c5de 100755 --- a/installers/image/bin/pgo-deploy.sh +++ b/installers/image/bin/pgo-deploy.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index 6c32646128..53f6c0fff4 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2020 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/internal/apiserver/backrestservice/backrestimpl.go b/internal/apiserver/backrestservice/backrestimpl.go index 7b5b7d1b64..b50b04c082 100644 --- a/internal/apiserver/backrestservice/backrestimpl.go +++ b/internal/apiserver/backrestservice/backrestimpl.go @@ -1,7 +1,7 @@ package backrestservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/backrestservice/backrestservice.go b/internal/apiserver/backrestservice/backrestservice.go index 00f4aba481..c0a63a8a44 100644 --- a/internal/apiserver/backrestservice/backrestservice.go +++ b/internal/apiserver/backrestservice/backrestservice.go @@ -1,7 +1,7 @@ package backrestservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/backupoptions/backupoptionsutil.go b/internal/apiserver/backupoptions/backupoptionsutil.go index 3c0fb5e6a5..3765bd05c7 100644 --- a/internal/apiserver/backupoptions/backupoptionsutil.go +++ b/internal/apiserver/backupoptions/backupoptionsutil.go @@ -1,7 +1,7 @@ package backupoptions /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/backupoptions/backupoptionsutil_test.go b/internal/apiserver/backupoptions/backupoptionsutil_test.go index 44048f15d8..8a996b4591 100644 --- a/internal/apiserver/backupoptions/backupoptionsutil_test.go +++ b/internal/apiserver/backupoptions/backupoptionsutil_test.go @@ -1,7 +1,7 @@ package backupoptions /* -Copyright 2021 Crunchy Data Solutions, Inc. +Copyright 2021 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/backupoptions/pgbackrestoptions.go b/internal/apiserver/backupoptions/pgbackrestoptions.go index 2deb8d2dcf..6fea3e45e7 100644 --- a/internal/apiserver/backupoptions/pgbackrestoptions.go +++ b/internal/apiserver/backupoptions/pgbackrestoptions.go @@ -1,7 +1,7 @@ package backupoptions /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/backupoptions/pgdumpoptions.go b/internal/apiserver/backupoptions/pgdumpoptions.go index bfbae16c23..9d2e30cd2a 100644 --- a/internal/apiserver/backupoptions/pgdumpoptions.go +++ b/internal/apiserver/backupoptions/pgdumpoptions.go @@ -1,7 +1,7 @@ package backupoptions /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/catservice/catimpl.go b/internal/apiserver/catservice/catimpl.go index f3bd91ce9b..42e926b153 100644 --- a/internal/apiserver/catservice/catimpl.go +++ b/internal/apiserver/catservice/catimpl.go @@ -1,7 +1,7 @@ package catservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/catservice/catservice.go b/internal/apiserver/catservice/catservice.go index 9c34db38db..c2c0e24d34 100644 --- a/internal/apiserver/catservice/catservice.go +++ b/internal/apiserver/catservice/catservice.go @@ -1,7 +1,7 @@ package catservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/cloneservice/cloneimpl.go b/internal/apiserver/cloneservice/cloneimpl.go index 452c201d09..2642ce4227 100644 --- a/internal/apiserver/cloneservice/cloneimpl.go +++ b/internal/apiserver/cloneservice/cloneimpl.go @@ -1,7 +1,7 @@ package cloneservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/cloneservice/cloneservice.go b/internal/apiserver/cloneservice/cloneservice.go index 7bf035e94f..0d04628788 100644 --- a/internal/apiserver/cloneservice/cloneservice.go +++ b/internal/apiserver/cloneservice/cloneservice.go @@ -1,7 +1,7 @@ package cloneservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index 93724648c1..8a46bff132 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -1,7 +1,7 @@ package clusterservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/clusterservice/clusterservice.go b/internal/apiserver/clusterservice/clusterservice.go index 9d1a3a29e5..f12d09323c 100644 --- a/internal/apiserver/clusterservice/clusterservice.go +++ b/internal/apiserver/clusterservice/clusterservice.go @@ -1,7 +1,7 @@ package clusterservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/clusterservice/scaleimpl.go b/internal/apiserver/clusterservice/scaleimpl.go index 11fe1e55f6..aad9874393 100644 --- a/internal/apiserver/clusterservice/scaleimpl.go +++ b/internal/apiserver/clusterservice/scaleimpl.go @@ -1,7 +1,7 @@ package clusterservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/clusterservice/scaleservice.go b/internal/apiserver/clusterservice/scaleservice.go index bb742691e7..2f6fd51246 100644 --- a/internal/apiserver/clusterservice/scaleservice.go +++ b/internal/apiserver/clusterservice/scaleservice.go @@ -1,7 +1,7 @@ package clusterservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/common.go b/internal/apiserver/common.go index a73e826a8a..b8a88294ad 100644 --- a/internal/apiserver/common.go +++ b/internal/apiserver/common.go @@ -1,7 +1,7 @@ package apiserver /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/common_test.go b/internal/apiserver/common_test.go index 712ca11611..d2ab1cd3bc 100644 --- a/internal/apiserver/common_test.go +++ b/internal/apiserver/common_test.go @@ -1,7 +1,7 @@ package apiserver /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/configservice/configimpl.go b/internal/apiserver/configservice/configimpl.go index dc7ec2274c..6f956479c0 100644 --- a/internal/apiserver/configservice/configimpl.go +++ b/internal/apiserver/configservice/configimpl.go @@ -1,7 +1,7 @@ package configservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/configservice/configservice.go b/internal/apiserver/configservice/configservice.go index 92a296ac3f..d8ffd774c5 100644 --- a/internal/apiserver/configservice/configservice.go +++ b/internal/apiserver/configservice/configservice.go @@ -1,7 +1,7 @@ package configservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/dfservice/dfimpl.go b/internal/apiserver/dfservice/dfimpl.go index e9e62df216..7dfc4c265c 100644 --- a/internal/apiserver/dfservice/dfimpl.go +++ b/internal/apiserver/dfservice/dfimpl.go @@ -1,7 +1,7 @@ package dfservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/dfservice/dfservice.go b/internal/apiserver/dfservice/dfservice.go index 3a71e9feab..1eb34d2a77 100644 --- a/internal/apiserver/dfservice/dfservice.go +++ b/internal/apiserver/dfservice/dfservice.go @@ -1,7 +1,7 @@ package dfservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/failoverservice/failoverimpl.go b/internal/apiserver/failoverservice/failoverimpl.go index cd40406e5c..fce8f4554d 100644 --- a/internal/apiserver/failoverservice/failoverimpl.go +++ b/internal/apiserver/failoverservice/failoverimpl.go @@ -1,7 +1,7 @@ package failoverservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/failoverservice/failoverservice.go b/internal/apiserver/failoverservice/failoverservice.go index e80d7e05de..e702de9d6b 100644 --- a/internal/apiserver/failoverservice/failoverservice.go +++ b/internal/apiserver/failoverservice/failoverservice.go @@ -1,7 +1,7 @@ package failoverservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/labelservice/labelimpl.go b/internal/apiserver/labelservice/labelimpl.go index deb49e32b9..c50fb9b49c 100644 --- a/internal/apiserver/labelservice/labelimpl.go +++ b/internal/apiserver/labelservice/labelimpl.go @@ -1,7 +1,7 @@ package labelservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/labelservice/labelservice.go b/internal/apiserver/labelservice/labelservice.go index 5921a7633b..7f730047ff 100644 --- a/internal/apiserver/labelservice/labelservice.go +++ b/internal/apiserver/labelservice/labelservice.go @@ -1,7 +1,7 @@ package labelservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/middleware.go b/internal/apiserver/middleware.go index 58a1fcd77d..3977341a34 100644 --- a/internal/apiserver/middleware.go +++ b/internal/apiserver/middleware.go @@ -1,7 +1,7 @@ package apiserver /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/namespaceservice/namespaceimpl.go b/internal/apiserver/namespaceservice/namespaceimpl.go index 281bb5d085..948ca18ae9 100644 --- a/internal/apiserver/namespaceservice/namespaceimpl.go +++ b/internal/apiserver/namespaceservice/namespaceimpl.go @@ -1,7 +1,7 @@ package namespaceservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/namespaceservice/namespaceservice.go b/internal/apiserver/namespaceservice/namespaceservice.go index 1e348218fa..c04e804e35 100644 --- a/internal/apiserver/namespaceservice/namespaceservice.go +++ b/internal/apiserver/namespaceservice/namespaceservice.go @@ -1,7 +1,7 @@ package namespaceservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/perms.go b/internal/apiserver/perms.go index 1874ffbd3c..364effff71 100644 --- a/internal/apiserver/perms.go +++ b/internal/apiserver/perms.go @@ -1,7 +1,7 @@ package apiserver /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgadminservice/pgadminimpl.go b/internal/apiserver/pgadminservice/pgadminimpl.go index 2ac3130a8f..b10ab3d2bb 100644 --- a/internal/apiserver/pgadminservice/pgadminimpl.go +++ b/internal/apiserver/pgadminservice/pgadminimpl.go @@ -1,7 +1,7 @@ package pgadminservice /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgadminservice/pgadminservice.go b/internal/apiserver/pgadminservice/pgadminservice.go index 44fe32f6b7..a0f77c57da 100644 --- a/internal/apiserver/pgadminservice/pgadminservice.go +++ b/internal/apiserver/pgadminservice/pgadminservice.go @@ -1,7 +1,7 @@ package pgadminservice /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgbouncerservice/pgbouncerimpl.go b/internal/apiserver/pgbouncerservice/pgbouncerimpl.go index 172cc01e01..a0dd070a3f 100644 --- a/internal/apiserver/pgbouncerservice/pgbouncerimpl.go +++ b/internal/apiserver/pgbouncerservice/pgbouncerimpl.go @@ -1,7 +1,7 @@ package pgbouncerservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgbouncerservice/pgbouncerservice.go b/internal/apiserver/pgbouncerservice/pgbouncerservice.go index 54fa6b3dae..623484dce1 100644 --- a/internal/apiserver/pgbouncerservice/pgbouncerservice.go +++ b/internal/apiserver/pgbouncerservice/pgbouncerservice.go @@ -1,7 +1,7 @@ package pgbouncerservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgdumpservice/pgdumpimpl.go b/internal/apiserver/pgdumpservice/pgdumpimpl.go index 2297a99242..c5d1e468b4 100644 --- a/internal/apiserver/pgdumpservice/pgdumpimpl.go +++ b/internal/apiserver/pgdumpservice/pgdumpimpl.go @@ -1,7 +1,7 @@ package pgdumpservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgdumpservice/pgdumpservice.go b/internal/apiserver/pgdumpservice/pgdumpservice.go index a31a2a788a..09a6f8a7e8 100644 --- a/internal/apiserver/pgdumpservice/pgdumpservice.go +++ b/internal/apiserver/pgdumpservice/pgdumpservice.go @@ -1,7 +1,7 @@ package pgdumpservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgoroleservice/pgoroleimpl.go b/internal/apiserver/pgoroleservice/pgoroleimpl.go index 5d9e1c7c2c..0d5d7e1d33 100644 --- a/internal/apiserver/pgoroleservice/pgoroleimpl.go +++ b/internal/apiserver/pgoroleservice/pgoroleimpl.go @@ -1,7 +1,7 @@ package pgoroleservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgoroleservice/pgoroleservice.go b/internal/apiserver/pgoroleservice/pgoroleservice.go index 9b9c70b061..8ddbdc6612 100644 --- a/internal/apiserver/pgoroleservice/pgoroleservice.go +++ b/internal/apiserver/pgoroleservice/pgoroleservice.go @@ -1,7 +1,7 @@ package pgoroleservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgouserservice/pgouserimpl.go b/internal/apiserver/pgouserservice/pgouserimpl.go index f7627c47cf..f03a98dfbf 100644 --- a/internal/apiserver/pgouserservice/pgouserimpl.go +++ b/internal/apiserver/pgouserservice/pgouserimpl.go @@ -1,7 +1,7 @@ package pgouserservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pgouserservice/pgouserservice.go b/internal/apiserver/pgouserservice/pgouserservice.go index 1abaf309d6..efecfe5e34 100644 --- a/internal/apiserver/pgouserservice/pgouserservice.go +++ b/internal/apiserver/pgouserservice/pgouserservice.go @@ -1,7 +1,7 @@ package pgouserservice /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/policyservice/policyimpl.go b/internal/apiserver/policyservice/policyimpl.go index 995b9648a8..faa669f78b 100644 --- a/internal/apiserver/policyservice/policyimpl.go +++ b/internal/apiserver/policyservice/policyimpl.go @@ -1,7 +1,7 @@ package policyservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/policyservice/policyservice.go b/internal/apiserver/policyservice/policyservice.go index 874c6c4ff9..400164aa51 100644 --- a/internal/apiserver/policyservice/policyservice.go +++ b/internal/apiserver/policyservice/policyservice.go @@ -1,7 +1,7 @@ package policyservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pvcservice/pvcimpl.go b/internal/apiserver/pvcservice/pvcimpl.go index ca07a3e8d9..46e2514bd1 100644 --- a/internal/apiserver/pvcservice/pvcimpl.go +++ b/internal/apiserver/pvcservice/pvcimpl.go @@ -1,7 +1,7 @@ package pvcservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/pvcservice/pvcservice.go b/internal/apiserver/pvcservice/pvcservice.go index de24ab7616..cb8684789b 100644 --- a/internal/apiserver/pvcservice/pvcservice.go +++ b/internal/apiserver/pvcservice/pvcservice.go @@ -1,7 +1,7 @@ package pvcservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/reloadservice/reloadimpl.go b/internal/apiserver/reloadservice/reloadimpl.go index da68706a90..000e455c83 100644 --- a/internal/apiserver/reloadservice/reloadimpl.go +++ b/internal/apiserver/reloadservice/reloadimpl.go @@ -1,7 +1,7 @@ package reloadservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/reloadservice/reloadservice.go b/internal/apiserver/reloadservice/reloadservice.go index e464a7991e..fb8b87f7bb 100644 --- a/internal/apiserver/reloadservice/reloadservice.go +++ b/internal/apiserver/reloadservice/reloadservice.go @@ -1,7 +1,7 @@ package reloadservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/restartservice/restartimpl.go b/internal/apiserver/restartservice/restartimpl.go index ffb5e4f692..062c413066 100644 --- a/internal/apiserver/restartservice/restartimpl.go +++ b/internal/apiserver/restartservice/restartimpl.go @@ -1,7 +1,7 @@ package restartservice /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/restartservice/restartservice.go b/internal/apiserver/restartservice/restartservice.go index 460635bec1..45c7073a26 100644 --- a/internal/apiserver/restartservice/restartservice.go +++ b/internal/apiserver/restartservice/restartservice.go @@ -1,7 +1,7 @@ package restartservice /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/root.go b/internal/apiserver/root.go index c76a93f0ff..a08d831dd5 100644 --- a/internal/apiserver/root.go +++ b/internal/apiserver/root.go @@ -1,7 +1,7 @@ package apiserver /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/routing/doc.go b/internal/apiserver/routing/doc.go index 2807dfb978..c24eebfbe6 100644 --- a/internal/apiserver/routing/doc.go +++ b/internal/apiserver/routing/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/routing/routes.go b/internal/apiserver/routing/routes.go index 3488ee9f25..401b7150a7 100644 --- a/internal/apiserver/routing/routes.go +++ b/internal/apiserver/routing/routes.go @@ -1,7 +1,7 @@ package routing /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/scheduleservice/scheduleimpl.go b/internal/apiserver/scheduleservice/scheduleimpl.go index 1ecc2992ec..86b38eb907 100644 --- a/internal/apiserver/scheduleservice/scheduleimpl.go +++ b/internal/apiserver/scheduleservice/scheduleimpl.go @@ -1,7 +1,7 @@ package scheduleservice /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/scheduleservice/scheduleservice.go b/internal/apiserver/scheduleservice/scheduleservice.go index 52f00bbe14..b4de3a01d4 100644 --- a/internal/apiserver/scheduleservice/scheduleservice.go +++ b/internal/apiserver/scheduleservice/scheduleservice.go @@ -1,7 +1,7 @@ package scheduleservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/statusservice/statusimpl.go b/internal/apiserver/statusservice/statusimpl.go index 5388842d39..618eee2908 100644 --- a/internal/apiserver/statusservice/statusimpl.go +++ b/internal/apiserver/statusservice/statusimpl.go @@ -1,7 +1,7 @@ package statusservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/statusservice/statusservice.go b/internal/apiserver/statusservice/statusservice.go index 2dd232dc4c..4f4305321a 100644 --- a/internal/apiserver/statusservice/statusservice.go +++ b/internal/apiserver/statusservice/statusservice.go @@ -1,7 +1,7 @@ package statusservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/upgradeservice/upgradeimpl.go b/internal/apiserver/upgradeservice/upgradeimpl.go index a157c34d30..1d576dc52f 100644 --- a/internal/apiserver/upgradeservice/upgradeimpl.go +++ b/internal/apiserver/upgradeservice/upgradeimpl.go @@ -1,7 +1,7 @@ package upgradeservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/upgradeservice/upgradeservice.go b/internal/apiserver/upgradeservice/upgradeservice.go index 7f6e1cd350..c225c4cd1c 100644 --- a/internal/apiserver/upgradeservice/upgradeservice.go +++ b/internal/apiserver/upgradeservice/upgradeservice.go @@ -1,7 +1,7 @@ package upgradeservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/userservice/userimpl.go b/internal/apiserver/userservice/userimpl.go index cbc71c2485..369ead5566 100644 --- a/internal/apiserver/userservice/userimpl.go +++ b/internal/apiserver/userservice/userimpl.go @@ -1,7 +1,7 @@ package userservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/userservice/userimpl_test.go b/internal/apiserver/userservice/userimpl_test.go index ba6f378c0d..ffa310924f 100644 --- a/internal/apiserver/userservice/userimpl_test.go +++ b/internal/apiserver/userservice/userimpl_test.go @@ -1,7 +1,7 @@ package userservice /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/userservice/userservice.go b/internal/apiserver/userservice/userservice.go index 709105daae..e5ab49cc71 100644 --- a/internal/apiserver/userservice/userservice.go +++ b/internal/apiserver/userservice/userservice.go @@ -1,7 +1,7 @@ package userservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/versionservice/versionimpl.go b/internal/apiserver/versionservice/versionimpl.go index 959cfae669..fb62a4a9bb 100644 --- a/internal/apiserver/versionservice/versionimpl.go +++ b/internal/apiserver/versionservice/versionimpl.go @@ -1,7 +1,7 @@ package versionservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/versionservice/versionservice.go b/internal/apiserver/versionservice/versionservice.go index 5affd301dd..d88fb2f86d 100644 --- a/internal/apiserver/versionservice/versionservice.go +++ b/internal/apiserver/versionservice/versionservice.go @@ -1,7 +1,7 @@ package versionservice /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/workflowservice/workflowimpl.go b/internal/apiserver/workflowservice/workflowimpl.go index 1f0742704b..d6deba6ded 100644 --- a/internal/apiserver/workflowservice/workflowimpl.go +++ b/internal/apiserver/workflowservice/workflowimpl.go @@ -1,7 +1,7 @@ package workflowservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/apiserver/workflowservice/workflowservice.go b/internal/apiserver/workflowservice/workflowservice.go index 168937d31d..ec5afc84a9 100644 --- a/internal/apiserver/workflowservice/workflowservice.go +++ b/internal/apiserver/workflowservice/workflowservice.go @@ -1,7 +1,7 @@ package workflowservice /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/annotations.go b/internal/config/annotations.go index d8c872e879..f5785048d6 100644 --- a/internal/config/annotations.go +++ b/internal/config/annotations.go @@ -1,7 +1,7 @@ package config /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/defaults.go b/internal/config/defaults.go index 776dfd7c90..a63340f16d 100644 --- a/internal/config/defaults.go +++ b/internal/config/defaults.go @@ -1,7 +1,7 @@ package config /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/images.go b/internal/config/images.go index 455677bb13..359105c38a 100644 --- a/internal/config/images.go +++ b/internal/config/images.go @@ -1,7 +1,7 @@ package config /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/labels.go b/internal/config/labels.go index 4ef9676a33..d043bffca9 100644 --- a/internal/config/labels.go +++ b/internal/config/labels.go @@ -1,7 +1,7 @@ package config /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/pgoconfig.go b/internal/config/pgoconfig.go index c48b122b1f..232c6995f6 100644 --- a/internal/config/pgoconfig.go +++ b/internal/config/pgoconfig.go @@ -1,7 +1,7 @@ package config /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/config/volumes.go b/internal/config/volumes.go index 4738d682c1..80cd3b9b5d 100644 --- a/internal/config/volumes.go +++ b/internal/config/volumes.go @@ -1,7 +1,7 @@ package config /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/configmap/configmapcontroller.go b/internal/controller/configmap/configmapcontroller.go index 9c9710c345..644e387418 100644 --- a/internal/controller/configmap/configmapcontroller.go +++ b/internal/controller/configmap/configmapcontroller.go @@ -1,7 +1,7 @@ package configmap /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/configmap/synchandler.go b/internal/controller/configmap/synchandler.go index 289a6c0afa..1f0c2a0a31 100644 --- a/internal/controller/configmap/synchandler.go +++ b/internal/controller/configmap/synchandler.go @@ -1,7 +1,7 @@ package configmap /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/controllerutil.go b/internal/controller/controllerutil.go index 849582db04..01fbcc1cb4 100644 --- a/internal/controller/controllerutil.go +++ b/internal/controller/controllerutil.go @@ -1,7 +1,7 @@ package controller /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/backresthandler.go b/internal/controller/job/backresthandler.go index 7873089a37..2be39e9040 100644 --- a/internal/controller/job/backresthandler.go +++ b/internal/controller/job/backresthandler.go @@ -1,7 +1,7 @@ package job /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/bootstraphandler.go b/internal/controller/job/bootstraphandler.go index c26817da2d..133c87c16d 100644 --- a/internal/controller/job/bootstraphandler.go +++ b/internal/controller/job/bootstraphandler.go @@ -1,7 +1,7 @@ package job /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/jobcontroller.go b/internal/controller/job/jobcontroller.go index 75ce0ca9bb..cbc848623a 100644 --- a/internal/controller/job/jobcontroller.go +++ b/internal/controller/job/jobcontroller.go @@ -1,7 +1,7 @@ package job /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/jobevents.go b/internal/controller/job/jobevents.go index 05e1d0d0fe..0cb17e9f14 100644 --- a/internal/controller/job/jobevents.go +++ b/internal/controller/job/jobevents.go @@ -1,7 +1,7 @@ package job /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/jobutil.go b/internal/controller/job/jobutil.go index e7a3113469..76135bcc32 100644 --- a/internal/controller/job/jobutil.go +++ b/internal/controller/job/jobutil.go @@ -1,7 +1,7 @@ package job /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/pgdumphandler.go b/internal/controller/job/pgdumphandler.go index dc9012cabd..a30cc6a232 100644 --- a/internal/controller/job/pgdumphandler.go +++ b/internal/controller/job/pgdumphandler.go @@ -1,7 +1,7 @@ package job /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/reposynchandler.go b/internal/controller/job/reposynchandler.go index 49b642b4bd..19ca398a62 100644 --- a/internal/controller/job/reposynchandler.go +++ b/internal/controller/job/reposynchandler.go @@ -1,7 +1,7 @@ package job /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/job/rmdatahandler.go b/internal/controller/job/rmdatahandler.go index e2f0693e66..a1203889a8 100644 --- a/internal/controller/job/rmdatahandler.go +++ b/internal/controller/job/rmdatahandler.go @@ -1,7 +1,7 @@ package job /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/manager/controllermanager.go b/internal/controller/manager/controllermanager.go index e2514d52a7..7655a3c1b0 100644 --- a/internal/controller/manager/controllermanager.go +++ b/internal/controller/manager/controllermanager.go @@ -1,7 +1,7 @@ package manager /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/manager/rbac.go b/internal/controller/manager/rbac.go index 5b04e7004d..c6e5ac208a 100644 --- a/internal/controller/manager/rbac.go +++ b/internal/controller/manager/rbac.go @@ -1,7 +1,7 @@ package manager /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/namespace/namespacecontroller.go b/internal/controller/namespace/namespacecontroller.go index 20db2e9534..36249affff 100644 --- a/internal/controller/namespace/namespacecontroller.go +++ b/internal/controller/namespace/namespacecontroller.go @@ -1,7 +1,7 @@ package namespace /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pgcluster/pgclustercontroller.go b/internal/controller/pgcluster/pgclustercontroller.go index 4568f87b50..07431d2e87 100644 --- a/internal/controller/pgcluster/pgclustercontroller.go +++ b/internal/controller/pgcluster/pgclustercontroller.go @@ -1,7 +1,7 @@ package pgcluster /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pgpolicy/pgpolicycontroller.go b/internal/controller/pgpolicy/pgpolicycontroller.go index a5be12bafb..4dab8be02c 100644 --- a/internal/controller/pgpolicy/pgpolicycontroller.go +++ b/internal/controller/pgpolicy/pgpolicycontroller.go @@ -1,7 +1,7 @@ package pgpolicy /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pgreplica/pgreplicacontroller.go b/internal/controller/pgreplica/pgreplicacontroller.go index 5ada57d30a..833f2018d8 100644 --- a/internal/controller/pgreplica/pgreplicacontroller.go +++ b/internal/controller/pgreplica/pgreplicacontroller.go @@ -1,7 +1,7 @@ package pgreplica /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pgtask/backresthandler.go b/internal/controller/pgtask/backresthandler.go index 31753453ab..e8e8d60e71 100644 --- a/internal/controller/pgtask/backresthandler.go +++ b/internal/controller/pgtask/backresthandler.go @@ -1,7 +1,7 @@ package pgtask /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pgtask/pgtaskcontroller.go b/internal/controller/pgtask/pgtaskcontroller.go index e26755e35e..e874323a09 100644 --- a/internal/controller/pgtask/pgtaskcontroller.go +++ b/internal/controller/pgtask/pgtaskcontroller.go @@ -1,7 +1,7 @@ package pgtask /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pod/inithandler.go b/internal/controller/pod/inithandler.go index 37b8b103d4..92348e7699 100644 --- a/internal/controller/pod/inithandler.go +++ b/internal/controller/pod/inithandler.go @@ -1,7 +1,7 @@ package pod /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pod/podcontroller.go b/internal/controller/pod/podcontroller.go index 30f21836b8..f26ac72dff 100644 --- a/internal/controller/pod/podcontroller.go +++ b/internal/controller/pod/podcontroller.go @@ -1,7 +1,7 @@ package pod /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pod/podevents.go b/internal/controller/pod/podevents.go index 7aa3c8da3a..f6df2ced38 100644 --- a/internal/controller/pod/podevents.go +++ b/internal/controller/pod/podevents.go @@ -1,7 +1,7 @@ package pod /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/controller/pod/promotionhandler.go b/internal/controller/pod/promotionhandler.go index 513a675f7b..271fda6045 100644 --- a/internal/controller/pod/promotionhandler.go +++ b/internal/controller/pod/promotionhandler.go @@ -1,7 +1,7 @@ package pod /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/client_config.go b/internal/kubeapi/client_config.go index 10285b7873..5049cc5468 100644 --- a/internal/kubeapi/client_config.go +++ b/internal/kubeapi/client_config.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/deployment.go b/internal/kubeapi/deployment.go index 5e9a665480..436a19e203 100644 --- a/internal/kubeapi/deployment.go +++ b/internal/kubeapi/deployment.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/endpoints.go b/internal/kubeapi/endpoints.go index d655ba1484..90ff217151 100644 --- a/internal/kubeapi/endpoints.go +++ b/internal/kubeapi/endpoints.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/errors.go b/internal/kubeapi/errors.go index ab5e9c07aa..b3f79e73ca 100644 --- a/internal/kubeapi/errors.go +++ b/internal/kubeapi/errors.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/exec.go b/internal/kubeapi/exec.go index c154ba1fa3..d807980c31 100644 --- a/internal/kubeapi/exec.go +++ b/internal/kubeapi/exec.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/fake/clientset.go b/internal/kubeapi/fake/clientset.go index 2ac060e1da..7623fea9c3 100644 --- a/internal/kubeapi/fake/clientset.go +++ b/internal/kubeapi/fake/clientset.go @@ -1,7 +1,7 @@ package fake /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/fake/fakeclients.go b/internal/kubeapi/fake/fakeclients.go index 173c7ea4e4..10c0f83f20 100644 --- a/internal/kubeapi/fake/fakeclients.go +++ b/internal/kubeapi/fake/fakeclients.go @@ -1,7 +1,7 @@ package fake /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/patch.go b/internal/kubeapi/patch.go index 57f11e6867..2042127db1 100644 --- a/internal/kubeapi/patch.go +++ b/internal/kubeapi/patch.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/patch_test.go b/internal/kubeapi/patch_test.go index 706ee4768d..a751f5f04b 100644 --- a/internal/kubeapi/patch_test.go +++ b/internal/kubeapi/patch_test.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/pod.go b/internal/kubeapi/pod.go index bedae52adf..4997e24e28 100644 --- a/internal/kubeapi/pod.go +++ b/internal/kubeapi/pod.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/volumes.go b/internal/kubeapi/volumes.go index 795b0a9151..26e1b2dd63 100644 --- a/internal/kubeapi/volumes.go +++ b/internal/kubeapi/volumes.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/kubeapi/volumes_test.go b/internal/kubeapi/volumes_test.go index 458a4153ef..f980f5bfe3 100644 --- a/internal/kubeapi/volumes_test.go +++ b/internal/kubeapi/volumes_test.go @@ -1,7 +1,7 @@ package kubeapi /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/logging/loglib.go b/internal/logging/loglib.go index 6205760a4e..830c45043c 100644 --- a/internal/logging/loglib.go +++ b/internal/logging/loglib.go @@ -2,7 +2,7 @@ package logging /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/ns/nslogic.go b/internal/ns/nslogic.go index b9bb8da878..1410653c23 100644 --- a/internal/ns/nslogic.go +++ b/internal/ns/nslogic.go @@ -1,7 +1,7 @@ package ns /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/backrest/backup.go b/internal/operator/backrest/backup.go index 055f6ac7a1..a7cb6785cd 100644 --- a/internal/operator/backrest/backup.go +++ b/internal/operator/backrest/backup.go @@ -1,7 +1,7 @@ package backrest /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/backrest/repo.go b/internal/operator/backrest/repo.go index d84b9773e2..be61e23f2f 100644 --- a/internal/operator/backrest/repo.go +++ b/internal/operator/backrest/repo.go @@ -1,7 +1,7 @@ package backrest /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/backrest/restore.go b/internal/operator/backrest/restore.go index cd0a1c8a24..51120a2ffd 100644 --- a/internal/operator/backrest/restore.go +++ b/internal/operator/backrest/restore.go @@ -1,7 +1,7 @@ package backrest /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/backrest/stanza.go b/internal/operator/backrest/stanza.go index a88b058d6e..185a6247c0 100644 --- a/internal/operator/backrest/stanza.go +++ b/internal/operator/backrest/stanza.go @@ -1,7 +1,7 @@ package backrest /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/clone.go b/internal/operator/cluster/clone.go index 494ca88e16..7e1d41e126 100644 --- a/internal/operator/cluster/clone.go +++ b/internal/operator/cluster/clone.go @@ -1,7 +1,7 @@ package cluster /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/cluster.go b/internal/operator/cluster/cluster.go index 40360ab12b..9de8c59717 100644 --- a/internal/operator/cluster/cluster.go +++ b/internal/operator/cluster/cluster.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/clusterlogic.go b/internal/operator/cluster/clusterlogic.go index 4270b456d9..a33c48cf46 100644 --- a/internal/operator/cluster/clusterlogic.go +++ b/internal/operator/cluster/clusterlogic.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/failover.go b/internal/operator/cluster/failover.go index e6533db7a6..d0e99157f9 100644 --- a/internal/operator/cluster/failover.go +++ b/internal/operator/cluster/failover.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/failoverlogic.go b/internal/operator/cluster/failoverlogic.go index cf61bff6e8..be0e39a462 100644 --- a/internal/operator/cluster/failoverlogic.go +++ b/internal/operator/cluster/failoverlogic.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/pgadmin.go b/internal/operator/cluster/pgadmin.go index 4a78c48a53..ad0a06c5e2 100644 --- a/internal/operator/cluster/pgadmin.go +++ b/internal/operator/cluster/pgadmin.go @@ -1,7 +1,7 @@ package cluster /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/pgbouncer.go b/internal/operator/cluster/pgbouncer.go index 422614131f..b5c550b09d 100644 --- a/internal/operator/cluster/pgbouncer.go +++ b/internal/operator/cluster/pgbouncer.go @@ -1,7 +1,7 @@ package cluster /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/pgbouncer_test.go b/internal/operator/cluster/pgbouncer_test.go index 2407da50a0..f3807dc2a6 100644 --- a/internal/operator/cluster/pgbouncer_test.go +++ b/internal/operator/cluster/pgbouncer_test.go @@ -1,7 +1,7 @@ package cluster /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/rmdata.go b/internal/operator/cluster/rmdata.go index bf0a8ce365..785815a4c5 100644 --- a/internal/operator/cluster/rmdata.go +++ b/internal/operator/cluster/rmdata.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/service.go b/internal/operator/cluster/service.go index f192be92cf..e24be777f1 100644 --- a/internal/operator/cluster/service.go +++ b/internal/operator/cluster/service.go @@ -4,7 +4,7 @@ package cluster /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/standby.go b/internal/operator/cluster/standby.go index 67ae9148e6..692f005695 100644 --- a/internal/operator/cluster/standby.go +++ b/internal/operator/cluster/standby.go @@ -1,7 +1,7 @@ package cluster /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/cluster/upgrade.go b/internal/operator/cluster/upgrade.go index 3ad3f66795..520097c51f 100644 --- a/internal/operator/cluster/upgrade.go +++ b/internal/operator/cluster/upgrade.go @@ -1,7 +1,7 @@ package cluster /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/clusterutilities.go b/internal/operator/clusterutilities.go index 500ccf26ea..8513071c13 100644 --- a/internal/operator/clusterutilities.go +++ b/internal/operator/clusterutilities.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/clusterutilities_test.go b/internal/operator/clusterutilities_test.go index f5f00d84ef..976b05b8d9 100644 --- a/internal/operator/clusterutilities_test.go +++ b/internal/operator/clusterutilities_test.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/common.go b/internal/operator/common.go index 00a34c9302..32ae3b3cb3 100644 --- a/internal/operator/common.go +++ b/internal/operator/common.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/config/configutil.go b/internal/operator/config/configutil.go index 0b4d594f27..4bd84dec41 100644 --- a/internal/operator/config/configutil.go +++ b/internal/operator/config/configutil.go @@ -1,7 +1,7 @@ package config /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/config/dcs.go b/internal/operator/config/dcs.go index 99c383d904..d74cc1fae9 100644 --- a/internal/operator/config/dcs.go +++ b/internal/operator/config/dcs.go @@ -1,7 +1,7 @@ package config /* - Copyright 2020 - 2021 Crunchy Data Solutions, Ind. + Copyright 2020 - 2022 Crunchy Data Solutions, Ind. 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 diff --git a/internal/operator/config/localdb.go b/internal/operator/config/localdb.go index dbdb9ab89e..208de465c5 100644 --- a/internal/operator/config/localdb.go +++ b/internal/operator/config/localdb.go @@ -1,7 +1,7 @@ package config /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inl. + Copyright 2020 - 2022 Crunchy Data Solutions, Inl. 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 diff --git a/internal/operator/operatorupgrade/version-check.go b/internal/operator/operatorupgrade/version-check.go index b49b2d430c..1e306b9a07 100644 --- a/internal/operator/operatorupgrade/version-check.go +++ b/internal/operator/operatorupgrade/version-check.go @@ -1,7 +1,7 @@ package operatorupgrade /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/pgbackrest.go b/internal/operator/pgbackrest.go index 7c4232c51c..98bd6c8e38 100644 --- a/internal/operator/pgbackrest.go +++ b/internal/operator/pgbackrest.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/pgbackrest_test.go b/internal/operator/pgbackrest_test.go index 38d09a6be6..f853e0e363 100644 --- a/internal/operator/pgbackrest_test.go +++ b/internal/operator/pgbackrest_test.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/pgdump/dump.go b/internal/operator/pgdump/dump.go index d1e6f393c1..33a0ad7b3c 100644 --- a/internal/operator/pgdump/dump.go +++ b/internal/operator/pgdump/dump.go @@ -1,7 +1,7 @@ package pgdump /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/pgdump/restore.go b/internal/operator/pgdump/restore.go index 2cf3d385e9..31a427a8e5 100644 --- a/internal/operator/pgdump/restore.go +++ b/internal/operator/pgdump/restore.go @@ -1,7 +1,7 @@ package pgdump /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/pvc/pvc.go b/internal/operator/pvc/pvc.go index b557514511..6db0fea08e 100644 --- a/internal/operator/pvc/pvc.go +++ b/internal/operator/pvc/pvc.go @@ -1,7 +1,7 @@ package pvc /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/storage.go b/internal/operator/storage.go index 2b1e3053b4..0341587c52 100644 --- a/internal/operator/storage.go +++ b/internal/operator/storage.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/storage_test.go b/internal/operator/storage_test.go index dacaaf78d3..8ed5237743 100644 --- a/internal/operator/storage_test.go +++ b/internal/operator/storage_test.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/task/applypolicies.go b/internal/operator/task/applypolicies.go index eb63f3674a..45852bca8c 100644 --- a/internal/operator/task/applypolicies.go +++ b/internal/operator/task/applypolicies.go @@ -1,7 +1,7 @@ package task /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/task/rmbackups.go b/internal/operator/task/rmbackups.go index 8c9744181c..b55424b620 100644 --- a/internal/operator/task/rmbackups.go +++ b/internal/operator/task/rmbackups.go @@ -1,7 +1,7 @@ package task /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/task/rmdata.go b/internal/operator/task/rmdata.go index c061170727..6c7adcbd06 100644 --- a/internal/operator/task/rmdata.go +++ b/internal/operator/task/rmdata.go @@ -1,7 +1,7 @@ package task /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/task/workflow.go b/internal/operator/task/workflow.go index a275f0e306..0a1983df64 100644 --- a/internal/operator/task/workflow.go +++ b/internal/operator/task/workflow.go @@ -1,7 +1,7 @@ package task /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/operator/wal.go b/internal/operator/wal.go index b9a14c3219..ca0889ca50 100644 --- a/internal/operator/wal.go +++ b/internal/operator/wal.go @@ -1,7 +1,7 @@ package operator /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/patroni/doc.go b/internal/patroni/doc.go index 6311d1e653..62c153097e 100644 --- a/internal/patroni/doc.go +++ b/internal/patroni/doc.go @@ -4,7 +4,7 @@ package patroni /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/patroni/patroni.go b/internal/patroni/patroni.go index 83d2772839..58bff584af 100644 --- a/internal/patroni/patroni.go +++ b/internal/patroni/patroni.go @@ -1,7 +1,7 @@ package patroni /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/backoff.go b/internal/pgadmin/backoff.go index 7fe83c72b6..b37a76fe33 100644 --- a/internal/pgadmin/backoff.go +++ b/internal/pgadmin/backoff.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/backoff_test.go b/internal/pgadmin/backoff_test.go index ec24f360fe..35101dbf80 100644 --- a/internal/pgadmin/backoff_test.go +++ b/internal/pgadmin/backoff_test.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/crypto.go b/internal/pgadmin/crypto.go index e2db5beb5d..6b116a6b0d 100644 --- a/internal/pgadmin/crypto.go +++ b/internal/pgadmin/crypto.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/crypto_test.go b/internal/pgadmin/crypto_test.go index 8c78611501..547478d4d3 100644 --- a/internal/pgadmin/crypto_test.go +++ b/internal/pgadmin/crypto_test.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/doc.go b/internal/pgadmin/doc.go index 58bf983ab5..d02d6feb3c 100644 --- a/internal/pgadmin/doc.go +++ b/internal/pgadmin/doc.go @@ -4,7 +4,7 @@ database which powers pgadmin */ package pgadmin /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/hash.go b/internal/pgadmin/hash.go index 64bc3df471..df6b0d4cc2 100644 --- a/internal/pgadmin/hash.go +++ b/internal/pgadmin/hash.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/logic.go b/internal/pgadmin/logic.go index 5481f69dc6..508d836066 100644 --- a/internal/pgadmin/logic.go +++ b/internal/pgadmin/logic.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/runner.go b/internal/pgadmin/runner.go index e4cb8a8ece..a7d6df3b0e 100644 --- a/internal/pgadmin/runner.go +++ b/internal/pgadmin/runner.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/pgadmin/server.go b/internal/pgadmin/server.go index b5ab3b6ef5..dcc68dd26c 100644 --- a/internal/pgadmin/server.go +++ b/internal/pgadmin/server.go @@ -1,7 +1,7 @@ package pgadmin /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/doc.go b/internal/postgres/doc.go index 2a2155a2cd..8010931373 100644 --- a/internal/postgres/doc.go +++ b/internal/postgres/doc.go @@ -5,7 +5,7 @@ package postgres /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/doc.go b/internal/postgres/password/doc.go index b0e22372f6..8950878ee2 100644 --- a/internal/postgres/password/doc.go +++ b/internal/postgres/password/doc.go @@ -4,7 +4,7 @@ package password /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/md5.go b/internal/postgres/password/md5.go index 7541d05a70..65cea2c081 100644 --- a/internal/postgres/password/md5.go +++ b/internal/postgres/password/md5.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/md5_test.go b/internal/postgres/password/md5_test.go index 5f810d884d..7bc2b1b6b8 100644 --- a/internal/postgres/password/md5_test.go +++ b/internal/postgres/password/md5_test.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/password.go b/internal/postgres/password/password.go index c0ad603a14..fc3966c9a7 100644 --- a/internal/postgres/password/password.go +++ b/internal/postgres/password/password.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/password_test.go b/internal/postgres/password/password_test.go index 1cf7e6f09f..41e54be000 100644 --- a/internal/postgres/password/password_test.go +++ b/internal/postgres/password/password_test.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/scram.go b/internal/postgres/password/scram.go index a28b187b90..b4e7bf1d3c 100644 --- a/internal/postgres/password/scram.go +++ b/internal/postgres/password/scram.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/postgres/password/scram_test.go b/internal/postgres/password/scram_test.go index 69397c1f8a..9bdde312ab 100644 --- a/internal/postgres/password/scram_test.go +++ b/internal/postgres/password/scram_test.go @@ -1,7 +1,7 @@ package password /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/tlsutil/primitives.go b/internal/tlsutil/primitives.go index a2c8da3187..3146ff7eea 100644 --- a/internal/tlsutil/primitives.go +++ b/internal/tlsutil/primitives.go @@ -1,7 +1,7 @@ package tlsutil /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/tlsutil/primitives_test.go b/internal/tlsutil/primitives_test.go index 0805621f57..507b3ddfe3 100644 --- a/internal/tlsutil/primitives_test.go +++ b/internal/tlsutil/primitives_test.go @@ -1,7 +1,7 @@ package tlsutil /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/backrest.go b/internal/util/backrest.go index eae2e62bfb..7b881bc8a5 100644 --- a/internal/util/backrest.go +++ b/internal/util/backrest.go @@ -1,7 +1,7 @@ package util /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/clone.go b/internal/util/clone.go index e01e34e670..cb69ec2055 100644 --- a/internal/util/clone.go +++ b/internal/util/clone.go @@ -1,7 +1,7 @@ package util /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/cluster.go b/internal/util/cluster.go index 61666b2a1a..bb38be3fa9 100644 --- a/internal/util/cluster.go +++ b/internal/util/cluster.go @@ -1,7 +1,7 @@ package util /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/failover.go b/internal/util/failover.go index dcee1da022..ac711b644b 100644 --- a/internal/util/failover.go +++ b/internal/util/failover.go @@ -1,7 +1,7 @@ package util /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/pgbouncer.go b/internal/util/pgbouncer.go index 3775c01378..219e771031 100644 --- a/internal/util/pgbouncer.go +++ b/internal/util/pgbouncer.go @@ -1,7 +1,7 @@ package util /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/policy.go b/internal/util/policy.go index d27be80503..931e2b73cb 100644 --- a/internal/util/policy.go +++ b/internal/util/policy.go @@ -1,7 +1,7 @@ package util /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/secrets.go b/internal/util/secrets.go index 43300706a1..e15d9e31c3 100644 --- a/internal/util/secrets.go +++ b/internal/util/secrets.go @@ -1,7 +1,7 @@ package util /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/secrets_test.go b/internal/util/secrets_test.go index 8dca7649bb..2754541d20 100644 --- a/internal/util/secrets_test.go +++ b/internal/util/secrets_test.go @@ -1,7 +1,7 @@ package util /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/ssh.go b/internal/util/ssh.go index e72eb77cdd..f811d970a3 100644 --- a/internal/util/ssh.go +++ b/internal/util/ssh.go @@ -1,7 +1,7 @@ package util /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/internal/util/util.go b/internal/util/util.go index 97a5fb3e27..b0b2f4831c 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -1,7 +1,7 @@ package util /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-backrest/pgo-backrest.go b/pgo-backrest/pgo-backrest.go index a02598bd37..8744cb097f 100644 --- a/pgo-backrest/pgo-backrest.go +++ b/pgo-backrest/pgo-backrest.go @@ -1,7 +1,7 @@ package main /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-rmdata/pgo-rmdata.go b/pgo-rmdata/pgo-rmdata.go index c191acbde9..6236125d5f 100644 --- a/pgo-rmdata/pgo-rmdata.go +++ b/pgo-rmdata/pgo-rmdata.go @@ -1,7 +1,7 @@ package main /* -Copyright 2019 - 2021 Crunchy Data +Copyright 2019 - 2022 Crunchy Data 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 diff --git a/pgo-rmdata/rmdata/process.go b/pgo-rmdata/rmdata/process.go index e96d4fb6c4..c1566d7820 100644 --- a/pgo-rmdata/rmdata/process.go +++ b/pgo-rmdata/rmdata/process.go @@ -1,7 +1,7 @@ package rmdata /* -Copyright 2019 - 2021 Crunchy Data +Copyright 2019 - 2022 Crunchy Data 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 diff --git a/pgo-rmdata/rmdata/types.go b/pgo-rmdata/rmdata/types.go index 06aec3ff3c..54273fb230 100644 --- a/pgo-rmdata/rmdata/types.go +++ b/pgo-rmdata/rmdata/types.go @@ -1,7 +1,7 @@ package rmdata /* -Copyright 2019 - 2021 Crunchy Data +Copyright 2019 - 2022 Crunchy Data 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 diff --git a/pgo-scheduler/pgo-scheduler.go b/pgo-scheduler/pgo-scheduler.go index a33ce5d18e..9ac87d43bb 100644 --- a/pgo-scheduler/pgo-scheduler.go +++ b/pgo-scheduler/pgo-scheduler.go @@ -1,7 +1,7 @@ package main /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/configmapcontroller.go b/pgo-scheduler/scheduler/configmapcontroller.go index c6b1e701d7..46840b5295 100644 --- a/pgo-scheduler/scheduler/configmapcontroller.go +++ b/pgo-scheduler/scheduler/configmapcontroller.go @@ -1,7 +1,7 @@ package scheduler /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/controllermanager.go b/pgo-scheduler/scheduler/controllermanager.go index bdb8f7eb9c..b688a2f31c 100644 --- a/pgo-scheduler/scheduler/controllermanager.go +++ b/pgo-scheduler/scheduler/controllermanager.go @@ -1,7 +1,7 @@ package scheduler /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/pgbackrest.go b/pgo-scheduler/scheduler/pgbackrest.go index fd706d5337..d265595b23 100644 --- a/pgo-scheduler/scheduler/pgbackrest.go +++ b/pgo-scheduler/scheduler/pgbackrest.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/policy.go b/pgo-scheduler/scheduler/policy.go index 3b3d097492..a1ecfc319f 100644 --- a/pgo-scheduler/scheduler/policy.go +++ b/pgo-scheduler/scheduler/policy.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/scheduler.go b/pgo-scheduler/scheduler/scheduler.go index 7f84e18963..6342e40fe3 100644 --- a/pgo-scheduler/scheduler/scheduler.go +++ b/pgo-scheduler/scheduler/scheduler.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/tasks.go b/pgo-scheduler/scheduler/tasks.go index a8374bfbe7..a79a60ba7f 100644 --- a/pgo-scheduler/scheduler/tasks.go +++ b/pgo-scheduler/scheduler/tasks.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/types.go b/pgo-scheduler/scheduler/types.go index 7d7a3b5bb6..7fcbbf944f 100644 --- a/pgo-scheduler/scheduler/types.go +++ b/pgo-scheduler/scheduler/types.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/validate.go b/pgo-scheduler/scheduler/validate.go index 29e923c716..4a9a3ffb67 100644 --- a/pgo-scheduler/scheduler/validate.go +++ b/pgo-scheduler/scheduler/validate.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo-scheduler/scheduler/validate_test.go b/pgo-scheduler/scheduler/validate_test.go index 9cc7b4864e..0a3846dc18 100644 --- a/pgo-scheduler/scheduler/validate_test.go +++ b/pgo-scheduler/scheduler/validate_test.go @@ -1,7 +1,7 @@ package scheduler /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/backrest.go b/pgo/api/backrest.go index 08c74e1ac5..59a9a0b30f 100644 --- a/pgo/api/backrest.go +++ b/pgo/api/backrest.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/cat.go b/pgo/api/cat.go index 9e06936153..74cd173a9a 100644 --- a/pgo/api/cat.go +++ b/pgo/api/cat.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/clone.go b/pgo/api/clone.go index ae09c01553..b3008d82c7 100644 --- a/pgo/api/clone.go +++ b/pgo/api/clone.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/cluster.go b/pgo/api/cluster.go index d3d543ba08..19bea26c9d 100644 --- a/pgo/api/cluster.go +++ b/pgo/api/cluster.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/common.go b/pgo/api/common.go index 327bbce98e..c1be82f2ec 100644 --- a/pgo/api/common.go +++ b/pgo/api/common.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/config.go b/pgo/api/config.go index c3c580cc4c..0e0e10509c 100644 --- a/pgo/api/config.go +++ b/pgo/api/config.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/df.go b/pgo/api/df.go index 6ed90c9643..693fce6c0d 100644 --- a/pgo/api/df.go +++ b/pgo/api/df.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/failover.go b/pgo/api/failover.go index 1ee9bf3694..60131f96db 100644 --- a/pgo/api/failover.go +++ b/pgo/api/failover.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/label.go b/pgo/api/label.go index 9ce0456812..e7c41c44e5 100644 --- a/pgo/api/label.go +++ b/pgo/api/label.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/namespace.go b/pgo/api/namespace.go index 391fb75816..43590ed8d9 100644 --- a/pgo/api/namespace.go +++ b/pgo/api/namespace.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pgadmin.go b/pgo/api/pgadmin.go index 56858a6be4..28e784ee94 100644 --- a/pgo/api/pgadmin.go +++ b/pgo/api/pgadmin.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pgbouncer.go b/pgo/api/pgbouncer.go index 58ae62d7ee..6562f2b904 100644 --- a/pgo/api/pgbouncer.go +++ b/pgo/api/pgbouncer.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pgdump.go b/pgo/api/pgdump.go index 2d6e0f3fd7..2488721459 100644 --- a/pgo/api/pgdump.go +++ b/pgo/api/pgdump.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pgorole.go b/pgo/api/pgorole.go index c9d9716b0b..cfc163ded5 100644 --- a/pgo/api/pgorole.go +++ b/pgo/api/pgorole.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pgouser.go b/pgo/api/pgouser.go index a17804d61e..f6c4e38e0d 100644 --- a/pgo/api/pgouser.go +++ b/pgo/api/pgouser.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/policy.go b/pgo/api/policy.go index 9e56993dc9..c21ccc0288 100644 --- a/pgo/api/policy.go +++ b/pgo/api/policy.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/pvc.go b/pgo/api/pvc.go index 0498967561..41fec8cc9e 100644 --- a/pgo/api/pvc.go +++ b/pgo/api/pvc.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/reload.go b/pgo/api/reload.go index 9dbe07a5f4..e07dcd513a 100644 --- a/pgo/api/reload.go +++ b/pgo/api/reload.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/restart.go b/pgo/api/restart.go index 3fba6f112f..d1bc84fd29 100644 --- a/pgo/api/restart.go +++ b/pgo/api/restart.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/restore.go b/pgo/api/restore.go index f8816e3c6c..c120f0ac2a 100644 --- a/pgo/api/restore.go +++ b/pgo/api/restore.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/restoreDump.go b/pgo/api/restoreDump.go index cb7aa573d7..ab54f922a5 100644 --- a/pgo/api/restoreDump.go +++ b/pgo/api/restoreDump.go @@ -1,7 +1,7 @@ package api /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/scale.go b/pgo/api/scale.go index b64133653f..fd5833433d 100644 --- a/pgo/api/scale.go +++ b/pgo/api/scale.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/scaledown.go b/pgo/api/scaledown.go index f4c8de0f6e..8e9c63081b 100644 --- a/pgo/api/scaledown.go +++ b/pgo/api/scaledown.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/schedule.go b/pgo/api/schedule.go index 02de41ba2d..d70ebe0a1d 100644 --- a/pgo/api/schedule.go +++ b/pgo/api/schedule.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/status.go b/pgo/api/status.go index 31ee0f7c70..30a8c003dc 100644 --- a/pgo/api/status.go +++ b/pgo/api/status.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/test.go b/pgo/api/test.go index 30bbeafd69..3106c4ca63 100644 --- a/pgo/api/test.go +++ b/pgo/api/test.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/upgrade.go b/pgo/api/upgrade.go index 9f00a2c2d5..f5e1f0cbec 100644 --- a/pgo/api/upgrade.go +++ b/pgo/api/upgrade.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/user.go b/pgo/api/user.go index 4334acd186..4001f38ddb 100644 --- a/pgo/api/user.go +++ b/pgo/api/user.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/version.go b/pgo/api/version.go index bef166c93a..a6dd33e007 100644 --- a/pgo/api/version.go +++ b/pgo/api/version.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/api/workflow.go b/pgo/api/workflow.go index 6b4ef05f67..12525976ac 100644 --- a/pgo/api/workflow.go +++ b/pgo/api/workflow.go @@ -1,7 +1,7 @@ package api /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/auth.go b/pgo/cmd/auth.go index 7b1b54ca04..8b8b9e4164 100644 --- a/pgo/cmd/auth.go +++ b/pgo/cmd/auth.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/backrest.go b/pgo/cmd/backrest.go index c4c39a3af7..ee687085fd 100644 --- a/pgo/cmd/backrest.go +++ b/pgo/cmd/backrest.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/backup.go b/pgo/cmd/backup.go index 719ea55712..062a7dd0f5 100644 --- a/pgo/cmd/backup.go +++ b/pgo/cmd/backup.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/cat.go b/pgo/cmd/cat.go index b213777843..d439dd3187 100644 --- a/pgo/cmd/cat.go +++ b/pgo/cmd/cat.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/clone.go b/pgo/cmd/clone.go index 463ccfca96..d294945f9c 100644 --- a/pgo/cmd/clone.go +++ b/pgo/cmd/clone.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/cluster.go b/pgo/cmd/cluster.go index 095b41e286..f42f43d8c5 100644 --- a/pgo/cmd/cluster.go +++ b/pgo/cmd/cluster.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/common.go b/pgo/cmd/common.go index 266bbf2937..371bcc86c9 100644 --- a/pgo/cmd/common.go +++ b/pgo/cmd/common.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/config.go b/pgo/cmd/config.go index 0a1a4ba773..cc05bc1e45 100644 --- a/pgo/cmd/config.go +++ b/pgo/cmd/config.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/create.go b/pgo/cmd/create.go index 3e6efcbb0d..aca18a4f08 100644 --- a/pgo/cmd/create.go +++ b/pgo/cmd/create.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/delete.go b/pgo/cmd/delete.go index eae34e471c..5077f16e5d 100644 --- a/pgo/cmd/delete.go +++ b/pgo/cmd/delete.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/df.go b/pgo/cmd/df.go index ec4bdc81b1..13b80fa758 100644 --- a/pgo/cmd/df.go +++ b/pgo/cmd/df.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/failover.go b/pgo/cmd/failover.go index f55c98d8a8..2f23afef9d 100644 --- a/pgo/cmd/failover.go +++ b/pgo/cmd/failover.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/flags.go b/pgo/cmd/flags.go index 89d55e4f97..a11086e7b5 100644 --- a/pgo/cmd/flags.go +++ b/pgo/cmd/flags.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/label.go b/pgo/cmd/label.go index f06e8fdac6..1c4e65fbe6 100644 --- a/pgo/cmd/label.go +++ b/pgo/cmd/label.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/namespace.go b/pgo/cmd/namespace.go index 5dd1fdc81e..3f9a31734b 100644 --- a/pgo/cmd/namespace.go +++ b/pgo/cmd/namespace.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pgadmin.go b/pgo/cmd/pgadmin.go index 336ab4ab40..2db81d3bec 100644 --- a/pgo/cmd/pgadmin.go +++ b/pgo/cmd/pgadmin.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pgbouncer.go b/pgo/cmd/pgbouncer.go index 3771047e9d..12950c5325 100644 --- a/pgo/cmd/pgbouncer.go +++ b/pgo/cmd/pgbouncer.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pgdump.go b/pgo/cmd/pgdump.go index e34036005c..bfd86be1c4 100644 --- a/pgo/cmd/pgdump.go +++ b/pgo/cmd/pgdump.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pgorole.go b/pgo/cmd/pgorole.go index 144f1fb108..1cfd2586bd 100644 --- a/pgo/cmd/pgorole.go +++ b/pgo/cmd/pgorole.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pgouser.go b/pgo/cmd/pgouser.go index ff4b535a1c..b45ef75118 100644 --- a/pgo/cmd/pgouser.go +++ b/pgo/cmd/pgouser.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/policy.go b/pgo/cmd/policy.go index 805bef66fd..9b6b68cb96 100644 --- a/pgo/cmd/policy.go +++ b/pgo/cmd/policy.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/pvc.go b/pgo/cmd/pvc.go index 6fc4c5cdd7..570711dcb8 100644 --- a/pgo/cmd/pvc.go +++ b/pgo/cmd/pvc.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/reload.go b/pgo/cmd/reload.go index f006f1a7dd..787594ef0c 100644 --- a/pgo/cmd/reload.go +++ b/pgo/cmd/reload.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/restart.go b/pgo/cmd/restart.go index d01e6dab80..0ec7812219 100644 --- a/pgo/cmd/restart.go +++ b/pgo/cmd/restart.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/restore.go b/pgo/cmd/restore.go index 7f4e884002..8cb54dd862 100644 --- a/pgo/cmd/restore.go +++ b/pgo/cmd/restore.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/root.go b/pgo/cmd/root.go index 396c078493..1819d98eb7 100644 --- a/pgo/cmd/root.go +++ b/pgo/cmd/root.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/scale.go b/pgo/cmd/scale.go index f6a5e10518..dd2910658e 100644 --- a/pgo/cmd/scale.go +++ b/pgo/cmd/scale.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/scaledown.go b/pgo/cmd/scaledown.go index 57b869a6a8..a00bd17f6a 100644 --- a/pgo/cmd/scaledown.go +++ b/pgo/cmd/scaledown.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/schedule.go b/pgo/cmd/schedule.go index 018a5fdb52..c0c1330048 100644 --- a/pgo/cmd/schedule.go +++ b/pgo/cmd/schedule.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/show.go b/pgo/cmd/show.go index 9636f7615f..faca68b3c9 100644 --- a/pgo/cmd/show.go +++ b/pgo/cmd/show.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/status.go b/pgo/cmd/status.go index f93c4a93bf..4dbbf67b88 100644 --- a/pgo/cmd/status.go +++ b/pgo/cmd/status.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/test.go b/pgo/cmd/test.go index 38b2df6146..76495204bd 100644 --- a/pgo/cmd/test.go +++ b/pgo/cmd/test.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/update.go b/pgo/cmd/update.go index fde0f6f774..582e1c619a 100644 --- a/pgo/cmd/update.go +++ b/pgo/cmd/update.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/upgrade.go b/pgo/cmd/upgrade.go index 500865330d..5d27fbea5b 100644 --- a/pgo/cmd/upgrade.go +++ b/pgo/cmd/upgrade.go @@ -2,7 +2,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/user.go b/pgo/cmd/user.go index ef8e73f283..57593b1eef 100644 --- a/pgo/cmd/user.go +++ b/pgo/cmd/user.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/version.go b/pgo/cmd/version.go index a5934cfb88..e406d681af 100644 --- a/pgo/cmd/version.go +++ b/pgo/cmd/version.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/watch.go b/pgo/cmd/watch.go index 9dd9d5cd41..7c05ec406d 100644 --- a/pgo/cmd/watch.go +++ b/pgo/cmd/watch.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/cmd/workflow.go b/pgo/cmd/workflow.go index c0fb0b8ca5..6dd0f3bcbc 100644 --- a/pgo/cmd/workflow.go +++ b/pgo/cmd/workflow.go @@ -1,7 +1,7 @@ package cmd /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/generatedocs.go b/pgo/generatedocs.go index 8d2b2a2833..86b0f79209 100644 --- a/pgo/generatedocs.go +++ b/pgo/generatedocs.go @@ -1,7 +1,7 @@ package main /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/pgo.go b/pgo/pgo.go index 49bdb9fde5..9cbd551c46 100644 --- a/pgo/pgo.go +++ b/pgo/pgo.go @@ -1,7 +1,7 @@ package main /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/util/confirmation.go b/pgo/util/confirmation.go index 4d15e0ae83..732f4de70a 100644 --- a/pgo/util/confirmation.go +++ b/pgo/util/confirmation.go @@ -1,7 +1,7 @@ package util /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/util/pad.go b/pgo/util/pad.go index fee08615ed..8c4affbbdf 100644 --- a/pgo/util/pad.go +++ b/pgo/util/pad.go @@ -1,7 +1,7 @@ package util /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pgo/util/validation.go b/pgo/util/validation.go index 17d29b8eac..28ee9ac6e0 100644 --- a/pgo/util/validation.go +++ b/pgo/util/validation.go @@ -1,7 +1,7 @@ package util /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/cluster.go b/pkg/apis/crunchydata.com/v1/cluster.go index 375255130c..9d1128c5d2 100644 --- a/pkg/apis/crunchydata.com/v1/cluster.go +++ b/pkg/apis/crunchydata.com/v1/cluster.go @@ -1,7 +1,7 @@ package v1 /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/common.go b/pkg/apis/crunchydata.com/v1/common.go index 227a74d3a9..db997e8954 100644 --- a/pkg/apis/crunchydata.com/v1/common.go +++ b/pkg/apis/crunchydata.com/v1/common.go @@ -1,7 +1,7 @@ package v1 /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/common_test.go b/pkg/apis/crunchydata.com/v1/common_test.go index cde6832420..853be90ba1 100644 --- a/pkg/apis/crunchydata.com/v1/common_test.go +++ b/pkg/apis/crunchydata.com/v1/common_test.go @@ -1,7 +1,7 @@ package v1 /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 8f7b9856c5..2611d5bd54 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -108,7 +108,7 @@ package v1 // +k8s:deepcopy-gen=package,register /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/policy.go b/pkg/apis/crunchydata.com/v1/policy.go index f3ac077cf4..d9ae30983d 100644 --- a/pkg/apis/crunchydata.com/v1/policy.go +++ b/pkg/apis/crunchydata.com/v1/policy.go @@ -1,7 +1,7 @@ package v1 /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/register.go b/pkg/apis/crunchydata.com/v1/register.go index 10e79dc7fc..347fd8345a 100644 --- a/pkg/apis/crunchydata.com/v1/register.go +++ b/pkg/apis/crunchydata.com/v1/register.go @@ -1,7 +1,7 @@ package v1 /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/apis/crunchydata.com/v1/replica.go b/pkg/apis/crunchydata.com/v1/replica.go index c5e17f4697..00c7d8cf44 100644 --- a/pkg/apis/crunchydata.com/v1/replica.go +++ b/pkg/apis/crunchydata.com/v1/replica.go @@ -1,7 +1,7 @@ package v1 /* - Copyright 2018 - 2021 Crunchy Data Solutions, Inc. + Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/task.go b/pkg/apis/crunchydata.com/v1/task.go index e898b548fd..b672000542 100644 --- a/pkg/apis/crunchydata.com/v1/task.go +++ b/pkg/apis/crunchydata.com/v1/task.go @@ -1,7 +1,7 @@ package v1 /* - Copyright 2017 - 2021 Crunchy Data Solutions, Inc. + Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apis/crunchydata.com/v1/zz_generated.deepcopy.go b/pkg/apis/crunchydata.com/v1/zz_generated.deepcopy.go index 81f9ab7a41..36c7fb5424 100644 --- a/pkg/apis/crunchydata.com/v1/zz_generated.deepcopy.go +++ b/pkg/apis/crunchydata.com/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/backrestmsgs.go b/pkg/apiservermsgs/backrestmsgs.go index 622b94bbe9..999198a0a9 100644 --- a/pkg/apiservermsgs/backrestmsgs.go +++ b/pkg/apiservermsgs/backrestmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/catmsgs.go b/pkg/apiservermsgs/catmsgs.go index 15f7d5cf85..b1eb5dd69f 100644 --- a/pkg/apiservermsgs/catmsgs.go +++ b/pkg/apiservermsgs/catmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/clonemsgs.go b/pkg/apiservermsgs/clonemsgs.go index c8ff454904..c67b1bdc94 100644 --- a/pkg/apiservermsgs/clonemsgs.go +++ b/pkg/apiservermsgs/clonemsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/clustermsgs.go b/pkg/apiservermsgs/clustermsgs.go index 4e11751cde..b71930774f 100644 --- a/pkg/apiservermsgs/clustermsgs.go +++ b/pkg/apiservermsgs/clustermsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index af81b12160..98b0cabe5e 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/configmsgs.go b/pkg/apiservermsgs/configmsgs.go index 1a4f8aae9c..a7f0631401 100644 --- a/pkg/apiservermsgs/configmsgs.go +++ b/pkg/apiservermsgs/configmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/dfmsgs.go b/pkg/apiservermsgs/dfmsgs.go index 8d947768ef..7e7e980eac 100644 --- a/pkg/apiservermsgs/dfmsgs.go +++ b/pkg/apiservermsgs/dfmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/failovermsgs.go b/pkg/apiservermsgs/failovermsgs.go index b51b11c3e4..00deaf2320 100644 --- a/pkg/apiservermsgs/failovermsgs.go +++ b/pkg/apiservermsgs/failovermsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/labelmsgs.go b/pkg/apiservermsgs/labelmsgs.go index d0a914840e..1076255240 100644 --- a/pkg/apiservermsgs/labelmsgs.go +++ b/pkg/apiservermsgs/labelmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/namespacemsgs.go b/pkg/apiservermsgs/namespacemsgs.go index 5fc4665a9b..dda8a3fe3a 100644 --- a/pkg/apiservermsgs/namespacemsgs.go +++ b/pkg/apiservermsgs/namespacemsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pgadminmsgs.go b/pkg/apiservermsgs/pgadminmsgs.go index 73e4475294..9241a9cc43 100644 --- a/pkg/apiservermsgs/pgadminmsgs.go +++ b/pkg/apiservermsgs/pgadminmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pgbouncermsgs.go b/pkg/apiservermsgs/pgbouncermsgs.go index 2c575b8f0c..997a3e5d61 100644 --- a/pkg/apiservermsgs/pgbouncermsgs.go +++ b/pkg/apiservermsgs/pgbouncermsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pgdumpmsgs.go b/pkg/apiservermsgs/pgdumpmsgs.go index 34bc123127..584c382461 100644 --- a/pkg/apiservermsgs/pgdumpmsgs.go +++ b/pkg/apiservermsgs/pgdumpmsgs.go @@ -5,7 +5,7 @@ import ( ) /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pgorolemsgs.go b/pkg/apiservermsgs/pgorolemsgs.go index 6aae3494d0..1705452624 100644 --- a/pkg/apiservermsgs/pgorolemsgs.go +++ b/pkg/apiservermsgs/pgorolemsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pgousermsgs.go b/pkg/apiservermsgs/pgousermsgs.go index 4690c1f888..e636c71b61 100644 --- a/pkg/apiservermsgs/pgousermsgs.go +++ b/pkg/apiservermsgs/pgousermsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/policymsgs.go b/pkg/apiservermsgs/policymsgs.go index 54fb12d52a..99ab2074d7 100644 --- a/pkg/apiservermsgs/policymsgs.go +++ b/pkg/apiservermsgs/policymsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/pvcmsgs.go b/pkg/apiservermsgs/pvcmsgs.go index da902da96b..7c4f1a366c 100644 --- a/pkg/apiservermsgs/pvcmsgs.go +++ b/pkg/apiservermsgs/pvcmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/reloadmsgs.go b/pkg/apiservermsgs/reloadmsgs.go index 11c4293980..ae23783d05 100644 --- a/pkg/apiservermsgs/reloadmsgs.go +++ b/pkg/apiservermsgs/reloadmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/restartmsgs.go b/pkg/apiservermsgs/restartmsgs.go index bf6b9faa1d..ffe5db91d5 100644 --- a/pkg/apiservermsgs/restartmsgs.go +++ b/pkg/apiservermsgs/restartmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/schedulemsgs.go b/pkg/apiservermsgs/schedulemsgs.go index 47e9f90ca8..529d60ddb6 100644 --- a/pkg/apiservermsgs/schedulemsgs.go +++ b/pkg/apiservermsgs/schedulemsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/statusmsgs.go b/pkg/apiservermsgs/statusmsgs.go index 72a6c79aab..923cd7fe77 100644 --- a/pkg/apiservermsgs/statusmsgs.go +++ b/pkg/apiservermsgs/statusmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/upgrademsgs.go b/pkg/apiservermsgs/upgrademsgs.go index a360c036c7..7e30d254de 100644 --- a/pkg/apiservermsgs/upgrademsgs.go +++ b/pkg/apiservermsgs/upgrademsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/usermsgs.go b/pkg/apiservermsgs/usermsgs.go index da048129db..a39b78a060 100644 --- a/pkg/apiservermsgs/usermsgs.go +++ b/pkg/apiservermsgs/usermsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/versionmsgs.go b/pkg/apiservermsgs/versionmsgs.go index 38ab640cdb..91618ec76a 100644 --- a/pkg/apiservermsgs/versionmsgs.go +++ b/pkg/apiservermsgs/versionmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +Copyright 2017 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/watchmsgs.go b/pkg/apiservermsgs/watchmsgs.go index 02c1472b90..4d6c48e65c 100644 --- a/pkg/apiservermsgs/watchmsgs.go +++ b/pkg/apiservermsgs/watchmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2019 - 2021 Crunchy Data Solutions, Inc. +Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/apiservermsgs/workflowmsgs.go b/pkg/apiservermsgs/workflowmsgs.go index 3d4c44353a..4c4be0bd45 100644 --- a/pkg/apiservermsgs/workflowmsgs.go +++ b/pkg/apiservermsgs/workflowmsgs.go @@ -1,7 +1,7 @@ package apiservermsgs /* -Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +Copyright 2018 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/events/eventing.go b/pkg/events/eventing.go index 5efcf7d328..0a6f1887e3 100644 --- a/pkg/events/eventing.go +++ b/pkg/events/eventing.go @@ -1,7 +1,7 @@ package events /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/events/eventtype.go b/pkg/events/eventtype.go index db946cf915..7e5f75d4f2 100644 --- a/pkg/events/eventtype.go +++ b/pkg/events/eventtype.go @@ -1,7 +1,7 @@ package events /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/events/pgoeventtype.go b/pkg/events/pgoeventtype.go index 4e4f114868..305c9197f0 100644 --- a/pkg/events/pgoeventtype.go +++ b/pkg/events/pgoeventtype.go @@ -1,7 +1,7 @@ package events /* - Copyright 2019 - 2021 Crunchy Data Solutions, Inc. + Copyright 2019 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/clientset.go b/pkg/generated/clientset/versioned/clientset.go index bc2b61e5e0..7376ce294a 100644 --- a/pkg/generated/clientset/versioned/clientset.go +++ b/pkg/generated/clientset/versioned/clientset.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/doc.go b/pkg/generated/clientset/versioned/doc.go index f862afa1b0..c8faf9c342 100644 --- a/pkg/generated/clientset/versioned/doc.go +++ b/pkg/generated/clientset/versioned/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/fake/clientset_generated.go b/pkg/generated/clientset/versioned/fake/clientset_generated.go index 5f9ec9bbbb..168269e377 100644 --- a/pkg/generated/clientset/versioned/fake/clientset_generated.go +++ b/pkg/generated/clientset/versioned/fake/clientset_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/fake/doc.go b/pkg/generated/clientset/versioned/fake/doc.go index e9300efbfe..79128b5478 100644 --- a/pkg/generated/clientset/versioned/fake/doc.go +++ b/pkg/generated/clientset/versioned/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/fake/register.go b/pkg/generated/clientset/versioned/fake/register.go index 7d57cf4437..bd68e535c8 100644 --- a/pkg/generated/clientset/versioned/fake/register.go +++ b/pkg/generated/clientset/versioned/fake/register.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/scheme/doc.go b/pkg/generated/clientset/versioned/scheme/doc.go index 49cfafd10d..264e52dac0 100644 --- a/pkg/generated/clientset/versioned/scheme/doc.go +++ b/pkg/generated/clientset/versioned/scheme/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/scheme/register.go b/pkg/generated/clientset/versioned/scheme/register.go index 2ce45ab80b..de17632bfe 100644 --- a/pkg/generated/clientset/versioned/scheme/register.go +++ b/pkg/generated/clientset/versioned/scheme/register.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/crunchydata.com_client.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/crunchydata.com_client.go index 4c862528fa..dfd0dd03c2 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/crunchydata.com_client.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/crunchydata.com_client.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/doc.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/doc.go index 21c249ea20..c7adf35aa6 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/doc.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/doc.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/doc.go index 14f506a6fb..f1a03c292f 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/doc.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_crunchydata.com_client.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_crunchydata.com_client.go index 33ad7a5550..6afd73a7ff 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_crunchydata.com_client.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_crunchydata.com_client.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgcluster.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgcluster.go index 01bb2a2f00..d2e6d3315b 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgcluster.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgcluster.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgpolicy.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgpolicy.go index 43a0a0a1fc..f7dab372d4 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgpolicy.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgreplica.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgreplica.go index b1a3ea105e..4af4e39a5f 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgreplica.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgreplica.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgtask.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgtask.go index d4c2e511a1..687b066cf9 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgtask.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/fake/fake_pgtask.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/generated_expansion.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/generated_expansion.go index 5ea3a63db1..3f12094466 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/generated_expansion.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgcluster.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgcluster.go index d87c091f29..be6f04c03b 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgcluster.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgcluster.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgpolicy.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgpolicy.go index 31d0ddd8b7..c12e5a88b5 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgpolicy.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgreplica.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgreplica.go index 5df06c39a4..51824abfd8 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgreplica.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgreplica.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgtask.go b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgtask.go index cbed3e2468..e177170e95 100644 --- a/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgtask.go +++ b/pkg/generated/clientset/versioned/typed/crunchydata.com/v1/pgtask.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/interface.go b/pkg/generated/informers/externalversions/crunchydata.com/interface.go index 698763aff3..8aec2edcfb 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/interface.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/v1/interface.go b/pkg/generated/informers/externalversions/crunchydata.com/v1/interface.go index b30e24b239..cbaf0ff49a 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/v1/interface.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/v1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgcluster.go b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgcluster.go index 3be680bc29..96ce541cb8 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgcluster.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgcluster.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgpolicy.go b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgpolicy.go index 4383e0914c..83034c1453 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgpolicy.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgreplica.go b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgreplica.go index 840efd6b0a..55eba0af23 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgreplica.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgreplica.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgtask.go b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgtask.go index c25536e459..149acc91a3 100644 --- a/pkg/generated/informers/externalversions/crunchydata.com/v1/pgtask.go +++ b/pkg/generated/informers/externalversions/crunchydata.com/v1/pgtask.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/factory.go b/pkg/generated/informers/externalversions/factory.go index 65c18752b4..00e6004f0a 100644 --- a/pkg/generated/informers/externalversions/factory.go +++ b/pkg/generated/informers/externalversions/factory.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/generic.go b/pkg/generated/informers/externalversions/generic.go index 48e7491d80..7fa4a6e032 100644 --- a/pkg/generated/informers/externalversions/generic.go +++ b/pkg/generated/informers/externalversions/generic.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go b/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go index 130bc043a8..a7b137f9b6 100644 --- a/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go +++ b/pkg/generated/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/listers/crunchydata.com/v1/expansion_generated.go b/pkg/generated/listers/crunchydata.com/v1/expansion_generated.go index 369c56b717..91a28bb8bd 100644 --- a/pkg/generated/listers/crunchydata.com/v1/expansion_generated.go +++ b/pkg/generated/listers/crunchydata.com/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/listers/crunchydata.com/v1/pgcluster.go b/pkg/generated/listers/crunchydata.com/v1/pgcluster.go index eb059beb06..d8ce1e5b88 100644 --- a/pkg/generated/listers/crunchydata.com/v1/pgcluster.go +++ b/pkg/generated/listers/crunchydata.com/v1/pgcluster.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/listers/crunchydata.com/v1/pgpolicy.go b/pkg/generated/listers/crunchydata.com/v1/pgpolicy.go index d73fef8e45..bae64cad46 100644 --- a/pkg/generated/listers/crunchydata.com/v1/pgpolicy.go +++ b/pkg/generated/listers/crunchydata.com/v1/pgpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/listers/crunchydata.com/v1/pgreplica.go b/pkg/generated/listers/crunchydata.com/v1/pgreplica.go index db450cee51..825e3321aa 100644 --- a/pkg/generated/listers/crunchydata.com/v1/pgreplica.go +++ b/pkg/generated/listers/crunchydata.com/v1/pgreplica.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/pkg/generated/listers/crunchydata.com/v1/pgtask.go b/pkg/generated/listers/crunchydata.com/v1/pgtask.go index 2042db9581..927284e070 100644 --- a/pkg/generated/listers/crunchydata.com/v1/pgtask.go +++ b/pkg/generated/listers/crunchydata.com/v1/pgtask.go @@ -1,5 +1,5 @@ /* -Copyright 2020 - 2021 Crunchy Data Solutions, Inc. +Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/postgres-operator.go b/postgres-operator.go index 5289876661..9c532eed11 100644 --- a/postgres-operator.go +++ b/postgres-operator.go @@ -1,7 +1,7 @@ package main /* -Copyright 2017 - 2021 Crunchy Data +Copyright 2017 - 2022 Crunchy Data 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 diff --git a/pv/create-pv-nfs-label.sh b/pv/create-pv-nfs-label.sh index a347a907fd..ec11b1b573 100755 --- a/pv/create-pv-nfs-label.sh +++ b/pv/create-pv-nfs-label.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2018 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2018 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/pv/create-pv-nfs-legacy.sh b/pv/create-pv-nfs-legacy.sh index 96d698e159..1f6a381035 100755 --- a/pv/create-pv-nfs-legacy.sh +++ b/pv/create-pv-nfs-legacy.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/pv/create-pv-nfs.sh b/pv/create-pv-nfs.sh index e1e71c95d8..60dd1f04d6 100755 --- a/pv/create-pv-nfs.sh +++ b/pv/create-pv-nfs.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/pv/create-pv.sh b/pv/create-pv.sh index 6d9ede0b71..44fb402031 100755 --- a/pv/create-pv.sh +++ b/pv/create-pv.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/pv/delete-pv.sh b/pv/delete-pv.sh index b3d7422ff2..3b1513184b 100755 --- a/pv/delete-pv.sh +++ b/pv/delete-pv.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2017 - 2021 Crunchy Data Solutions, Inc. +# Copyright 2017 - 2022 Crunchy Data Solutions, Inc. # 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 diff --git a/testing/pgo_cli/cluster_annotation_test.go b/testing/pgo_cli/cluster_annotation_test.go index e0a2b9286f..66c94898f1 100644 --- a/testing/pgo_cli/cluster_annotation_test.go +++ b/testing/pgo_cli/cluster_annotation_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_backup_test.go b/testing/pgo_cli/cluster_backup_test.go index ceeefe2e5a..b937e218a8 100644 --- a/testing/pgo_cli/cluster_backup_test.go +++ b/testing/pgo_cli/cluster_backup_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_cat_test.go b/testing/pgo_cli/cluster_cat_test.go index aea958fb15..123648f5cf 100644 --- a/testing/pgo_cli/cluster_cat_test.go +++ b/testing/pgo_cli/cluster_cat_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_clone_test.go b/testing/pgo_cli/cluster_clone_test.go index 24154c2f05..62ded0c10a 100644 --- a/testing/pgo_cli/cluster_clone_test.go +++ b/testing/pgo_cli/cluster_clone_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_create_test.go b/testing/pgo_cli/cluster_create_test.go index f0579de8cd..228177a749 100644 --- a/testing/pgo_cli/cluster_create_test.go +++ b/testing/pgo_cli/cluster_create_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_delete_test.go b/testing/pgo_cli/cluster_delete_test.go index 1285b6026e..08cf13df79 100644 --- a/testing/pgo_cli/cluster_delete_test.go +++ b/testing/pgo_cli/cluster_delete_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_df_test.go b/testing/pgo_cli/cluster_df_test.go index 91ae0b8092..056c947d3c 100644 --- a/testing/pgo_cli/cluster_df_test.go +++ b/testing/pgo_cli/cluster_df_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_failover_test.go b/testing/pgo_cli/cluster_failover_test.go index ac4f2a40c6..ff1bf789bf 100644 --- a/testing/pgo_cli/cluster_failover_test.go +++ b/testing/pgo_cli/cluster_failover_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_label_test.go b/testing/pgo_cli/cluster_label_test.go index ccf4a17461..67d9023604 100644 --- a/testing/pgo_cli/cluster_label_test.go +++ b/testing/pgo_cli/cluster_label_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_pgbouncer_test.go b/testing/pgo_cli/cluster_pgbouncer_test.go index b0f9199881..30aebd9571 100644 --- a/testing/pgo_cli/cluster_pgbouncer_test.go +++ b/testing/pgo_cli/cluster_pgbouncer_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_policy_test.go b/testing/pgo_cli/cluster_policy_test.go index 66db7c6080..eb08beee07 100644 --- a/testing/pgo_cli/cluster_policy_test.go +++ b/testing/pgo_cli/cluster_policy_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_pvc_test.go b/testing/pgo_cli/cluster_pvc_test.go index 0009225e4a..a55d962435 100644 --- a/testing/pgo_cli/cluster_pvc_test.go +++ b/testing/pgo_cli/cluster_pvc_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_reload_test.go b/testing/pgo_cli/cluster_reload_test.go index 02cf63a479..e0ffd7cc46 100644 --- a/testing/pgo_cli/cluster_reload_test.go +++ b/testing/pgo_cli/cluster_reload_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_restart_test.go b/testing/pgo_cli/cluster_restart_test.go index 2a106fbd41..b741717e6d 100644 --- a/testing/pgo_cli/cluster_restart_test.go +++ b/testing/pgo_cli/cluster_restart_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_scale_test.go b/testing/pgo_cli/cluster_scale_test.go index 219e44f582..475b54339d 100644 --- a/testing/pgo_cli/cluster_scale_test.go +++ b/testing/pgo_cli/cluster_scale_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_scaledown_test.go b/testing/pgo_cli/cluster_scaledown_test.go index 5e9dc16b28..e8fc1f1a46 100644 --- a/testing/pgo_cli/cluster_scaledown_test.go +++ b/testing/pgo_cli/cluster_scaledown_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_test_test.go b/testing/pgo_cli/cluster_test_test.go index 76100eb9f0..d1f40fe826 100644 --- a/testing/pgo_cli/cluster_test_test.go +++ b/testing/pgo_cli/cluster_test_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/cluster_user_test.go b/testing/pgo_cli/cluster_user_test.go index 964bb6b58c..17e416eab3 100644 --- a/testing/pgo_cli/cluster_user_test.go +++ b/testing/pgo_cli/cluster_user_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/operator_namespace_test.go b/testing/pgo_cli/operator_namespace_test.go index 57bc685ea2..32b8f5a85e 100644 --- a/testing/pgo_cli/operator_namespace_test.go +++ b/testing/pgo_cli/operator_namespace_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/operator_rbac_test.go b/testing/pgo_cli/operator_rbac_test.go index 569f1bd090..4a18548905 100644 --- a/testing/pgo_cli/operator_rbac_test.go +++ b/testing/pgo_cli/operator_rbac_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/operator_test.go b/testing/pgo_cli/operator_test.go index 09e8148c68..81442de7dc 100644 --- a/testing/pgo_cli/operator_test.go +++ b/testing/pgo_cli/operator_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/suite_helpers_test.go b/testing/pgo_cli/suite_helpers_test.go index 811343d8d9..c0bf2a9121 100644 --- a/testing/pgo_cli/suite_helpers_test.go +++ b/testing/pgo_cli/suite_helpers_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/suite_pgo_cmd_test.go b/testing/pgo_cli/suite_pgo_cmd_test.go index 245d314aa7..f19fb4a879 100644 --- a/testing/pgo_cli/suite_pgo_cmd_test.go +++ b/testing/pgo_cli/suite_pgo_cmd_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 diff --git a/testing/pgo_cli/suite_test.go b/testing/pgo_cli/suite_test.go index 9429f28278..bca4b81a5e 100644 --- a/testing/pgo_cli/suite_test.go +++ b/testing/pgo_cli/suite_test.go @@ -1,7 +1,7 @@ package pgo_cli_test /* - Copyright 2020 - 2021 Crunchy Data Solutions, Inc. + Copyright 2020 - 2022 Crunchy Data Solutions, Inc. 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 From a2d88283cf05c914ae09c48ee1c69e534da4c9d7 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Tue, 22 Feb 2022 21:14:16 +0000 Subject: [PATCH 118/129] Version Bump for PG Updates & PGO v4.5.6 [sc-13826] --- Makefile | 4 ++-- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 ++-- docs/config.toml | 13 ++++++------- docs/content/Configuration/compatibility.md | 5 +++++ docs/content/advanced/crunchy-postgres-exporter.md | 2 +- docs/content/tutorial/pgbouncer.md | 2 +- examples/create-by-resource/fromcrd.json | 6 +++--- examples/envs.sh | 2 +- .../helm/create-cluster/templates/pgcluster.yaml | 2 +- examples/helm/create-cluster/values.yaml | 4 ++-- installers/ansible/README.md | 2 +- installers/ansible/values.yaml | 6 +++--- installers/gcp-marketplace/Makefile | 2 +- installers/gcp-marketplace/README.md | 2 +- installers/gcp-marketplace/values.yaml | 6 +++--- installers/helm/Chart.yaml | 2 +- installers/helm/values.yaml | 6 +++--- installers/kubectl/client-setup.sh | 2 +- installers/kubectl/postgres-operator-ocp311.yml | 8 ++++---- installers/kubectl/postgres-operator.yml | 8 ++++---- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- installers/metrics/helm/helm_template.yaml | 2 +- installers/metrics/helm/values.yaml | 2 +- .../kubectl/postgres-operator-metrics-ocp311.yml | 2 +- .../metrics/kubectl/postgres-operator-metrics.yml | 2 +- installers/olm/Makefile | 4 ++-- pkg/apis/crunchydata.com/v1/doc.go | 8 ++++---- pkg/apiservermsgs/common.go | 2 +- redhat/atomic/help.1 | 2 +- redhat/atomic/help.md | 2 +- 33 files changed, 63 insertions(+), 59 deletions(-) diff --git a/Makefile b/Makefile index a690179d74..1ff9aa4050 100644 --- a/Makefile +++ b/Makefile @@ -9,9 +9,9 @@ PGO_CMD ?= kubectl PGO_IMAGE_PREFIX ?= crunchydata PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) PGO_OPERATOR_NAMESPACE ?= pgo -PGO_VERSION ?= 4.5.5 +PGO_VERSION ?= 4.5.6 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.9 +PGO_PG_FULLVERSION ?= 12.10 PGO_BACKREST_VERSION ?= 2.29 PACKAGER ?= yum diff --git a/README.md b/README.md index 67bc97115d..138ccfd851 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ to start as quickly as: ```shell kubectl create namespace pgo -kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.5/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.6/installers/kubectl/postgres-operator.yml ``` Otherwise, we highly recommend following the instructions from our [Quickstart](https://access.crunchydata.com/documentation/postgres-operator/latest/quickstart/). diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index f049d7d4b1..9516b7501d 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -16,7 +16,7 @@ GCR_IMAGE_PREFIX=gcr.io/crunchy-dev-test CCP_IMAGE_PREFIX=crunchydata -CCP_IMAGE_TAG=centos8-12.9-4.5.5 +CCP_IMAGE_TAG=centos8-12.10-4.5.6 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index e380c50ece..b3d82d417a 100644 --- a/conf/postgres-operator/pgo.yaml +++ b/conf/postgres-operator/pgo.yaml @@ -2,7 +2,7 @@ Cluster: CCPImagePrefix: registry.developers.crunchydata.com/crunchydata Metrics: false Badger: false - CCPImageTag: centos8-12.9-4.5.5 + CCPImageTag: centos8-12.10-4.5.6 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -82,4 +82,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos8-4.5.5 + PGOImageTag: centos8-4.5.6 diff --git a/docs/config.toml b/docs/config.toml index f2224e5190..e4f1ae5fd0 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,13 +25,12 @@ disableNavChevron = false # set true to hide next/prev chevron, default is false highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter menushortcutsnewtab = true # set true to open shortcuts links to a new tab/window enableGitInfo = true -operatorVersion = "4.5.5" -postgresVersion = "12.9" -postgresVersion13 = "13.5" -postgresVersion12 = "12.9" -postgresVersion11 = "11.14" -postgresVersion10 = "10.19" -postgresVersion96 = "9.6.24" +operatorVersion = "4.5.6" +postgresVersion = "12.10" +postgresVersion13 = "13.6" +postgresVersion12 = "12.10" +postgresVersion11 = "11.15" +postgresVersion10 = "10.20" postgisVersion = "3.0" centosBase = "centos8" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index 1f25dee1a6..ddd41334af 100644 --- a/docs/content/Configuration/compatibility.md +++ b/docs/content/Configuration/compatibility.md @@ -12,6 +12,11 @@ version dependencies between the two projects. Below are the operator releases a | Operator Release | Container Release | Postgres | PgBackrest Version |:----------|:-------------|:------------|:-------------- +| 4.5.6 | 4.5.6 | 13.6 | 2.29 | +|||12.10|2.29| +|||11.15|2.29| +|||10.20|2.29| +|||| | 4.5.5 | 4.5.5 | 13.5 | 2.29 | |||12.9|2.29| |||11.14|2.29| diff --git a/docs/content/advanced/crunchy-postgres-exporter.md b/docs/content/advanced/crunchy-postgres-exporter.md index 1704ffb6aa..84a2cf1968 100644 --- a/docs/content/advanced/crunchy-postgres-exporter.md +++ b/docs/content/advanced/crunchy-postgres-exporter.md @@ -23,7 +23,7 @@ can be specified for the API to collect. For an example of a queries.yml file, s The crunchy-postgres-exporter Docker image contains the following packages (versions vary depending on PostgreSQL version): -* PostgreSQL ({{< param postgresVersion13 >}}, {{< param postgresVersion12 >}}, {{< param postgresVersion11 >}}, {{< param postgresVersion10 >}}, and {{< param postgresVersion96 >}} +* PostgreSQL ({{< param postgresVersion13 >}}, {{< param postgresVersion12 >}}, {{< param postgresVersion11 >}}, and {{< param postgresVersion10 >}} * CentOS 7, 8 - publicly available * UBI 7, 8 - customers only * [PostgreSQL Exporter](https://github.com/wrouesnel/postgres_exporter) diff --git a/docs/content/tutorial/pgbouncer.md b/docs/content/tutorial/pgbouncer.md index a818d6a9bd..3a16f16a27 100644 --- a/docs/content/tutorial/pgbouncer.md +++ b/docs/content/tutorial/pgbouncer.md @@ -116,7 +116,7 @@ PGPASSWORD=randompassword psql -h localhost -p 5432 -U pgbouncer pgbouncer You should see something similar to this: ``` -psql (12.9, server 1.14.0/bouncer) +psql (12.10, server 1.14.0/bouncer) Type "help" for help. pgbouncer=# diff --git a/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index 639115207a..7c612efb16 100644 --- a/examples/create-by-resource/fromcrd.json +++ b/examples/create-by-resource/fromcrd.json @@ -16,7 +16,7 @@ "pg-cluster": "fromcrd", "pg-pod-anti-affinity": "", "pgo-backrest": "true", - "pgo-version": "4.5.5", + "pgo-version": "4.5.6", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos8-12.9-4.5.5", + "ccpimagetag": "centos8-12.10-4.5.6", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy-postgres-exporter": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.5.5", + "pgo-version": "4.5.6", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index 62c468db5f..1646291188 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -23,7 +23,7 @@ export PGO_CONF_DIR=$PGOROOT/installers/ansible/roles/pgo-operator/files # the version of the Operator you run is set by these vars export PGO_IMAGE_PREFIX=registry.developers.crunchydata.com/crunchydata export PGO_BASEOS=centos8 -export PGO_VERSION=4.5.5 +export PGO_VERSION=4.5.6 export PGO_IMAGE_TAG=$PGO_BASEOS-$PGO_VERSION # for setting the pgo apiserver port, disabling TLS or not verifying TLS diff --git a/examples/helm/create-cluster/templates/pgcluster.yaml b/examples/helm/create-cluster/templates/pgcluster.yaml index 551c18a9d5..71de892216 100644 --- a/examples/helm/create-cluster/templates/pgcluster.yaml +++ b/examples/helm/create-cluster/templates/pgcluster.yaml @@ -13,7 +13,7 @@ metadata: pg-cluster: {{ .Values.pgclustername }} pg-pod-anti-affinity: "" pgo-backrest: "true" - pgo-version: 4.5.5 + pgo-version: 4.5.6 pgouser: admin name: {{ .Values.pgclustername }} namespace: {{ .Values.namespace }} diff --git a/examples/helm/create-cluster/values.yaml b/examples/helm/create-cluster/values.yaml index 21ace0ad7a..06f4f33476 100644 --- a/examples/helm/create-cluster/values.yaml +++ b/examples/helm/create-cluster/values.yaml @@ -4,11 +4,11 @@ # The values is for the namespace and the postgresql cluster name ccpimage: crunchy-postgres-ha ccpimageprefix: registry.developers.crunchydata.com/crunchydata -ccpimagetag: centos8-12.9-4.5.5 +ccpimagetag: centos8-12.10-4.5.6 namespace: pgo pgclustername: hippo pgoimageprefix: registry.developers.crunchydata.com/crunchydata -pgoversion: 4.5.5 +pgoversion: 4.5.6 hipposecretuser: "hippo" hipposecretpassword: "Supersecurepassword*" postgressecretuser: "postgres" diff --git a/installers/ansible/README.md b/installers/ansible/README.md index f537090af9..cfec049b20 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ PGO: The Postgres Operator from Crunchy Data

-Latest Release: 4.5.5 +Latest Release: 4.5.6 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index 1445729bd5..d81c1aec0c 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -17,7 +17,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.9-4.5.5" +ccp_image_tag: "centos8-12.10-4.5.6" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -50,14 +50,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.5" +pgo_client_version: "4.5.6" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.5" +pgo_image_tag: "centos8-4.5.6" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index 08ce60da3d..c59be5998c 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -6,7 +6,7 @@ MARKETPLACE_TOOLS ?= gcr.io/cloud-marketplace-tools/k8s/dev:$(MARKETPLACE_VERSIO MARKETPLACE_VERSION ?= 0.9.4 KUBECONFIG ?= $(HOME)/.kube/config PARAMETERS ?= {} -PGO_VERSION ?= 4.5.5 +PGO_VERSION ?= 4.5.6 IMAGE_BUILD_ARGS = --build-arg MARKETPLACE_VERSION='$(MARKETPLACE_VERSION)' \ --build-arg PGO_VERSION='$(PGO_VERSION)' diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index 500fe54619..0c224b78c0 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -59,7 +59,7 @@ Google Cloud Marketplace. ```shell IMAGE_REPOSITORY=gcr.io/crunchydata-public/postgres-operator - export PGO_VERSION=4.5.5 + export PGO_VERSION=4.5.6 export INSTALLER_IMAGE=${IMAGE_REPOSITORY}/deployer:${PGO_VERSION} export OPERATOR_IMAGE=${IMAGE_REPOSITORY}:${PGO_VERSION} export OPERATOR_IMAGE_API=${IMAGE_REPOSITORY}/pgo-apiserver:${PGO_VERSION} diff --git a/installers/gcp-marketplace/values.yaml b/installers/gcp-marketplace/values.yaml index a0f6be4197..e65b88aa50 100644 --- a/installers/gcp-marketplace/values.yaml +++ b/installers/gcp-marketplace/values.yaml @@ -10,7 +10,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.9-4.5.5" +ccp_image_tag: "centos8-12.10-4.5.6" create_rbac: "true" db_name: "" db_password_age_days: "0" @@ -32,9 +32,9 @@ pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" pgo_client_container_install: "false" pgo_client_install: 'false' -pgo_client_version: "4.5.5" +pgo_client_version: "4.5.6" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.5" +pgo_image_tag: "centos8-4.5.6" pgo_installation_name: '${OPERATOR_NAME}' pgo_operator_namespace: '${OPERATOR_NAMESPACE}' scheduler_timeout: "3600" diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index 1347ec4003..c74dda2adf 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -3,7 +3,7 @@ name: postgres-operator description: 'PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes' type: application version: 0.1.0 -appVersion: 4.5.5 +appVersion: 4.5.6 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg keywords: diff --git a/installers/helm/values.yaml b/installers/helm/values.yaml index a3a7cc0fe6..c3f41784e8 100644 --- a/installers/helm/values.yaml +++ b/installers/helm/values.yaml @@ -37,7 +37,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.9-4.5.5" +ccp_image_tag: "centos8-12.10-4.5.6" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -70,14 +70,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.5" +pgo_client_version: "4.5.6" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.5" +pgo_image_tag: "centos8-4.5.6" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index 53f6c0fff4..d1bafa6823 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -14,7 +14,7 @@ # This script should be run after the operator has been deployed PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}" PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}" -PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.5}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.6}" PGO_CLIENT_URL="https://github.com/CrunchyData/postgres-operator/releases/download/${PGO_CLIENT_VERSION}" PGO_CMD="${PGO_CMD-kubectl}" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 64356b2587..0f61817d60 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -50,7 +50,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.9-4.5.5" + ccp_image_tag: "centos8-12.10-4.5.6" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -83,14 +83,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.5" + pgo_client_version: "4.5.6" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.5" + pgo_image_tag: "centos8-4.5.6" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.5 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.6 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index abf59303c6..7873c7e529 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -145,7 +145,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.9-4.5.5" + ccp_image_tag: "centos8-12.10-4.5.6" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -178,14 +178,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.5" + pgo_client_version: "4.5.6" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.5" + pgo_image_tag: "centos8-4.5.6" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -281,7 +281,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.5 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.6 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index c4358d9df3..622bec79c0 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.5 +Latest Release: 4.5.6 ## General diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index 727a858bff..6b5eb0a055 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-monitoring description: Install for Crunchy PostgreSQL Operator Monitoring type: application version: 0.1.0 -appVersion: 4.5.5 +appVersion: 4.5.6 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg diff --git a/installers/metrics/helm/helm_template.yaml b/installers/metrics/helm/helm_template.yaml index 3312a14bc5..960f30d08b 100644 --- a/installers/metrics/helm/helm_template.yaml +++ b/installers/metrics/helm/helm_template.yaml @@ -20,5 +20,5 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.5" +pgo_image_tag: "centos8-4.5.6" diff --git a/installers/metrics/helm/values.yaml b/installers/metrics/helm/values.yaml index f29c3bbf22..32d26afe2a 100644 --- a/installers/metrics/helm/values.yaml +++ b/installers/metrics/helm/values.yaml @@ -20,7 +20,7 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.5" +pgo_image_tag: "centos8-4.5.6" # ===================== # Configuration Options diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index 0dd2af1239..343fca569d 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -101,7 +101,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.5 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.6 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index 8fc454161e..10baccd7f2 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.5 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.6 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index 33bf44abc6..2b452933ad 100644 --- a/installers/olm/Makefile +++ b/installers/olm/Makefile @@ -2,7 +2,7 @@ .SUFFIXES: CCP_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -CCP_PG_FULLVERSION ?= 12.9 +CCP_PG_FULLVERSION ?= 12.10 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.15.1 @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.15.1 PGO_BASEOS ?= centos8 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.5.5 +PGO_VERSION ?= 4.5.6 PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) CCP_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(PGO_VERSION) CCP_POSTGIS_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(CCP_POSTGIS_VERSION)-$(PGO_VERSION) diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 2611d5bd54..71f760a7e3 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -53,7 +53,7 @@ cluster. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.5", + '{"ClientVersion":"4.5.6", "Namespace":"pgouser1", "Name":"mycluster", $PGO_APISERVER_URL/clusters @@ -72,7 +72,7 @@ show all of the clusters that are in the given namespace. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.5", + '{"ClientVersion":"4.5.6", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/showclusters @@ -82,7 +82,7 @@ $PGO_APISERVER_URL/showclusters curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.5", + '{"ClientVersion":"4.5.6", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.5.5 + Version: 4.5.6 License: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 Contact: Crunchy Data https://www.crunchydata.com/ diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index 98b0cabe5e..fd4b06cd77 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -const PGO_VERSION = "4.5.5" +const PGO_VERSION = "4.5.6" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index 68c20b2ea2..1b0a1e4d4a 100644 --- a/redhat/atomic/help.1 +++ b/redhat/atomic/help.1 @@ -56,4 +56,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa \fB\fCRelease=\fR .PP -The specific release number of the container. For example, Release="4.5.5" +The specific release number of the container. For example, Release="4.5.6" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index 34d28d60ca..8130e8dcb1 100644 --- a/redhat/atomic/help.md +++ b/redhat/atomic/help.md @@ -45,4 +45,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa `Release=` -The specific release number of the container. For example, Release="4.5.5" +The specific release number of the container. For example, Release="4.5.6" From a6074b4d0d5d0dfe1d0005eb3cae4adf91abc227 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Tue, 22 Feb 2022 21:15:43 +0000 Subject: [PATCH 119/129] Add PGO v4.5.6 Release Notes [sc-13826] --- docs/content/releases/4.5.6.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 docs/content/releases/4.5.6.md diff --git a/docs/content/releases/4.5.6.md b/docs/content/releases/4.5.6.md new file mode 100644 index 0000000000..799423bf81 --- /dev/null +++ b/docs/content/releases/4.5.6.md @@ -0,0 +1,18 @@ +--- +title: "4.5.6" +date: +draft: false +weight: 65 +--- + +Crunchy Data announces the release of PGO, the Postgres Operator 4.5.6. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +PostgreSQL Operator 4.5.6 release includes the following software versions upgrades: + +- [PostgreSQL](https://www.postgresql.org) versions 13.6, 12.10, 11.15 and 10.20 are now available. + +## Changes + +- The version of Go utilized to build `yq` is now aligned with all other Go binaries. From ceba860eb368deb0c22d8f2df1db5b84dc26454f Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Wed, 23 Feb 2022 16:45:33 +0000 Subject: [PATCH 120/129] Update "golang.org/x/crypto" Dependency [sc-13826] --- Gopkg.lock | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 127 insertions(+), 6 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index ebbdb30834..1c7a70ea8d 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -79,6 +79,14 @@ revision = "daf2830f2741ebb735b21709a520c5f37d642d85" version = "v1.9.0" +[[projects]] + digest = "1:db78764ccd0698098e746bd1288916950bf875463915672051f1bdfef120e442" + name = "github.com/fsnotify/fsnotify" + packages = ["."] + pruneopts = "UT" + revision = "466b39d216616549a37ee93c7c47775f6a010790" + version = "v1.5.1" + [[projects]] digest = "1:ed15647db08b6d63666bf9755d337725960c302bbfa5e23754b4b915a4797e42" name = "github.com/go-openapi/jsonpointer" @@ -197,6 +205,25 @@ revision = "14eae340515388ca95aa8e7b86f0de668e981f54" version = "v0.5.4" +[[projects]] + digest = "1:c0d19ab64b32ce9fe5cf4ddceba78d5bc9807f0016db6b1183599da3dcc24d10" + name = "github.com/hashicorp/hcl" + packages = [ + ".", + "hcl/ast", + "hcl/parser", + "hcl/printer", + "hcl/scanner", + "hcl/strconv", + "hcl/token", + "json/parser", + "json/scanner", + "json/token", + ] + pruneopts = "UT" + revision = "8cb6e5b959231cc1119e43259c4a608f9c51a241" + version = "v1.0.0" + [[projects]] digest = "1:1a7059d684f8972987e4b6f0703083f207d63f63da0ea19610ef2e6bb73db059" name = "github.com/imdario/mergo" @@ -229,6 +256,14 @@ revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" version = "v1.0.2" +[[projects]] + digest = "1:fa6d7a5a592ad4052351be50fe4a66f9974a203eff6b675841ab64d99d17bb8e" + name = "github.com/magiconair/properties" + packages = ["."] + pruneopts = "UT" + revision = "869a5592420f4ff6ebf74500b5c658b29d973172" + version = "v1.8.6" + [[projects]] digest = "1:7bbccd3dd7998f2a180264ec1d12e362ed8e02f55ea7b82ac0d0f48ffa2d8888" name = "github.com/mailru/easyjson" @@ -257,6 +292,14 @@ revision = "7b513a986450394f7bbf1476909911b3aa3a55ce" version = "v0.0.12" +[[projects]] + digest = "1:408df21d45d59142857b4a5bb565aa75df89043f235987143ea1128cb8589000" + name = "github.com/mitchellh/mapstructure" + packages = ["."] + pruneopts = "UT" + revision = "b9b99d7d59762a5b2a43df840adc318b2fa229ee" + version = "v1.4.3" + [[projects]] digest = "1:33422d238f147d247752996a26574ac48dcf472976eda7f5134015f06bf16563" name = "github.com/modern-go/concurrent" @@ -281,6 +324,14 @@ revision = "d7acddb4babdf3329ad415cc02b605a239011b4b" version = "v1.0.8" +[[projects]] + digest = "1:fc865e52c574a92a628aee6cc4fb6b78f2bd2becf121881a1d6d1cfc6fb86b33" + name = "github.com/pelletier/go-toml" + packages = ["."] + pruneopts = "UT" + revision = "b8ba995eaaba4be30c8a8090bdfb4aa61af52054" + version = "v1.9.4" + [[projects]] digest = "1:9e1d37b58d17113ec3cb5608ac0382313c5b59470b94ed97d0976e69c7022314" name = "github.com/pkg/errors" @@ -313,6 +364,25 @@ revision = "d417be0fe654de640a82370515129985b407c7e3" version = "v1.5.0" +[[projects]] + digest = "1:0211c1b1e8d4b8945e2712854ebd76832fae02647b4c39fcfd219f10ad341566" + name = "github.com/spf13/afero" + packages = [ + ".", + "mem", + ] + pruneopts = "UT" + revision = "450b30f2bfc09acd88c31d66c28cb814a14b192b" + version = "v1.8.1" + +[[projects]] + digest = "1:df641e58f425436baeeb55d7a65a18f6a109591cd485a9b90d974a8fe4340eb4" + name = "github.com/spf13/cast" + packages = ["."] + pruneopts = "UT" + revision = "88075729b052bca4b8b6c31bf198db2fe6c9da93" + version = "v1.4.1" + [[projects]] digest = "1:abe9f3f23399646a6263682cacc9e86969f6c7e768f0ef036449926aa24cbbef" name = "github.com/spf13/cobra" @@ -324,6 +394,14 @@ revision = "f2b07da1e2c38d5f12845a4f607e2e1018cbb1f5" version = "v0.0.5" +[[projects]] + digest = "1:1b753ec16506f5864d26a28b43703c58831255059644351bbcb019b843950900" + name = "github.com/spf13/jwalterweatherman" + packages = ["."] + pruneopts = "UT" + revision = "94f6ae3ed3bceceafa716478c5fbf8d29ca601a1" + version = "v1.1.0" + [[projects]] digest = "1:524b71991fc7d9246cc7dc2d9e0886ccb97648091c63e30eef619e6862c955dd" name = "github.com/spf13/pflag" @@ -332,6 +410,29 @@ revision = "2e9d26c8c37aae03e3f9d4e90b7116f5accb7cab" version = "v1.0.5" +[[projects]] + digest = "1:f8ae93995f7b68f2aeba036bd6c9e0881c8c6edd67d6120f092eafa4c5a040f0" + name = "github.com/spf13/viper" + packages = [ + ".", + "internal/encoding", + "internal/encoding/hcl", + "internal/encoding/json", + "internal/encoding/toml", + "internal/encoding/yaml", + ] + pruneopts = "UT" + revision = "f646c50b184a0bec644dd1147d6b0e57be17c7aa" + version = "v1.10.1" + +[[projects]] + digest = "1:f4b32291cad5efac2bfdba89ccde6aa04618b62ce06c1a571da2dc4f3f2677fb" + name = "github.com/subosito/gotenv" + packages = ["."] + pruneopts = "UT" + revision = "2ef7124db659d49edac6aa459693a15ae36c671a" + version = "v1.2.0" + [[projects]] digest = "1:577b99fc55ee19cbf1ffd072808c91ced78cd732bd9d0517bec9b90e532069cb" name = "github.com/xdg/stringprep" @@ -342,23 +443,23 @@ [[projects]] branch = "master" - digest = "1:17da86687c09ab43a342bf91c2b2e5feba1dda6b7cce9626d64201fbf0113264" + digest = "1:2590655047facf8013ec25a0390c74c5eaf4aabcf817ff3d6e134b9975a29ed2" name = "golang.org/x/crypto" packages = [ "blowfish", "chacha20", "curve25519", + "curve25519/internal/field", "ed25519", - "ed25519/internal/edwards25519", + "internal/poly1305", "internal/subtle", "pbkdf2", - "poly1305", "ssh", "ssh/internal/bcrypt_pbkdf", "ssh/terminal", ] pruneopts = "UT" - revision = "0ec3e9974c59449edd84298612e9f16fa13368e8" + revision = "86341886e2925764dc890ad96c141a1bc76043af" [[projects]] digest = "1:467bb8fb8fa786448b8d486cd0bb7c1a5577dcd7310441aa02a20110cd9f727d" @@ -410,16 +511,25 @@ [[projects]] branch = "master" - digest = "1:3dcef1d66750aa78c2c57361b88e715b70a2486ab2a9f6c70a7cfb5e0712e9c3" + digest = "1:e1351da01125b2ed0ef635fbccc9a89a1df4a936ac668e8b106ce19366e32836" name = "golang.org/x/sys" packages = [ "cpu", + "plan9", "unix", "windows", ] pruneopts = "UT" revision = "c3d80250170dec19bf61949c81233cede5ddaf61" +[[projects]] + branch = "master" + digest = "1:91489886d519064782c699ea27906e2a5922bf05b31c6a46b74d4962b3657004" + name = "golang.org/x/term" + packages = ["."] + pruneopts = "UT" + revision = "03fcf44c2211dcd5eb77510b5f7c1fb02d6ded50" + [[projects]] digest = "1:66a2f252a58b4fbbad0e4e180e1d85a83c222b6bce09c3dcdef3dc87c72eda7c" name = "golang.org/x/text" @@ -456,7 +566,7 @@ [[projects]] branch = "master" - digest = "1:f09beeb593a009d70c55af474c713e5fdc13c0843896396db9e063c73fe572e4" + digest = "1:2ca7efcc164a3ee0b598bcc27e76563c362ba15d1fe14bda47f5a8e475b5f539" name = "golang.org/x/tools" packages = [ "go/ast/astutil", @@ -465,6 +575,7 @@ "internal/gocommand", "internal/gopathwalk", "internal/imports", + "internal/testenv", ] pruneopts = "UT" revision = "69646383afec4980001de1c52d6a3a6f3073ff6a" @@ -540,6 +651,14 @@ revision = "d2d2541c53f18d2a059457998ce2876cc8e67cbf" version = "v0.9.1" +[[projects]] + digest = "1:e56a0b2f3d01f2a98d2ace2171b4217ca8c08f8ef5f416bb11461064867c6ad4" + name = "gopkg.in/ini.v1" + packages = ["."] + pruneopts = "UT" + revision = "39f9e49bca3bbb9e67f361e9dd883912bb09a1b0" + version = "v1.66.4" + [[projects]] digest = "1:55b110c99c5fdc4f14930747326acce56b52cfce60b24b1c03ef686ac0e46bb1" name = "gopkg.in/yaml.v2" @@ -995,10 +1114,12 @@ "github.com/spf13/cobra", "github.com/spf13/cobra/doc", "github.com/spf13/pflag", + "github.com/spf13/viper", "github.com/xdg/stringprep", "golang.org/x/crypto/pbkdf2", "golang.org/x/crypto/ssh", "golang.org/x/sync/semaphore", + "golang.org/x/tools/internal/testenv", "k8s.io/api/apps/v1", "k8s.io/api/authorization/v1", "k8s.io/api/batch/v1", From 5d3ca35387256a10a799b95983908b426b57d185 Mon Sep 17 00:00:00 2001 From: Val Date: Fri, 27 May 2022 17:30:25 -0400 Subject: [PATCH 121/129] update to v4.5.7 and removed centos8 from docs, examples and (#3230) Makefile [sc-14635] --- Makefile | 6 +-- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 +- docs/config.toml | 14 ++--- docs/content/Configuration/compatibility.md | 5 ++ .../Configuration/pgo-yaml-configuration.md | 2 +- docs/content/Upgrade/automatedupgrade.md | 2 +- docs/content/Upgrade/manual/upgrade35.md | 2 +- docs/content/Upgrade/manual/upgrade4.md | 4 +- .../advanced/crunchy-postgres-exporter.md | 2 +- .../multi-cluster-kubernetes.md | 2 +- docs/content/contributing/developer-setup.md | 2 +- docs/content/custom-resources/_index.md | 6 +-- docs/content/installation/configuration.md | 4 +- .../metrics/metrics-configuration.md | 2 +- docs/content/pgo-client/common-tasks.md | 8 +-- docs/content/releases/4.5.6.md | 2 +- docs/content/releases/4.5.7.md | 17 ++++++ docs/content/support/_index.md | 2 +- docs/content/tutorial/pgbouncer.md | 2 +- examples/create-by-resource/fromcrd.json | 6 +-- examples/envs.sh | 4 +- .../create-cluster/templates/pgcluster.yaml | 2 +- examples/helm/create-cluster/values.yaml | 4 +- installers/ansible/README.md | 2 +- installers/ansible/values.yaml | 6 +-- installers/gcp-marketplace/Makefile | 2 +- installers/gcp-marketplace/README.md | 2 +- installers/gcp-marketplace/values.yaml | 6 +-- installers/helm/Chart.yaml | 2 +- installers/helm/values.yaml | 6 +-- installers/kubectl/client-setup.sh | 2 +- .../kubectl/postgres-operator-ocp311.yml | 8 +-- installers/kubectl/postgres-operator.yml | 8 +-- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- installers/metrics/helm/helm_template.yaml | 2 +- installers/metrics/helm/values.yaml | 2 +- .../postgres-operator-metrics-ocp311.yml | 2 +- .../kubectl/postgres-operator-metrics.yml | 2 +- installers/olm/Makefile | 6 +-- internal/util/util_test.go | 54 +++++++++---------- pkg/apis/crunchydata.com/v1/doc.go | 8 +-- pkg/apiservermsgs/common.go | 2 +- redhat/atomic/help.1 | 2 +- redhat/atomic/help.md | 2 +- 47 files changed, 130 insertions(+), 108 deletions(-) create mode 100644 docs/content/releases/4.5.7.md diff --git a/Makefile b/Makefile index 1ff9aa4050..19ff34f00a 100644 --- a/Makefile +++ b/Makefile @@ -4,14 +4,14 @@ GOBIN ?= $(GOPATH)/bin # Default values if not already set ANSIBLE_VERSION ?= 2.9.* PGOROOT ?= $(GOPATH)/src/github.com/crunchydata/postgres-operator -PGO_BASEOS ?= centos8 +PGO_BASEOS ?= ubi8 PGO_CMD ?= kubectl PGO_IMAGE_PREFIX ?= crunchydata PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) PGO_OPERATOR_NAMESPACE ?= pgo -PGO_VERSION ?= 4.5.6 +PGO_VERSION ?= 4.5.7 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.10 +PGO_PG_FULLVERSION ?= 12.11 PGO_BACKREST_VERSION ?= 2.29 PACKAGER ?= yum diff --git a/README.md b/README.md index 138ccfd851..45ae72c051 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ to start as quickly as: ```shell kubectl create namespace pgo -kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.6/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.7/installers/kubectl/postgres-operator.yml ``` Otherwise, we highly recommend following the instructions from our [Quickstart](https://access.crunchydata.com/documentation/postgres-operator/latest/quickstart/). diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index 9516b7501d..1ac46c6e14 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -16,7 +16,7 @@ GCR_IMAGE_PREFIX=gcr.io/crunchy-dev-test CCP_IMAGE_PREFIX=crunchydata -CCP_IMAGE_TAG=centos8-12.10-4.5.6 +CCP_IMAGE_TAG=ubi8-12.11-4.5.7 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index b3d82d417a..4f1e816cf7 100644 --- a/conf/postgres-operator/pgo.yaml +++ b/conf/postgres-operator/pgo.yaml @@ -2,7 +2,7 @@ Cluster: CCPImagePrefix: registry.developers.crunchydata.com/crunchydata Metrics: false Badger: false - CCPImageTag: centos8-12.10-4.5.6 + CCPImageTag: ubi8-12.11-4.5.7 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -82,4 +82,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos8-4.5.6 + PGOImageTag: ubi8-4.5.7 diff --git a/docs/config.toml b/docs/config.toml index e4f1ae5fd0..cd105a59bd 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,14 +25,14 @@ disableNavChevron = false # set true to hide next/prev chevron, default is false highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter menushortcutsnewtab = true # set true to open shortcuts links to a new tab/window enableGitInfo = true -operatorVersion = "4.5.6" -postgresVersion = "12.10" -postgresVersion13 = "13.6" -postgresVersion12 = "12.10" -postgresVersion11 = "11.15" -postgresVersion10 = "10.20" +operatorVersion = "4.5.7" +postgresVersion = "12.11" +postgresVersion13 = "13.7" +postgresVersion12 = "12.11" +postgresVersion11 = "11.16" +postgresVersion10 = "10.21" postgisVersion = "3.0" -centosBase = "centos8" +ubiBase = "ubi8" [outputs] home = [ "HTML", "RSS", "JSON"] diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index ddd41334af..3367c84915 100644 --- a/docs/content/Configuration/compatibility.md +++ b/docs/content/Configuration/compatibility.md @@ -12,6 +12,11 @@ version dependencies between the two projects. Below are the operator releases a | Operator Release | Container Release | Postgres | PgBackrest Version |:----------|:-------------|:------------|:-------------- +| 4.5.7 | 4.5.7 | 13.7 | 2.29 | +|||12.11|2.29| +|||11.16|2.29| +|||10.21|2.29| +|||| | 4.5.6 | 4.5.6 | 13.6 | 2.29 | |||12.10|2.29| |||11.15|2.29| diff --git a/docs/content/Configuration/pgo-yaml-configuration.md b/docs/content/Configuration/pgo-yaml-configuration.md index 942eafd229..46f944e309 100644 --- a/docs/content/Configuration/pgo-yaml-configuration.md +++ b/docs/content/Configuration/pgo-yaml-configuration.md @@ -16,7 +16,7 @@ The *pgo.yaml* file is broken into major sections as described below: |---|---| |BasicAuth | If set to `"true"` will enable Basic Authentication. If set to `"false"`, will allow a valid Operator user to successfully authenticate regardless of the value of the password provided for Basic Authentication. Defaults to `"true".` |CCPImagePrefix |newly created containers will be based on this image prefix (e.g. crunchydata), update this if you require a custom image prefix -|CCPImageTag |newly created containers will be based on this image version (e.g. {{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}}), unless you override it using the --ccp-image-tag command line flag +|CCPImageTag |newly created containers will be based on this image version (e.g. {{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}}), unless you override it using the --ccp-image-tag command line flag |Port | the PostgreSQL port to use for new containers (e.g. 5432) |PGBadgerPort | the port used to connect to pgbadger (e.g. 10000) |ExporterPort | the port used to connect to postgres exporter (e.g. 9187) diff --git a/docs/content/Upgrade/automatedupgrade.md b/docs/content/Upgrade/automatedupgrade.md index 31480bc07e..72184ced6a 100644 --- a/docs/content/Upgrade/automatedupgrade.md +++ b/docs/content/Upgrade/automatedupgrade.md @@ -127,7 +127,7 @@ pgo upgrade mycluster If you are using the PostGIS-enabled image (i.e. `crunchy-postgres-gis-ha`) or any other custom images, you will need to add the `--ccp-image-tag`: ``` -pgo upgrade --ccp-image-tag={{< param centosBase >}}-{{< param postgresVersion >}}-{{< param postgisVersion >}}-{{< param operatorVersion >}} mygiscluster +pgo upgrade --ccp-image-tag={{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param postgisVersion >}}-{{< param operatorVersion >}} mygiscluster ``` Where `{{< param postgresVersion >}}` is the PostgreSQL version, `{{< param postgisVersion >}}` is the PostGIS version and `{{< param operatorVersion >}}` is the PostgreSQL Operator version. Please note, no tag validation will be performed and additional steps may be required to upgrade your PostGIS extension implementation. For more information on PostGIS upgrade considerations, please see diff --git a/docs/content/Upgrade/manual/upgrade35.md b/docs/content/Upgrade/manual/upgrade35.md index cb7ec25138..261fbf6e89 100644 --- a/docs/content/Upgrade/manual/upgrade35.md +++ b/docs/content/Upgrade/manual/upgrade35.md @@ -17,7 +17,7 @@ A major change to this container is that the PostgreSQL process is now managed b When creating your new clusters using version {{< param operatorVersion >}} of the PostgreSQL Operator, the `pgo create cluster` command will automatically use the new `crunchy-postgres-ha` image if the image is unspecified. If you are creating a PostGIS enabled cluster, please be sure to use the updated image name and image tag, as with the command: ``` -pgo create cluster mygiscluster --ccp-image=crunchy-postgres-gis-ha --ccp-image-tag={{< param centosBase >}}-{{< param postgresVersion >}}-{{< param postgisVersion >}}-{{< param operatorVersion >}} +pgo create cluster mygiscluster --ccp-image=crunchy-postgres-gis-ha --ccp-image-tag={{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param postgisVersion >}}-{{< param operatorVersion >}} ``` Where `{{< param postgresVersion >}}` is the PostgreSQL version, `{{< param postgisVersion >}}` is the PostGIS version and `{{< param operatorVersion >}}` is the PostgreSQL Operator version. Please note, no tag validation will be performed and additional steps may be required to upgrade your PostGIS extension implementation. For more information on PostGIS upgrade considerations, please see diff --git a/docs/content/Upgrade/manual/upgrade4.md b/docs/content/Upgrade/manual/upgrade4.md index 01d6ac1d32..0c2d34baba 100644 --- a/docs/content/Upgrade/manual/upgrade4.md +++ b/docs/content/Upgrade/manual/upgrade4.md @@ -19,7 +19,7 @@ A major change to this container is that the PostgreSQL process is now managed b When creating your new clusters using version {{< param operatorVersion >}} of the PostgreSQL Operator, the `pgo create cluster` command will automatically use the new `crunchy-postgres-ha` image if the image is unspecified. If you are creating a PostGIS enabled cluster, please be sure to use the updated image name and image tag, as with the command: ``` -pgo create cluster mygiscluster --ccp-image=crunchy-postgres-gis-ha --ccp-image-tag={{< param centosBase >}}-{{< param postgresVersion >}}-{{< param postgisVersion >}}-{{< param operatorVersion >}} +pgo create cluster mygiscluster --ccp-image=crunchy-postgres-gis-ha --ccp-image-tag={{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param postgisVersion >}}-{{< param operatorVersion >}} ``` Where `{{< param postgresVersion >}}` is the PostgreSQL version, `{{< param postgisVersion >}}` is the PostGIS version and `{{< param operatorVersion >}}` is the PostgreSQL Operator version. Please note, no tag validation will be performed and additional steps may be required to upgrade your PostGIS extension implementation. For more information on PostGIS upgrade considerations, please see @@ -58,7 +58,7 @@ For example, given the following output: ``` $ pgo show cluster mycluster -cluster : mycluster (crunchy-postgres:centos8-11.5-2.4.2) +cluster : mycluster (crunchy-postgres:ubi8-11.5-2.4.2) pod : mycluster-7bbf54d785-pk5dq (Running) on kubernetes1 (1/1) (replica) pvc : mycluster pod : mycluster-ypvq-5b9b8d645-nvlb6 (Running) on kubernetes1 (1/1) (primary) diff --git a/docs/content/advanced/crunchy-postgres-exporter.md b/docs/content/advanced/crunchy-postgres-exporter.md index 84a2cf1968..f864a22b5a 100644 --- a/docs/content/advanced/crunchy-postgres-exporter.md +++ b/docs/content/advanced/crunchy-postgres-exporter.md @@ -24,7 +24,7 @@ can be specified for the API to collect. For an example of a queries.yml file, s The crunchy-postgres-exporter Docker image contains the following packages (versions vary depending on PostgreSQL version): * PostgreSQL ({{< param postgresVersion13 >}}, {{< param postgresVersion12 >}}, {{< param postgresVersion11 >}}, and {{< param postgresVersion10 >}} -* CentOS 7, 8 - publicly available +* CentOS 7, UBI 8 - publicly available * UBI 7, 8 - customers only * [PostgreSQL Exporter](https://github.com/wrouesnel/postgres_exporter) diff --git a/docs/content/architecture/high-availability/multi-cluster-kubernetes.md b/docs/content/architecture/high-availability/multi-cluster-kubernetes.md index 182fda58bf..1a507bbfb9 100644 --- a/docs/content/architecture/high-availability/multi-cluster-kubernetes.md +++ b/docs/content/architecture/high-availability/multi-cluster-kubernetes.md @@ -219,7 +219,7 @@ command. ``` pgo show cluster hippo -cluster : standby (crunchy-postgres-ha:{{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}}) +cluster : standby (crunchy-postgres-ha:{{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}}) standby : true ``` ## Promoting a Standby Cluster diff --git a/docs/content/contributing/developer-setup.md b/docs/content/contributing/developer-setup.md index 113139e607..30413da4dd 100644 --- a/docs/content/contributing/developer-setup.md +++ b/docs/content/contributing/developer-setup.md @@ -24,7 +24,7 @@ Variable | Example | Description `GOPATH` | $HOME/odev | Golang project directory `PGOROOT` | $GOPATH/src/github.com/crunchydata/postgres-operator | Operator repository location `PGO_CONF_DIR` | $PGOROOT/installers/ansible/roles/pgo-operator/files | Operator Config Template Directory -`PGO_BASEOS` | {{< param centosBase >}} | Base OS for container images +`PGO_BASEOS` | {{< param ubiBase >}} | Base OS for container images `PGO_CMD` | kubectl | Cluster management tool executable `PGO_IMAGE_PREFIX` | crunchydata | Container image prefix `PGO_OPERATOR_NAMESPACE` | pgo | Kubernetes namespace for the operator diff --git a/docs/content/custom-resources/_index.md b/docs/content/custom-resources/_index.md index f4384e311e..58290f8acc 100644 --- a/docs/content/custom-resources/_index.md +++ b/docs/content/custom-resources/_index.md @@ -168,7 +168,7 @@ spec: backrestS3VerifyTLS: "" ccpimage: crunchy-postgres-ha ccpimageprefix: registry.developers.crunchydata.com/crunchydata - ccpimagetag: {{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}} + ccpimagetag: {{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}} clustername: ${pgo_cluster_name} customconfig: "" database: ${pgo_cluster_name} @@ -359,7 +359,7 @@ spec: backrestS3VerifyTLS: "" ccpimage: crunchy-postgres-ha ccpimageprefix: registry.developers.crunchydata.com/crunchydata - ccpimagetag: {{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}} + ccpimagetag: {{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}} clustername: ${pgo_cluster_name} customconfig: "" database: ${pgo_cluster_name} @@ -678,7 +678,7 @@ make changes, as described below. | BackrestStorage | `create` | A specification that gives information about the storage attributes for the pgBackRest repository, which stores backups and archives, of the PostgreSQL cluster. For details, please see the `Storage Specification` section below. This is required. | | CCPImage | `create` | The name of the PostgreSQL container image to use, e.g. `crunchy-postgres-ha` or `crunchy-postgres-ha-gis`. | | CCPImagePrefix | `create` | If provided, the image prefix (or registry) of the PostgreSQL container image, e.g. `registry.developers.crunchydata.com/crunchydata`. The default is to use the image prefix set in the PostgreSQL Operator configuration. | -| CCPImageTag | `create` | The tag of the PostgreSQL container image to use, e.g. `{{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}}`. | +| CCPImageTag | `create` | The tag of the PostgreSQL container image to use, e.g. `{{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}}`. | | CollectSecretName | `create` | An optional attribute unless `crunchy-postgres-exporter` is specified in the `UserLabels`; contains the name of a Kubernetes Secret that contains the credentials for a PostgreSQL user that is used for metrics collection, and is created when the PostgreSQL cluster is first bootstrapped. For more information, please see `User Secret Specification`.| | ClusterName | `create` | The name of the PostgreSQL cluster, e.g. `hippo`. This is used to group PostgreSQL instances (primary, replicas) together. | | CustomConfig | `create` | If specified, references a custom ConfigMap to use when bootstrapping a PostgreSQL cluster. For the shape of this file, please see the section on [Custom Configuration]({{< relref "/advanced/custom-configuration.md" >}}) | diff --git a/docs/content/installation/configuration.md b/docs/content/installation/configuration.md index da4226a2f2..64ca97aaac 100644 --- a/docs/content/installation/configuration.md +++ b/docs/content/installation/configuration.md @@ -31,7 +31,7 @@ Operator. | `ccp_image_prefix` | registry.developers.crunchydata.com/crunchydata | **Required** | Configures the image prefix used when creating containers from Crunchy Container Suite. | | `ccp_image_pull_secret` | | | Name of a Secret containing credentials for container image registries. | | `ccp_image_pull_secret_manifest` | | | Provide a path to the Secret manifest to be installed in each namespace. (optional) | -| `ccp_image_tag` | {{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}} | **Required** | Configures the image tag (version) used when creating containers from Crunchy Container Suite. | +| `ccp_image_tag` | {{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}} | **Required** | Configures the image tag (version) used when creating containers from Crunchy Container Suite. | | `create_rbac` | true | **Required** | Set to true if the installer should create the RBAC resources required to run the PostgreSQL Operator. | | `crunchy_debug` | false | | Set to configure Operator to use debugging mode. Note: this can cause sensitive data such as passwords to appear in Operator logs. | | `db_name` | | | Set to a value to configure the default database name on all newly created clusters. By default, the PostgreSQL Operator will set it to the name of the cluster that is being created. | @@ -69,7 +69,7 @@ Operator. | `pgo_image_prefix` | registry.developers.crunchydata.com/crunchydata | **Required** | Configures the image prefix used when creating containers for the Crunchy PostgreSQL Operator (apiserver, operator, scheduler..etc). | | `pgo_image_pull_secret` | | | Name of a Secret containing credentials for container image registries. | | `pgo_image_pull_secret_manifest` | | | Provide a path to the Secret manifest to be installed in each namespace. (optional) | -| `pgo_image_tag` | {{< param centosBase >}}-{{< param operatorVersion >}} | **Required** | Configures the image tag used when creating containers for the Crunchy PostgreSQL Operator (apiserver, operator, scheduler..etc) | +| `pgo_image_tag` | {{< param ubiBase >}}-{{< param operatorVersion >}} | **Required** | Configures the image tag used when creating containers for the Crunchy PostgreSQL Operator (apiserver, operator, scheduler..etc) | | `pgo_installation_name` | devtest | **Required** | The name of the PGO installation. | | `pgo_noauth_routes` | | | Configures URL routes with mTLS and HTTP BasicAuth disabled. | | `pgo_operator_namespace` | pgo | **Required** | Set to configure the namespace where Operator will be deployed. | diff --git a/docs/content/installation/metrics/metrics-configuration.md b/docs/content/installation/metrics/metrics-configuration.md index 580f8e264a..d8a6bbf55f 100644 --- a/docs/content/installation/metrics/metrics-configuration.md +++ b/docs/content/installation/metrics/metrics-configuration.md @@ -125,6 +125,6 @@ PostgreSQL Operator Monitoring infrastructure: | Name | Default | Required | Description | |------|---------|----------|-------------| | `pgo_image_prefix` | registry.developers.crunchydata.com/crunchydata | **Required** | Configures the image prefix used by the `pgo-deployer` container | -| `pgo_image_tag` | {{< param centosBase >}}-{{< param operatorVersion >}} | **Required** | Configures the image tag used by the `pgo-deployer` container | +| `pgo_image_tag` | {{< param ubiBase >}}-{{< param operatorVersion >}} | **Required** | Configures the image tag used by the `pgo-deployer` container | [k8s-service-type]: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types diff --git a/docs/content/pgo-client/common-tasks.md b/docs/content/pgo-client/common-tasks.md index 265e0354aa..e339789ee0 100644 --- a/docs/content/pgo-client/common-tasks.md +++ b/docs/content/pgo-client/common-tasks.md @@ -107,7 +107,7 @@ which yields output similar to: BasicAuth: "" Cluster: CCPImagePrefix: crunchydata - CCPImageTag: {{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}} + CCPImageTag: {{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}} Policies: "" Metrics: false Badger: false @@ -136,7 +136,7 @@ Cluster: Pgo: Audit: false PGOImagePrefix: crunchydata - PGOImageTag: {{< param centosBase >}}-{{< param operatorVersion >}} + PGOImageTag: {{< param ubiBase >}}-{{< param operatorVersion >}} PrimaryStorage: nfsstorage BackupStorage: nfsstorage ReplicaStorage: nfsstorage @@ -253,7 +253,7 @@ example below, the cluster will use PostgreSQL {{< param postgresVersion >}} and ```shell pgo create cluster hagiscluster \ --ccp-image=crunchy-postgres-gis-ha \ - --ccp-image-tag={{< param centosBase >}}-{{< param postgresVersion >}}-{{< param postgisVersion >}}-{{< param operatorVersion >}} + --ccp-image-tag={{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param postgisVersion >}}-{{< param operatorVersion >}} ``` #### Create a PostgreSQL Cluster with a Tablespace @@ -378,7 +378,7 @@ pgo show cluster hacluster which will yield output similar to: ``` -cluster : hacluster (crunchy-postgres-ha:{{< param centosBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}}) +cluster : hacluster (crunchy-postgres-ha:{{< param ubiBase >}}-{{< param postgresVersion >}}-{{< param operatorVersion >}}) pod : hacluster-6dc6cfcfb9-f9knq (Running) on node01 (1/1) (primary) pvc : hacluster resources : CPU Limit= Memory Limit=, CPU Request= Memory Request= diff --git a/docs/content/releases/4.5.6.md b/docs/content/releases/4.5.6.md index 799423bf81..a166f188bf 100644 --- a/docs/content/releases/4.5.6.md +++ b/docs/content/releases/4.5.6.md @@ -2,7 +2,7 @@ title: "4.5.6" date: draft: false -weight: 65 +weight: 64 --- Crunchy Data announces the release of PGO, the Postgres Operator 4.5.6. diff --git a/docs/content/releases/4.5.7.md b/docs/content/releases/4.5.7.md new file mode 100644 index 0000000000..3e71bea796 --- /dev/null +++ b/docs/content/releases/4.5.7.md @@ -0,0 +1,17 @@ +--- +title: "4.5.7" +date: +draft: false +weight: 63 +--- + +Crunchy Data announces the release of PGO, the Postgres Operator 4.5.7. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +PostgreSQL Operator 4.5.7 release includes the following software versions upgrades: + +- [PostgreSQL](https://www.postgresql.org) versions 14.3, 13.7, 12.11, 11.16, and 10.21 are now available. +- [PostGIS](http://postgis.net/) version 3.1.4 is now available. +- The [pg_partman](https://github.com/pgpartman/pg_partman) extension is now at version 4.6.1. +- The [TimescaleDB](https://github.com/timescale/timescaledb) extension is now at version 2.6.1. diff --git a/docs/content/support/_index.md b/docs/content/support/_index.md index 0a2ca60346..f8a974c84b 100644 --- a/docs/content/support/_index.md +++ b/docs/content/support/_index.md @@ -13,7 +13,7 @@ There are a few options available for community support of the [PGO: the Postgre In all cases, please be sure to provide as many details as possible in regards to your issue, including: - Your Platform (e.g. Kubernetes vX.YY.Z) -- Operator Version (e.g. {{< param centosBase >}}-{{< param operatorVersion >}}) +- Operator Version (e.g. {{< param ubiBase >}}-{{< param operatorVersion >}}) - A detailed description of the issue, as well as steps you took that lead up to the issue - Any relevant logs - Any additional information you can provide that you may find helpful diff --git a/docs/content/tutorial/pgbouncer.md b/docs/content/tutorial/pgbouncer.md index 3a16f16a27..edddc06489 100644 --- a/docs/content/tutorial/pgbouncer.md +++ b/docs/content/tutorial/pgbouncer.md @@ -116,7 +116,7 @@ PGPASSWORD=randompassword psql -h localhost -p 5432 -U pgbouncer pgbouncer You should see something similar to this: ``` -psql (12.10, server 1.14.0/bouncer) +psql (12.11, server 1.14.0/bouncer) Type "help" for help. pgbouncer=# diff --git a/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index 7c612efb16..b044941521 100644 --- a/examples/create-by-resource/fromcrd.json +++ b/examples/create-by-resource/fromcrd.json @@ -16,7 +16,7 @@ "pg-cluster": "fromcrd", "pg-pod-anti-affinity": "", "pgo-backrest": "true", - "pgo-version": "4.5.6", + "pgo-version": "4.5.7", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos8-12.10-4.5.6", + "ccpimagetag": "ubi8-12.11-4.5.7", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy-postgres-exporter": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.5.6", + "pgo-version": "4.5.7", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index 1646291188..d30bb67261 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -22,8 +22,8 @@ export PGO_CONF_DIR=$PGOROOT/installers/ansible/roles/pgo-operator/files # the version of the Operator you run is set by these vars export PGO_IMAGE_PREFIX=registry.developers.crunchydata.com/crunchydata -export PGO_BASEOS=centos8 -export PGO_VERSION=4.5.6 +export PGO_BASEOS=ubi8 +export PGO_VERSION=4.5.7 export PGO_IMAGE_TAG=$PGO_BASEOS-$PGO_VERSION # for setting the pgo apiserver port, disabling TLS or not verifying TLS diff --git a/examples/helm/create-cluster/templates/pgcluster.yaml b/examples/helm/create-cluster/templates/pgcluster.yaml index 71de892216..2b29f4ce97 100644 --- a/examples/helm/create-cluster/templates/pgcluster.yaml +++ b/examples/helm/create-cluster/templates/pgcluster.yaml @@ -13,7 +13,7 @@ metadata: pg-cluster: {{ .Values.pgclustername }} pg-pod-anti-affinity: "" pgo-backrest: "true" - pgo-version: 4.5.6 + pgo-version: 4.5.7 pgouser: admin name: {{ .Values.pgclustername }} namespace: {{ .Values.namespace }} diff --git a/examples/helm/create-cluster/values.yaml b/examples/helm/create-cluster/values.yaml index 06f4f33476..b6a8d32648 100644 --- a/examples/helm/create-cluster/values.yaml +++ b/examples/helm/create-cluster/values.yaml @@ -4,11 +4,11 @@ # The values is for the namespace and the postgresql cluster name ccpimage: crunchy-postgres-ha ccpimageprefix: registry.developers.crunchydata.com/crunchydata -ccpimagetag: centos8-12.10-4.5.6 +ccpimagetag: ubi8-12.11-4.5.7 namespace: pgo pgclustername: hippo pgoimageprefix: registry.developers.crunchydata.com/crunchydata -pgoversion: 4.5.6 +pgoversion: 4.5.7 hipposecretuser: "hippo" hipposecretpassword: "Supersecurepassword*" postgressecretuser: "postgres" diff --git a/installers/ansible/README.md b/installers/ansible/README.md index cfec049b20..a278ac0af1 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ PGO: The Postgres Operator from Crunchy Data

-Latest Release: 4.5.6 +Latest Release: 4.5.7 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index d81c1aec0c..d619d210cd 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -17,7 +17,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.10-4.5.6" +ccp_image_tag: "ubi8-12.11-4.5.7" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -50,14 +50,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.6" +pgo_client_version: "4.5.7" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.6" +pgo_image_tag: "ubi8-4.5.7" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index c59be5998c..30e52165e1 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -6,7 +6,7 @@ MARKETPLACE_TOOLS ?= gcr.io/cloud-marketplace-tools/k8s/dev:$(MARKETPLACE_VERSIO MARKETPLACE_VERSION ?= 0.9.4 KUBECONFIG ?= $(HOME)/.kube/config PARAMETERS ?= {} -PGO_VERSION ?= 4.5.6 +PGO_VERSION ?= 4.5.7 IMAGE_BUILD_ARGS = --build-arg MARKETPLACE_VERSION='$(MARKETPLACE_VERSION)' \ --build-arg PGO_VERSION='$(PGO_VERSION)' diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index 0c224b78c0..c0291a3a74 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -59,7 +59,7 @@ Google Cloud Marketplace. ```shell IMAGE_REPOSITORY=gcr.io/crunchydata-public/postgres-operator - export PGO_VERSION=4.5.6 + export PGO_VERSION=4.5.7 export INSTALLER_IMAGE=${IMAGE_REPOSITORY}/deployer:${PGO_VERSION} export OPERATOR_IMAGE=${IMAGE_REPOSITORY}:${PGO_VERSION} export OPERATOR_IMAGE_API=${IMAGE_REPOSITORY}/pgo-apiserver:${PGO_VERSION} diff --git a/installers/gcp-marketplace/values.yaml b/installers/gcp-marketplace/values.yaml index e65b88aa50..53d59f7cda 100644 --- a/installers/gcp-marketplace/values.yaml +++ b/installers/gcp-marketplace/values.yaml @@ -10,7 +10,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.10-4.5.6" +ccp_image_tag: "ubi8-12.11-4.5.7" create_rbac: "true" db_name: "" db_password_age_days: "0" @@ -32,9 +32,9 @@ pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" pgo_client_container_install: "false" pgo_client_install: 'false' -pgo_client_version: "4.5.6" +pgo_client_version: "4.5.7" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.6" +pgo_image_tag: "ubi8-4.5.7" pgo_installation_name: '${OPERATOR_NAME}' pgo_operator_namespace: '${OPERATOR_NAMESPACE}' scheduler_timeout: "3600" diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index c74dda2adf..02da65ef6c 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -3,7 +3,7 @@ name: postgres-operator description: 'PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes' type: application version: 0.1.0 -appVersion: 4.5.6 +appVersion: 4.5.7 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg keywords: diff --git a/installers/helm/values.yaml b/installers/helm/values.yaml index c3f41784e8..6865536a57 100644 --- a/installers/helm/values.yaml +++ b/installers/helm/values.yaml @@ -37,7 +37,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "centos8-12.10-4.5.6" +ccp_image_tag: "ubi8-12.11-4.5.7" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -70,14 +70,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.6" +pgo_client_version: "4.5.7" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos8-4.5.6" +pgo_image_tag: "ubi8-4.5.7" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index d1bafa6823..fbe91e8863 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -14,7 +14,7 @@ # This script should be run after the operator has been deployed PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}" PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}" -PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.6}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.7}" PGO_CLIENT_URL="https://github.com/CrunchyData/postgres-operator/releases/download/${PGO_CLIENT_VERSION}" PGO_CMD="${PGO_CMD-kubectl}" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 0f61817d60..1114a2db3a 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -50,7 +50,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.10-4.5.6" + ccp_image_tag: "ubi8-12.11-4.5.7" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -83,14 +83,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.6" + pgo_client_version: "4.5.7" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.6" + pgo_image_tag: "ubi8-4.5.7" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.6 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.7 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index 7873c7e529..c1a383e5bd 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -145,7 +145,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos8-12.10-4.5.6" + ccp_image_tag: "ubi8-12.11-4.5.7" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -178,14 +178,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.6" + pgo_client_version: "4.5.7" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "centos8-4.5.6" + pgo_image_tag: "ubi8-4.5.7" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -281,7 +281,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.6 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.7 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index 622bec79c0..6a837039c3 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.6 +Latest Release: 4.5.7 ## General diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index 6b5eb0a055..90fa9befc2 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-monitoring description: Install for Crunchy PostgreSQL Operator Monitoring type: application version: 0.1.0 -appVersion: 4.5.6 +appVersion: 4.5.7 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg diff --git a/installers/metrics/helm/helm_template.yaml b/installers/metrics/helm/helm_template.yaml index 960f30d08b..0ee7ebdb86 100644 --- a/installers/metrics/helm/helm_template.yaml +++ b/installers/metrics/helm/helm_template.yaml @@ -20,5 +20,5 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.6" +pgo_image_tag: "ubi8-4.5.7" diff --git a/installers/metrics/helm/values.yaml b/installers/metrics/helm/values.yaml index 32d26afe2a..9ff72ef74d 100644 --- a/installers/metrics/helm/values.yaml +++ b/installers/metrics/helm/values.yaml @@ -20,7 +20,7 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "centos8-4.5.6" +pgo_image_tag: "ubi8-4.5.7" # ===================== # Configuration Options diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index 343fca569d..e7421b824e 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -101,7 +101,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.6 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.7 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index 10baccd7f2..3fb552e646 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos8-4.5.6 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.7 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index 2b452933ad..4e22f79dd5 100644 --- a/installers/olm/Makefile +++ b/installers/olm/Makefile @@ -2,15 +2,15 @@ .SUFFIXES: CCP_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -CCP_PG_FULLVERSION ?= 12.10 +CCP_PG_FULLVERSION ?= 12.11 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.15.1 OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSION) OLM_VERSION ?= 0.15.1 -PGO_BASEOS ?= centos8 +PGO_BASEOS ?= ubi8 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.5.6 +PGO_VERSION ?= 4.5.7 PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) CCP_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(PGO_VERSION) CCP_POSTGIS_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(CCP_POSTGIS_VERSION)-$(PGO_VERSION) diff --git a/internal/util/util_test.go b/internal/util/util_test.go index b7ae785b55..ba02d48987 100644 --- a/internal/util/util_test.go +++ b/internal/util/util_test.go @@ -18,50 +18,50 @@ func TestGetStandardImageTag(t *testing.T) { expected string }{ { - "image: crunchy-postgres-ha, tag: centos8-12.4-4.5.0", + "image: crunchy-postgres-ha, tag: ubi8-12.4-4.5.0", "crunchy-postgres-ha", - "centos8-12.4-4.5.0", - "centos8-12.4-4.5.0", + "ubi8-12.4-4.5.0", + "ubi8-12.4-4.5.0", }, { - "image: crunchy-postgres-gis-ha, tag: centos8-12.4-3.0-4.5.0", + "image: crunchy-postgres-gis-ha, tag: ubi8-12.4-3.0-4.5.0", "crunchy-postgres-gis-ha", - "centos8-12.4-3.0-4.5.0", - "centos8-12.4-4.5.0", + "ubi8-12.4-3.0-4.5.0", + "ubi8-12.4-4.5.0", }, { - "image: crunchy-postgres-ha, tag: centos8-12.4-4.5.0-beta.1", + "image: crunchy-postgres-ha, tag: ubi8-12.4-4.5.0-beta.1", "crunchy-postgres-ha", - "centos8-12.4-4.5.0-beta.1", - "centos8-12.4-4.5.0-beta.1", + "ubi8-12.4-4.5.0-beta.1", + "ubi8-12.4-4.5.0-beta.1", }, { - "image: crunchy-postgres-gis-ha, tag: centos8-12.4-3.0-4.5.0-beta.2", + "image: crunchy-postgres-gis-ha, tag: ubi8-12.4-3.0-4.5.0-beta.2", "crunchy-postgres-gis-ha", - "centos8-12.4-3.0-4.5.0-beta.2", - "centos8-12.4-4.5.0-beta.2", + "ubi8-12.4-3.0-4.5.0-beta.2", + "ubi8-12.4-4.5.0-beta.2", }, { - "image: crunchy-postgres-ha, tag: centos8-9.5.23-4.5.0-rc.1", + "image: crunchy-postgres-ha, tag: ubi8-9.5.23-4.5.0-rc.1", "crunchy-postgres-ha", - "centos8-9.5.23-4.5.0-rc.1", - "centos8-9.5.23-4.5.0-rc.1", + "ubi8-9.5.23-4.5.0-rc.1", + "ubi8-9.5.23-4.5.0-rc.1", }, { - "image: crunchy-postgres-gis-ha, tag: centos8-9.5.23-2.4-4.5.0-rc.1", + "image: crunchy-postgres-gis-ha, tag: ubi8-9.5.23-2.4-4.5.0-rc.1", "crunchy-postgres-gis-ha", - "centos8-9.5.23-2.4-4.5.0-rc.1", - "centos8-9.5.23-4.5.0-rc.1", + "ubi8-9.5.23-2.4-4.5.0-rc.1", + "ubi8-9.5.23-4.5.0-rc.1", }, { - "image: crunchy-postgres-gis-ha, tag: centos8-13.0-3.0-4.5.0-rc.1", + "image: crunchy-postgres-gis-ha, tag: ubi8-13.0-3.0-4.5.0-rc.1", "crunchy-postgres-gis-ha", - "centos8-13.0-3.0-4.5.0-rc.1", - "centos8-13.0-4.5.0-rc.1", + "ubi8-13.0-3.0-4.5.0-rc.1", + "ubi8-13.0-4.5.0-rc.1", }, { - "image: crunchy-postgres-gis-ha, tag: centos8-custom123", + "image: crunchy-postgres-gis-ha, tag: ubi8-custom123", "crunchy-postgres-gis-ha", - "centos8-custom123", - "centos8-custom123", + "ubi8-custom123", + "ubi8-custom123", }, { - "image: crunchy-postgres-gis-ha, tag: centos8-custom123-moreinfo-789", + "image: crunchy-postgres-gis-ha, tag: ubi8-custom123-moreinfo-789", "crunchy-postgres-gis-ha", - "centos8-custom123-moreinfo-789", - "centos8-custom123-moreinfo-789", + "ubi8-custom123-moreinfo-789", + "ubi8-custom123-moreinfo-789", }, } diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 71f760a7e3..9599cba7e6 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -53,7 +53,7 @@ cluster. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.6", + '{"ClientVersion":"4.5.7", "Namespace":"pgouser1", "Name":"mycluster", $PGO_APISERVER_URL/clusters @@ -72,7 +72,7 @@ show all of the clusters that are in the given namespace. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.6", + '{"ClientVersion":"4.5.7", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/showclusters @@ -82,7 +82,7 @@ $PGO_APISERVER_URL/showclusters curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.6", + '{"ClientVersion":"4.5.7", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.5.6 + Version: 4.5.7 License: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 Contact: Crunchy Data https://www.crunchydata.com/ diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index fd4b06cd77..479554cb08 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -const PGO_VERSION = "4.5.6" +const PGO_VERSION = "4.5.7" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index 1b0a1e4d4a..cfb38ca3e1 100644 --- a/redhat/atomic/help.1 +++ b/redhat/atomic/help.1 @@ -56,4 +56,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa \fB\fCRelease=\fR .PP -The specific release number of the container. For example, Release="4.5.6" +The specific release number of the container. For example, Release="4.5.7" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index 8130e8dcb1..fa36365cd1 100644 --- a/redhat/atomic/help.md +++ b/redhat/atomic/help.md @@ -45,4 +45,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa `Release=` -The specific release number of the container. For example, Release="4.5.6" +The specific release number of the container. For example, Release="4.5.7" From cdb461bea8a4ca318e068ed5ff619e89b92e8fd9 Mon Sep 17 00:00:00 2001 From: ValClarkson Date: Wed, 1 Jun 2022 16:40:04 -0400 Subject: [PATCH 122/129] updated ansible in makefile and docker file [sc-14721] --- Makefile | 2 +- build/pgo-deployer/Dockerfile | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 19ff34f00a..62eaaaee68 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ GOPATH ?= $(HOME)/odev/go GOBIN ?= $(GOPATH)/bin # Default values if not already set -ANSIBLE_VERSION ?= 2.9.* +ANSIBLE_VERSION ?= 2.12.* PGOROOT ?= $(GOPATH)/src/github.com/crunchydata/postgres-operator PGO_BASEOS ?= ubi8 PGO_CMD ?= kubectl diff --git a/build/pgo-deployer/Dockerfile b/build/pgo-deployer/Dockerfile index e6532886d2..7899333f52 100644 --- a/build/pgo-deployer/Dockerfile +++ b/build/pgo-deployer/Dockerfile @@ -19,7 +19,7 @@ RUN if [ "$DFSET" = "centos" ] ; then \ && ${PACKAGER} -y install \ --setopt=skip_missing_names_on_install=False \ kubectl \ - ansible-${ANSIBLE_VERSION} \ + ansible-core-${ANSIBLE_VERSION} \ which \ gettext \ && ${PACKAGER} -y clean all ; \ @@ -32,7 +32,7 @@ RUN if [ "$BASEOS" = "rhel7" ] ; then \ --setopt=skip_missing_names_on_install=False \ --enablerepo='rhel-7-server-ose-4.4-rpms' \ openshift-clients \ - ansible-${ANSIBLE_VERSION} \ + ansible-core-${ANSIBLE_VERSION} \ which \ gettext \ && ${PACKAGER} -y clean all --enablerepo='rhel-7-server-ose-4.4-rpms' ; \ @@ -45,7 +45,7 @@ RUN if [ "$BASEOS" = "ubi7" ] ; then \ --setopt=skip_missing_names_on_install=False \ --enablerepo='rhel-7-server-ose-4.4-rpms' \ openshift-clients \ - ansible-${ANSIBLE_VERSION} \ + ansible-core-${ANSIBLE_VERSION} \ which \ gettext \ && ${PACKAGER} -y clean all --enablerepo='rhel-7-server-ose-4.4-rpms' ; \ @@ -58,7 +58,7 @@ RUN if [ "$BASEOS" = "ubi8" ] ; then \ --setopt=skip_missing_names_on_install=False \ --enablerepo='rhocp-4.5-for-rhel-8-x86_64-rpms' \ openshift-clients \ - ansible-${ANSIBLE_VERSION} \ + ansible-core-${ANSIBLE_VERSION} \ which \ gettext \ && ${PACKAGER} -y clean all --enablerepo='rhocp-4.5-for-rhel-8-x86_64-rpms' ; \ From 0a74dbb9d5f7ecfe511b071f21016ab34a05963f Mon Sep 17 00:00:00 2001 From: Val Date: Thu, 2 Jun 2022 12:37:08 -0400 Subject: [PATCH 123/129] removed ansible pinned version, will now install latest ansible (#3243) [sc-14721] --- Makefile | 2 -- build/pgo-deployer/Dockerfile | 9 ++++----- installers/image/conf/kubernetes.repo | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 62eaaaee68..743a81a5bf 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,6 @@ GOPATH ?= $(HOME)/odev/go GOBIN ?= $(GOPATH)/bin # Default values if not already set -ANSIBLE_VERSION ?= 2.12.* PGOROOT ?= $(GOPATH)/src/github.com/crunchydata/postgres-operator PGO_BASEOS ?= ubi8 PGO_CMD ?= kubectl @@ -181,7 +180,6 @@ $(PGOROOT)/build/%/Dockerfile: --build-arg PREFIX=$(PGO_IMAGE_PREFIX) \ --build-arg PGVERSION=$(PGO_PG_VERSION) \ --build-arg BACKREST_VERSION=$(PGO_BACKREST_VERSION) \ - --build-arg ANSIBLE_VERSION=$(ANSIBLE_VERSION) \ --build-arg DFSET=$(DFSET) \ --build-arg PACKAGER=$(PACKAGER) \ $(PGOROOT) diff --git a/build/pgo-deployer/Dockerfile b/build/pgo-deployer/Dockerfile index 7899333f52..b25fd7ae00 100644 --- a/build/pgo-deployer/Dockerfile +++ b/build/pgo-deployer/Dockerfile @@ -4,7 +4,6 @@ ARG PREFIX FROM ${PREFIX}/pgo-base:${BASEOS}-${BASEVER} ARG BASEOS -ARG ANSIBLE_VERSION ARG PACKAGER ARG DFSET @@ -19,7 +18,7 @@ RUN if [ "$DFSET" = "centos" ] ; then \ && ${PACKAGER} -y install \ --setopt=skip_missing_names_on_install=False \ kubectl \ - ansible-core-${ANSIBLE_VERSION} \ + ansible \ which \ gettext \ && ${PACKAGER} -y clean all ; \ @@ -32,7 +31,7 @@ RUN if [ "$BASEOS" = "rhel7" ] ; then \ --setopt=skip_missing_names_on_install=False \ --enablerepo='rhel-7-server-ose-4.4-rpms' \ openshift-clients \ - ansible-core-${ANSIBLE_VERSION} \ + ansible \ which \ gettext \ && ${PACKAGER} -y clean all --enablerepo='rhel-7-server-ose-4.4-rpms' ; \ @@ -45,7 +44,7 @@ RUN if [ "$BASEOS" = "ubi7" ] ; then \ --setopt=skip_missing_names_on_install=False \ --enablerepo='rhel-7-server-ose-4.4-rpms' \ openshift-clients \ - ansible-core-${ANSIBLE_VERSION} \ + ansible \ which \ gettext \ && ${PACKAGER} -y clean all --enablerepo='rhel-7-server-ose-4.4-rpms' ; \ @@ -58,7 +57,7 @@ RUN if [ "$BASEOS" = "ubi8" ] ; then \ --setopt=skip_missing_names_on_install=False \ --enablerepo='rhocp-4.5-for-rhel-8-x86_64-rpms' \ openshift-clients \ - ansible-core-${ANSIBLE_VERSION} \ + ansible \ which \ gettext \ && ${PACKAGER} -y clean all --enablerepo='rhocp-4.5-for-rhel-8-x86_64-rpms' ; \ diff --git a/installers/image/conf/kubernetes.repo b/installers/image/conf/kubernetes.repo index 0a8b4cf2bf..8830e53746 100644 --- a/installers/image/conf/kubernetes.repo +++ b/installers/image/conf/kubernetes.repo @@ -3,5 +3,5 @@ name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 -repo_gpgcheck=1 +repo_gpgcheck=0 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg \ No newline at end of file From 4b464c1f74948d4cdb27375702d86c9e853302b4 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Wed, 8 Jun 2022 18:15:17 +0000 Subject: [PATCH 124/129] Fix Ansible Dependency & Update Aync Directory Adds the "python38-jmespath" package to the "pgo-deployer" image for UBI 8 as required by Ansible, while also updating the Ansible async directory for proper async functionality in all "pgo-deployer" image builds. Issue: [sc-14754] --- build/pgo-deployer/Dockerfile | 1 + installers/ansible/roles/pgo-operator/tasks/main.yml | 2 ++ installers/metrics/ansible/roles/pgo-metrics/tasks/main.yml | 2 ++ 3 files changed, 5 insertions(+) diff --git a/build/pgo-deployer/Dockerfile b/build/pgo-deployer/Dockerfile index b25fd7ae00..ff02c0bec7 100644 --- a/build/pgo-deployer/Dockerfile +++ b/build/pgo-deployer/Dockerfile @@ -60,6 +60,7 @@ RUN if [ "$BASEOS" = "ubi8" ] ; then \ ansible \ which \ gettext \ + python38-jmespath \ && ${PACKAGER} -y clean all --enablerepo='rhocp-4.5-for-rhel-8-x86_64-rpms' ; \ fi diff --git a/installers/ansible/roles/pgo-operator/tasks/main.yml b/installers/ansible/roles/pgo-operator/tasks/main.yml index 205c7385ed..aafe7b6679 100644 --- a/installers/ansible/roles/pgo-operator/tasks/main.yml +++ b/installers/ansible/roles/pgo-operator/tasks/main.yml @@ -340,6 +340,8 @@ - name: Wait for PGO to finish deploying command: "{{ kubectl_or_oc }} rollout status deployment/postgres-operator -n {{ pgo_operator_namespace }}" async: 600 + vars: + ansible_async_dir: /tmp/.ansible_async - name: PGO Client tags: diff --git a/installers/metrics/ansible/roles/pgo-metrics/tasks/main.yml b/installers/metrics/ansible/roles/pgo-metrics/tasks/main.yml index ae2c27b8e3..20232d1445 100644 --- a/installers/metrics/ansible/roles/pgo-metrics/tasks/main.yml +++ b/installers/metrics/ansible/roles/pgo-metrics/tasks/main.yml @@ -114,6 +114,8 @@ poll: 0 loop: "{{ deployments }}" register: deployment_results + vars: + ansible_async_dir: /tmp/.ansible_async - name: Check Metrics Deployment Status async_status: From eee84156bedaea7061820b656bf43cfde33be70d Mon Sep 17 00:00:00 2001 From: Joseph Mckulka <16840147+jmckulk@users.noreply.github.com> Date: Thu, 4 Aug 2022 14:03:14 -0400 Subject: [PATCH 125/129] Bump 4.5.7 to 4.5.8 (#3335) --- Makefile | 4 ++-- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 ++-- docs/config.toml | 12 ++++++------ docs/content/Configuration/compatibility.md | 5 +++++ docs/content/releases/4.5.8.md | 17 +++++++++++++++++ docs/content/tutorial/pgbouncer.md | 2 +- installers/ansible/README.md | 2 +- installers/ansible/values.yaml | 6 +++--- installers/gcp-marketplace/Makefile | 2 +- installers/gcp-marketplace/README.md | 2 +- installers/gcp-marketplace/values.yaml | 6 +++--- installers/helm/Chart.yaml | 2 +- installers/helm/values.yaml | 6 +++--- installers/kubectl/client-setup.sh | 2 +- installers/kubectl/postgres-operator-ocp311.yml | 8 ++++---- installers/kubectl/postgres-operator.yml | 8 ++++---- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- installers/metrics/helm/helm_template.yaml | 2 +- installers/metrics/helm/values.yaml | 2 +- .../postgres-operator-metrics-ocp311.yml | 2 +- .../kubectl/postgres-operator-metrics.yml | 2 +- installers/olm/Makefile | 4 ++-- pkg/apis/crunchydata.com/v1/doc.go | 8 ++++---- pkg/apiservermsgs/common.go | 2 +- redhat/atomic/help.1 | 2 +- redhat/atomic/help.md | 2 +- 29 files changed, 72 insertions(+), 50 deletions(-) create mode 100644 docs/content/releases/4.5.8.md diff --git a/Makefile b/Makefile index 743a81a5bf..59465f442e 100644 --- a/Makefile +++ b/Makefile @@ -8,9 +8,9 @@ PGO_CMD ?= kubectl PGO_IMAGE_PREFIX ?= crunchydata PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) PGO_OPERATOR_NAMESPACE ?= pgo -PGO_VERSION ?= 4.5.7 +PGO_VERSION ?= 4.5.8 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.11 +PGO_PG_FULLVERSION ?= 12.12 PGO_BACKREST_VERSION ?= 2.29 PACKAGER ?= yum diff --git a/README.md b/README.md index 45ae72c051..03f3e50c30 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ to start as quickly as: ```shell kubectl create namespace pgo -kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.7/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.8/installers/kubectl/postgres-operator.yml ``` Otherwise, we highly recommend following the instructions from our [Quickstart](https://access.crunchydata.com/documentation/postgres-operator/latest/quickstart/). diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index 1ac46c6e14..60320d7f39 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -16,7 +16,7 @@ GCR_IMAGE_PREFIX=gcr.io/crunchy-dev-test CCP_IMAGE_PREFIX=crunchydata -CCP_IMAGE_TAG=ubi8-12.11-4.5.7 +CCP_IMAGE_TAG=ubi8-12.12-4.5.8 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index 4f1e816cf7..c0b9bcb041 100644 --- a/conf/postgres-operator/pgo.yaml +++ b/conf/postgres-operator/pgo.yaml @@ -2,7 +2,7 @@ Cluster: CCPImagePrefix: registry.developers.crunchydata.com/crunchydata Metrics: false Badger: false - CCPImageTag: ubi8-12.11-4.5.7 + CCPImageTag: ubi8-12.12-4.5.8 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -82,4 +82,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: ubi8-4.5.7 + PGOImageTag: ubi8-4.5.8 diff --git a/docs/config.toml b/docs/config.toml index cd105a59bd..c222518baf 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,12 +25,12 @@ disableNavChevron = false # set true to hide next/prev chevron, default is false highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter menushortcutsnewtab = true # set true to open shortcuts links to a new tab/window enableGitInfo = true -operatorVersion = "4.5.7" -postgresVersion = "12.11" -postgresVersion13 = "13.7" -postgresVersion12 = "12.11" -postgresVersion11 = "11.16" -postgresVersion10 = "10.21" +operatorVersion = "4.5.8" +postgresVersion = "12.12" +postgresVersion13 = "13.8" +postgresVersion12 = "12.12" +postgresVersion11 = "11.17" +postgresVersion10 = "10.22" postgisVersion = "3.0" ubiBase = "ubi8" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index 3367c84915..69f0bf1f78 100644 --- a/docs/content/Configuration/compatibility.md +++ b/docs/content/Configuration/compatibility.md @@ -12,6 +12,11 @@ version dependencies between the two projects. Below are the operator releases a | Operator Release | Container Release | Postgres | PgBackrest Version |:----------|:-------------|:------------|:-------------- +| 4.5.8 | 4.5.8 | 13.8 | 2.29 | +|||12.12|2.29| +|||11.17|2.29| +|||10.22|2.29| +|||| | 4.5.7 | 4.5.7 | 13.7 | 2.29 | |||12.11|2.29| |||11.16|2.29| diff --git a/docs/content/releases/4.5.8.md b/docs/content/releases/4.5.8.md new file mode 100644 index 0000000000..31e1005673 --- /dev/null +++ b/docs/content/releases/4.5.8.md @@ -0,0 +1,17 @@ +--- +title: "4.5.8" +date: +draft: false +weight: 62 +--- + +Crunchy Data announces the release of PGO, the Postgres Operator 4.5.8. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +PostgreSQL Operator 4.5.8 release includes the following software versions upgrades: + +- [PostgreSQL](https://www.postgresql.org) versions 13.8, 12.12, 11.17, and 10.22 are now available. +- [PgBouncer](https://www.pgbouncer.org/) is now at version 1.17. +- The [pg_partman](https://github.com/pgpartman/pg_partman) extension is now at version 4.6.0. +- The [TimescaleDB](https://github.com/timescale/timescaledb) extension is now at version 2.7.1. \ No newline at end of file diff --git a/docs/content/tutorial/pgbouncer.md b/docs/content/tutorial/pgbouncer.md index edddc06489..b6f9aa4ee5 100644 --- a/docs/content/tutorial/pgbouncer.md +++ b/docs/content/tutorial/pgbouncer.md @@ -116,7 +116,7 @@ PGPASSWORD=randompassword psql -h localhost -p 5432 -U pgbouncer pgbouncer You should see something similar to this: ``` -psql (12.11, server 1.14.0/bouncer) +psql (12.12, server 1.14.0/bouncer) Type "help" for help. pgbouncer=# diff --git a/installers/ansible/README.md b/installers/ansible/README.md index a278ac0af1..b41d13cc9b 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ PGO: The Postgres Operator from Crunchy Data

-Latest Release: 4.5.7 +Latest Release: 4.5.8 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index d619d210cd..6c2b78a1cf 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -17,7 +17,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "ubi8-12.11-4.5.7" +ccp_image_tag: "ubi8-12.12-4.5.8" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -50,14 +50,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.7" +pgo_client_version: "4.5.8" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "ubi8-4.5.7" +pgo_image_tag: "ubi8-4.5.8" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index 30e52165e1..b17c8356b0 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -6,7 +6,7 @@ MARKETPLACE_TOOLS ?= gcr.io/cloud-marketplace-tools/k8s/dev:$(MARKETPLACE_VERSIO MARKETPLACE_VERSION ?= 0.9.4 KUBECONFIG ?= $(HOME)/.kube/config PARAMETERS ?= {} -PGO_VERSION ?= 4.5.7 +PGO_VERSION ?= 4.5.8 IMAGE_BUILD_ARGS = --build-arg MARKETPLACE_VERSION='$(MARKETPLACE_VERSION)' \ --build-arg PGO_VERSION='$(PGO_VERSION)' diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index c0291a3a74..cd38bbd57e 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -59,7 +59,7 @@ Google Cloud Marketplace. ```shell IMAGE_REPOSITORY=gcr.io/crunchydata-public/postgres-operator - export PGO_VERSION=4.5.7 + export PGO_VERSION=4.5.8 export INSTALLER_IMAGE=${IMAGE_REPOSITORY}/deployer:${PGO_VERSION} export OPERATOR_IMAGE=${IMAGE_REPOSITORY}:${PGO_VERSION} export OPERATOR_IMAGE_API=${IMAGE_REPOSITORY}/pgo-apiserver:${PGO_VERSION} diff --git a/installers/gcp-marketplace/values.yaml b/installers/gcp-marketplace/values.yaml index 53d59f7cda..011e824e3d 100644 --- a/installers/gcp-marketplace/values.yaml +++ b/installers/gcp-marketplace/values.yaml @@ -10,7 +10,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "ubi8-12.11-4.5.7" +ccp_image_tag: "ubi8-12.12-4.5.8" create_rbac: "true" db_name: "" db_password_age_days: "0" @@ -32,9 +32,9 @@ pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" pgo_client_container_install: "false" pgo_client_install: 'false' -pgo_client_version: "4.5.7" +pgo_client_version: "4.5.8" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "ubi8-4.5.7" +pgo_image_tag: "ubi8-4.5.8" pgo_installation_name: '${OPERATOR_NAME}' pgo_operator_namespace: '${OPERATOR_NAMESPACE}' scheduler_timeout: "3600" diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index 02da65ef6c..693150a9b0 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -3,7 +3,7 @@ name: postgres-operator description: 'PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes' type: application version: 0.1.0 -appVersion: 4.5.7 +appVersion: 4.5.8 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg keywords: diff --git a/installers/helm/values.yaml b/installers/helm/values.yaml index 6865536a57..f5a0bab14f 100644 --- a/installers/helm/values.yaml +++ b/installers/helm/values.yaml @@ -37,7 +37,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "ubi8-12.11-4.5.7" +ccp_image_tag: "ubi8-12.12-4.5.8" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -70,14 +70,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.7" +pgo_client_version: "4.5.8" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "ubi8-4.5.7" +pgo_image_tag: "ubi8-4.5.8" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index fbe91e8863..0529a224d4 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -14,7 +14,7 @@ # This script should be run after the operator has been deployed PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}" PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}" -PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.7}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.8}" PGO_CLIENT_URL="https://github.com/CrunchyData/postgres-operator/releases/download/${PGO_CLIENT_VERSION}" PGO_CMD="${PGO_CMD-kubectl}" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 1114a2db3a..6d25593006 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -50,7 +50,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "ubi8-12.11-4.5.7" + ccp_image_tag: "ubi8-12.12-4.5.8" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -83,14 +83,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.7" + pgo_client_version: "4.5.8" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "ubi8-4.5.7" + pgo_image_tag: "ubi8-4.5.8" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.7 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.8 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index c1a383e5bd..f766db036b 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -145,7 +145,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "ubi8-12.11-4.5.7" + ccp_image_tag: "ubi8-12.12-4.5.8" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -178,14 +178,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.7" + pgo_client_version: "4.5.8" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "ubi8-4.5.7" + pgo_image_tag: "ubi8-4.5.8" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -281,7 +281,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.7 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.8 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index 6a837039c3..3ae2a237ad 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.7 +Latest Release: 4.5.8 ## General diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index 90fa9befc2..37cd4647b3 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-monitoring description: Install for Crunchy PostgreSQL Operator Monitoring type: application version: 0.1.0 -appVersion: 4.5.7 +appVersion: 4.5.8 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg diff --git a/installers/metrics/helm/helm_template.yaml b/installers/metrics/helm/helm_template.yaml index 0ee7ebdb86..a04824e35e 100644 --- a/installers/metrics/helm/helm_template.yaml +++ b/installers/metrics/helm/helm_template.yaml @@ -20,5 +20,5 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "ubi8-4.5.7" +pgo_image_tag: "ubi8-4.5.8" diff --git a/installers/metrics/helm/values.yaml b/installers/metrics/helm/values.yaml index 9ff72ef74d..97d9f5b2c8 100644 --- a/installers/metrics/helm/values.yaml +++ b/installers/metrics/helm/values.yaml @@ -20,7 +20,7 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "ubi8-4.5.7" +pgo_image_tag: "ubi8-4.5.8" # ===================== # Configuration Options diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index e7421b824e..babe7d54c2 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -101,7 +101,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.7 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.8 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index 3fb552e646..9df124b6ea 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.7 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.8 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index 4e22f79dd5..4828df4b96 100644 --- a/installers/olm/Makefile +++ b/installers/olm/Makefile @@ -2,7 +2,7 @@ .SUFFIXES: CCP_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -CCP_PG_FULLVERSION ?= 12.11 +CCP_PG_FULLVERSION ?= 12.12 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.15.1 @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.15.1 PGO_BASEOS ?= ubi8 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.5.7 +PGO_VERSION ?= 4.5.8 PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) CCP_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(PGO_VERSION) CCP_POSTGIS_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(CCP_POSTGIS_VERSION)-$(PGO_VERSION) diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 9599cba7e6..374ef371ad 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -53,7 +53,7 @@ cluster. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.7", + '{"ClientVersion":"4.5.8", "Namespace":"pgouser1", "Name":"mycluster", $PGO_APISERVER_URL/clusters @@ -72,7 +72,7 @@ show all of the clusters that are in the given namespace. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.7", + '{"ClientVersion":"4.5.8", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/showclusters @@ -82,7 +82,7 @@ $PGO_APISERVER_URL/showclusters curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.7", + '{"ClientVersion":"4.5.8", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.5.7 + Version: 4.5.8 License: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 Contact: Crunchy Data https://www.crunchydata.com/ diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index 479554cb08..f205d9773e 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -const PGO_VERSION = "4.5.7" +const PGO_VERSION = "4.5.8" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index cfb38ca3e1..538c37252c 100644 --- a/redhat/atomic/help.1 +++ b/redhat/atomic/help.1 @@ -56,4 +56,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa \fB\fCRelease=\fR .PP -The specific release number of the container. For example, Release="4.5.7" +The specific release number of the container. For example, Release="4.5.8" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index fa36365cd1..260fcaa789 100644 --- a/redhat/atomic/help.md +++ b/redhat/atomic/help.md @@ -45,4 +45,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa `Release=` -The specific release number of the container. For example, Release="4.5.7" +The specific release number of the container. For example, Release="4.5.8" From fb1aeb4ef9c98ee5b41443550c134093b80a49e0 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Mon, 15 Aug 2022 20:11:00 +0000 Subject: [PATCH 126/129] Fix timescale & partman Versions in Release Notes Issue: [sc-15290] --- docs/content/releases/4.5.8.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/content/releases/4.5.8.md b/docs/content/releases/4.5.8.md index 31e1005673..3cc78e476f 100644 --- a/docs/content/releases/4.5.8.md +++ b/docs/content/releases/4.5.8.md @@ -13,5 +13,5 @@ PostgreSQL Operator 4.5.8 release includes the following software versions upgra - [PostgreSQL](https://www.postgresql.org) versions 13.8, 12.12, 11.17, and 10.22 are now available. - [PgBouncer](https://www.pgbouncer.org/) is now at version 1.17. -- The [pg_partman](https://github.com/pgpartman/pg_partman) extension is now at version 4.6.0. -- The [TimescaleDB](https://github.com/timescale/timescaledb) extension is now at version 2.7.1. \ No newline at end of file +- The [pg_partman](https://github.com/pgpartman/pg_partman) extension is now at version 4.6.2. +- The [TimescaleDB](https://github.com/timescale/timescaledb) extension is now at version 2.7.2. \ No newline at end of file From b1c961f3979b778bb06c01c255d937dc2e9a8eb8 Mon Sep 17 00:00:00 2001 From: Anthony Landreth Date: Thu, 10 Nov 2022 12:35:52 -0500 Subject: [PATCH 127/129] Release Prep for 4.5.9 Issue: [sc-16495] --- Makefile | 4 ++-- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 ++-- docs/config.toml | 12 ++++++------ docs/content/Configuration/compatibility.md | 5 +++++ docs/content/releases/4.5.9.md | 16 ++++++++++++++++ docs/content/tutorial/pgbouncer.md | 2 +- installers/ansible/README.md | 2 +- installers/ansible/values.yaml | 6 +++--- installers/gcp-marketplace/Makefile | 2 +- installers/gcp-marketplace/README.md | 2 +- installers/gcp-marketplace/values.yaml | 6 +++--- installers/helm/Chart.yaml | 2 +- installers/helm/values.yaml | 6 +++--- installers/kubectl/client-setup.sh | 2 +- installers/kubectl/postgres-operator-ocp311.yml | 8 ++++---- installers/kubectl/postgres-operator.yml | 8 ++++---- installers/metrics/ansible/README.md | 2 +- installers/metrics/helm/Chart.yaml | 2 +- installers/metrics/helm/helm_template.yaml | 2 +- installers/metrics/helm/values.yaml | 2 +- .../postgres-operator-metrics-ocp311.yml | 2 +- .../kubectl/postgres-operator-metrics.yml | 2 +- installers/olm/Makefile | 4 ++-- pkg/apis/crunchydata.com/v1/doc.go | 17 +++++++++-------- pkg/apiservermsgs/common.go | 2 +- redhat/atomic/help.1 | 2 +- redhat/atomic/help.md | 2 +- 29 files changed, 76 insertions(+), 54 deletions(-) create mode 100644 docs/content/releases/4.5.9.md diff --git a/Makefile b/Makefile index 59465f442e..9ba121b7a4 100644 --- a/Makefile +++ b/Makefile @@ -8,9 +8,9 @@ PGO_CMD ?= kubectl PGO_IMAGE_PREFIX ?= crunchydata PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) PGO_OPERATOR_NAMESPACE ?= pgo -PGO_VERSION ?= 4.5.8 +PGO_VERSION ?= 4.5.9 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.12 +PGO_PG_FULLVERSION ?= 12.13 PGO_BACKREST_VERSION ?= 2.29 PACKAGER ?= yum diff --git a/README.md b/README.md index 03f3e50c30..1bed830964 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ to start as quickly as: ```shell kubectl create namespace pgo -kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.8/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.5.9/installers/kubectl/postgres-operator.yml ``` Otherwise, we highly recommend following the instructions from our [Quickstart](https://access.crunchydata.com/documentation/postgres-operator/latest/quickstart/). diff --git a/bin/push-ccp-to-gcr.sh b/bin/push-ccp-to-gcr.sh index 60320d7f39..2c6123a0c2 100755 --- a/bin/push-ccp-to-gcr.sh +++ b/bin/push-ccp-to-gcr.sh @@ -16,7 +16,7 @@ GCR_IMAGE_PREFIX=gcr.io/crunchy-dev-test CCP_IMAGE_PREFIX=crunchydata -CCP_IMAGE_TAG=ubi8-12.12-4.5.8 +CCP_IMAGE_TAG=ubi8-12.13-4.5.9 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index c0b9bcb041..040bb5e8bf 100644 --- a/conf/postgres-operator/pgo.yaml +++ b/conf/postgres-operator/pgo.yaml @@ -2,7 +2,7 @@ Cluster: CCPImagePrefix: registry.developers.crunchydata.com/crunchydata Metrics: false Badger: false - CCPImageTag: ubi8-12.12-4.5.8 + CCPImageTag: ubi8-12.13-4.5.9 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -82,4 +82,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: ubi8-4.5.8 + PGOImageTag: ubi8-4.5.9 diff --git a/docs/config.toml b/docs/config.toml index c222518baf..9a64427568 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,12 +25,12 @@ disableNavChevron = false # set true to hide next/prev chevron, default is false highlightClientSide = false # set true to use highlight.pack.js instead of the default hugo chroma highlighter menushortcutsnewtab = true # set true to open shortcuts links to a new tab/window enableGitInfo = true -operatorVersion = "4.5.8" -postgresVersion = "12.12" -postgresVersion13 = "13.8" -postgresVersion12 = "12.12" -postgresVersion11 = "11.17" -postgresVersion10 = "10.22" +operatorVersion = "4.5.9" +postgresVersion = "13.9" +postgresVersion13 = "13.9" +postgresVersion12 = "12.13" +postgresVersion11 = "11.18" +postgresVersion10 = "10.23" postgisVersion = "3.0" ubiBase = "ubi8" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index 69f0bf1f78..1780ebad7b 100644 --- a/docs/content/Configuration/compatibility.md +++ b/docs/content/Configuration/compatibility.md @@ -12,6 +12,11 @@ version dependencies between the two projects. Below are the operator releases a | Operator Release | Container Release | Postgres | PgBackrest Version |:----------|:-------------|:------------|:-------------- +| 4.5.9 | 4.5.9 | 13.9 | 2.29 | +|||12.13|2.29| +|||11.18|2.29| +|||10.23|2.29| +|||| | 4.5.8 | 4.5.8 | 13.8 | 2.29 | |||12.12|2.29| |||11.17|2.29| diff --git a/docs/content/releases/4.5.9.md b/docs/content/releases/4.5.9.md new file mode 100644 index 0000000000..85ec5d7952 --- /dev/null +++ b/docs/content/releases/4.5.9.md @@ -0,0 +1,16 @@ +--- +title: "4.5.9" +date: +draft: false +weight: 61 +--- + +Crunchy Data announces the release of PGO, the Postgres Operator 4.5.9. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +PostgreSQL Operator 4.5.9 release includes the following software versions upgrades: + +- [PostgreSQL](https://www.postgresql.org) versions 13.9, 12.13, 11.18, and 10.23 are now available. +- The [pg_partman](https://github.com/pgpartman/pg_partman) extension is now at version 4.7.1. +- The [TimescaleDB](https://github.com/timescale/timescaledb) extension is now at version 2.8.1. diff --git a/docs/content/tutorial/pgbouncer.md b/docs/content/tutorial/pgbouncer.md index b6f9aa4ee5..4ca68f561a 100644 --- a/docs/content/tutorial/pgbouncer.md +++ b/docs/content/tutorial/pgbouncer.md @@ -116,7 +116,7 @@ PGPASSWORD=randompassword psql -h localhost -p 5432 -U pgbouncer pgbouncer You should see something similar to this: ``` -psql (12.12, server 1.14.0/bouncer) +psql (12.13, server 1.14.0/bouncer) Type "help" for help. pgbouncer=# diff --git a/installers/ansible/README.md b/installers/ansible/README.md index b41d13cc9b..d6edeb160d 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ PGO: The Postgres Operator from Crunchy Data

-Latest Release: 4.5.8 +Latest Release: 4.5.9 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index 6c2b78a1cf..c76c35c783 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -17,7 +17,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "ubi8-12.12-4.5.8" +ccp_image_tag: "ubi8-12.13-4.5.9" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -50,14 +50,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.8" +pgo_client_version: "4.5.9" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "ubi8-4.5.8" +pgo_image_tag: "ubi8-4.5.9" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/gcp-marketplace/Makefile b/installers/gcp-marketplace/Makefile index b17c8356b0..8329eed52b 100644 --- a/installers/gcp-marketplace/Makefile +++ b/installers/gcp-marketplace/Makefile @@ -6,7 +6,7 @@ MARKETPLACE_TOOLS ?= gcr.io/cloud-marketplace-tools/k8s/dev:$(MARKETPLACE_VERSIO MARKETPLACE_VERSION ?= 0.9.4 KUBECONFIG ?= $(HOME)/.kube/config PARAMETERS ?= {} -PGO_VERSION ?= 4.5.8 +PGO_VERSION ?= 4.5.9 IMAGE_BUILD_ARGS = --build-arg MARKETPLACE_VERSION='$(MARKETPLACE_VERSION)' \ --build-arg PGO_VERSION='$(PGO_VERSION)' diff --git a/installers/gcp-marketplace/README.md b/installers/gcp-marketplace/README.md index cd38bbd57e..31534e3eb4 100644 --- a/installers/gcp-marketplace/README.md +++ b/installers/gcp-marketplace/README.md @@ -59,7 +59,7 @@ Google Cloud Marketplace. ```shell IMAGE_REPOSITORY=gcr.io/crunchydata-public/postgres-operator - export PGO_VERSION=4.5.8 + export PGO_VERSION=4.5.9 export INSTALLER_IMAGE=${IMAGE_REPOSITORY}/deployer:${PGO_VERSION} export OPERATOR_IMAGE=${IMAGE_REPOSITORY}:${PGO_VERSION} export OPERATOR_IMAGE_API=${IMAGE_REPOSITORY}/pgo-apiserver:${PGO_VERSION} diff --git a/installers/gcp-marketplace/values.yaml b/installers/gcp-marketplace/values.yaml index 011e824e3d..45ff49f7ec 100644 --- a/installers/gcp-marketplace/values.yaml +++ b/installers/gcp-marketplace/values.yaml @@ -10,7 +10,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "ubi8-12.12-4.5.8" +ccp_image_tag: "ubi8-12.13-4.5.9" create_rbac: "true" db_name: "" db_password_age_days: "0" @@ -32,9 +32,9 @@ pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" pgo_client_container_install: "false" pgo_client_install: 'false' -pgo_client_version: "4.5.8" +pgo_client_version: "4.5.9" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "ubi8-4.5.8" +pgo_image_tag: "ubi8-4.5.9" pgo_installation_name: '${OPERATOR_NAME}' pgo_operator_namespace: '${OPERATOR_NAMESPACE}' scheduler_timeout: "3600" diff --git a/installers/helm/Chart.yaml b/installers/helm/Chart.yaml index 693150a9b0..58c24902d0 100644 --- a/installers/helm/Chart.yaml +++ b/installers/helm/Chart.yaml @@ -3,7 +3,7 @@ name: postgres-operator description: 'PGO: The Postgres Operator from Crunchy Data Helm Chart for Kubernetes' type: application version: 0.1.0 -appVersion: 4.5.8 +appVersion: 4.5.9 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg keywords: diff --git a/installers/helm/values.yaml b/installers/helm/values.yaml index f5a0bab14f..c01b2822c3 100644 --- a/installers/helm/values.yaml +++ b/installers/helm/values.yaml @@ -37,7 +37,7 @@ badger: "false" ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" -ccp_image_tag: "ubi8-12.12-4.5.8" +ccp_image_tag: "ubi8-12.13-4.5.9" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -70,14 +70,14 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "4.5.8" +pgo_client_version: "4.5.9" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "ubi8-4.5.8" +pgo_image_tag: "ubi8-4.5.9" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" diff --git a/installers/kubectl/client-setup.sh b/installers/kubectl/client-setup.sh index 0529a224d4..4d32c82270 100755 --- a/installers/kubectl/client-setup.sh +++ b/installers/kubectl/client-setup.sh @@ -14,7 +14,7 @@ # This script should be run after the operator has been deployed PGO_OPERATOR_NAMESPACE="${PGO_OPERATOR_NAMESPACE:-pgo}" PGO_USER_ADMIN="${PGO_USER_ADMIN:-pgouser-admin}" -PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.8}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.5.9}" PGO_CLIENT_URL="https://github.com/CrunchyData/postgres-operator/releases/download/${PGO_CLIENT_VERSION}" PGO_CMD="${PGO_CMD-kubectl}" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 6d25593006..c993ec3981 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -50,7 +50,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "ubi8-12.12-4.5.8" + ccp_image_tag: "ubi8-12.13-4.5.9" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -83,14 +83,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.8" + pgo_client_version: "4.5.9" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "ubi8-4.5.8" + pgo_image_tag: "ubi8-4.5.9" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.8 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.9 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index f766db036b..54b07b09f3 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -145,7 +145,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "ubi8-12.12-4.5.8" + ccp_image_tag: "ubi8-12.13-4.5.9" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -178,14 +178,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.5.8" + pgo_client_version: "4.5.9" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" - pgo_image_tag: "ubi8-4.5.8" + pgo_image_tag: "ubi8-4.5.9" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -281,7 +281,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.8 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.9 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/ansible/README.md b/installers/metrics/ansible/README.md index 3ae2a237ad..bbfe4faf68 100644 --- a/installers/metrics/ansible/README.md +++ b/installers/metrics/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.5.8 +Latest Release: 4.5.9 ## General diff --git a/installers/metrics/helm/Chart.yaml b/installers/metrics/helm/Chart.yaml index 37cd4647b3..81fdc2f483 100644 --- a/installers/metrics/helm/Chart.yaml +++ b/installers/metrics/helm/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-monitoring description: Install for Crunchy PostgreSQL Operator Monitoring type: application version: 0.1.0 -appVersion: 4.5.8 +appVersion: 4.5.9 home: https://github.com/CrunchyData/postgres-operator icon: https://github.com/CrunchyData/postgres-operator/raw/master/docs/static/logos/pgo.svg diff --git a/installers/metrics/helm/helm_template.yaml b/installers/metrics/helm/helm_template.yaml index a04824e35e..13ffab86a3 100644 --- a/installers/metrics/helm/helm_template.yaml +++ b/installers/metrics/helm/helm_template.yaml @@ -20,5 +20,5 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "ubi8-4.5.8" +pgo_image_tag: "ubi8-4.5.9" diff --git a/installers/metrics/helm/values.yaml b/installers/metrics/helm/values.yaml index 97d9f5b2c8..10639764e1 100644 --- a/installers/metrics/helm/values.yaml +++ b/installers/metrics/helm/values.yaml @@ -20,7 +20,7 @@ serviceAccount: # the image prefix and tag to use for the 'pgo-deployer' container pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" -pgo_image_tag: "ubi8-4.5.8" +pgo_image_tag: "ubi8-4.5.9" # ===================== # Configuration Options diff --git a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml index babe7d54c2..c26f427e0a 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics-ocp311.yml @@ -101,7 +101,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.8 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.9 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/metrics/kubectl/postgres-operator-metrics.yml b/installers/metrics/kubectl/postgres-operator-metrics.yml index 9df124b6ea..0a0be2b2a6 100644 --- a/installers/metrics/kubectl/postgres-operator-metrics.yml +++ b/installers/metrics/kubectl/postgres-operator-metrics.yml @@ -171,7 +171,7 @@ spec: restartPolicy: Never containers: - name: pgo-metrics-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.8 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:ubi8-4.5.9 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index 4828df4b96..990257b3ab 100644 --- a/installers/olm/Makefile +++ b/installers/olm/Makefile @@ -2,7 +2,7 @@ .SUFFIXES: CCP_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -CCP_PG_FULLVERSION ?= 12.12 +CCP_PG_FULLVERSION ?= 12.13 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.15.1 @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.15.1 PGO_BASEOS ?= ubi8 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.5.8 +PGO_VERSION ?= 4.5.9 PGO_IMAGE_TAG ?= $(PGO_BASEOS)-$(PGO_VERSION) CCP_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(PGO_VERSION) CCP_POSTGIS_IMAGE_TAG ?= $(PGO_BASEOS)-$(CCP_PG_FULLVERSION)-$(CCP_POSTGIS_VERSION)-$(PGO_VERSION) diff --git a/pkg/apis/crunchydata.com/v1/doc.go b/pkg/apis/crunchydata.com/v1/doc.go index 374ef371ad..db93b2be8b 100644 --- a/pkg/apis/crunchydata.com/v1/doc.go +++ b/pkg/apis/crunchydata.com/v1/doc.go @@ -52,8 +52,9 @@ cluster. ``` curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ + POST --data \ - '{"ClientVersion":"4.5.8", + '{"ClientVersion":"4.5.9", "Namespace":"pgouser1", "Name":"mycluster", $PGO_APISERVER_URL/clusters @@ -72,7 +73,7 @@ show all of the clusters that are in the given namespace. curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.8", + '{"ClientVersion":"4.5.9", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/showclusters @@ -82,7 +83,7 @@ $PGO_APISERVER_URL/showclusters curl --cacert $PGO_CA_CERT --key $PGO_CLIENT_KEY --cert $PGO_CA_CERT -u \ admin:examplepassword -H "Content-Type:application/json" --insecure -X \ POST --data \ - '{"ClientVersion":"4.5.8", + '{"ClientVersion":"4.5.9", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,16 +91,16 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.5.8 + Version: 4.5.9 License: Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0 Contact: Crunchy Data https://www.crunchydata.com/ - Consumes: - - application/json + Consumes: + - application/json - Produces: - - application/json + Produces: + - application/json swagger:meta */ diff --git a/pkg/apiservermsgs/common.go b/pkg/apiservermsgs/common.go index f205d9773e..4cb5c08ac3 100644 --- a/pkg/apiservermsgs/common.go +++ b/pkg/apiservermsgs/common.go @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -const PGO_VERSION = "4.5.8" +const PGO_VERSION = "4.5.9" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index 538c37252c..139f354070 100644 --- a/redhat/atomic/help.1 +++ b/redhat/atomic/help.1 @@ -56,4 +56,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa \fB\fCRelease=\fR .PP -The specific release number of the container. For example, Release="4.5.8" +The specific release number of the container. For example, Release="4.5.9" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index 260fcaa789..9ac7292550 100644 --- a/redhat/atomic/help.md +++ b/redhat/atomic/help.md @@ -45,4 +45,4 @@ The Red Hat Enterprise Linux version from which the container was built. For exa `Release=` -The specific release number of the container. For example, Release="4.5.8" +The specific release number of the container. For example, Release="4.5.9" From c9b425450b34b0c5ea732ef227dea4b0a25cc372 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Thu, 17 Nov 2022 19:04:47 +0000 Subject: [PATCH 128/129] Pin 'kubectl' to v1.24 in the Deployer Image Issue: [sc-16731] --- build/pgo-deployer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/pgo-deployer/Dockerfile b/build/pgo-deployer/Dockerfile index ff02c0bec7..131709c334 100644 --- a/build/pgo-deployer/Dockerfile +++ b/build/pgo-deployer/Dockerfile @@ -17,7 +17,7 @@ RUN if [ "$DFSET" = "centos" ] ; then \ ${PACKAGER} install -y epel-release \ && ${PACKAGER} -y install \ --setopt=skip_missing_names_on_install=False \ - kubectl \ + kubectl-1.24* \ ansible \ which \ gettext \ From fd9b013b13cead94201ace1bae69f837c7ae89bd Mon Sep 17 00:00:00 2001 From: TJ Moore Date: Thu, 1 Dec 2022 16:48:33 -0500 Subject: [PATCH 129/129] Bump jmespath Update jmespath from python38-jmespath to python39-jmespath. --- build/pgo-deployer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/pgo-deployer/Dockerfile b/build/pgo-deployer/Dockerfile index 131709c334..5cddb35651 100644 --- a/build/pgo-deployer/Dockerfile +++ b/build/pgo-deployer/Dockerfile @@ -60,7 +60,7 @@ RUN if [ "$BASEOS" = "ubi8" ] ; then \ ansible \ which \ gettext \ - python38-jmespath \ + python39-jmespath \ && ${PACKAGER} -y clean all --enablerepo='rhocp-4.5-for-rhel-8-x86_64-rpms' ; \ fi