From 5f0fb8e6e6486d66b4baca9fa6f902d042af1e5e Mon Sep 17 00:00:00 2001 From: Chris Bandy Date: Tue, 14 Jul 2020 14:49:12 -0500 Subject: [PATCH 01/77] Fix typos identified by go vet in internal package Tests pass when running `go test ./internal/...` with Go 1.13, but it emits warnings and exits non-zero. The `./internal/operator` package fails to build on Go 1.14 because the `%w` verb is not allowed in formatted log messages. `go test ./internal/... ./pkg/...` now exits zero in both Go 1.13 and 1.14. See: 63ed75984cf286818f29fd5e9dcf108653f89af3 --- internal/apiserver/clusterservice/clusterimpl.go | 10 +++++----- internal/apiserver/clusterservice/clusterservice.go | 4 ++-- internal/apiserver/labelservice/labelimpl.go | 2 +- internal/apiserver/pgdumpservice/pgdumpimpl.go | 2 +- internal/apiserver/pgouserservice/pgouserimpl.go | 2 +- internal/apiserver/policyservice/policyimpl.go | 4 ++-- internal/apiserver/pvcservice/pvcservice.go | 2 +- internal/apiserver/statusservice/statusimpl.go | 2 +- internal/apiserver/upgradeservice/upgradeimpl.go | 2 +- internal/controller/manager/controllermanager.go | 2 +- internal/controller/pgtask/pgtaskcontroller.go | 6 +++--- internal/operator/common.go | 4 ++-- internal/operator/task/rmdata.go | 2 +- 13 files changed, 22 insertions(+), 22 deletions(-) diff --git a/internal/apiserver/clusterservice/clusterimpl.go b/internal/apiserver/clusterservice/clusterimpl.go index 049a23758e..2524a33b47 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -339,7 +339,7 @@ func getServices(cluster *crv1.Pgcluster, ns string) ([]msgs.ShowClusterService, func TestCluster(name, selector, ns, pgouser string, allFlag bool) msgs.ClusterTestResponse { var err error - log.Debugf("TestCluster(%s,%s,%s,%s,%s): Called", + log.Debugf("TestCluster(%s,%s,%s,%s,%v): Called", name, selector, ns, pgouser, allFlag) response := msgs.ClusterTestResponse{} @@ -355,7 +355,7 @@ func TestCluster(name, selector, ns, pgouser string, allFlag bool) msgs.ClusterT // be used if selector == "" { if allFlag { - log.Debug("selector is : all clusters in %s", ns) + log.Debugf("selector is : all clusters in %s", ns) } else { selector = "name=" + name log.Debugf("selector is: %s", selector) @@ -446,7 +446,7 @@ func TestCluster(name, selector, ns, pgouser string, allFlag bool) msgs.ClusterT case msgs.PodTypeReplica: instance.InstanceType = msgs.ClusterTestInstanceTypeReplica } - log.Debugf("Instance found with attributes: (%s, %s, %s)", + log.Debugf("Instance found with attributes: (%s, %s, %v)", instance.InstanceType, instance.Message, instance.Available) // Add the report on the pods to this set result.Instances = append(result.Instances, instance) @@ -514,7 +514,7 @@ func TestCluster(name, selector, ns, pgouser string, allFlag bool) msgs.ClusterT } } - log.Debugf("Endpoint found with attributes: (%s, %s, %s)", + log.Debugf("Endpoint found with attributes: (%s, %s, %v)", endpoint.InstanceType, endpoint.Message, endpoint.Available) // append the endpoint to the list @@ -1699,7 +1699,7 @@ func UpdateCluster(request *msgs.UpdateClusterRequest) msgs.UpdateClusterRespons response.Status = msgs.Status{Code: msgs.Ok, Msg: ""} response.Results = make([]string, 0) - log.Debugf("autofail is [%t]\n", request.Autofail) + log.Debugf("autofail is [%v]\n", request.Autofail) switch { case request.Startup && request.Shutdown: diff --git a/internal/apiserver/clusterservice/clusterservice.go b/internal/apiserver/clusterservice/clusterservice.go index e69aae067f..d0f31df636 100644 --- a/internal/apiserver/clusterservice/clusterservice.go +++ b/internal/apiserver/clusterservice/clusterservice.go @@ -131,7 +131,7 @@ func ShowClusterHandler(w http.ResponseWriter, r *http.Request) { namespace := request.Namespace allflag := request.AllFlag - log.Debugf("ShowClusterHandler: parameters name [%s] selector [%s] ccpimagetag [%s] version [%s] namespace [%s] allflag [%s]", clustername, selector, ccpimagetag, clientVersion, namespace, allflag) + log.Debugf("ShowClusterHandler: parameters name [%s] selector [%s] ccpimagetag [%s] version [%s] namespace [%s] allflag [%v]", clustername, selector, ccpimagetag, clientVersion, namespace, allflag) username, err := apiserver.Authn(apiserver.SHOW_CLUSTER_PERM, w, r) if err != nil { @@ -206,7 +206,7 @@ func DeleteClusterHandler(w http.ResponseWriter, r *http.Request) { deleteData := request.DeleteData deleteBackups := request.DeleteBackups - log.Debugf("DeleteClusterHandler: parameters namespace [%s] selector [%s] delete-data [%t] delete-backups [%t]", namespace, selector, clientVersion, deleteData, deleteBackups) + log.Debugf("DeleteClusterHandler: parameters namespace [%s] selector [%s] delete-data [%t] delete-backups [%t]", namespace, selector, deleteData, deleteBackups) username, err := apiserver.Authn(apiserver.DELETE_CLUSTER_PERM, w, r) if err != nil { diff --git a/internal/apiserver/labelservice/labelimpl.go b/internal/apiserver/labelservice/labelimpl.go index 7dd04d4567..ad066f3cb5 100644 --- a/internal/apiserver/labelservice/labelimpl.go +++ b/internal/apiserver/labelservice/labelimpl.go @@ -483,7 +483,7 @@ func deleteTheLabel(deployment *v1.Deployment, clusterName string, labelsMap map _, err = apiserver.Clientset.AppsV1().Deployments(ns).Patch(deployment.Name, types.MergePatchType, patchBytes, "") if err != nil { - log.Debugf("error patching deployment ", err.Error()) + log.Debugf("error patching deployment: %v", err.Error()) } return err diff --git a/internal/apiserver/pgdumpservice/pgdumpimpl.go b/internal/apiserver/pgdumpservice/pgdumpimpl.go index f234262fe9..031c559cee 100644 --- a/internal/apiserver/pgdumpservice/pgdumpimpl.go +++ b/internal/apiserver/pgdumpservice/pgdumpimpl.go @@ -237,7 +237,7 @@ func ShowpgDump(clusterName string, selector string, ns string) msgs.ShowBackupR // nothing found, no error log.Debugf("pgTask %s not found, no erros", pgTaskName) response.Status.Code = msgs.Ok - response.Status.Msg = fmt.Sprintln("pgDump %s not found.", pgTaskName) + response.Status.Msg = fmt.Sprintf("pgDump %s not found.", pgTaskName) } } diff --git a/internal/apiserver/pgouserservice/pgouserimpl.go b/internal/apiserver/pgouserservice/pgouserimpl.go index b1f0ef57d2..6e0c061467 100644 --- a/internal/apiserver/pgouserservice/pgouserimpl.go +++ b/internal/apiserver/pgouserservice/pgouserimpl.go @@ -244,7 +244,7 @@ func UpdatePgouser(clientset kubernetes.Interface, updatedBy string, request *ms log.Info("Updating secret for: ", request.PgouserName) _, err = clientset.CoreV1().Secrets(apiserver.PgoNamespace).Update(secret) if err != nil { - log.Debug("Error updating pgouser secret: ", err.Error) + log.Debug("Error updating pgouser secret: ", err.Error()) resp.Status.Code = msgs.Error resp.Status.Msg = err.Error() return resp diff --git a/internal/apiserver/policyservice/policyimpl.go b/internal/apiserver/policyservice/policyimpl.go index a7c7fe2180..9463288ffd 100644 --- a/internal/apiserver/policyservice/policyimpl.go +++ b/internal/apiserver/policyservice/policyimpl.go @@ -220,7 +220,7 @@ func ApplyPolicy(request *msgs.ApplyPolicyRequest, ns, pgouser string) msgs.Appl return resp } if len(deployments.Items) < 1 { - log.Error("%s did not have a deployment for some reason", c.Name) + log.Errorf("%s did not have a deployment for some reason", c.Name) } else { allDeployments = append(allDeployments, deployments.Items[0]) } @@ -239,7 +239,7 @@ func ApplyPolicy(request *msgs.ApplyPolicyRequest, ns, pgouser string) msgs.Appl for _, d := range allDeployments { if d.ObjectMeta.Labels[config.LABEL_SERVICE_NAME] != d.ObjectMeta.Labels[config.LABEL_PG_CLUSTER] { - log.Debug("skipping apply policy on deployment %s", d.Name) + log.Debugf("skipping apply policy on deployment %s", d.Name) continue //skip non primary deployments } diff --git a/internal/apiserver/pvcservice/pvcservice.go b/internal/apiserver/pvcservice/pvcservice.go index 3143cf183b..a12979cb3c 100644 --- a/internal/apiserver/pvcservice/pvcservice.go +++ b/internal/apiserver/pvcservice/pvcservice.go @@ -53,7 +53,7 @@ func ShowPVCHandler(w http.ResponseWriter, r *http.Request) { clientVersion := request.ClientVersion namespace := request.Namespace - log.Debugf("ShowPVCHandler parameters version [%s] namespace [%s] pvcname [%s] nodeLabel [%]", clientVersion, namespace, clusterName) + log.Debugf("ShowPVCHandler parameters version [%s] namespace [%s] pvcname [%s]", clientVersion, namespace, clusterName) switch r.Method { case "GET": diff --git a/internal/apiserver/statusservice/statusimpl.go b/internal/apiserver/statusservice/statusimpl.go index 87c629470c..3dfdb40836 100644 --- a/internal/apiserver/statusservice/statusimpl.go +++ b/internal/apiserver/statusservice/statusimpl.go @@ -174,7 +174,7 @@ func getLabels(ns string) []msgs.KeyValue { } for k, v := range results { - ss = append(ss, msgs.KeyValue{k, v}) + ss = append(ss, msgs.KeyValue{Key: k, Value: v}) } sort.Slice(ss, func(i, j int) bool { diff --git a/internal/apiserver/upgradeservice/upgradeimpl.go b/internal/apiserver/upgradeservice/upgradeimpl.go index 7b2aabcf2d..0389defcfb 100644 --- a/internal/apiserver/upgradeservice/upgradeimpl.go +++ b/internal/apiserver/upgradeservice/upgradeimpl.go @@ -222,7 +222,7 @@ func supportedOperatorVersion(version string) bool { // then the upgrade cannot continue minor, err := strconv.Atoi(operatorVersion[2]) if err != nil { - log.Errorf("Cannot convert Postgres Operator's minor version to an integer. Error: ", err) + log.Errorf("Cannot convert Postgres Operator's minor version to an integer. Error: %v", err) return false } if minor < MINIMUM_MINOR_PGO_VERSION || minor > MAXIMUM_MINOR_PGO_VERSION { diff --git a/internal/controller/manager/controllermanager.go b/internal/controller/manager/controllermanager.go index 6d3789d3e9..5991c3ccd7 100644 --- a/internal/controller/manager/controllermanager.go +++ b/internal/controller/manager/controllermanager.go @@ -304,7 +304,7 @@ func (c *ControllerManager) addControllerGroup(namespace string) error { pgoInformerFactory.Crunchydata().V1().Pgclusters(), *c.pgoConfig.Pgo.ConfigMapWorkerCount) if err != nil { - log.Errorf("Unable to create ConfigMap controller: %w", err) + log.Errorf("Unable to create ConfigMap controller: %v", err) return err } diff --git a/internal/controller/pgtask/pgtaskcontroller.go b/internal/controller/pgtask/pgtaskcontroller.go index 9a5b524dc9..979cc64f75 100644 --- a/internal/controller/pgtask/pgtaskcontroller.go +++ b/internal/controller/pgtask/pgtaskcontroller.go @@ -117,7 +117,7 @@ func (c *Controller) processNextItem() bool { if !dupeFailover(c.PgtaskClient, &tmpTask, keyNamespace) { clusteroperator.FailoverBase(keyNamespace, c.PgtaskClientset, c.PgtaskClient, &tmpTask, c.PgtaskConfig) } else { - log.Debug("skipping duplicate onAdd failover task %s/%s", keyNamespace, keyResourceName) + log.Debugf("skipping duplicate onAdd failover task %s/%s", keyNamespace, keyResourceName) } case crv1.PgtaskDeleteData: @@ -125,7 +125,7 @@ func (c *Controller) processNextItem() bool { if !dupeDeleteData(c.PgtaskClient, &tmpTask, keyNamespace) { taskoperator.RemoveData(keyNamespace, c.PgtaskClientset, c.PgtaskClient, &tmpTask) } else { - log.Debug("skipping duplicate onAdd delete data task %s/%s", keyNamespace, keyResourceName) + log.Debugf("skipping duplicate onAdd delete data task %s/%s", keyNamespace, keyResourceName) } case crv1.PgtaskDeleteBackups: log.Debug("delete backups task added") @@ -150,7 +150,7 @@ func (c *Controller) processNextItem() bool { log.Debugf("workflow task added [%s] ID [%s]", keyResourceName, tmpTask.Spec.Parameters[crv1.PgtaskWorkflowID]) case crv1.PgtaskCloneStep1, crv1.PgtaskCloneStep2, crv1.PgtaskCloneStep3: - log.Debug("clone task added [%s]", keyResourceName) + log.Debugf("clone task added [%s]", keyResourceName) clusteroperator.Clone(c.PgtaskClientset, c.PgtaskClient, c.PgtaskConfig, keyNamespace, &tmpTask) default: diff --git a/internal/operator/common.go b/internal/operator/common.go index 15adae0f1f..2d4360deb7 100644 --- a/internal/operator/common.go +++ b/internal/operator/common.go @@ -369,7 +369,7 @@ func SetupNamespaces(clientset kubernetes.Interface) ([]string, error) { // First set the proper namespace operating mode for the Operator install. The mode identified // determines whether or not certain namespace capabilities are enabled. if err := setNamespaceOperatingMode(clientset); err != nil { - log.Errorf("Error detecting namespace operating mode: %w", err) + log.Errorf("Error detecting namespace operating mode: %v", err) return nil, err } log.Debugf("Namespace operating mode is '%s'", NamespaceOperatingMode()) @@ -383,7 +383,7 @@ func SetupNamespaces(clientset kubernetes.Interface) ([]string, error) { // proceed with creating and/or updating any namespaces provided for the installation if err := ns.ConfigureInstallNamespaces(clientset, InstallationName, PgoNamespace, namespaceList, NamespaceOperatingMode()); err != nil { - log.Errorf("Unable to setup namespaces: %w", err) + log.Errorf("Unable to setup namespaces: %v", err) return nil, err } diff --git a/internal/operator/task/rmdata.go b/internal/operator/task/rmdata.go index 79250c8592..875abef328 100644 --- a/internal/operator/task/rmdata.go +++ b/internal/operator/task/rmdata.go @@ -56,7 +56,7 @@ func RemoveData(namespace string, clientset kubernetes.Interface, restclient *re //create marker (clustername, namespace) err := PatchpgtaskDeleteDataStatus(restclient, task, namespace) if err != nil { - log.Error("could not set delete data started marker for task %s cluster %s", task.Spec.Name, task.Spec.Parameters[config.LABEL_PG_CLUSTER]) + log.Errorf("could not set delete data started marker for task %s cluster %s", task.Spec.Name, task.Spec.Parameters[config.LABEL_PG_CLUSTER]) return } From 261b38d9c251780ac12d366b20c4445892af7741 Mon Sep 17 00:00:00 2001 From: Chris Bandy Date: Mon, 20 Jul 2020 16:50:11 -0500 Subject: [PATCH 02/77] Fix labeling clusters with multiple labels When using `pgo label` or `pgo delete label` with a list of labels, PgCluster was getting different labels than its Deployments. Issue: [ch8740] See: 88cd75f6b5f409a148f1884be5a911fba6e759e0 --- internal/apiserver/labelservice/labelimpl.go | 22 +++++++++---------- .../apiserver/policyservice/policyimpl.go | 2 +- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/internal/apiserver/labelservice/labelimpl.go b/internal/apiserver/labelservice/labelimpl.go index ad066f3cb5..672757a1cd 100644 --- a/internal/apiserver/labelservice/labelimpl.go +++ b/internal/apiserver/labelservice/labelimpl.go @@ -125,7 +125,7 @@ func addLabels(items []crv1.Pgcluster, DryRun bool, LabelCmdLabel string, newLab log.Debug("dry run only") } else { log.Debugf("adding label to cluster %s", items[i].Spec.Name) - err := PatchPgcluster(LabelCmdLabel, items[i], ns) + err := PatchPgcluster(newLabels, items[i], ns) if err != nil { log.Error(err.Error()) } @@ -224,11 +224,8 @@ func updateLabels(deployment *v1.Deployment, clusterName string, newLabels map[s } -func PatchPgcluster(newLabel string, oldCRD crv1.Pgcluster, ns string) error { +func PatchPgcluster(newLabels map[string]string, oldCRD crv1.Pgcluster, ns string) error { - fields := strings.Split(newLabel, "=") - labelKey := fields[0] - labelValue := fields[1] oldData, err := json.Marshal(oldCRD) if err != nil { return err @@ -236,7 +233,9 @@ func PatchPgcluster(newLabel string, oldCRD crv1.Pgcluster, ns string) error { if oldCRD.ObjectMeta.Labels == nil { oldCRD.ObjectMeta.Labels = make(map[string]string) } - oldCRD.ObjectMeta.Labels[labelKey] = labelValue + for key, value := range newLabels { + oldCRD.ObjectMeta.Labels[key] = value + } var newData, patchBytes []byte newData, err = json.Marshal(oldCRD) if err != nil { @@ -377,7 +376,7 @@ func deleteLabels(items []crv1.Pgcluster, LabelCmdLabel string, labelsMap map[st for i := 0; i < len(items); i++ { log.Debugf("deleting label from %s", items[i].Spec.Name) - err = deletePatchPgcluster(LabelCmdLabel, items[i], ns) + err = deletePatchPgcluster(labelsMap, items[i], ns) if err != nil { log.Error(err.Error()) return err @@ -406,11 +405,8 @@ func deleteLabels(items []crv1.Pgcluster, LabelCmdLabel string, labelsMap map[st return err } -func deletePatchPgcluster(newLabel string, oldCRD crv1.Pgcluster, ns string) error { +func deletePatchPgcluster(labelsMap map[string]string, oldCRD crv1.Pgcluster, ns string) error { - fields := strings.Split(newLabel, "=") - labelKey := fields[0] - //labelValue := fields[1] oldData, err := json.Marshal(oldCRD) if err != nil { return err @@ -418,7 +414,9 @@ func deletePatchPgcluster(newLabel string, oldCRD crv1.Pgcluster, ns string) err if oldCRD.ObjectMeta.Labels == nil { oldCRD.ObjectMeta.Labels = make(map[string]string) } - delete(oldCRD.ObjectMeta.Labels, labelKey) + for k := range labelsMap { + delete(oldCRD.ObjectMeta.Labels, k) + } var newData, patchBytes []byte newData, err = json.Marshal(oldCRD) diff --git a/internal/apiserver/policyservice/policyimpl.go b/internal/apiserver/policyservice/policyimpl.go index 9463288ffd..b78e0aa34b 100644 --- a/internal/apiserver/policyservice/policyimpl.go +++ b/internal/apiserver/policyservice/policyimpl.go @@ -270,7 +270,7 @@ func ApplyPolicy(request *msgs.ApplyPolicyRequest, ns, pgouser string) msgs.Appl } //update the pgcluster crd labels with the new policy - err = labelservice.PatchPgcluster(request.Name+"="+config.LABEL_PGPOLICY, cl, ns) + err = labelservice.PatchPgcluster(map[string]string{request.Name: config.LABEL_PGPOLICY}, cl, ns) if err != nil { log.Error(err) } From b1b52b85b1004668f64351bfbb27ede62f6cfa8d Mon Sep 17 00:00:00 2001 From: tjmoore4 <42497036+tjmoore4@users.noreply.github.com> Date: Wed, 22 Jul 2020 14:55:00 -0400 Subject: [PATCH 03/77] Update Upgrade Documentation for all Installation Methods This update adds additional information for how to upgrade the Crunchy PostgreSQL Operator using the PostgreSQL Operator Installer and Helm Chart installation methods. --- docs/content/Upgrade/automatedupgrade.md | 26 +++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/docs/content/Upgrade/automatedupgrade.md b/docs/content/Upgrade/automatedupgrade.md index 18b2adde27..31480bc07e 100644 --- a/docs/content/Upgrade/automatedupgrade.md +++ b/docs/content/Upgrade/automatedupgrade.md @@ -35,15 +35,31 @@ The automated upgrade procedure is designed to facilate the quickest and most ef ##### NOTE: As with any upgrade procedure, it is strongly recommended that a full logical backup is taken before any upgrade procedure is started. Please see the [Logical Backups](/pgo-client/common-tasks#logical-backups-pg_dump--pg_dumpall) section of the Common Tasks page for more information. -### Automated Upgrade when using an Ansible installation of the PostgreSQL Operator +### Automated Upgrade when using the PostgreSQL Operator Installer (`pgo-deployer`), Helm or Ansible -For existing PostgreSQL Operator deployments that were installed using Ansible, the upgrade process is straightforward. +For all existing PostgreSQL Operator deployments that were installed using the Ansible installation method, the PostgreSQL Operator Installer or the Helm Chart Installation of the PostgreSQL Operator, the upgrade process is straightforward. -First, you will copy your existing inventory file as a backup for your existing settings. You will reference these settings, but you will need to use the updated version of the inventory file for the current version of PostgreSQL Operator. +First, you will copy your existing configuration file (whether inventory, postgres-operator.yml, values.yaml, etc, depending on method and version) as a backup for your existing settings. You will reference these settings, but you will need to use the updated version of this file for the current version of PostgreSQL Operator. -Once you've checked out the appropriate release tag, please follow the [Update Instructions]({{< relref "installation/other/ansible/updating-operator.md" >}}), being sure to update the new inventory file with your required settings. Please keep the above [Considerations](/upgrade/automatedupgrade#considerations) in mind, particularly with regard to the version and storage requirements listed. +In all three cases, you will need to use the relevant update functionality available with your chosen installation method. For all three options, please keep the above [Considerations](/upgrade/automatedupgrade#considerations) in mind, particularly with regard to the version and storage requirements listed. -Once the update is complete, you should now see the PostgreSQL Operator pods are up and ready. It is strongly recommended that you create a test cluster to validate proper functionality before moving on to the [Automated Cluster Upgrade](/upgrade/automatedupgrade#postgresql-operator-automated-cluster-upgrade) section below. +#### PostgreSQL Operator Installer + +For existing PostgreSQL Operator deployments that were installed using the PostgreSQL Operator Installer, you will check out the appropriate release tag and update your the new configuration files. After this, you will need to update your Operator installation using the `DEPLOY_ACTION` method described in the [Configuring to Update and Uninstall](/installation/postgres-operator#configuring-to-update-and-uninstall) section of the documentation. + +Please note, you will need to ensure that you have executed the [post-installation cleanup](/installation/postgres-operator#post-installation) between each `DEPLOY_ACTION` activity. + +#### Helm + +For existing PostgreSQL Operator deployments that were installed using the Helm installer, you will check out the appropriate release tag and update your the new configuration files. Then you will need to use the `helm upgrade` command as described in the [Helm Upgrade](/installation/other/helm#upgrade) section of the Helm installation documentation. + +#### Ansible + +For existing PostgreSQL Operator deployments that were installed using Ansible, you will first need to check out the appropriate release tag of the Operator. Then please follow the [Update Instructions]({{< relref "installation/other/ansible/updating-operator.md" >}}), being sure to update the new inventory file with your required settings. + +#### Wrapping Up the PostgreSQL Operator Upgrade + +Once the upgrade is complete, you should now see the PostgreSQL Operator pods are up and ready. It is strongly recommended that you create a test cluster to validate proper functionality before moving on to the [Automated Cluster Upgrade](/upgrade/automatedupgrade#postgresql-operator-automated-cluster-upgrade) section below. ### Automated Upgrade when using a Bash installation of the PostgreSQL Operator From 49a4d2d6a964176acad56e04e2395030df39d856 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 28 Jul 2020 17:46:11 -0400 Subject: [PATCH 04/77] Provide additional context around pgBackRest Secret To provide more transparency around the configuration files that are loaded into the pgBackRest secret, this includes a note to explain the context of the config and sshd_config files. Issue: #1741 --- docs/content/custom-resources/_index.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/content/custom-resources/_index.md b/docs/content/custom-resources/_index.md index abf7bb7c25..9058d8a1da 100644 --- a/docs/content/custom-resources/_index.md +++ b/docs/content/custom-resources/_index.md @@ -260,6 +260,12 @@ export pgbackrest_public_key="${public_key_temp//[$'\n']}" pgbackrest_private_ke # 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 From 6ac888d4fba97b335cfa738314778c74e3491772 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 30 Jul 2020 09:30:19 -0400 Subject: [PATCH 05/77] Add support for the "*" permission to pgo create pgorole --permissions While "*" has been supported for awhile in the PostgreSQL Operator, one could not add it while using the `pgo create pgorole --permissions` as it failed the validation check. This rectifies this oversight and fixes said bug. Issue: [ch8909] --- .../apiserver/pgoroleservice/pgoroleimpl.go | 2 +- .../pgoroleservice/pgoroleimpl_test.go | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 internal/apiserver/pgoroleservice/pgoroleimpl_test.go diff --git a/internal/apiserver/pgoroleservice/pgoroleimpl.go b/internal/apiserver/pgoroleservice/pgoroleimpl.go index b16453f557..633d0c3660 100644 --- a/internal/apiserver/pgoroleservice/pgoroleimpl.go +++ b/internal/apiserver/pgoroleservice/pgoroleimpl.go @@ -254,7 +254,7 @@ func validPermissions(perms string) error { fields := strings.Split(perms, ",") for _, v := range fields { - if apiserver.PermMap[strings.TrimSpace(v)] == "" { + if apiserver.PermMap[strings.TrimSpace(v)] == "" && strings.TrimSpace(v) != "*" { return errors.New(v + " not a valid Permission") } } diff --git a/internal/apiserver/pgoroleservice/pgoroleimpl_test.go b/internal/apiserver/pgoroleservice/pgoroleimpl_test.go new file mode 100644 index 0000000000..98ad0c61f2 --- /dev/null +++ b/internal/apiserver/pgoroleservice/pgoroleimpl_test.go @@ -0,0 +1,55 @@ +package pgoroleservice + +import ( + "fmt" + "testing" + + "github.com/crunchydata/postgres-operator/internal/apiserver" +) + +func TestValidPermissions(t *testing.T) { + apiserver.PermMap = map[string]string{ + apiserver.CREATE_CLUSTER_PERM: "yes", + apiserver.CREATE_PGBOUNCER_PERM: "yes", + } + + t.Run("with valid permission", func(t *testing.T) { + perms := apiserver.CREATE_CLUSTER_PERM + + if err := validPermissions(perms); err != nil { + t.Errorf("%q should be a valid permission", perms) + } + }) + + t.Run("with multiple valid permissions", func(t *testing.T) { + perms := fmt.Sprintf("%s,%s", apiserver.CREATE_CLUSTER_PERM, apiserver.CREATE_PGBOUNCER_PERM) + + if err := validPermissions(perms); err != nil { + t.Errorf("%v should be a valid permission", perms) + } + }) + + t.Run("with an invalid permission", func(t *testing.T) { + perms := "bogus" + + if err := validPermissions(perms); err == nil { + t.Errorf("%q should raise an error", perms) + } + }) + + t.Run("with a mix of valid and invalid permissions", func(t *testing.T) { + perms := fmt.Sprintf("%s,%s", apiserver.CREATE_CLUSTER_PERM, "bogus") + + if err := validPermissions(perms); err == nil { + t.Errorf("%q should raise an error", perms) + } + }) + + t.Run("with *", func(t *testing.T) { + perms := "*" + + if err := validPermissions(perms); err != nil { + t.Errorf("%q should be a valid permission", perms) + } + }) +} From 04b6c483b7b122a07f298c2decc477aa06564012 Mon Sep 17 00:00:00 2001 From: Joseph Mckulka Date: Thu, 6 Aug 2020 18:18:34 +0000 Subject: [PATCH 06/77] Update sane default for pgbadger resources pgbadger was running into the OOM Killer because of the memory resource limits. This commit ups the memory limit as a workaround. --- .../ansible/roles/pgo-operator/files/pgo-configs/pgbadger.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgbadger.json b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgbadger.json index f39964b5d2..d9b04daa73 100644 --- a/installers/ansible/roles/pgo-operator/files/pgo-configs/pgbadger.json +++ b/installers/ansible/roles/pgo-operator/files/pgo-configs/pgbadger.json @@ -23,7 +23,7 @@ "resources": { "limits": { "cpu": "500m", - "memory": "24Mi" + "memory": "64Mi" } }, "volumeMounts": [ From 639324a46e28551be68386fa336f05d5ef4d66b2 Mon Sep 17 00:00:00 2001 From: andrewlecuyer <43458182+andrewlecuyer@users.noreply.github.com> Date: Wed, 12 Aug 2020 14:06:21 -0500 Subject: [PATCH 07/77] Default URI Style for S3 Bootstrap The proper default S3 URI style is now set when generating the pgBackRest S3 environment variables for a bootstrap Job (i.e. a Job created to bootstrap a cluster from an existing backup, such as when using the '--restore-from' flag with the 'pgo' client). Specifically, if an empty string is detected in the 's3-uri-style' annotation for the pgBackRest repo secret for the cluster being bootstrapped/restored from, a proper default value of 'host' is now set. This ensures there is never an empty value for the PGBACKREST_REPO1_S3_URI_STYLE environment variable in a bootstrap Pod, which can lead to problems when running various pgBackRest commands. Additionally, tests have been created to verify the output of the GetPgbackrestBootstrapS3EnvVars function that is utilized to populate the proper S3 environment variables for a bootstrap Job (specifically using the pgBackRest repo secret from the cluster being bootstrapped from). This includes ensuring the proper default URI style is set when the 's3-uri-style' annotation is empty, as well as ensuring all annotation values are properly reflected in the final S3 environment variable output. In support of these tests, a NewFakePGOClient function has also been created in the 'fake' package (underneath 'kubeapi'). This is needed to create a fake client containing the proper resources (i.e. a mock 'pgo-config' ConfigMap) as need to initialize the Operator and therefore the various templates needed to properly call the GetPgbackrestBootstrapS3EnvVars function for these tests (PGOROOT must be properly set in the environment when running tests so that the proper default template files and pgo.yaml file can be found as needed to create the mock 'pgo-config' ConfigMap). Issue: [ch8915] See: c503b9d25ce4a9c06b01844e635d87ff00e2d4ce --- internal/operator/backrest/repo.go | 4 +-- internal/operator/cluster/clusterlogic.go | 4 +-- internal/operator/clusterutilities.go | 31 +++++++++++++++-------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/internal/operator/backrest/repo.go b/internal/operator/backrest/repo.go index 3bc75ea074..8893d2e416 100644 --- a/internal/operator/backrest/repo.go +++ b/internal/operator/backrest/repo.go @@ -191,8 +191,8 @@ func setBootstrapRepoOverrides(clientset kubernetes.Interface, cluster *crv1.Pgc s3Restore := S3RepoTypeCLIOptionExists(cluster.Spec.PGDataSource.RestoreOpts) if s3Restore { // Now override any backrest S3 env vars for the bootstrap job - repoFields.PgbackrestS3EnvVars = operator.GetPgbackrestBootstrapS3EnvVars(cluster, - restoreFromSecret) + repoFields.PgbackrestS3EnvVars = operator.GetPgbackrestBootstrapS3EnvVars( + cluster.Spec.PGDataSource.RestoreFrom, restoreFromSecret) } else { repoFields.PgbackrestS3EnvVars = "" } diff --git a/internal/operator/cluster/clusterlogic.go b/internal/operator/cluster/clusterlogic.go index 69c35cd961..d18b71eb99 100644 --- a/internal/operator/cluster/clusterlogic.go +++ b/internal/operator/cluster/clusterlogic.go @@ -246,8 +246,8 @@ func getBootstrapJobFields(clientset kubernetes.Interface, client *rest.RESTClie s3Restore := backrest.S3RepoTypeCLIOptionExists(cluster.Spec.PGDataSource.RestoreOpts) if s3Restore { // Now override any backrest S3 env vars for the bootstrap job - bootstrapFields.PgbackrestS3EnvVars = operator.GetPgbackrestBootstrapS3EnvVars(cluster, - restoreFromSecret) + bootstrapFields.PgbackrestS3EnvVars = operator.GetPgbackrestBootstrapS3EnvVars( + cluster.Spec.PGDataSource.RestoreFrom, restoreFromSecret) } else { bootstrapFields.PgbackrestS3EnvVars = "" } diff --git a/internal/operator/clusterutilities.go b/internal/operator/clusterutilities.go index 1efdc4ee1b..d11ed1a1c1 100644 --- a/internal/operator/clusterutilities.go +++ b/internal/operator/clusterutilities.go @@ -57,6 +57,10 @@ const ( PGHAConfigReplicaBootstrapRepoType = "replica-bootstrap-repo-type" ) +// defaultPGBackRestS3URIStyle is the default pgBackRest S3 URI style to use if a specific style is +// not provided +const defaultPGBackRestS3URIStyle = "host" + // affinityType represents the two affinity types provided by Kubernetes, specifically // either preferredDuringSchedulingIgnoredDuringExecution or // requiredDuringSchedulingIgnoredDuringExecution @@ -779,7 +783,7 @@ func GetPgbackrestS3EnvVars(cluster crv1.Pgcluster, clientset kubernetes.Interfa // if the URI style is not configured, set to the default value if s3EnvVars.PgbackrestS3URIStyle == "" { - s3EnvVars.PgbackrestS3URIStyle = "host" + s3EnvVars.PgbackrestS3URIStyle = defaultPGBackRestS3URIStyle } // if set, pgBackRest URI style must be set to either 'path' or 'host'. If it is neither, // log an error and stop the cluster from being created. @@ -828,18 +832,23 @@ func GetS3VerifyTLSSetting(cluster *crv1.Pgcluster) string { // pgBackRest environment variables required to enable S3 support for the boostrap job. After // the template has been executed with the proper values, the result is then returned a string // for inclusion in the PG and pgBackRest deployments. -func GetPgbackrestBootstrapS3EnvVars(cluster *crv1.Pgcluster, restoreFromSecret *v1.Secret) string { +func GetPgbackrestBootstrapS3EnvVars(pgDataSourceRestoreFrom string, + restoreFromSecret *v1.Secret) string { s3EnvVars := PgbackrestS3EnvVarsTemplateFields{ - PgbackrestS3Key: util.BackRestRepoSecretKeyAWSS3KeyAWSS3Key, - PgbackrestS3KeySecret: util.BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret, - PgbackrestS3Bucket: restoreFromSecret.Annotations[config.ANNOTATION_S3_BUCKET], - PgbackrestS3Endpoint: restoreFromSecret.Annotations[config.ANNOTATION_S3_ENDPOINT], - PgbackrestS3Region: restoreFromSecret.Annotations[config.ANNOTATION_S3_REGION], - PgbackrestS3URIStyle: restoreFromSecret.Annotations[config.ANNOTATION_S3_URI_STYLE], - PgbackrestS3VerifyTLS: restoreFromSecret.Annotations[config.ANNOTATION_S3_VERIFY_TLS], - PgbackrestS3SecretName: fmt.Sprintf(util.BackrestRepoSecretName, - cluster.Spec.PGDataSource.RestoreFrom), + PgbackrestS3Key: util.BackRestRepoSecretKeyAWSS3KeyAWSS3Key, + PgbackrestS3KeySecret: util.BackRestRepoSecretKeyAWSS3KeyAWSS3KeySecret, + PgbackrestS3Bucket: restoreFromSecret.Annotations[config.ANNOTATION_S3_BUCKET], + PgbackrestS3Endpoint: restoreFromSecret.Annotations[config.ANNOTATION_S3_ENDPOINT], + PgbackrestS3Region: restoreFromSecret.Annotations[config.ANNOTATION_S3_REGION], + PgbackrestS3SecretName: fmt.Sprintf(util.BackrestRepoSecretName, pgDataSourceRestoreFrom), + } + + // if the URI style annotation is empty then set the proper default + if restoreFromSecret.Annotations[config.ANNOTATION_S3_URI_STYLE] != "" { + s3EnvVars.PgbackrestS3URIStyle = restoreFromSecret.Annotations[config.ANNOTATION_S3_URI_STYLE] + } else { + s3EnvVars.PgbackrestS3URIStyle = defaultPGBackRestS3URIStyle } verifyTLS := restoreFromSecret.Annotations[config.ANNOTATION_S3_VERIFY_TLS] From bcff5d5401fb4e907769daac309495ea5fa33b16 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 14 Aug 2020 11:40:50 -0400 Subject: [PATCH 08/77] Version bump for 4.4.1 This adds in the information for the PostgreSQL 2020-08-13 cumulative update release. --- Makefile | 4 ++-- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 ++-- docs/config.toml | 4 ++-- docs/content/Configuration/compatibility.md | 6 ++++++ examples/create-by-resource/fromcrd.json | 6 +++--- examples/envs.sh | 2 +- examples/load/sample-json-load-config-sc.yaml | 2 +- examples/load/sample-json-load-config.yaml | 2 +- examples/load/sample-load-config.yaml | 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/inventory.ini | 6 +++--- installers/helm/metrics/Chart.yaml | 2 +- installers/helm/metrics/values.yaml | 6 +++--- installers/helm/postgres-operator/Chart.yaml | 2 +- installers/helm/postgres-operator/values.yaml | 6 +++--- installers/kubectl/client-setup.sh | 2 +- installers/kubectl/postgres-operator-ocp311.yml | 8 ++++---- installers/kubectl/postgres-operator.yml | 8 ++++---- 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 +- 28 files changed, 56 insertions(+), 50 deletions(-) diff --git a/Makefile b/Makefile index d4d51e2873..e2b75516e6 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.4.0 +PGO_VERSION ?= 4.4.1 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.3 +PGO_PG_FULLVERSION ?= 12.4 PGO_BACKREST_VERSION ?= 2.27 RELTMPDIR=/tmp/release.$(PGO_VERSION) diff --git a/README.md b/README.md index 9d14b031ed..5b152ce843 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,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.4.0/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.4.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 5928c70bfd..8043d20317 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.3-4.4.0 +CCP_IMAGE_TAG=centos7-12.4-4.4.1 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index d59a27aff4..576b7aaf0c 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.3-4.4.0 + CCPImageTag: centos7-12.4-4.4.1 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -81,4 +81,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos7-4.4.0 + PGOImageTag: centos7-4.4.1 diff --git a/docs/config.toml b/docs/config.toml index 63e9eb37e1..b233d0eeaf 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,8 +25,8 @@ 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.4.0" -postgresVersion = "12.3" +operatorVersion = "4.4.1" +postgresVersion = "12.4" postgisVersion = "3.0" centosBase = "centos7" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index 42ec75cfbc..12fe2de0c1 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.4.1 | 4.4.1 | 12.4 | 2.27 | +|||11.9|2.27| +|||10.14|2.27| +|||9.6.19|2.27| +|||9.5.23|2.27| +|||| | 4.4.0 | 4.4.0 | 12.3 | 2.27 | |||11.8|2.27| |||10.13|2.27| diff --git a/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index 209401d9b6..14f1a2c033 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.4.0", + "pgo-version": "4.4.1", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos7-12.3-4.4.0", + "ccpimagetag": "centos7-12.4-4.4.1", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy_collect": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.4.0", + "pgo-version": "4.4.1", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index e9a612077c..4d439d682f 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -20,7 +20,7 @@ export PGOROOT=$GOPATH/src/github.com/crunchydata/postgres-operator # 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.4.0 +export PGO_VERSION=4.4.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/load/sample-json-load-config-sc.yaml b/examples/load/sample-json-load-config-sc.yaml index b69fe846d3..20e5c111ce 100644 --- a/examples/load/sample-json-load-config-sc.yaml +++ b/examples/load/sample-json-load-config-sc.yaml @@ -1,5 +1,5 @@ PGOImagePrefix: registry.developers.crunchydata.com/crunchydata -PGOImageTag: centos7-4.4.0 +PGOImageTag: centos7-4.4.1 DbDatabase: userdb DbUser: postgres DbPort: 5432 diff --git a/examples/load/sample-json-load-config.yaml b/examples/load/sample-json-load-config.yaml index 530d176958..24268fda1a 100644 --- a/examples/load/sample-json-load-config.yaml +++ b/examples/load/sample-json-load-config.yaml @@ -1,5 +1,5 @@ PGOImagePrefix: registry.developers.crunchydata.com/crunchydata -PGOImageTag: centos7-4.4.0 +PGOImageTag: centos7-4.4.1 DbDatabase: userdb DbUser: postgres DbPort: 5432 diff --git a/examples/load/sample-load-config.yaml b/examples/load/sample-load-config.yaml index 34016c35eb..1b75a5df4a 100644 --- a/examples/load/sample-load-config.yaml +++ b/examples/load/sample-load-config.yaml @@ -1,5 +1,5 @@ PGOImagePrefix: registry.developers.crunchydata.com/crunchydata -PGOImageTag: centos7-4.4.0 +PGOImageTag: centos7-4.4.1 DbDatabase: userdb DbUser: postgres DbPort: 5432 diff --git a/installers/ansible/README.md b/installers/ansible/README.md index 6f0464914b..4518aa3a52 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.4.0 +Latest Release: 4.4.1 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index 5f50ea37b7..a553a19421 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -13,7 +13,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.3-4.4.0" +ccp_image_tag: "centos7-12.4-4.4.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -54,14 +54,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: "v4.4.0" +pgo_client_version: "v4.4.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.4.0" +pgo_image_tag: "centos7-4.4.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 8f243ca122..a9591aa02e 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.4.0 +PGO_VERSION ?= 4.4.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 cb152c04a2..0f29b9af13 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.4.0 + export PGO_VERSION=4.4.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/inventory.ini b/installers/gcp-marketplace/inventory.ini index c3ea1a1000..ab8dac2486 100644 --- a/installers/gcp-marketplace/inventory.ini +++ b/installers/gcp-marketplace/inventory.ini @@ -16,11 +16,11 @@ pgo_operator_namespace='${OPERATOR_NAMESPACE}' namespace='' ccp_image_prefix='registry.developers.crunchydata.com/crunchydata' -ccp_image_tag='centos7-12.3-4.4.0' +ccp_image_tag='centos7-12.4-4.4.1' ccp_image_pull_secret='' ccp_image_pull_secret_manifest='' pgo_image_prefix='registry.developers.crunchydata.com/crunchydata' -pgo_image_tag='centos7-4.4.0' +pgo_image_tag='centos7-4.4.1' pgo_image='${OPERATOR_IMAGE}' pgo_event_image='${OPERATOR_IMAGE_EVENT}' @@ -29,7 +29,7 @@ pgo_scheduler_image='${OPERATOR_IMAGE_SCHEDULER}' # PGO Client Install pgo_client_install='false' -pgo_client_version='v4.4.0' +pgo_client_version='v4.4.1' badger='false' metrics='${POSTGRES_METRICS}' diff --git a/installers/helm/metrics/Chart.yaml b/installers/helm/metrics/Chart.yaml index 6efe6c6ab9..fbb7a92719 100644 --- a/installers/helm/metrics/Chart.yaml +++ b/installers/helm/metrics/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-metrics description: Metrics Install for Crunchy PostgreSQL Operator type: application version: 0.1.0 -appVersion: 4.4.0 +appVersion: 4.4.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/helm/metrics/values.yaml b/installers/helm/metrics/values.yaml index df0060caf0..9a47f3baf1 100644 --- a/installers/helm/metrics/values.yaml +++ b/installers/helm/metrics/values.yaml @@ -29,7 +29,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.3-4.4.0" +ccp_image_tag: "centos7-12.4-4.4.1" create_rbac: "true" crunchy_debug: "false" db_password_length: "24" @@ -56,11 +56,11 @@ pgo_admin_password: "examplepassword" pgo_admin_perms: "*" pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" -pgo_client_version: "4.4.0" +pgo_client_version: "4.4.1" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos7-4.4.0" +pgo_image_tag: "centos7-4.4.1" pgo_installation_name: "devtest" pgo_operator_namespace: "pgo" prometheus_install: "false" diff --git a/installers/helm/postgres-operator/Chart.yaml b/installers/helm/postgres-operator/Chart.yaml index cf0622add8..d2a005c5bc 100644 --- a/installers/helm/postgres-operator/Chart.yaml +++ b/installers/helm/postgres-operator/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.4.0 +appVersion: 4.4.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/postgres-operator/values.yaml b/installers/helm/postgres-operator/values.yaml index 4544d5c0d8..837b9e855a 100644 --- a/installers/helm/postgres-operator/values.yaml +++ b/installers/helm/postgres-operator/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.3-4.4.0" +ccp_image_tag: "centos7-12.4-4.4.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -69,14 +69,14 @@ pgo_apiserver_port: "8443" pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" -pgo_client_version: "4.4.0" +pgo_client_version: "4.4.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.4.0" +pgo_image_tag: "centos7-4.4.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 6d4c0a84d5..4ae6f3f0f9 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.4.0}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.4.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 e9abff59d4..dfce225a9e 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -40,7 +40,7 @@ data: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos7-12.3-4.4.0" + ccp_image_tag: "centos7-12.4-4.4.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -80,14 +80,14 @@ data: pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" - pgo_client_version: "4.4.0" + pgo_client_version: "4.4.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.4.0" + pgo_image_tag: "centos7-4.4.1" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -169,7 +169,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.0 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.1 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index 716cc3ed6b..cec1f1bb7d 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -134,7 +134,7 @@ rules: ccp_image_prefix: "registry.developers.crunchydata.com/crunchydata" ccp_image_pull_secret: "" ccp_image_pull_secret_manifest: "" - ccp_image_tag: "centos7-12.3-4.4.0" + ccp_image_tag: "centos7-12.4-4.4.1" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -174,14 +174,14 @@ rules: pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" - pgo_client_version: "4.4.0" + pgo_client_version: "4.4.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.4.0" + pgo_image_tag: "centos7-4.4.1" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -276,7 +276,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.0 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.1 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index 09ff82042f..e6881c21c2 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.3 +CCP_PG_FULLVERSION ?= 12.4 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.13.0 @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.14.2 PGO_BASEOS ?= centos7 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.4.0 +PGO_VERSION ?= 4.4.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 d4040f582a..63b21d1c91 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.4.0", + '{"ClientVersion":"4.4.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.4.0", + '{"ClientVersion":"4.4.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.4.0", + '{"ClientVersion":"4.4.1", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.4.0 + Version: 4.4.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 d8407415bc..5c7ba74143 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.4.0" +const PGO_VERSION = "4.4.1" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index 20abae2707..34735fc700 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.4.0" +The specific release number of the container. For example, Release="4.4.1" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index 77a3d7920f..6fd906b198 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.4.0" +The specific release number of the container. For example, Release="4.4.1" From 4a41cc6396a2301395ce68f8198911849b67ac99 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 17 Aug 2020 12:45:46 -0400 Subject: [PATCH 09/77] Add 4.3.3 release notes --- docs/content/releases/4.3.3.md | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 docs/content/releases/4.3.3.md diff --git a/docs/content/releases/4.3.3.md b/docs/content/releases/4.3.3.md new file mode 100644 index 0000000000..c76495049d --- /dev/null +++ b/docs/content/releases/4.3.3.md @@ -0,0 +1,48 @@ +--- +title: "4.3.3" +date: +draft: false +weight: 93 +--- + +Crunchy Data announces the release of the [PostgreSQL Operator](https://www.crunchydata.com/products/crunchy-postgresql-operator/) 4.3.3 on August 17, 2020. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +The PostgreSQL Operator 4.3.3 release includes the following software versions upgrades: + +- The PostgreSQL containers now use versions 12.4, 11.9, 10.14, 9.6.19, and 9.5.23 +- pgBouncer is now at version 1.14. + +PostgreSQL Operator is tested with Kubernetes 1.13 - 1.18, OpenShift 3.11+, OpenShift 4.3+, Google Kubernetes Engine (GKE), and VMware Enterprise PKS 1.3+. + + +## Changes + +- Perform a `pg_dump` from a specific database using the `--database` flag when using `pgo backup` with `--backup-type=pgdump`. +- Restore a `pg_dump` to a specific database using the `--pgdump-database` flag using `pgo restore` when `--backup-type=pgdump` is specified. +- Add the `--client` flag to `pgo version` to output the client version of `pgo`. +- The PostgreSQL cluster scope is now utilized to identify and sync the ConfigMap responsible for the DCS for a PostgreSQL cluster. +- The `PGMONITOR_PASSWORD` is now populated by an environmental variable secret. This environmental variable is only set on a primary instance as it is only needed at the time a PostgreSQL cluster is initialized. +- Remove "Operator Start Time" from `pgo status` as it is more convenient and accurate to get this information from `kubectl` and the like, and it was not working due to RBAC privileges. (Reported by @mw-0). +- `pgo-rmdata` container no longer runs as the `root` user, but as `daemon` (UID 2) +- Remove dependency on the `expenv` binary that was included in the PostgreSQL Operator release. All `expenv` calls were either replaced with the native `envsubst` program or removed. + +## Fixes + +- Add validation to ensure that limits for CPU/memory are greater-than-or-equal-to the requests. This applies to any command that can set a limit/request. +- Ensure WAL archives are pushed to all repositories when pgBackRest is set to use both a local and a S3-based repository +- Silence expected error conditions when a pgBackRest repository is being initialized. +- Add the `watch` permissions to the `pgo-deployer` ServiceAccount. +- Ensure `client-setup.sh` works with when there is an existing `pgo` client in the install path +- Ensure the PostgreSQL Operator can be uninstalled by adding `list` verb ClusterRole privileges to several Kubernetes objects. +- Bring up the correct number of pgBouncer replicas when `pgo update cluster --startup` is issued. +- Fixed issue where `pgo scale` would not work after `pgo update cluster --shutdown` and `pgo update cluster --startup` were run. +- Ensure `pgo scaledown` deletes external WAL volumes from the replica that is removed. +- Fix for PostgreSQL cluster startup logic when performing a restore. +- Do not consider non-running Pods as primary Pods when checking for multiple primaries (Reported by @djcooklup). +- Fix race condition that could occur while `pgo upgrade` was running while a HA configuration map attempted to sync. (Reported by Paul Heinen @v3nturetheworld). +- Silence "ConfigMap not found" error messages that occurred during PostgreSQL cluster initialization, as these were not real errors. +- Fix an issue with controller processing, which could manifest in PostgreSQL clusters not being deleted. +- Eliminate `gcc` from the `postgres-ha` and `pgadmin4` containers. +- Fix `pgo label` when applying multiple labels at once. From 58c58289482682183c6ef9a0b01084ab630ecda8 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 17 Aug 2020 12:47:17 -0400 Subject: [PATCH 10/77] Add 4.4.1 release notes --- docs/content/releases/4.4.1.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 docs/content/releases/4.4.1.md diff --git a/docs/content/releases/4.4.1.md b/docs/content/releases/4.4.1.md new file mode 100644 index 0000000000..7057ee69ae --- /dev/null +++ b/docs/content/releases/4.4.1.md @@ -0,0 +1,23 @@ +--- +title: "4.4.1" +date: +draft: false +weight: 79 +--- + +Crunchy Data announces the release of the [PostgreSQL Operator](https://www.crunchydata.com/products/crunchy-postgresql-operator/) 4.4.1 on August 17, 2020. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +The PostgreSQL Operator 4.4.1 release includes the following software versions upgrades: + +- The PostgreSQL containers now use versions 12.4, 11.9, 10.14, 9.6.19, and 9.5.23 + +PostgreSQL Operator is tested with Kubernetes 1.13 - 1.18, OpenShift 3.11+, OpenShift 4.3+, Google Kubernetes Engine (GKE), and VMware Enterprise PKS 1.3+. + +## Fixes + +- The pgBackRest URI style defaults to `host` if it is not set. +- Fix `pgo label` when applying multiple labels at once. +- pgBadger now has a default memory limit of 64Mi, which should help avoid a visit from the OOM killer. +- Fix `pgo create pgorole` so that the expression `--permissions=*` works. From f71b5a3b326ed464baaabed61e58542fbbe7a0b4 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 1 Sep 2020 14:10:06 -0400 Subject: [PATCH 11/77] Restrict check for pgBackRest primary Pods to running pods There could be cases where a pgBackRest Pod is running while another is terminating, and we want to ensure that the full pgBackRest functionality is available when there is one (and presently, only one) pgBackRest Pod available for the request. Issue: [ch9155] Issue: #1835 --- internal/apiserver/backrestservice/backrestimpl.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/internal/apiserver/backrestservice/backrestimpl.go b/internal/apiserver/backrestservice/backrestimpl.go index 048b0237cb..d41428478e 100644 --- a/internal/apiserver/backrestservice/backrestimpl.go +++ b/internal/apiserver/backrestservice/backrestimpl.go @@ -36,6 +36,7 @@ import ( log "github.com/sirupsen/logrus" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" ) const containername = "database" @@ -291,7 +292,13 @@ func getPrimaryPodName(cluster *crv1.Pgcluster, ns string) (string, error) { //look up the backrest-repo pod name selector := "pg-cluster=" + cluster.Spec.Name + ",pgo-backrest-repo=true" - repopods, err := apiserver.Clientset.CoreV1().Pods(ns).List(metav1.ListOptions{LabelSelector: selector}) + + options := metav1.ListOptions{ + FieldSelector: fields.OneTermEqualSelector("status.phase", string(v1.PodRunning)).String(), + LabelSelector: selector, + } + + repopods, err := apiserver.Clientset.CoreV1().Pods(ns).List(options) if len(repopods.Items) != 1 { log.Errorf("pods len != 1 for cluster %s", cluster.Spec.Name) return "", errors.New("backrestrepo pod not found for cluster " + cluster.Spec.Name) From 35f71450f1c99271e150e55a61f2ae56a45a3a84 Mon Sep 17 00:00:00 2001 From: Chris Bandy Date: Fri, 28 Aug 2020 15:33:31 -0500 Subject: [PATCH 12/77] Copy pgBackRest S3 secrets during cluster upgrade Starting in 4.3, pgBackRest secrets are overwritten during upgrade in order to generate new SSH keys and corresponding SSH config. Some non-SSH secrets were omitted. Issue: [ch9063] See: 7ef89deb88a5fcf43b0034811ecde03d2bdea277 --- internal/operator/cluster/upgrade.go | 44 ++++++++++++++++++++-------- internal/util/cluster.go | 3 ++ 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/internal/operator/cluster/upgrade.go b/internal/operator/cluster/upgrade.go index d7675ce97e..ee766c89af 100644 --- a/internal/operator/cluster/upgrade.go +++ b/internal/operator/cluster/upgrade.go @@ -312,9 +312,6 @@ func deleteBeforeUpgrade(clientset kubernetes.Interface, restclient *rest.RESTCl // delete the '-pgha-default-config' configmap, if it exists so the config syncer // will not try to use it instead of '-pgha-config' clientset.CoreV1().ConfigMaps(namespace).Delete(clusterName+"-pgha-default-config", &metav1.DeleteOptions{}) - - // delete the backrest repo config secret, since key encryption has been updated from RSA to EdDSA - clientset.CoreV1().Secrets(namespace).Delete(clusterName+"-backrest-repo-config", &metav1.DeleteOptions{}) } // deploymentWait is modified from cluster.waitForDeploymentDelete. It simply waits for the current primary deployment @@ -405,17 +402,35 @@ func createUpgradePGHAConfigMap(clientset kubernetes.Interface, cluster *crv1.Pg return nil } -// recreateBackrestRepoSecret deletes and recreates the secret for the pgBackRest repo. This is needed +// recreateBackrestRepoSecret overwrites the secret for the pgBackRest repo. This is needed // because the key encryption algorithm has been updated from RSA to EdDSA func recreateBackrestRepoSecret(clientset kubernetes.Interface, clustername, namespace, operatorNamespace string) { - if err := util.CreateBackrestRepoSecrets(clientset, - util.BackrestRepoConfig{ - BackrestS3Key: "", // these are set to empty so that it can be generated - BackrestS3KeySecret: "", - ClusterName: clustername, - ClusterNamespace: namespace, - OperatorNamespace: operatorNamespace, - }); err != nil { + config := util.BackrestRepoConfig{ + ClusterName: clustername, + ClusterNamespace: namespace, + OperatorNamespace: operatorNamespace, + } + + secretName := clustername + "-backrest-repo-config" + secret, err := clientset.CoreV1().Secrets(namespace).Get(secretName, metav1.GetOptions{}) + + // >= 4.3 + if err == nil { + if b, ok := secret.Data["aws-s3-ca.crt"]; ok { + config.BackrestS3CA = b + } + if b, ok := secret.Data["aws-s3-key"]; ok { + config.BackrestS3Key = string(b) + } + if b, ok := secret.Data["aws-s3-key-secret"]; ok { + config.BackrestS3KeySecret = string(b) + } + } + + if err == nil { + err = util.CreateBackrestRepoSecrets(clientset, config) + } + if err != nil { log.Errorf("error generating new backrest repo secrets during pgcluster upgrade: %v", err) } } @@ -490,6 +505,11 @@ func preparePgclusterForUpgrade(pgcluster *crv1.Pgcluster, parameters map[string // cluster operations in this version of the Postgres Operator pgcluster.ObjectMeta.Labels[config.LABEL_BACKREST] = "true" + // added in 4.4 + if pgcluster.Spec.BackrestS3VerifyTLS == "" { + pgcluster.Spec.BackrestS3VerifyTLS = operator.Pgo.Cluster.BackrestS3VerifyTLS + } + // add a label with the PGO version upgraded from and to pgcluster.Annotations[config.ANNOTATION_UPGRADE_INFO] = "From_" + oldpgoversion + "_to_" + parameters[config.LABEL_PGO_VERSION] // update the "is upgraded" label to indicate cluster has been upgraded diff --git a/internal/util/cluster.go b/internal/util/cluster.go index d9c8cc2091..91c7cfec95 100644 --- a/internal/util/cluster.go +++ b/internal/util/cluster.go @@ -176,6 +176,9 @@ func CreateBackrestRepoSecrets(clientset kubernetes.Interface, } _, err = clientset.CoreV1().Secrets(backrestRepoConfig.ClusterNamespace).Create(&secret) + if kubeapi.IsAlreadyExists(err) { + _, err = clientset.CoreV1().Secrets(backrestRepoConfig.ClusterNamespace).Update(&secret) + } return err } From f0adfea798548a187f8200bb6dab0ad8ec2dc041 Mon Sep 17 00:00:00 2001 From: Chris Bandy Date: Wed, 2 Sep 2020 16:14:23 -0500 Subject: [PATCH 13/77] Upgrade pgBackRest settings from 4.2 and earlier The format of pgBackRest secrets changed in 4.3, and operator settings started being saved to the cluster in 4.4. Issue: [ch9063] See: b1e03f1ed301f60451cf83c73a5479d933e6d2b7 --- internal/operator/cluster/upgrade.go | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/internal/operator/cluster/upgrade.go b/internal/operator/cluster/upgrade.go index ee766c89af..fad958ea4e 100644 --- a/internal/operator/cluster/upgrade.go +++ b/internal/operator/cluster/upgrade.go @@ -36,6 +36,7 @@ import ( "k8s.io/apimachinery/pkg/fields" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" + "sigs.k8s.io/yaml" ) // Store image names as constants to use later @@ -414,6 +415,23 @@ func recreateBackrestRepoSecret(clientset kubernetes.Interface, clustername, nam secretName := clustername + "-backrest-repo-config" secret, err := clientset.CoreV1().Secrets(namespace).Get(secretName, metav1.GetOptions{}) + // 4.1, 4.2 + if err == nil { + if b, ok := secret.Data["aws-s3-ca.crt"]; ok { + config.BackrestS3CA = b + } + if b, ok := secret.Data["aws-s3-credentials.yaml"]; ok { + var parsed struct { + Key string `yaml:"aws-s3-key"` + KeySecret string `yaml:"aws-s3-key-secret"` + } + if err = yaml.Unmarshal(b, &parsed); err == nil { + config.BackrestS3Key = parsed.Key + config.BackrestS3KeySecret = parsed.KeySecret + } + } + } + // >= 4.3 if err == nil { if b, ok := secret.Data["aws-s3-ca.crt"]; ok { @@ -505,6 +523,17 @@ func preparePgclusterForUpgrade(pgcluster *crv1.Pgcluster, parameters map[string // cluster operations in this version of the Postgres Operator pgcluster.ObjectMeta.Labels[config.LABEL_BACKREST] = "true" + // added in 4.2 and copied from configuration in 4.4 + if pgcluster.Spec.BackrestS3Bucket == "" { + pgcluster.Spec.BackrestS3Bucket = operator.Pgo.Cluster.BackrestS3Bucket + } + if pgcluster.Spec.BackrestS3Endpoint == "" { + pgcluster.Spec.BackrestS3Endpoint = operator.Pgo.Cluster.BackrestS3Endpoint + } + if pgcluster.Spec.BackrestS3Region == "" { + pgcluster.Spec.BackrestS3Region = operator.Pgo.Cluster.BackrestS3Region + } + // added in 4.4 if pgcluster.Spec.BackrestS3VerifyTLS == "" { pgcluster.Spec.BackrestS3VerifyTLS = operator.Pgo.Cluster.BackrestS3VerifyTLS From c2ee6f906ac39f4c162ff6ccd95fabb0276c9a43 Mon Sep 17 00:00:00 2001 From: Chris Bandy Date: Tue, 8 Sep 2020 12:16:14 -0500 Subject: [PATCH 14/77] Use a byte slice when generating passwords Go 1.15 complained about the conversion from int64 to string. See: 44e3a1819927e53b2674c90a142ac7d90c80a4d2 --- internal/util/secrets.go | 8 ++--- internal/util/secrets_test.go | 58 +++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 internal/util/secrets_test.go diff --git a/internal/util/secrets.go b/internal/util/secrets.go index 16bb5758d9..1ef90e7bd6 100644 --- a/internal/util/secrets.go +++ b/internal/util/secrets.go @@ -76,9 +76,7 @@ func CreateSecret(clientset kubernetes.Interface, db, secretName, username, pass // GeneratePassword generates a password of a given length out of the acceptable // ASCII characters suitable for a password func GeneratePassword(length int) (string, error) { - // for "length" times, we are going to get a random ASCII character, and - // append it to the "password" string - password := "" + password := make([]byte, length) for i := 0; i < length; i++ { char, err := rand.Int(rand.Reader, passwordCharSelector) @@ -88,10 +86,10 @@ func GeneratePassword(length int) (string, error) { return "", err } - password += string(passwordCharLower + char.Int64()) + password[i] = byte(passwordCharLower + char.Int64()) } - return password, nil + return string(password), nil } // GeneratedPasswordLength returns the value for what the length of a diff --git a/internal/util/secrets_test.go b/internal/util/secrets_test.go new file mode 100644 index 0000000000..89cbcebac9 --- /dev/null +++ b/internal/util/secrets_test.go @@ -0,0 +1,58 @@ +package util + +/* + 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. +*/ + +import ( + "strings" + "testing" + "unicode" +) + +func TestGeneratePassword(t *testing.T) { + // different lengths + for _, length := range []int{1, 2, 3, 5, 20} { + password, err := GeneratePassword(length) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + 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 { + t.Fatalf("expected only printable characters, got %q in %q", password[i], password) + } + } + + // random contents + previous := []string{} + + for i := 0; i < 10; i++ { + password, err := GeneratePassword(5) + if err != nil { + t.Fatalf("expected no error, got %v", err) + } + if i := strings.IndexFunc(password, unicode.IsPrint); i > 0 { + t.Fatalf("expected only printable characters, got %q in %q", password[i], password) + } + + for i := range previous { + if password == previous[i] { + t.Fatalf("expected passwords to not repeat, got %q after %q", password, previous) + } + } + previous = append(previous, password) + } +} From 00e809211d0fc370cb24a5d2d0dbe27ae3002cbd Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 14 Sep 2020 16:41:39 -0400 Subject: [PATCH 15/77] Ensure pgBouncer port is derived from Cluster spec Previously, it was derived from the Postgres Operator configuration, which is actually incorrect for several reasons, so technically this constitutes a bug. Issue: #1830 --- internal/operator/cluster/pgbouncer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/operator/cluster/pgbouncer.go b/internal/operator/cluster/pgbouncer.go index 2b8e1cc207..9e5065daa3 100644 --- a/internal/operator/cluster/pgbouncer.go +++ b/internal/operator/cluster/pgbouncer.go @@ -460,7 +460,7 @@ func createPgBouncerDeployment(clientset kubernetes.Interface, cluster *crv1.Pgc ClusterName: cluster.Name, CCPImagePrefix: util.GetValueOrDefault(cluster.Spec.CCPImagePrefix, operator.Pgo.Cluster.CCPImagePrefix), CCPImageTag: cluster.Spec.CCPImageTag, - Port: operator.Pgo.Cluster.Port, + Port: cluster.Spec.Port, PGBouncerSecret: util.GeneratePgBouncerSecretName(cluster.Name), ContainerResources: operator.GetResourcesJSON(cluster.Spec.PgBouncer.Resources, cluster.Spec.PgBouncer.Limits), From 81b0b38c2efac05d36eb858789b2f92a2d09fb22 Mon Sep 17 00:00:00 2001 From: Joseph Mckulka Date: Wed, 22 Jul 2020 18:48:54 -0400 Subject: [PATCH 16/77] updates template to generate configmap from values.yaml --- .../postgres-operator/templates/_helpers.tpl | 11 ++ .../templates/values_configmap.yaml | 117 +----------------- 2 files changed, 12 insertions(+), 116 deletions(-) diff --git a/installers/helm/postgres-operator/templates/_helpers.tpl b/installers/helm/postgres-operator/templates/_helpers.tpl index b1457b2728..a1027ba8d7 100644 --- a/installers/helm/postgres-operator/templates/_helpers.tpl +++ b/installers/helm/postgres-operator/templates/_helpers.tpl @@ -84,3 +84,14 @@ cluster-admin {{ include "postgres-operator.fullname" . }}-cr {{- end }} {{- end }} + +{{/* +Generate Configmap based on Values defined in values.yaml +*/}} +{{- define "postgres-operator.values" -}} +values.yaml: | + --- +{{- range $index, $value := .Values }} +{{ $index | indent 2 }}: {{ $value | quote }} +{{- end }} +{{- end }} diff --git a/installers/helm/postgres-operator/templates/values_configmap.yaml b/installers/helm/postgres-operator/templates/values_configmap.yaml index f30ff0233c..15ab0b9606 100644 --- a/installers/helm/postgres-operator/templates/values_configmap.yaml +++ b/installers/helm/postgres-operator/templates/values_configmap.yaml @@ -6,119 +6,4 @@ metadata: labels: {{ include "postgres-operator.labels" . | indent 4 }} data: - values.yaml: | - --- - archive_mode: "{{ .Values.archive_mode}}" - archive_timeout: "{{ .Values.archive_timeout}}" - backrest_aws_s3_bucket: "{{ .Values.backrest_aws_s3_bucket}}" - backrest_aws_s3_endpoint: "{{ .Values.backrest_aws_s3_endpoint}}" - backrest_aws_s3_key: "{{ .Values.backrest_aws_s3_key}}" - backrest_aws_s3_region: "{{ .Values.backrest_aws_s3_region}}" - backrest_aws_s3_secret: "{{ .Values.backrest_aws_s3_secret}}" - backrest_aws_s3_uri_style: "{{ .Values.backrest_aws_s3_uri_style }}" - backrest_aws_s3_verify_tls: "{{ .Values.backrest_aws_s3_verify_tls }}" - backrest_port: "{{ .Values.backrest_port}}" - badger: "{{ .Values.badger}}" - ccp_image_prefix: "{{ .Values.ccp_image_prefix}}" - ccp_image_pull_secret: "{{ .Values.ccp_image_pull_secret}}" - ccp_image_pull_secret_manifest: "{{ .Values.ccp_image_pull_secret_manifest}}" - ccp_image_tag: "{{ .Values.ccp_image_tag}}" - create_rbac: "{{ .Values.create_rbac}}" - crunchy_debug: "{{ .Values.crunchy_debug}}" - db_name: "{{ .Values.db_name}}" - db_password_age_days: "{{ .Values.db_password_age_days}}" - db_password_length: "{{ .Values.db_password_length}}" - db_port: "{{ .Values.db_port}}" - db_replicas: "{{ .Values.db_replicas}}" - db_user: "{{ .Values.db_user}}" - default_instance_memory: "{{ .Values.default_instance_memory}}" - default_pgbackrest_memory: "{{ .Values.default_pgbackrest_memory}}" - default_pgbouncer_memory: "{{ .Values.default_pgbouncer_memory}}" - delete_metrics_namespace: "{{ .Values.delete_metrics_namespace}}" - delete_operator_namespace: "{{ .Values.delete_operator_namespace}}" - delete_watched_namespaces: "{{ .Values.delete_watched_namespaces}}" - disable_auto_failover: "{{ .Values.disable_auto_failover}}" - disable_fsgroup: "{{ .Values.disable_fsgroup}}" - reconcile_rbac: "{{ .Values.reconcile_rbac}}" - exporterport: "{{ .Values.exporterport}}" - metrics: "{{ .Values.metrics}}" - namespace: "{{ .Values.namespace}}" - namespace_mode: "{{ .Values.namespace_mode}}" - pgbadgerport: "{{ .Values.pgbadgerport}}" - pgo_add_os_ca_store: "{{ .Values.pgo_add_os_ca_store}}" - pgo_admin_password: "{{ .Values.pgo_admin_password}}" - pgo_admin_perms: "{{ .Values.pgo_admin_perms}}" - pgo_admin_role_name: "{{ .Values.pgo_admin_role_name}}" - pgo_admin_username: "{{ .Values.pgo_admin_username}}" - pgo_apiserver_port: "{{ .Values.pgo_apiserver_port}}" - pgo_apiserver_url: "{{ .Values.pgo_apiserver_url}}" - pgo_client_cert_secret: "{{ .Values.pgo_client_cert_secret}}" - pgo_client_container_install: "{{ .Values.pgo_client_container_install}}" - pgo_client_version: "{{ .Values.pgo_client_version}}" - pgo_cluster_admin: "{{ .Values.pgo_cluster_admin}}" - pgo_disable_eventing: "{{ .Values.pgo_disable_eventing}}" - pgo_disable_tls: "{{ .Values.pgo_disable_tls}}" - pgo_image_prefix: "{{ .Values.pgo_image_prefix}}" - pgo_image_pull_secret: "{{ .Values.pgo_image_pull_secret}}" - pgo_image_pull_secret_manifest: "{{ .Values.pgo_image_pull_secret_manifest}}" - pgo_image_tag: "{{ .Values.pgo_image_tag}}" - pgo_installation_name: "{{ .Values.pgo_installation_name}}" - pgo_noauth_routes: "{{ .Values.pgo_noauth_routes}}" - pgo_operator_namespace: "{{ .Values.pgo_operator_namespace}}" - pgo_tls_ca_store: "{{ .Values.pgo_tls_ca_store}}" - pgo_tls_no_verify: "{{ .Values.pgo_tls_no_verify}}" - pod_anti_affinity: "{{ .Values.pod_anti_affinity}}" - pod_anti_affinity_pgbackrest: "{{ .Values.pod_anti_affinity_pgbackrest}}" - pod_anti_affinity_pgbouncer: "{{ .Values.pod_anti_affinity_pgbouncer}}" - scheduler_timeout: "{{ .Values.scheduler_timeout}}" - service_type: "{{ .Values.service_type}}" - sync_replication: "{{ .Values.sync_replication}}" - backrest_storage: "{{ .Values.backrest_storage}}" - backup_storage: "{{ .Values.backup_storage}}" - primary_storage: "{{ .Values.primary_storage}}" - replica_storage: "{{ .Values.replica_storage}}" - wal_storage: "{{ .Values.wal_storage}}" - storage1_name: "{{ .Values.storage1_name}}" - storage1_access_mode: "{{ .Values.storage1_access_mode}}" - storage1_size: "{{ .Values.storage1_size}}" - storage1_type: "{{ .Values.storage1_type}}" - storage2_name: "{{ .Values.storage2_name}}" - storage2_access_mode: "{{ .Values.storage2_access_mode}}" - storage2_size: "{{ .Values.storage2_size}}" - storage2_type: "{{ .Values.storage2_type}}" - storage3_name: "{{ .Values.storage3_name}}" - storage3_access_mode: "{{ .Values.storage3_access_mode}}" - storage3_size: "{{ .Values.storage3_size}}" - storage3_type: "{{ .Values.storage3_type}}" - storage3_supplemental_groups: "{{ .Values.storage3_supplemental_groups}}" - storage4_name: "{{ .Values.storage4_name}}" - storage4_access_mode: "{{ .Values.storage4_access_mode}}" - storage4_size: "{{ .Values.storage4_size}}" - storage4_match_labels: "{{ .Values.storage4_match_labels}}" - storage4_type: "{{ .Values.storage4_type}}" - storage4_supplemental_groups: "{{ .Values.storage4_supplemental_groups}}" - storage5_name: "{{ .Values.storage5_name}}" - storage5_access_mode: "{{ .Values.storage5_access_mode}}" - storage5_size: "{{ .Values.storage5_size}}" - storage5_type: "{{ .Values.storage5_type}}" - storage5_class: "{{ .Values.storage5_class}}" - storage6_name: "{{ .Values.storage6_name}}" - storage6_access_mode: "{{ .Values.storage6_access_mode}}" - storage6_size: "{{ .Values.storage6_size}}" - storage6_type: "{{ .Values.storage6_type}}" - storage6_class: "{{ .Values.storage6_class}}" - storage7_name: "{{ .Values.storage7_name}}" - storage7_access_mode: "{{ .Values.storage7_access_mode}}" - storage7_size: "{{ .Values.storage7_size}}" - storage7_type: "{{ .Values.storage7_type}}" - storage7_class: "{{ .Values.storage7_class}}" - storage8_name: "{{ .Values.storage8_name}}" - storage8_access_mode: "{{ .Values.storage8_access_mode}}" - storage8_size: "{{ .Values.storage8_size}}" - storage8_type: "{{ .Values.storage8_type}}" - storage8_class: "{{ .Values.storage8_class}}" - storage9_name: "{{ .Values.storage9_name}}" - storage9_access_mode: "{{ .Values.storage9_access_mode}}" - storage9_size: "{{ .Values.storage9_size}}" - storage9_type: "{{ .Values.storage9_type}}" - storage9_class: "{{ .Values.storage9_class}}" +{{ include "postgres-operator.values" . | indent 2}} From dd1701d7f9a25d0acb58781203987ad03010538d Mon Sep 17 00:00:00 2001 From: Joseph Mckulka Date: Fri, 24 Jul 2020 18:40:36 +0000 Subject: [PATCH 17/77] Fixes yaml spacing of yaml files --- .../kubectl/postgres-operator-ocp311.yml | 66 ++-- installers/kubectl/postgres-operator.yml | 334 +++++++++--------- 2 files changed, 200 insertions(+), 200 deletions(-) diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index dfce225a9e..4b56b1646c 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -1,22 +1,22 @@ apiVersion: v1 kind: ServiceAccount metadata: - name: pgo-deployer-sa - namespace: pgo + name: pgo-deployer-sa + namespace: pgo --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: - name: pgo-deployer-crb - namespace: pgo + name: pgo-deployer-crb + namespace: pgo roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-admin + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin subjects: -- kind: ServiceAccount - name: pgo-deployer-sa - namespace: pgo + - kind: ServiceAccount + name: pgo-deployer-sa + namespace: pgo --- apiVersion: v1 kind: ConfigMap @@ -157,27 +157,27 @@ data: apiVersion: batch/v1 kind: Job metadata: - name: pgo-deploy - namespace: pgo + name: pgo-deploy + namespace: pgo spec: - backoffLimit: 0 - template: - metadata: - name: pgo-deploy - spec: - serviceAccountName: pgo-deployer-sa - restartPolicy: Never - containers: - - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.1 - imagePullPolicy: IfNotPresent - env: - - name: DEPLOY_ACTION - value: install - volumeMounts: - - name: deployer-conf - mountPath: "/conf" - volumes: - - name: deployer-conf - configMap: - name: pgo-deployer-cm + backoffLimit: 0 + template: + metadata: + name: pgo-deploy + spec: + serviceAccountName: pgo-deployer-sa + restartPolicy: Never + containers: + - name: pgo-deploy + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.1 + imagePullPolicy: IfNotPresent + env: + - name: DEPLOY_ACTION + value: install + volumeMounts: + - name: deployer-conf + mountPath: "/conf" + volumes: + - name: deployer-conf + configMap: + name: pgo-deployer-cm diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index cec1f1bb7d..aaec8dc931 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -1,8 +1,8 @@ apiVersion: v1 kind: ServiceAccount metadata: - name: pgo-deployer-sa - namespace: pgo + name: pgo-deployer-sa + namespace: pgo --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 @@ -112,179 +112,179 @@ rules: - delete - list --- - apiVersion: v1 - kind: ConfigMap - metadata: - name: pgo-deployer-cm - namespace: pgo - data: - values.yaml: |+ - --- - archive_mode: "true" - archive_timeout: "60" - backrest_aws_s3_bucket: "" - backrest_aws_s3_endpoint: "" - backrest_aws_s3_key: "" - backrest_aws_s3_region: "" - backrest_aws_s3_secret: "" - backrest_aws_s3_uri_style: "" - backrest_aws_s3_verify_tls: "true" - backrest_port: "2022" - 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.4.1" - create_rbac: "true" - crunchy_debug: "false" - db_name: "" - db_password_age_days: "0" - db_password_length: "24" - db_port: "5432" - db_replicas: "0" - db_user: "testuser" - default_instance_memory: "128Mi" - default_pgbackrest_memory: "48Mi" - default_pgbouncer_memory: "24Mi" - delete_metrics_namespace: "false" - delete_operator_namespace: "false" - delete_watched_namespaces: "false" - disable_auto_failover: "false" - disable_fsgroup: "false" - reconcile_rbac: "true" - exporterport: "9187" - grafana_admin_password: "" - grafana_admin_username: "admin" - grafana_install: "false" - grafana_storage_access_mode: "ReadWriteOnce" - grafana_storage_class_name: "fast" - grafana_supplemental_groups: "65534" - grafana_volume_size: "1G" - metrics: "false" - metrics_namespace: "pgo" - namespace: "pgo" - namespace_mode: "dynamic" - pgbadgerport: "10000" - pgo_add_os_ca_store: "false" - pgo_admin_password: "examplepassword" - pgo_admin_perms: "*" - pgo_admin_role_name: "pgoadmin" - pgo_admin_username: "admin" - pgo_apiserver_port: "8443" - pgo_apiserver_url: "https://postgres-operator" - pgo_client_cert_secret: "pgo.tls" - pgo_client_container_install: "false" - pgo_client_version: "4.4.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.4.1" - pgo_installation_name: "devtest" - pgo_noauth_routes: "" - pgo_operator_namespace: "pgo" - pgo_tls_ca_store: "" - pgo_tls_no_verify: "false" - pod_anti_affinity: "preferred" - pod_anti_affinity_pgbackrest: "" - pod_anti_affinity_pgbouncer: "" - prometheus_install: "false" - prometheus_storage_access_mode: "ReadWriteOnce" - prometheus_storage_class_name: "fast" - prometheus_supplemental_groups: "65534" - prometheus_volume_size: "1G" - scheduler_timeout: "3600" - service_type: "ClusterIP" - sync_replication: "false" - backrest_storage: "hostpathstorage" - backup_storage: "hostpathstorage" - primary_storage: "hostpathstorage" - replica_storage: "hostpathstorage" - wal_storage: "" - storage1_name: "hostpathstorage" - storage1_access_mode: "ReadWriteMany" - storage1_size: "1G" - storage1_type: "create" - storage2_name: "replicastorage" - storage2_access_mode: "ReadWriteMany" - storage2_size: "1G" - storage2_type: "create" - storage3_name: "nfsstorage" - storage3_access_mode: "ReadWriteMany" - storage3_size: "1G" - storage3_type: "create" - storage3_supplemental_groups: "65534" - storage4_name: "nfsstoragered" - storage4_access_mode: "ReadWriteMany" - storage4_size: "1G" - storage4_match_labels: "crunchyzone=red" - storage4_type: "create" - storage4_supplemental_groups: "65534" - storage5_name: "storageos" - storage5_access_mode: "ReadWriteOnce" - storage5_size: "5Gi" - storage5_type: "dynamic" - storage5_class: "fast" - storage6_name: "primarysite" - storage6_access_mode: "ReadWriteOnce" - storage6_size: "4G" - storage6_type: "dynamic" - storage6_class: "primarysite" - storage7_name: "alternatesite" - storage7_access_mode: "ReadWriteOnce" - storage7_size: "4G" - storage7_type: "dynamic" - storage7_class: "alternatesite" - storage8_name: "gce" - storage8_access_mode: "ReadWriteOnce" - storage8_size: "300M" - storage8_type: "dynamic" - storage8_class: "standard" - storage9_name: "rook" - storage9_access_mode: "ReadWriteOnce" - storage9_size: "1Gi" - storage9_type: "dynamic" - storage9_class: "rook-ceph-block" +apiVersion: v1 +kind: ConfigMap +metadata: + name: pgo-deployer-cm + namespace: pgo +data: + values.yaml: |+ + --- + archive_mode: "true" + archive_timeout: "60" + backrest_aws_s3_bucket: "" + backrest_aws_s3_endpoint: "" + backrest_aws_s3_key: "" + backrest_aws_s3_region: "" + backrest_aws_s3_secret: "" + backrest_aws_s3_uri_style: "" + backrest_aws_s3_verify_tls: "true" + backrest_port: "2022" + 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.4.1" + create_rbac: "true" + crunchy_debug: "false" + db_name: "" + db_password_age_days: "0" + db_password_length: "24" + db_port: "5432" + db_replicas: "0" + db_user: "testuser" + default_instance_memory: "128Mi" + default_pgbackrest_memory: "48Mi" + default_pgbouncer_memory: "24Mi" + delete_metrics_namespace: "false" + delete_operator_namespace: "false" + delete_watched_namespaces: "false" + disable_auto_failover: "false" + disable_fsgroup: "false" + reconcile_rbac: "true" + exporterport: "9187" + grafana_admin_password: "" + grafana_admin_username: "admin" + grafana_install: "false" + grafana_storage_access_mode: "ReadWriteOnce" + grafana_storage_class_name: "fast" + grafana_supplemental_groups: "65534" + grafana_volume_size: "1G" + metrics: "false" + metrics_namespace: "pgo" + namespace: "pgo" + namespace_mode: "dynamic" + pgbadgerport: "10000" + pgo_add_os_ca_store: "false" + pgo_admin_password: "examplepassword" + pgo_admin_perms: "*" + pgo_admin_role_name: "pgoadmin" + pgo_admin_username: "admin" + pgo_apiserver_port: "8443" + pgo_apiserver_url: "https://postgres-operator" + pgo_client_cert_secret: "pgo.tls" + pgo_client_container_install: "false" + pgo_client_version: "4.4.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.4.1" + pgo_installation_name: "devtest" + pgo_noauth_routes: "" + pgo_operator_namespace: "pgo" + pgo_tls_ca_store: "" + pgo_tls_no_verify: "false" + pod_anti_affinity: "preferred" + pod_anti_affinity_pgbackrest: "" + pod_anti_affinity_pgbouncer: "" + prometheus_install: "false" + prometheus_storage_access_mode: "ReadWriteOnce" + prometheus_storage_class_name: "fast" + prometheus_supplemental_groups: "65534" + prometheus_volume_size: "1G" + scheduler_timeout: "3600" + service_type: "ClusterIP" + sync_replication: "false" + backrest_storage: "hostpathstorage" + backup_storage: "hostpathstorage" + primary_storage: "hostpathstorage" + replica_storage: "hostpathstorage" + wal_storage: "" + storage1_name: "hostpathstorage" + storage1_access_mode: "ReadWriteMany" + storage1_size: "1G" + storage1_type: "create" + storage2_name: "replicastorage" + storage2_access_mode: "ReadWriteMany" + storage2_size: "1G" + storage2_type: "create" + storage3_name: "nfsstorage" + storage3_access_mode: "ReadWriteMany" + storage3_size: "1G" + storage3_type: "create" + storage3_supplemental_groups: "65534" + storage4_name: "nfsstoragered" + storage4_access_mode: "ReadWriteMany" + storage4_size: "1G" + storage4_match_labels: "crunchyzone=red" + storage4_type: "create" + storage4_supplemental_groups: "65534" + storage5_name: "storageos" + storage5_access_mode: "ReadWriteOnce" + storage5_size: "5Gi" + storage5_type: "dynamic" + storage5_class: "fast" + storage6_name: "primarysite" + storage6_access_mode: "ReadWriteOnce" + storage6_size: "4G" + storage6_type: "dynamic" + storage6_class: "primarysite" + storage7_name: "alternatesite" + storage7_access_mode: "ReadWriteOnce" + storage7_size: "4G" + storage7_type: "dynamic" + storage7_class: "alternatesite" + storage8_name: "gce" + storage8_access_mode: "ReadWriteOnce" + storage8_size: "300M" + storage8_type: "dynamic" + storage8_class: "standard" + storage9_name: "rook" + storage9_access_mode: "ReadWriteOnce" + storage9_size: "1Gi" + storage9_type: "dynamic" + storage9_class: "rook-ceph-block" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: - name: pgo-deployer-crb + name: pgo-deployer-crb roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: pgo-deployer-cr + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: pgo-deployer-cr subjects: -- kind: ServiceAccount - name: pgo-deployer-sa - namespace: pgo + - kind: ServiceAccount + name: pgo-deployer-sa + namespace: pgo --- apiVersion: batch/v1 kind: Job metadata: - name: pgo-deploy - namespace: pgo + name: pgo-deploy + namespace: pgo spec: - backoffLimit: 0 - template: - metadata: - name: pgo-deploy - spec: - serviceAccountName: pgo-deployer-sa - restartPolicy: Never - containers: - - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.1 - imagePullPolicy: IfNotPresent - env: - - name: DEPLOY_ACTION - value: install - volumeMounts: - - name: deployer-conf - mountPath: "/conf" - volumes: - - name: deployer-conf - configMap: - name: pgo-deployer-cm + backoffLimit: 0 + template: + metadata: + name: pgo-deploy + spec: + serviceAccountName: pgo-deployer-sa + restartPolicy: Never + containers: + - name: pgo-deploy + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.1 + imagePullPolicy: IfNotPresent + env: + - name: DEPLOY_ACTION + value: install + volumeMounts: + - name: deployer-conf + mountPath: "/conf" + volumes: + - name: deployer-conf + configMap: + name: pgo-deployer-cm From d653d5b224a48ff6c7f98f61e54c267227b971b4 Mon Sep 17 00:00:00 2001 From: Joseph Mckulka Date: Tue, 28 Jul 2020 21:05:00 +0000 Subject: [PATCH 18/77] updates pgo_client download url --- installers/ansible/roles/pgo-operator/vars/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installers/ansible/roles/pgo-operator/vars/main.yml b/installers/ansible/roles/pgo-operator/vars/main.yml index 5df7eae691..c613bb340b 100644 --- a/installers/ansible/roles/pgo-operator/vars/main.yml +++ b/installers/ansible/roles/pgo-operator/vars/main.yml @@ -1,3 +1,3 @@ --- -pgo_client_url: "https://github.com/CrunchyData/postgres-operator/releases/download/{{ pgo_client_version }}" +pgo_client_url: "https://github.com/CrunchyData/postgres-operator/releases/download/v{{ pgo_client_version }}" pgo_keys_dir: "{{ ansible_env.HOME }}/.pgo/{{ pgo_operator_namespace }}" From 5e4c344b83d68157b7580d8c7a04ab3c48c784a3 Mon Sep 17 00:00:00 2001 From: Joseph Mckulka Date: Mon, 27 Jul 2020 13:17:27 +0000 Subject: [PATCH 19/77] Master Config Update This update adds a master config that is used for the Ansible, Helm, and Kubectl installers. The config_sync.sh script is added to the hack directory, this script will use the ansible/values.yaml file as the master config. The values.yaml for each installer is updated to exactly match the master config. This is a small change that includes adding a link to the docs and syncing the pgo_client options. The master config and the helm installer values.yaml will be out of sync until the installers are updated with coming metrics changes. The master config still contains metrics options but those options were removed from the helm values.yaml. --- hack/config_sync.sh | 24 +++++++++++++++++++ installers/ansible/values.yaml | 6 ++++- installers/helm/postgres-operator/.helmignore | 1 + .../helm/postgres-operator/helm_template.yaml | 20 ++++++++++++++++ installers/helm/postgres-operator/values.yaml | 1 + .../kubectl/postgres-operator-ocp311.yml | 9 +++++-- installers/kubectl/postgres-operator.yml | 9 +++++-- 7 files changed, 65 insertions(+), 5 deletions(-) create mode 100755 hack/config_sync.sh create mode 100644 installers/helm/postgres-operator/.helmignore create mode 100644 installers/helm/postgres-operator/helm_template.yaml diff --git a/hack/config_sync.sh b/hack/config_sync.sh new file mode 100755 index 0000000000..d78d36275d --- /dev/null +++ b/hack/config_sync.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Copyright 2019 - 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. + +test="${PGOROOT:?Need to set PGOROOT env variable}" + +INSTALLER_DIR="$PGOROOT/installers" +MASTER_CONFIG="$PGOROOT/installers/ansible/values.yaml" + +yq write --inplace --doc 2 "$INSTALLER_DIR/kubectl/postgres-operator.yml" 'data"values.yaml"' -- "$(cat $MASTER_CONFIG)" +yq write --inplace --doc 2 "$INSTALLER_DIR/kubectl/postgres-operator-ocp311.yml" 'data"values.yaml"' -- "$(cat $MASTER_CONFIG)" + +cat "$INSTALLER_DIR/helm/postgres-operator/helm_template.yaml" "$MASTER_CONFIG" > "$INSTALLER_DIR/helm/postgres-operator/values.yaml" diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index a553a19421..8ad78425b7 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -1,4 +1,8 @@ ---- +# ===================== +# Configuration Options +# More info for these options can be found in the docs +# https://crunchydata.github.io/postgres-operator/latest/installation/configuration/ +# ===================== archive_mode: "true" archive_timeout: "60" backrest_aws_s3_bucket: "" diff --git a/installers/helm/postgres-operator/.helmignore b/installers/helm/postgres-operator/.helmignore new file mode 100644 index 0000000000..a92ca61289 --- /dev/null +++ b/installers/helm/postgres-operator/.helmignore @@ -0,0 +1 @@ +helm_template.yaml diff --git a/installers/helm/postgres-operator/helm_template.yaml b/installers/helm/postgres-operator/helm_template.yaml new file mode 100644 index 0000000000..408861e463 --- /dev/null +++ b/installers/helm/postgres-operator/helm_template.yaml @@ -0,0 +1,20 @@ +--- +# ====================== +# Installer Controls +# ====================== +fullnameOverride: "" + +# rbac: settings for deployer RBAC creation +rbac: + # rbac.create: if false RBAC resources should be in place + create: true + # rbac.useClusterAdmin: creates a ClusterRoleBinding giving cluster-admin to serviceAccount.name + useClusterAdmin: false + +# serviceAccount: settings for Service Account used by the deployer +serviceAccount: + # serviceAccount.create: Whether to create a Service Account or not + create: true + # serviceAccount.name: The name of the Service Account to create or use + name: "" + diff --git a/installers/helm/postgres-operator/values.yaml b/installers/helm/postgres-operator/values.yaml index 837b9e855a..8f77ddd52b 100644 --- a/installers/helm/postgres-operator/values.yaml +++ b/installers/helm/postgres-operator/values.yaml @@ -69,6 +69,7 @@ pgo_apiserver_port: "8443" 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.4.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 4b56b1646c..49bda7611e 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -24,8 +24,12 @@ metadata: name: pgo-deployer-cm namespace: pgo data: - values.yaml: |+ - --- + values.yaml: |- + # ===================== + # Configuration Options + # More info for these options can be found in the docs + # https://crunchydata.github.io/postgres-operator/latest/installation/configuration/ + # ===================== archive_mode: "true" archive_timeout: "60" backrest_aws_s3_bucket: "" @@ -80,6 +84,7 @@ data: 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.4.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index aaec8dc931..65f20a4ad4 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -118,8 +118,12 @@ metadata: name: pgo-deployer-cm namespace: pgo data: - values.yaml: |+ - --- + values.yaml: |- + # ===================== + # Configuration Options + # More info for these options can be found in the docs + # https://crunchydata.github.io/postgres-operator/latest/installation/configuration/ + # ===================== archive_mode: "true" archive_timeout: "60" backrest_aws_s3_bucket: "" @@ -174,6 +178,7 @@ data: 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.4.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" From e4cec699820a4814d283b60bb0e16c755140595c Mon Sep 17 00:00:00 2001 From: Joseph Mckulka <16840147+jmckulk@users.noreply.github.com> Date: Tue, 28 Jul 2020 10:45:20 -0400 Subject: [PATCH 20/77] Updates links and copyright Co-authored-by: Jonathan S. Katz --- hack/config_sync.sh | 2 +- installers/ansible/values.yaml | 2 +- installers/helm/postgres-operator/values.yaml | 2 +- installers/kubectl/postgres-operator-ocp311.yml | 2 +- installers/kubectl/postgres-operator.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hack/config_sync.sh b/hack/config_sync.sh index d78d36275d..14f7e9c811 100755 --- a/hack/config_sync.sh +++ b/hack/config_sync.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019 - 2020 Crunchy Data Solutions, Inc. +# 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 diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index 8ad78425b7..b521e0054c 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -1,7 +1,7 @@ # ===================== # Configuration Options # More info for these options can be found in the docs -# https://crunchydata.github.io/postgres-operator/latest/installation/configuration/ +# https://access.crunchydata.com/documentation/postgres-operator/latest/installation/configuration/ # ===================== archive_mode: "true" archive_timeout: "60" diff --git a/installers/helm/postgres-operator/values.yaml b/installers/helm/postgres-operator/values.yaml index 8f77ddd52b..fcc609376a 100644 --- a/installers/helm/postgres-operator/values.yaml +++ b/installers/helm/postgres-operator/values.yaml @@ -21,7 +21,7 @@ serviceAccount: # ===================== # Configuration Options # More info for these options can be found in the docs -# https://crunchydata.github.io/postgres-operator/latest/installation/configuration/ +# https://access.crunchydata.com/documentation/postgres-operator/latest/installation/configuration/ # ===================== archive_mode: "true" archive_timeout: "60" diff --git a/installers/kubectl/postgres-operator-ocp311.yml b/installers/kubectl/postgres-operator-ocp311.yml index 49bda7611e..90f396ffef 100644 --- a/installers/kubectl/postgres-operator-ocp311.yml +++ b/installers/kubectl/postgres-operator-ocp311.yml @@ -28,7 +28,7 @@ data: # ===================== # Configuration Options # More info for these options can be found in the docs - # https://crunchydata.github.io/postgres-operator/latest/installation/configuration/ + # https://access.crunchydata.com/documentation/postgres-operator/latest/installation/configuration/ # ===================== archive_mode: "true" archive_timeout: "60" diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index 65f20a4ad4..eeec9afce5 100644 --- a/installers/kubectl/postgres-operator.yml +++ b/installers/kubectl/postgres-operator.yml @@ -122,7 +122,7 @@ data: # ===================== # Configuration Options # More info for these options can be found in the docs - # https://crunchydata.github.io/postgres-operator/latest/installation/configuration/ + # https://access.crunchydata.com/documentation/postgres-operator/latest/installation/configuration/ # ===================== archive_mode: "true" archive_timeout: "60" From b736315248682c3af561053df81cd64507233b70 Mon Sep 17 00:00:00 2001 From: Joseph Mckulka Date: Wed, 16 Sep 2020 18:49:27 +0000 Subject: [PATCH 21/77] Update ansible values.yaml pgo_client_version A github url is used to download the pgo client when installing with ansible locally. In the main config update the ansible values.yaml file was updated so that the "v" in "v4.4.1" was defined in the download url. This changes updates the values.yaml to account for this change. --- installers/ansible/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index b521e0054c..cb52a0fa4c 100644 --- a/installers/ansible/values.yaml +++ b/installers/ansible/values.yaml @@ -58,7 +58,7 @@ pgo_apiserver_url: "https://postgres-operator" pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" -pgo_client_version: "v4.4.1" +pgo_client_version: "4.4.1" pgo_cluster_admin: "false" pgo_disable_eventing: "false" pgo_disable_tls: "false" From 73966b5db16d739d1a6a92875e3f82ba4db0eaf8 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Wed, 16 Sep 2020 23:45:32 +0000 Subject: [PATCH 22/77] Prevent Panic if PG Deployments Scaled Down If the primary and all replica Deployments are scaled to zero outside of the context of the PostgreSQL Operator (e.g. by using 'kubectl scale deployment --replicas=0' instead of 'pgo update cluster --shutdown') and the associated pgcluster for the Deployment(s) being scaled is not manually set to the proper "shutdown" status, then the PostgreSQL Operator could panic as it continues to attempt to synchronize Patroni/PostgreSQL configuration for the PG cluster (specifically because no pods are found for the cluster). This commit protects against a panic in this scenario by simply logging an error when no Pods are found during an attempt to sync configuration. Issue: [ch9278] --- internal/operator/config/localdb.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/internal/operator/config/localdb.go b/internal/operator/config/localdb.go index c825d0baee..f1c837169c 100644 --- a/internal/operator/config/localdb.go +++ b/internal/operator/config/localdb.go @@ -217,10 +217,10 @@ func (l *LocalDB) Update(configName string, localDBConfig LocalDBConfig) error { return nil } -// apply applies the configuration stored in the CusterConig's configMap for a -// specific database server to that server. This is done by updating the contents of that -// database server's local configuration with the configuration for that cluster stored in -// the LocalDB's configMap, and the issuing a Patroni "reload" for that specific server. +// apply applies the configuration stored in the cluster ConfigMap for a specific database server +// to that server. This is done by updating the contents of that database server's local +// configuration with the configuration for that cluster stored in the LocalDB's configMap, and +// then issuing a Patroni "reload" for that specific server. func (l *LocalDB) apply(configName string) error { clusterName := l.configMap.GetObjectMeta().GetLabels()[config.LABEL_PG_CLUSTER] @@ -243,6 +243,11 @@ func (l *LocalDB) apply(configName string) error { if err != nil { return err } + // if the pod list is empty, also return an error + if len(dbPodList.Items) == 0 { + return fmt.Errorf("no pod found for %q", clusterName) + } + dbPod := &dbPodList.Items[0] // add the config name and patroni port as params for the call to the apply & reload script From 7ea25fb70310f21c9d62bff8dcc362b10943225d Mon Sep 17 00:00:00 2001 From: andrewlecuyer <43458182+andrewlecuyer@users.noreply.github.com> Date: Thu, 24 Sep 2020 15:56:19 -0500 Subject: [PATCH 23/77] Delete WAL PVC for Replica Only on Scale Down When scaling down a replica within a PostgreSQL cluster that utilizes external PVC's for write-ahead-logs (WAL), only the WAL PVC for replica being removed is deleted, and the WAL PVC's for all other PostgreSQL instances within the cluster remain in place. Issue: [ch9338] Issue: #1915 --- pgo-rmdata/rmdata/process.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pgo-rmdata/rmdata/process.go b/pgo-rmdata/rmdata/process.go index f18430f5f6..df182db617 100644 --- a/pgo-rmdata/rmdata/process.go +++ b/pgo-rmdata/rmdata/process.go @@ -40,8 +40,8 @@ const ( tablespacePathFormat = "/tablespaces/%s/%s" // the tablespace on a replcia follows the pattern "" + walReplicaPVCPattern = "%s-wal" // the following constants define the suffixes for the various configMaps created by Patroni configConfigMapSuffix = "config" @@ -544,13 +544,16 @@ func getReplicaPVC(request Request) ([]string, error) { // ...and where the fun begins tablespaceReplicaPVCPrefix := fmt.Sprintf(tablespaceReplicaPVCPattern, request.ReplicaName) + walReplicaPVCName := fmt.Sprintf(walReplicaPVCPattern, request.ReplicaName) // iterate over the PVC list and append the tablespace PVCs for _, pvc := range pvcs.Items { pvcName := pvc.ObjectMeta.Name - // it does not start with the tablespace replica PVC pattern, continue - if !(strings.HasPrefix(pvcName, tablespaceReplicaPVCPrefix) || strings.HasSuffix(pvcName, walPVCSuffix)) { + // if it does not start with the tablespace replica PVC pattern and does not equal the WAL + // PVC pattern then continue + if !(strings.HasPrefix(pvcName, tablespaceReplicaPVCPrefix) || + pvcName == walReplicaPVCName) { continue } From 4fbd82cf444bca2bcc25c8be0a2908b45282e5fd Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 25 Sep 2020 09:24:53 -0400 Subject: [PATCH 24/77] Update platform support The PostgreSQL Operator is tested on Amazon EKS, so add said indications that we do so. Issue: #1921 --- README.md | 1 + docs/content/_index.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 5b152ce843..593ea70361 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,7 @@ The Crunchy PostgreSQL Operator is tested on the following Platforms: - Kubernetes 1.13+ - OpenShift 3.11+ - Google Kubernetes Engine (GKE), including Anthos +- Amazon EKS - VMware Enterprise PKS 1.3+ ### Storage diff --git a/docs/content/_index.md b/docs/content/_index.md index 5571714be7..a1adc57a81 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -102,6 +102,7 @@ The Crunchy PostgreSQL Operator is tested on the following Platforms: - Kubernetes 1.13+ - OpenShift 3.11+ - Google Kubernetes Engine (GKE), including Anthos +- Amazon EKS - VMware Enterprise PKS 1.3+ ## Storage From 1aaa53a84df7da5c2b74b87515cbc0006c9717e4 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 25 Sep 2020 12:58:37 -0400 Subject: [PATCH 25/77] Allow for bad replicas to be scaled down Previously, the scaledown command would only list out healthy replicas, not replicas that were in a bad state. However, these may be the exact replicas that one would want to scale down, given they are unhealthy. Issue: [ch9253] --- .../apiserver/clusterservice/scaleimpl.go | 10 +- .../apiserver/failoverservice/failoverimpl.go | 2 +- .../apiserver/restartservice/restartimpl.go | 4 +- internal/util/failover.go | 105 ++++++++++++++---- pgo/cmd/restart.go | 16 ++- pgo/cmd/scaledown.go | 12 +- 6 files changed, 112 insertions(+), 37 deletions(-) diff --git a/internal/apiserver/clusterservice/scaleimpl.go b/internal/apiserver/clusterservice/scaleimpl.go index 64d631233c..802cc61c18 100644 --- a/internal/apiserver/clusterservice/scaleimpl.go +++ b/internal/apiserver/clusterservice/scaleimpl.go @@ -216,7 +216,7 @@ func ScaleQuery(name, ns string) msgs.ScaleQueryResponse { ClusterName: name, } - replicationStatusResponse, err := util.ReplicationStatus(replicationStatusRequest, false) + replicationStatusResponse, err := util.ReplicationStatus(replicationStatusRequest, false, true) // if an error is return, log the message, and return the response if err != nil { @@ -291,10 +291,10 @@ func ScaleDown(deleteData bool, clusterName, replicaName, ns string) msgs.ScaleD return response } - // selector in the format "pg-cluster=,pg-ha-scope=" - // which will grab the primary and any/all replicas - selector := fmt.Sprintf("%s=%s,%s=%s", config.LABEL_PG_CLUSTER, clusterName, - config.LABEL_PGHA_ROLE, config.LABEL_PGHA_ROLE_REPLICA) + // selector in the format "pg-cluster=,pgo-pg-database,role!=config.LABEL_PGHA_ROLE_PRIMARY" + // which will grab all the replicas + selector := fmt.Sprintf("%s=%s,%s,%s!=%s", config.LABEL_PG_CLUSTER, clusterName, + config.LABEL_PG_DATABASE, config.LABEL_PGHA_ROLE, config.LABEL_PGHA_ROLE_PRIMARY) replicaList, err := apiserver.Clientset.CoreV1().Pods(ns).List(metav1.ListOptions{LabelSelector: selector}) if err != nil { response.Status.Code = msgs.Error diff --git a/internal/apiserver/failoverservice/failoverimpl.go b/internal/apiserver/failoverservice/failoverimpl.go index e7a2573c94..c347a024d9 100644 --- a/internal/apiserver/failoverservice/failoverimpl.go +++ b/internal/apiserver/failoverservice/failoverimpl.go @@ -137,7 +137,7 @@ func QueryFailover(name, ns string) msgs.QueryFailoverResponse { ClusterName: name, } - replicationStatusResponse, err := util.ReplicationStatus(replicationStatusRequest, false) + replicationStatusResponse, err := util.ReplicationStatus(replicationStatusRequest, false, false) // if an error is return, log the message, and return the response if err != nil { diff --git a/internal/apiserver/restartservice/restartimpl.go b/internal/apiserver/restartservice/restartimpl.go index 9b72f673a1..9da501fc2b 100644 --- a/internal/apiserver/restartservice/restartimpl.go +++ b/internal/apiserver/restartservice/restartimpl.go @@ -123,7 +123,9 @@ func QueryRestart(clusterName, namespace string) msgs.QueryRestartResponse { ClusterName: clusterName, } - replicationStatusResponse, err := util.ReplicationStatus(replicationStatusRequest, true) + // get a list of all the Pods...note that we can included "busted" pods as + // by including the primary, we're getting all of the database pods anyway. + replicationStatusResponse, err := util.ReplicationStatus(replicationStatusRequest, true, true) if err != nil { log.Error(err.Error()) resp.Status.Code = msgs.Error diff --git a/internal/util/failover.go b/internal/util/failover.go index 643407b737..78f96a8664 100644 --- a/internal/util/failover.go +++ b/internal/util/failover.go @@ -79,6 +79,14 @@ const ( // instanceReplicationInfoTypePrimaryStandby is the label used by Patroni to indicate that an // instance is indeed a primary PostgreSQL instance, specifically within a standby cluster instanceReplicationInfoTypePrimaryStandby = "Standby Leader" + // instanceRolePrimary indicates that an instance is a primary + instanceRolePrimary = "primary" + // instanceRoleReplica indicates that an instance is a replica + instanceRoleReplica = "replica" + // instanceRoleUnknown indicates taht an instance is of an unknown typ + instanceRoleUnknown = "unknown" + // instanceStatusUnavailable indicates an instance is unavailable + instanceStatusUnavailable = "unavailable" ) var ( @@ -137,20 +145,34 @@ func GetPod(clientset kubernetes.Interface, deploymentName, namespace string) (* // By default information is only returned for replicas within the cluster. However, // if primary information is also needed, the inlcudePrimary flag can set set to true // and primary information will will also be included in the ReplicationStatusResponse. -func ReplicationStatus(request ReplicationStatusRequest, includePrimary bool) (ReplicationStatusResponse, error) { +// +// Also by default we do not include any "busted" Pods, e.g. a Pod that is not +// in a happy phase. That Pod may be lacking a "role" label. From there, we zero +// out the statistics and apply an error +func ReplicationStatus(request ReplicationStatusRequest, includePrimary, includeBusted bool) (ReplicationStatusResponse, error) { response := ReplicationStatusResponse{ Instances: make([]InstanceReplicationInfo, 0), } - // First, get replica pods using selector pg-cluster=clusterName,role=replica if not including the primary, - // or pg-cluster=clusterName,pg-database if including the primary - var roleSelector string + // Build up the selector. First, create the base, which restricts to the + // current cluster + // pg-cluster=clusterName,pgo-pg-database + selector := fmt.Sprintf("%s=%s,%s", + config.LABEL_PG_CLUSTER, request.ClusterName, config.LABEL_PG_DATABASE) + + // if we are not including the primary, determine if we are including busted + // replicas or not if !includePrimary { - roleSelector = fmt.Sprintf("%s=%s", config.LABEL_PGHA_ROLE, config.LABEL_PGHA_ROLE_REPLICA) - } else { - roleSelector = config.LABEL_PG_DATABASE + if includeBusted { + // include all Pods that identify as a database, but **not** a primary + // pg-cluster=clusterName,pgo-pg-database,role!=config.LABEL_PGHA_ROLE_PRIMARY + selector += fmt.Sprintf(",%s!=%s", config.LABEL_PGHA_ROLE, config.LABEL_PGHA_ROLE_PRIMARY) + } else { + // include all Pods that identify as a database and have a replica label + // pg-cluster=clusterName,pgo-pg-database,role=replica + selector += fmt.Sprintf(",%s=%s", config.LABEL_PGHA_ROLE, config.LABEL_PGHA_ROLE_REPLICA) + } } - selector := fmt.Sprintf("%s=%s,%s", config.LABEL_PG_CLUSTER, request.ClusterName, roleSelector) log.Debugf(`searching for pods with "%s"`, selector) pods, err := request.Clientset.CoreV1().Pods(request.Namespace).List(metav1.ListOptions{LabelSelector: selector}) @@ -176,8 +198,36 @@ func ReplicationStatus(request ReplicationStatusRequest, includePrimary bool) (R // Now get the statistics about the current state of the replicas, which we // can delegate to Patroni vis-a-vis the information that it collects // We can get the statistics about the current state of the managed instance - // From executing and running a command in the first pod - pod := pods.Items[0] + // From executing and running a command in the first active pod + var pod *v1.Pod + + for _, p := range pods.Items { + if p.Status.Phase == v1.PodRunning { + pod = &p + break + } + } + + // if no active Pod can be found, we can only assume that all of the instances + // are unavailable, and we should indicate as such + if pod == nil { + for _, p := range pods.Items { + // set up the instance that will be returned + instance := InstanceReplicationInfo{ + Name: instanceInfoMap[p.Name].name, + Node: instanceInfoMap[p.Name].node, + ReplicationLag: -1, + Role: instanceRoleUnknown, + Status: instanceStatusUnavailable, + Timeline: -1, + } + + // append this newly created instance to the list that will be returned + response.Instances = append(response.Instances, instance) + } + + return response, nil + } // Execute the command that will retrieve the replica information from Patroni commandStdOut, _, err := kubeapi.ExecToPodThroughAPI( @@ -198,17 +248,25 @@ func ReplicationStatus(request ReplicationStatusRequest, includePrimary bool) (R // We need to iterate through this list to format the information for the // response for _, rawInstance := range rawInstances { - var role string + // skip the primary unless explicitly enabled - if rawInstance.Type == instanceReplicationInfoTypePrimary || - rawInstance.Type == instanceReplicationInfoTypePrimaryStandby { - if !includePrimary { - continue - } - role = "primary" - } else { - role = "replica" + if !includePrimary && (rawInstance.Type == instanceReplicationInfoTypePrimary || + rawInstance.Type == instanceReplicationInfoTypePrimaryStandby) { + continue + } + + // if this is a busted instance and we are not including it, skip + if !includeBusted && rawInstance.State == "" { + continue + } + + // determine the role of the instnace + switch rawInstance.Type { + default: + role = instanceRoleReplica + case instanceReplicationInfoTypePrimary, instanceReplicationInfoTypePrimaryStandby: + role = instanceRolePrimary } // set up the instance that will be returned @@ -219,11 +277,14 @@ func ReplicationStatus(request ReplicationStatusRequest, includePrimary bool) (R Role: role, Name: instanceInfoMap[rawInstance.PodName].name, Node: instanceInfoMap[rawInstance.PodName].node, + PendingRestart: rawInstance.PendingRestart == "*", } - // indicate whether or not the instance has a pending restart - if rawInstance.PendingRestart == "*" { - instance.PendingRestart = true + // update the instance info if the instance is busted + if rawInstance.State == "" { + instance.Status = instanceStatusUnavailable + instance.ReplicationLag = -1 + instance.Timeline = -1 } // append this newly created instance to the list that will be returned diff --git a/pgo/cmd/restart.go b/pgo/cmd/restart.go index c3274e96f2..5303466f9b 100644 --- a/pgo/cmd/restart.go +++ b/pgo/cmd/restart.go @@ -32,13 +32,13 @@ var restartCmd = &cobra.Command{ Use: "restart", Short: "Restarts the PostgrSQL database within a PostgreSQL cluster", Long: `Restarts one or more PostgreSQL databases within a PostgreSQL cluster. - + For example, to restart the primary and all replicas: pgo restart mycluster Or target a specific instance within the cluster: pgo restart mycluster --target=mycluster-abcd - + And use the 'query' flag obtain a list of all instances within the cluster: pgo restart mycluster --query`, Run: func(cmd *cobra.Command, args []string) { @@ -169,9 +169,15 @@ func queryRestart(args []string, namespace string) { log.Debugf("postgresql instance: %v", instance) - fmt.Printf("%-20s\t%-10s\t%-10s\t%-10s\t%12d %-7s\t%15t\n", - instance.Name, instance.Role, instance.Status, instance.Node, instance.ReplicationLag, "MB", - instance.PendingRestart) + if instance.ReplicationLag != -1 { + fmt.Printf("%-20s\t%-10s\t%-10s\t%-10s\t%12d %-7s\t%15t\n", + instance.Name, instance.Role, instance.Status, instance.Node, instance.ReplicationLag, "MB", + instance.PendingRestart) + } else { + fmt.Printf("%-20s\t%-10s\t%-10s\t%-10s\t%15s\t%23t\n", + instance.Name, instance.Role, instance.Status, instance.Node, "unknown", + instance.PendingRestart) + } } } } diff --git a/pgo/cmd/scaledown.go b/pgo/cmd/scaledown.go index fbea9523be..20241c3d46 100644 --- a/pgo/cmd/scaledown.go +++ b/pgo/cmd/scaledown.go @@ -120,9 +120,15 @@ func queryCluster(args []string, ns string) { log.Debugf("postgresql instance: %v", instance) - fmt.Printf("%-20s\t%-10s\t%-10s\t%12d %-7s\t%15t\n", - instance.Name, instance.Status, instance.Node, instance.ReplicationLag, "MB", - instance.PendingRestart) + if instance.ReplicationLag != -1 { + fmt.Printf("%-20s\t%-10s\t%-10s\t%12d %-7s\t%15t\n", + instance.Name, instance.Status, instance.Node, instance.ReplicationLag, "MB", + instance.PendingRestart) + } else { + fmt.Printf("%-20s\t%-10s\t%-10s\t%15s\t%23t\n", + instance.Name, instance.Status, instance.Node, "unknown", + instance.PendingRestart) + } } } } From e5eebcd355178650efff5c9273a064e179f0dbbb Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sat, 26 Sep 2020 14:33:33 -0400 Subject: [PATCH 26/77] Add a list of included components This makes it easier to identify which PostgreSQL software and extensions are included with the PostgreSQL Operator. --- README.md | 31 +++++++++++++++++++++++++++++++ docs/content/_index.md | 31 +++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/README.md b/README.md index 593ea70361..a5879f0822 100644 --- a/README.md +++ b/README.md @@ -150,6 +150,37 @@ If you have the PostgreSQL Operator installed in your environment, and are inter There is also a `pgo-client` container if you wish to deploy the client directly to your Kubernetes environment. +### Included Components + +[PostgreSQL containers](https://github.com/CrunchyData/crunchy-containers) deployed with the PostgreSQL Operator include the following components: + +- [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) + - [pgAudit](https://www.pgaudit.org/) + - [pgAudit Analyze](https://github.com/pgaudit/pgaudit_analyze) + - [set_user](https://github.com/pgaudit/set_user) +- [pgBackRest](https://pgbackrest.org/) +- [pgBouncer](http://pgbouncer.github.io/) +- [pgAdmin 4](https://www.pgadmin.org/) +- [pgMonitor](https://github.com/CrunchyData/pgmonitor) +- [Patroni](https://patroni.readthedocs.io/) +- [LLVM](https://llvm.org/) (for [JIT compilation](https://www.postgresql.org/docs/current/jit.html)) + +In addition to the above, the geospatially enhanced PostgreSQL + PostGIS container adds the following components: + +- [PostGIS](http://postgis.net/) +- [pgRouting](https://pgrouting.org/) +- [PL/R](https://github.com/postgres-plr/plr) + +Additional containers that are not directly integrated with the PostgreSQL Operator but can work alongside it include: + +- [pgPool II](https://access.crunchydata.com/documentation/crunchy-postgres-containers/latest/container-specifications/crunchy-pgpool/) +- [pg_upgrade](https://access.crunchydata.com/documentation/crunchy-postgres-containers/latest/container-specifications/crunchy-upgrade/) +- [pgBench](https://access.crunchydata.com/documentation/crunchy-postgres-containers/latest/container-specifications/crunchy-pgbench/) + +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 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: diff --git a/docs/content/_index.md b/docs/content/_index.md index a1adc57a81..a13b8c960e 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -95,6 +95,37 @@ The Crunchy PostgreSQL Operator makes it easy to get your own PostgreSQL-as-a-Se The Crunchy PostgreSQL Operator extends Kubernetes to provide a higher-level abstraction for rapid creation and management of PostgreSQL clusters. The Crunchy PostgreSQL Operator leverages a Kubernetes concept referred to as "[Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/)” to create several [custom resource definitions (CRDs)](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions) that allow for the management of PostgreSQL clusters. +# Included Components + +[PostgreSQL containers](https://github.com/CrunchyData/crunchy-containers) deployed with the PostgreSQL Operator include the following components: + +- [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) + - [pgAudit](https://www.pgaudit.org/) + - [pgAudit Analyze](https://github.com/pgaudit/pgaudit_analyze) + - [set_user](https://github.com/pgaudit/set_user) +- [pgBackRest](https://pgbackrest.org/) +- [pgBouncer](http://pgbouncer.github.io/) +- [pgAdmin 4](https://www.pgadmin.org/) +- [pgMonitor](https://github.com/CrunchyData/pgmonitor) +- [Patroni](https://patroni.readthedocs.io/) +- [LLVM](https://llvm.org/) (for [JIT compilation](https://www.postgresql.org/docs/current/jit.html)) + +In addition to the above, the geospatially enhanced PostgreSQL + PostGIS container adds the following components: + +- [PostGIS](http://postgis.net/) +- [pgRouting](https://pgrouting.org/) +- [PL/R](https://github.com/postgres-plr/plr) + +Additional containers that are not directly integrated with the PostgreSQL Operator but can work alongside it include: + +- [pgPool II](https://access.crunchydata.com/documentation/crunchy-postgres-containers/latest/container-specifications/crunchy-pgpool/) +- [pg_upgrade](https://access.crunchydata.com/documentation/crunchy-postgres-containers/latest/container-specifications/crunchy-upgrade/) +- [pgBench](https://access.crunchydata.com/documentation/crunchy-postgres-containers/latest/container-specifications/crunchy-pgbench/) + +For more information about which versions of the PostgreSQL Operator include which components, please visit the [compatibility]({{< relref "configuration/compatibility.md" >}}) section of the documentation. + # Supported Platforms The Crunchy PostgreSQL Operator is tested on the following Platforms: From 84cf2b26a0395a7d6c0ebc132fc099ee3f912a90 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Wed, 30 Sep 2020 14:02:41 +0000 Subject: [PATCH 27/77] Proper Deletion Behavior for Logical Backup PVCs Logical backup PVCs are now properly identified when rmdata is run. This ensures any PVCs for logical backups are properly preserved or deleted depending on the specific settings specified when deleting a cluster. For instance, if '--keep-data' only is specified, then the logical backups will now be deleted. Additionally, if '--keep-backups' is specified, then the logical backup PVCs will now be preserved. This is specifically accomplished by now matching on a prefix for the name of any logical backup PVCs (prefix 'backup--pgdump'), instead of matching on the full name of the PVC (which includes the name of the database name used for the logical backup, e.g. 'backup--pgdump--pvc', and therefore could vary). Issue: [ch9381] --- pgo-rmdata/rmdata/process.go | 39 +++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/pgo-rmdata/rmdata/process.go b/pgo-rmdata/rmdata/process.go index df182db617..361dbef021 100644 --- a/pgo-rmdata/rmdata/process.go +++ b/pgo-rmdata/rmdata/process.go @@ -35,7 +35,7 @@ const ( MAX_TRIES = 16 pgBackRestPathFormat = "/backrestrepo/%s" pgBackRestRepoPVC = "%s-pgbr-repo" - pgDumpPVC = "backup-%s-pgdump-pvc" + pgDumpPVCPrefix = "backup-%s-pgdump" pgDataPathFormat = "/pgdata/%s" tablespacePathFormat = "/tablespaces/%s/%s" // the tablespace on a replcia follows the pattern " Date: Tue, 13 Oct 2020 08:31:04 -0500 Subject: [PATCH 28/77] 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 d74c9f5210416c723b74d376d347f318ab3cfdbd Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Wed, 21 Oct 2020 15:46:03 +0000 Subject: [PATCH 29/77] Proper Detection of Previously Processed pgcluster The pgcluster controller has been updated to properly detect whether or not a specific pgcluster custom resource was previously processed via the controller's 'onAdd' function. Specifically, the 'onAdd' function will now no longer place a pgcluster in a 'processed' status and attempt to call 'AddClusterBase' if it determines that the a previous call to 'AddClusterBase' completed successfully. This is indicated by either a value of 'completed' in the /spec/status' field of the pgcluster (which indicates that a previous call to 'AddClusterBase' successfully created the resources needed to bootstrap the PG cluster), or a value of 'pgcluster Initialized' in the '/status/state' field (which indicates that the cluster has been fully initialized). In addition, 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 | 33 ++++++------------- internal/operator/cluster/cluster.go | 7 ---- 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/internal/controller/pgcluster/pgclustercontroller.go b/internal/controller/pgcluster/pgclustercontroller.go index 5a3e2f9c33..018cb3cf75 100644 --- a/internal/controller/pgcluster/pgclustercontroller.go +++ b/internal/controller/pgcluster/pgclustercontroller.go @@ -30,7 +30,6 @@ import ( informers "github.com/crunchydata/postgres-operator/pkg/generated/informers/externalversions/crunchydata.com/v1" log "github.com/sirupsen/logrus" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" @@ -49,22 +48,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 @@ -107,17 +95,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.PgclusterClientset.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 := crv1.Pgcluster{} found, err := kubeapi.Getpgcluster(c.PgclusterClient, &cluster, keyResourceName, keyNamespace) @@ -126,6 +103,16 @@ 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 || + 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 + } addIdentifier(&cluster) diff --git a/internal/operator/cluster/cluster.go b/internal/operator/cluster/cluster.go index f5cf72bdbc..6249ad7337 100644 --- a/internal/operator/cluster/cluster.go +++ b/internal/operator/cluster/cluster.go @@ -67,13 +67,6 @@ const ( func AddClusterBase(clientset kubernetes.Interface, client *rest.RESTClient, cl *crv1.Pgcluster, namespace string) { var err error - if cl.Spec.Status == crv1.CompletedStatus { - errorMsg := "crv1 pgcluster " + cl.Spec.ClusterName + " is already marked complete, will not recreate" - log.Warn(errorMsg) - publishClusterCreateFailure(cl, errorMsg) - return - } - dataVolume, walVolume, tablespaceVolumes, err := pvc.CreateMissingPostgreSQLVolumes( clientset, cl, namespace, cl.Annotations[config.ANNOTATION_CURRENT_PRIMARY], cl.Spec.PrimaryStorage) if err != nil { From 0f0140e9e37e705869dc8a87c5b4f645aa7e3c42 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 30/77] 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 d41428478e..e19389016e 100644 --- a/internal/apiserver/backrestservice/backrestimpl.go +++ b/internal/apiserver/backrestservice/backrestimpl.go @@ -203,9 +203,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) @@ -214,6 +214,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) @@ -266,30 +274,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" @@ -310,25 +297,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 } @@ -356,6 +324,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 @@ -385,7 +379,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 b65beb021bfff214e0a74669780d6571cffff4b7 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 31/77] 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 8013b38e21..7356c73ded 100644 --- a/internal/operator/cluster/pgadmin.go +++ b/internal/operator/cluster/pgadmin.go @@ -354,7 +354,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 9e5065daa3..1f5f6f33b2 100644 --- a/internal/operator/cluster/pgbouncer.go +++ b/internal/operator/cluster/pgbouncer.go @@ -459,7 +459,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, PGBouncerSecret: util.GeneratePgBouncerSecretName(cluster.Name), ContainerResources: operator.GetResourcesJSON(cluster.Spec.PgBouncer.Resources, diff --git a/internal/operator/clusterutilities.go b/internal/operator/clusterutilities.go index d11ed1a1c1..b606f10465 100644 --- a/internal/operator/clusterutilities.go +++ b/internal/operator/clusterutilities.go @@ -285,7 +285,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 40991290d8..e25334d71f 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "math/rand" + "regexp" "strings" "time" @@ -44,6 +45,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()) @@ -208,6 +213,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 29686f4eefb8bed3d767eeb64230c32ab8b8ea33 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 26 Oct 2020 18:04:52 -0400 Subject: [PATCH 32/77] 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 | 32 +++++++++++++++++++------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/internal/operator/cluster/pgbouncer.go b/internal/operator/cluster/pgbouncer.go index 1f5f6f33b2..c860ecb0e4 100644 --- a/internal/operator/cluster/pgbouncer.go +++ b/internal/operator/cluster/pgbouncer.go @@ -154,15 +154,30 @@ func AddPgbouncer(clientset kubernetes.Interface, restclient *rest.RESTClient, r } } - // 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 { @@ -218,7 +233,8 @@ func DeletePgbouncer(clientset kubernetes.Interface, restclient *rest.RESTClient } // 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 a79682a7e092d128691962b60dac78c3bdd39cd2 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 33/77] 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 c8202cc000f67dc5fe10561adb61afcc1dc2bd24 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 15 Nov 2020 14:14:49 -0500 Subject: [PATCH 34/77] 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 2524a33b47..e201d313d0 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -488,7 +488,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 5530c23c92df287c0dbc034b933a7b91acf457ae Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 17 Nov 2020 21:48:16 -0500 Subject: [PATCH 35/77] 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 87f08b2878..4c3ed07564 100644 --- a/docs/content/pgo-client/common-tasks.md +++ b/docs/content/pgo-client/common-tasks.md @@ -1314,6 +1314,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 4556643abe27d773246eac1a79d60a0fcb71a1ae Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 19 Nov 2020 12:24:12 -0500 Subject: [PATCH 36/77] Ensure compilation of Postgres Operator The backpatch described in 29686f4e failed to remove one particular block, which caused a compilation error. --- internal/operator/cluster/pgbouncer.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/internal/operator/cluster/pgbouncer.go b/internal/operator/cluster/pgbouncer.go index c860ecb0e4..74b0d0d437 100644 --- a/internal/operator/cluster/pgbouncer.go +++ b/internal/operator/cluster/pgbouncer.go @@ -185,11 +185,6 @@ func AddPgbouncer(clientset kubernetes.Interface, restclient *rest.RESTClient, r } } - // next, create the secret that pgbouncer will use to be properly configure - if err := createPgbouncerSecret(clientset, cluster, pgBouncerPassword); err != nil { - return err - } - // next, create the pgBouncer deployment if err := createPgBouncerDeployment(clientset, cluster); err != nil { return err From cfe788c5be18b23ff9a8a6acc102e2fd9d2fa067 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 20 Nov 2020 13:35:37 -0500 Subject: [PATCH 37/77] 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 1cdefdda77..12a0b757cf 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 bae37f6f8f38c5d97f6eaf94330eeeb18bc95018 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 23 Nov 2020 17:49:55 -0500 Subject: [PATCH 38/77] Bump v4.4.2 --- Makefile | 4 +-- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 +-- docs/config.toml | 4 +-- docs/content/Configuration/compatibility.md | 6 ++++ docs/content/releases/4.4.2.md | 36 +++++++++++++++++++ examples/create-by-resource/fromcrd.json | 6 ++-- examples/envs.sh | 2 +- examples/load/sample-json-load-config-sc.yaml | 2 +- examples/load/sample-json-load-config.yaml | 2 +- examples/load/sample-load-config.yaml | 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/inventory.ini | 6 ++-- installers/helm/metrics/Chart.yaml | 2 +- installers/helm/metrics/values.yaml | 6 ++-- installers/helm/postgres-operator/Chart.yaml | 2 +- installers/helm/postgres-operator/values.yaml | 6 ++-- installers/kubectl/client-setup.sh | 2 +- .../kubectl/postgres-operator-ocp311.yml | 8 ++--- installers/kubectl/postgres-operator.yml | 8 ++--- installers/olm/Makefile | 4 +-- 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 +- 30 files changed, 104 insertions(+), 62 deletions(-) create mode 100644 docs/content/releases/4.4.2.md diff --git a/Makefile b/Makefile index e2b75516e6..d92ee0e944 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.4.1 +PGO_VERSION ?= 4.4.2 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.4 +PGO_PG_FULLVERSION ?= 12.5 PGO_BACKREST_VERSION ?= 2.27 RELTMPDIR=/tmp/release.$(PGO_VERSION) diff --git a/README.md b/README.md index a5879f0822..2e4bbb5cce 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,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.4.1/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.4.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 8043d20317..68ccd9c3cd 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.4.1 +CCP_IMAGE_TAG=centos7-12.5-4.4.2 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index 576b7aaf0c..2c60f86968 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.4.1 + CCPImageTag: centos7-12.5-4.4.2 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -81,4 +81,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos7-4.4.1 + PGOImageTag: centos7-4.4.2 diff --git a/docs/config.toml b/docs/config.toml index b233d0eeaf..3e34daf864 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,8 +25,8 @@ 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.4.1" -postgresVersion = "12.4" +operatorVersion = "4.4.2" +postgresVersion = "12.5" postgisVersion = "3.0" centosBase = "centos7" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index 12fe2de0c1..669f94aceb 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.4.2 | 4.4.2 | 12.5 | 2.27 | +|||11.10|2.27| +|||10.15|2.27| +|||9.6.20|2.27| +|||9.5.24|2.27| +|||| | 4.4.1 | 4.4.1 | 12.4 | 2.27 | |||11.9|2.27| |||10.14|2.27| diff --git a/docs/content/releases/4.4.2.md b/docs/content/releases/4.4.2.md new file mode 100644 index 0000000000..06eb97de49 --- /dev/null +++ b/docs/content/releases/4.4.2.md @@ -0,0 +1,36 @@ +--- +title: "4.4.2" +date: +draft: false +weight: 78 +--- + +Crunchy Data announces the release of the [PostgreSQL Operator](https://www.crunchydata.com/products/crunchy-postgresql-operator/) 4.4.1 on November 25, 2020. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +The PostgreSQL Operator 4.4.2 release includes the following software versions upgrades: + +- The PostgreSQL containers now use versions 12.5, 11.10, 10.15, 9.6.20, and 9.5.24 + +PostgreSQL Operator is tested with Kubernetes 1.13 - 1.18, OpenShift 3.11+, OpenShift 4.3+, Google Kubernetes Engine (GKE), and VMware Enterprise PKS 1.3+. + +## Fixes + +- 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. +- The `pgo scaledown` now allows for the removal of replicas that are not actively running. +- The `pgo scaledown --query` command now shows replicas that may not be in an active state. +- 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). +- pgBackRest commands can now be executed even if there are multiple pgBackRest Pods available in a Deployment, so long as there is only one "running" pgBackRest Pod. Reported by Rubin Simons (@rubin55). +- Ensure pgBackRest S3 Secrets can be upgraded from PostgreSQL Operator 4.3. +- Ensure pgBouncer Port is derived from the cluster's port, not the Operator configuration defaults. +- External WAL PVCs are only removed for the replica they are targeted for on a scaledown. Reported by (@dakine1111). +- 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). +- When deleting a cluster with the `--keep-backups` flag, ensure that backups that were created via `--backup-type=pgdump` are retained. +- Return an error if a cluster is not found when using `pgo df` instead of timing out. +- The `operator` container will no longer panic if all Deployments are scaled to `0` without using the `pgo update cluster --shutdown` command. +- 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/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index 14f1a2c033..29d4ca4341 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.4.1", + "pgo-version": "4.4.2", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos7-12.4-4.4.1", + "ccpimagetag": "centos7-12.5-4.4.2", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy_collect": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.4.1", + "pgo-version": "4.4.2", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index 4d439d682f..e6bb782306 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -20,7 +20,7 @@ export PGOROOT=$GOPATH/src/github.com/crunchydata/postgres-operator # 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.4.1 +export PGO_VERSION=4.4.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/load/sample-json-load-config-sc.yaml b/examples/load/sample-json-load-config-sc.yaml index 20e5c111ce..39c3e9d82b 100644 --- a/examples/load/sample-json-load-config-sc.yaml +++ b/examples/load/sample-json-load-config-sc.yaml @@ -1,5 +1,5 @@ PGOImagePrefix: registry.developers.crunchydata.com/crunchydata -PGOImageTag: centos7-4.4.1 +PGOImageTag: centos7-4.4.2 DbDatabase: userdb DbUser: postgres DbPort: 5432 diff --git a/examples/load/sample-json-load-config.yaml b/examples/load/sample-json-load-config.yaml index 24268fda1a..38f36497c3 100644 --- a/examples/load/sample-json-load-config.yaml +++ b/examples/load/sample-json-load-config.yaml @@ -1,5 +1,5 @@ PGOImagePrefix: registry.developers.crunchydata.com/crunchydata -PGOImageTag: centos7-4.4.1 +PGOImageTag: centos7-4.4.2 DbDatabase: userdb DbUser: postgres DbPort: 5432 diff --git a/examples/load/sample-load-config.yaml b/examples/load/sample-load-config.yaml index 1b75a5df4a..3e4700e850 100644 --- a/examples/load/sample-load-config.yaml +++ b/examples/load/sample-load-config.yaml @@ -1,5 +1,5 @@ PGOImagePrefix: registry.developers.crunchydata.com/crunchydata -PGOImageTag: centos7-4.4.1 +PGOImageTag: centos7-4.4.2 DbDatabase: userdb DbUser: postgres DbPort: 5432 diff --git a/installers/ansible/README.md b/installers/ansible/README.md index 4518aa3a52..dc62f5d4c5 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.4.1 +Latest Release: 4.4.2 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index cb52a0fa4c..53e8b9b577 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.4.1" +ccp_image_tag: "centos7-12.5-4.4.2" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -58,14 +58,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.4.1" +pgo_client_version: "4.4.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.4.1" +pgo_image_tag: "centos7-4.4.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 a9591aa02e..232c4e06ee 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.4.1 +PGO_VERSION ?= 4.4.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 0f29b9af13..cdde5b8892 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.4.1 + export PGO_VERSION=4.4.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/inventory.ini b/installers/gcp-marketplace/inventory.ini index ab8dac2486..023e5229c1 100644 --- a/installers/gcp-marketplace/inventory.ini +++ b/installers/gcp-marketplace/inventory.ini @@ -16,11 +16,11 @@ pgo_operator_namespace='${OPERATOR_NAMESPACE}' namespace='' ccp_image_prefix='registry.developers.crunchydata.com/crunchydata' -ccp_image_tag='centos7-12.4-4.4.1' +ccp_image_tag='centos7-12.5-4.4.2' ccp_image_pull_secret='' ccp_image_pull_secret_manifest='' pgo_image_prefix='registry.developers.crunchydata.com/crunchydata' -pgo_image_tag='centos7-4.4.1' +pgo_image_tag='centos7-4.4.2' pgo_image='${OPERATOR_IMAGE}' pgo_event_image='${OPERATOR_IMAGE_EVENT}' @@ -29,7 +29,7 @@ pgo_scheduler_image='${OPERATOR_IMAGE_SCHEDULER}' # PGO Client Install pgo_client_install='false' -pgo_client_version='v4.4.1' +pgo_client_version='v4.4.2' badger='false' metrics='${POSTGRES_METRICS}' diff --git a/installers/helm/metrics/Chart.yaml b/installers/helm/metrics/Chart.yaml index fbb7a92719..aa1a37f1bd 100644 --- a/installers/helm/metrics/Chart.yaml +++ b/installers/helm/metrics/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-metrics description: Metrics Install for Crunchy PostgreSQL Operator type: application version: 0.1.0 -appVersion: 4.4.1 +appVersion: 4.4.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/helm/metrics/values.yaml b/installers/helm/metrics/values.yaml index 9a47f3baf1..b3118d7858 100644 --- a/installers/helm/metrics/values.yaml +++ b/installers/helm/metrics/values.yaml @@ -29,7 +29,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.4.1" +ccp_image_tag: "centos7-12.5-4.4.2" create_rbac: "true" crunchy_debug: "false" db_password_length: "24" @@ -56,11 +56,11 @@ pgo_admin_password: "examplepassword" pgo_admin_perms: "*" pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" -pgo_client_version: "4.4.1" +pgo_client_version: "4.4.2" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos7-4.4.1" +pgo_image_tag: "centos7-4.4.2" pgo_installation_name: "devtest" pgo_operator_namespace: "pgo" prometheus_install: "false" diff --git a/installers/helm/postgres-operator/Chart.yaml b/installers/helm/postgres-operator/Chart.yaml index d2a005c5bc..6a388a3de6 100644 --- a/installers/helm/postgres-operator/Chart.yaml +++ b/installers/helm/postgres-operator/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.4.1 +appVersion: 4.4.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/postgres-operator/values.yaml b/installers/helm/postgres-operator/values.yaml index fcc609376a..988b9e6f80 100644 --- a/installers/helm/postgres-operator/values.yaml +++ b/installers/helm/postgres-operator/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.4.1" +ccp_image_tag: "centos7-12.5-4.4.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.4.1" +pgo_client_version: "4.4.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.4.1" +pgo_image_tag: "centos7-4.4.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 4ae6f3f0f9..1fd3c85c31 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.4.1}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.4.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 90f396ffef..8b80b430aa 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.4.1" + ccp_image_tag: "centos7-12.5-4.4.2" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -85,14 +85,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.4.1" + pgo_client_version: "4.4.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.4.1" + pgo_image_tag: "centos7-4.4.2" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -174,7 +174,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.1 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.2 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index eeec9afce5..dd65c40804 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.4.1" + ccp_image_tag: "centos7-12.5-4.4.2" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -179,14 +179,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.4.1" + pgo_client_version: "4.4.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.4.1" + pgo_image_tag: "centos7-4.4.2" 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:centos7-4.4.1 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.2 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index e6881c21c2..0ed6d4cdce 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.13.0 @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.14.2 PGO_BASEOS ?= centos7 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.4.1 +PGO_VERSION ?= 4.4.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..2527772df3 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: centos7-12.5-4.5.0", "crunchy-postgres-ha", - "centos7-12.4-4.5.0", - "centos7-12.4-4.5.0", + "centos7-12.5-4.5.0", + "centos7-12.5-4.5.0", }, { - "image: crunchy-postgres-gis-ha, tag: centos7-12.4-3.0-4.5.0", + "image: crunchy-postgres-gis-ha, tag: centos7-12.5-3.0-4.5.0", "crunchy-postgres-gis-ha", - "centos7-12.4-3.0-4.5.0", - "centos7-12.4-4.5.0", + "centos7-12.5-3.0-4.5.0", + "centos7-12.5-4.5.0", }, { - "image: crunchy-postgres-ha, tag: centos7-12.4-4.5.0-beta.1", + "image: crunchy-postgres-ha, tag: centos7-12.5-4.5.0-beta.1", "crunchy-postgres-ha", - "centos7-12.4-4.5.0-beta.1", - "centos7-12.4-4.5.0-beta.1", + "centos7-12.5-4.5.0-beta.1", + "centos7-12.5-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: centos7-12.5-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", + "centos7-12.5-3.0-4.5.0-beta.2", + "centos7-12.5-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 63b21d1c91..2992589526 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.4.1", + '{"ClientVersion":"4.4.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.4.1", + '{"ClientVersion":"4.4.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.4.1", + '{"ClientVersion":"4.4.2", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.4.1 + Version: 4.4.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 5c7ba74143..fccc1ff341 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.4.1" +const PGO_VERSION = "4.4.2" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index 34735fc700..3790f3ee02 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.4.1" +The specific release number of the container. For example, Release="4.4.2" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index 6fd906b198..bd993a3b86 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.4.1" +The specific release number of the container. For example, Release="4.4.2" From fad89605ce7bf1355595f57c72f5e7011dc0d74d Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 27 Nov 2020 11:54:40 -0500 Subject: [PATCH 39/77] 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 d18b71eb99..c28942863a 100644 --- a/internal/operator/cluster/clusterlogic.go +++ b/internal/operator/cluster/clusterlogic.go @@ -624,7 +624,10 @@ func ShutdownCluster(clientset kubernetes.Interface, restclient *rest.RESTClient 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 0748231ced90e3ff1b09d988d3ea55df2e8e1da9 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 40/77] 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 361dbef021..66b2111a48 100644 --- a/pgo-rmdata/rmdata/process.go +++ b/pgo-rmdata/rmdata/process.go @@ -52,15 +52,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 9726ab7be1f7373ebc8ba78e8b4897bffa328821 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 41/77] 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 17a8b368f8..2a9404bab2 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.PodClient, c.PodClientset, cluster.Name, newPod.Namespace); err != nil { log.Error(err) From 1a62e737458d640c060cd257836461ebc6085b6d Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 8 Dec 2020 22:19:40 -0500 Subject: [PATCH 42/77] 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 08e104dc8c..e42ce9aa13 100644 --- a/internal/apiserver/dfservice/dfimpl.go +++ b/internal/apiserver/dfservice/dfimpl.go @@ -133,7 +133,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 7c84fba12f327467ca45aeb63763d54d6c178986 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 8 Dec 2020 22:41:06 -0500 Subject: [PATCH 43/77] 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 ad632867de..222fcba5fc 100644 --- a/internal/controller/job/bootstraphandler.go +++ b/internal/controller/job/bootstraphandler.go @@ -68,7 +68,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); err != nil { @@ -82,6 +82,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.JobClientset.BatchV1().Jobs(namespace).Delete(job.Name, + &metav1.DeleteOptions{PropagationPolicy: &deletePropagation}) } return nil From 82761ea24b21b83580fe98f18597e7e95e57db64 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 10 Dec 2020 12:38:36 -0500 Subject: [PATCH 44/77] 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 e201d313d0..00f4abf430 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" ) @@ -1933,10 +1934,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 } @@ -1956,9 +1962,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 758fedda80a23e704fcb6168876ff77878de7f02 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 16 Dec 2020 09:43:40 -0500 Subject: [PATCH 45/77] 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 e42ce9aa13..1d18742f29 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" ) @@ -136,7 +138,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 8ab663321e73551b5388361c0d6476f75d721aa4 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 18 Dec 2020 16:36:12 -0500 Subject: [PATCH 46/77] 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 2a9404bab2..9083eb52f6 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 1e3b333ced9927c3daf75b40f91492ddb353e99f Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 20 Dec 2020 11:37:57 -0500 Subject: [PATCH 47/77] 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 | 13 +++++++++---- pgo/cmd/upgrade.go | 10 ++++------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/content/pgo-client/reference/pgo_upgrade.md b/docs/content/pgo-client/reference/pgo_upgrade.md index 8490a8d13e..7225e6be02 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. @@ -23,12 +23,13 @@ pgo upgrade [flags] ``` -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 @@ -42,4 +43,8 @@ pgo upgrade [flags] * [pgo](/pgo-client/reference/pgo/) - The pgo command line interface. +<<<<<<< HEAD ###### Auto generated by spf13/cobra on 2-Jul-2020 +======= +###### Auto generated by spf13/cobra on 20-Dec-2020 +>>>>>>> c8c29c3d0... Add missing `--no-prompt` flag to `pgo upgrade` diff --git a/pgo/cmd/upgrade.go b/pgo/cmd/upgrade.go index e6672f1aa8..a095dcde75 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,8 @@ 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().BoolVar(&NoPrompt, "no-prompt", false, "No command line confirmation.") } func createUpgrade(args []string, ns string) { @@ -90,7 +90,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 +103,4 @@ func createUpgrade(args []string, ns string) { fmt.Println("Error: " + response.Status.Msg) os.Exit(2) } - } From 84f65ff3f7a91dde530455962e1f4d6363e81d71 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 20 Dec 2020 12:30:26 -0500 Subject: [PATCH 48/77] 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 231dcb49e1..30a57cc5f6 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 @@ -163,8 +163,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 efc6e1947a..4a5e0952b6 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 @@ -247,8 +247,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 511bbee7a8..0cf67d3f16 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 @@ -99,8 +99,7 @@ "volumes": [{ "name": "sshd", "secret": { - "secretName": "{{.SshdSecretsName}}", - "defaultMode": 511 + "secretName": "{{.SshdSecretsName}}" } }, { "name": "backrestrepo", From 43a41e5c173063d2706d0af33c5a592d9fa6398c Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sat, 26 Dec 2020 15:14:47 -0500 Subject: [PATCH 49/77] 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 eec75dc05fc7dc203c0a9976baeda163e1728b50 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 29 Dec 2020 09:59:45 -0500 Subject: [PATCH 50/77] 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pgo-rmdata/rmdata/process.go b/pgo-rmdata/rmdata/process.go index 66b2111a48..9e0f7a65cc 100644 --- a/pgo-rmdata/rmdata/process.go +++ b/pgo-rmdata/rmdata/process.go @@ -23,7 +23,6 @@ import ( "github.com/crunchydata/postgres-operator/internal/config" "github.com/crunchydata/postgres-operator/internal/kubeapi" - "github.com/crunchydata/postgres-operator/internal/util" crv1 "github.com/crunchydata/postgres-operator/pkg/apis/crunchydata.com/v1" log "github.com/sirupsen/logrus" @@ -47,6 +46,7 @@ const ( configConfigMapSuffix = "config" leaderConfigMapSuffix = "leader" failoverConfigMapSuffix = "failover" + syncConfigMapSuffix = "sync" ) func Delete(request Request) { @@ -232,6 +232,8 @@ func removeClusterConfigmaps(request Request) { // next, the name of the general configuration settings configmap, which is // "`clusterName`-config" fmt.Sprintf("%s-%s", request.ClusterName, configConfigMapSuffix), + // next, if there is a synchronous replication configmap, clean that up + fmt.Sprintf("%s-%s", request.ClusterName, syncConfigMapSuffix), // finally, the name of the failover configmap, which is // "`clusterName`-failover" fmt.Sprintf("%s-%s", request.ClusterName, failoverConfigMapSuffix), From 28d159a0f555e28471d0c4311f2b26f1753a3f79 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sat, 2 Jan 2021 11:58:10 -0500 Subject: [PATCH 51/77] Happy New Year! Good riddance 2020, hello 2021. --- LICENSE.md | 2 +- apiserver.go | 2 +- bin/get-deps.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-load/start.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/loadservice/loadconfig.go | 2 +- internal/apiserver/loadservice/loadimpl.go | 2 +- internal/apiserver/loadservice/loadservice.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/loadhandler.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/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/pgcluster.go | 2 +- internal/kubeapi/pgpolicy.go | 2 +- internal/kubeapi/pgreplica.go | 2 +- internal/kubeapi/pgtask.go | 2 +- internal/kubeapi/pod.go | 2 +- internal/kubeapi/pointer.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/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/load.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/load.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/loadmsgs.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 +- 404 files changed, 404 insertions(+), 404 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/get-deps.sh b/bin/get-deps.sh index 8816aa3635..28bc5d4937 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/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-load/start.sh b/bin/pgo-load/start.sh index 894c65a11c..34a2d4d0e1 100755 --- a/bin/pgo-load/start.sh +++ b/bin/pgo-load/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-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 c45c4bfb8f..de30d03554 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 6c2c511aa8..49c611d059 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 68ccd9c3cd..f8b08b88db 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 3ccc0518e2..809d997ef0 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 d76c25ecdc..2bf780816a 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 b274f6fe7d..c11eb092a8 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 7d4c3fd997..add3c0d46c 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 9e8cb6d11c..83b4ab833f 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 f4c422cdb6..0fa326e7bb 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 eff0cc9700..08e429cbc4 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 12a0b757cf..f5e0cd5d58 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 14f7e9c811..06f8ec1498 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 76a02c6646..c6490a05d7 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 1fd3c85c31..b4f9e4bdb9 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 e19389016e..00280732cc 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 b01bc4b618..ddd6a58b12 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 b095f45289..5361300233 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 00f4abf430..6ff04384fa 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 802cc61c18..2d108d17ba 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 e1a0e0260f..fcc8e3c545 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 1d18742f29..b3f4ed7c3b 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 c347a024d9..afec8cabf1 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 672757a1cd..47282ca487 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/loadservice/loadconfig.go b/internal/apiserver/loadservice/loadconfig.go index c5351796d7..e5de7df536 100644 --- a/internal/apiserver/loadservice/loadconfig.go +++ b/internal/apiserver/loadservice/loadconfig.go @@ -1,7 +1,7 @@ package loadservice /* -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/loadservice/loadimpl.go b/internal/apiserver/loadservice/loadimpl.go index 0cdf723bd9..20b4632d9d 100644 --- a/internal/apiserver/loadservice/loadimpl.go +++ b/internal/apiserver/loadservice/loadimpl.go @@ -1,7 +1,7 @@ package loadservice /* -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/loadservice/loadservice.go b/internal/apiserver/loadservice/loadservice.go index 068821ea87..036dd5c66c 100644 --- a/internal/apiserver/loadservice/loadservice.go +++ b/internal/apiserver/loadservice/loadservice.go @@ -1,7 +1,7 @@ package loadservice /* -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 74204dfc80..e702a5a9d8 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 a3c0712c68..8c31c7dd34 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 8f0b17d370..5c3d00269b 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 031c559cee..df4e5dcf92 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 b78e0aa34b..bed7e1e5ee 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 35917a64c9..897d2dbff0 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 5268147602..2023feba21 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 9da501fc2b..7e67881c98 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 f9dfec42dc..0b1e1004b1 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 c98848b6c9..9774eec41c 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 92d0e1fd46..1fa60c974c 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 3dfdb40836..2e4f859b74 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 0389defcfb..d2cbd1f395 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 77c89b78e8..b0d51253a4 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 2c588183af..8af15d5a86 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 ddaa58d4cc..05bea9deac 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 21e0dc417f..ba7648c667 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 12405034b1..f09b4784f7 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 f2128e207b..f2351ddc7e 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 833adfc280..04a0e33282 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 e07068bfc2..e19744b614 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 ff45f17048..eae945775c 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 ce0df82510..31f956b3e7 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 1c1cf51802..173de9b734 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 222fcba5fc..35af805f2c 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 2e2dffcb6b..4684f2c066 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/loadhandler.go b/internal/controller/job/loadhandler.go index d83a643c4a..47183ee240 100644 --- a/internal/controller/job/loadhandler.go +++ b/internal/controller/job/loadhandler.go @@ -6,7 +6,7 @@ import ( ) /* -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 9025426491..c723cf407f 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 dbf56f89a1..cc885f1733 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 bfc7874a11..6187d015e1 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 5991c3ccd7..e1822bbbaa 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 4e960e1cd5..d7865722a5 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 018cb3cf75..56d059e334 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 ba699c579c..a6ee5c7f29 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 43ae0878fe..7325d714b0 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/pgtaskcontroller.go b/internal/controller/pgtask/pgtaskcontroller.go index 979cc64f75..ceca886899 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 5335653bce..802e1fae3f 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 0ae1342188..92cf7ae085 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 9083eb52f6..fd3feea7c5 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 64a544c3bc..f91a8cfb1f 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/pgcluster.go b/internal/kubeapi/pgcluster.go index 983138fdd4..5d554ed747 100644 --- a/internal/kubeapi/pgcluster.go +++ b/internal/kubeapi/pgcluster.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/pgpolicy.go b/internal/kubeapi/pgpolicy.go index 5d9bc30029..f2d92c679d 100644 --- a/internal/kubeapi/pgpolicy.go +++ b/internal/kubeapi/pgpolicy.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/pgreplica.go b/internal/kubeapi/pgreplica.go index 62095f4f78..c4e4c6c474 100644 --- a/internal/kubeapi/pgreplica.go +++ b/internal/kubeapi/pgreplica.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/pgtask.go b/internal/kubeapi/pgtask.go index d5468495fa..7e06f91028 100644 --- a/internal/kubeapi/pgtask.go +++ b/internal/kubeapi/pgtask.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/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/pointer.go b/internal/kubeapi/pointer.go index 21109e61f1..dbf5d6db27 100644 --- a/internal/kubeapi/pointer.go +++ b/internal/kubeapi/pointer.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 006ee81d03..e4cc827fad 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 8893d2e416..8e003f020c 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 882a249e26..9318e7bb98 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 1ec57f0ee5..de770b84cd 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 7014c26b86..fd98071eb9 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 6249ad7337..f283f6b4ad 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 c28942863a..9fb6320436 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 f3dfc17a2b..cb77f66bd3 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 a25c90802c..97a65e9665 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 7356c73ded..31a421dbb8 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 74b0d0d437..bde5efc7ce 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 224431df40..0515cdafef 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 fad958ea4e..991e02c5ed 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 b606f10465..df2160013f 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 499719343e..2b9bf8e427 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 f1c837169c..8c6391ee4b 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 034999469c..2bcb53491f 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/pgdump/dump.go b/internal/operator/pgdump/dump.go index 8aa2ae1094..b25327e4d9 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 93b362b1d2..897ae5c931 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 550e681b9c..086bdbe740 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 875abef328..9664dec8d5 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 1b5b51ad52..71b8808fe6 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 f7c74f8483..070c12e46f 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 91c7cfec95..ed81d27cad 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 78f96a8664..98d34fea66 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 a31ecd3a9c..96d6c23bb5 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 867c5706aa..633398a0a8 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 e25334d71f..db8bdb8852 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 aeb688be31..882def5a1e 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 c8f70894bf..097cd7685d 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 9e0f7a65cc..2848e82eab 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 a7e0ea14de..39bbb147ae 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 0a8162fb78..94552c4470 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 f8e08dfa0c..0b20e2a9dc 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 f95ee67679..dabd98c468 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 9b16865295..97d55672c6 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 dd53e5d3c9..f5e1409f23 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 f86299bbcc..e8043fada7 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 13f6feaaa9..e23a14e78d 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/load.go b/pgo/api/load.go index 8d8f1a8bd8..4c7a373964 100644 --- a/pgo/api/load.go +++ b/pgo/api/load.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 3ba9ca373b..ebbff8e6e7 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 daa268484c..da977a2661 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 507b77f9a1..1d747a97b0 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/load.go b/pgo/cmd/load.go index 3cf808835f..a0df076fec 100644 --- a/pgo/cmd/load.go +++ b/pgo/cmd/load.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/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 ced111cd21..85174ef6a7 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 075a9f13e8..3a233b484a 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 f24bf8b9d2..9059d3b96d 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 a095dcde75..24b10998d7 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 120cc15f5c..89e6697a83 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 541c3ff426..90e9427fe8 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 2992589526..90085ef52b 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 ba5b0af842..418d4d3979 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 8944df9186..0e48475c49 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 65f32eddd1..240abaacc5 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 fccc1ff341..e560721dfe 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/loadmsgs.go b/pkg/apiservermsgs/loadmsgs.go index ddfcde3af5..ececc01229 100644 --- a/pkg/apiservermsgs/loadmsgs.go +++ b/pkg/apiservermsgs/loadmsgs.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 18f0e78ab9..cf632191ae 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 37cda4bde4..2bd877d973 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 100644 --- 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 3b5b96b31b..5381548160 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 a5f0ae33ff..ca434ae218 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 b714ce6107..77aa53c05e 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 78259178cb226a6335d56d5f658c7bbf92d3d555 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 7 Jan 2021 11:51:11 -0500 Subject: [PATCH 52/77] 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/metrics/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/metrics/templates/rbac.yaml b/installers/helm/metrics/templates/rbac.yaml index dbef140471..19d6fc06e4 100644 --- a/installers/helm/metrics/templates/rbac.yaml +++ b/installers/helm/metrics/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 dd65c40804..d77db7974a 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 cd56f91271008b6099dd4c1f96d4880d412cb5b2 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 13 Jan 2021 12:43:46 -0500 Subject: [PATCH 53/77] 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 6ff04384fa..093773ab8d 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -489,7 +489,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 01f3db4c840af44d0e97103eb02967a9f14e665a Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 13 Jan 2021 17:38:23 -0500 Subject: [PATCH 54/77] 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 3dd7045f605c61073674223a2179c4c9c9d190c2 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Wed, 13 Jan 2021 18:24:57 -0500 Subject: [PATCH 55/77] 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 0c810a7bfd..6d44096328 100644 --- a/docs/content/Security/configure-postgres-operator-rbac.md +++ b/docs/content/Security/configure-postgres-operator-rbac.md @@ -74,6 +74,7 @@ The following list shows the current complete list of possible pgo permissions t |Label | allow *pgo label*| |Load | allow *pgo load*| |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 e702a5a9d8..ce7f26cf53 100644 --- a/internal/apiserver/perms.go +++ b/internal/apiserver/perms.go @@ -42,7 +42,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" @@ -59,7 +58,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" @@ -73,7 +71,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" @@ -119,6 +116,7 @@ func InitializePerms() { LABEL_PERM: "yes", LOAD_PERM: "yes", RELOAD_PERM: "yes", + RESTART_PERM: "yes", RESTORE_PERM: "yes", STATUS_PERM: "yes", TEST_CLUSTER_PERM: "yes", @@ -129,7 +127,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", @@ -146,7 +143,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", @@ -160,7 +156,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 f7a6b332baee087129a25bf7c4907e9dd885fd4d Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 17 Jan 2021 10:40:22 -0500 Subject: [PATCH 56/77] 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 4c3ed07564..6fe881f1cd 100644 --- a/docs/content/pgo-client/common-tasks.md +++ b/docs/content/pgo-client/common-tasks.md @@ -744,7 +744,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 6afaed445c..cc42f9cd62 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 fa3e1b128d..4350d7d073 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 093773ab8d..2def7973b8 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -1802,7 +1802,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 9059d3b96d..c120f23a5d 100644 --- a/pgo/cmd/update.go +++ b/pgo/cmd/update.go @@ -143,8 +143,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" @@ -189,7 +189,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 93798e479547da8de25c6c7d889dc1951646c88c Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 17 Jan 2021 10:52:55 -0500 Subject: [PATCH 57/77] 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 173de9b734..363009b539 100644 --- a/internal/controller/job/backresthandler.go +++ b/internal/controller/job/backresthandler.go @@ -223,6 +223,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.JobClient, clusterName, namespace) + + // now initialize the creation of any replica + controller.InitializeReplicaCreation(c.JobClient, clusterName, namespace) return nil } From d8a482de22215c4c04453caed4d66fa09fa8b721 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 17 Jan 2021 21:44:41 -0500 Subject: [PATCH 58/77] 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 47282ca487..39ff692264 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" @@ -55,7 +60,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 } @@ -259,29 +264,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 5b61c9ce39bd5f1f893dcfc7c0f38ea3c651a9ba Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 18 Jan 2021 10:23:59 -0500 Subject: [PATCH 59/77] 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 fcc8e3c545..34568f3616 100644 --- a/internal/apiserver/common.go +++ b/internal/apiserver/common.go @@ -27,6 +27,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 ( @@ -45,6 +46,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") @@ -110,6 +113,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 39ff692264..5a029a3f8a 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" @@ -37,7 +30,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 ... @@ -57,7 +49,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() @@ -264,59 +256,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 @@ -334,7 +273,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 9f9941e3c677d99d0ac241d8c53a6923e545136c Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 18 Jan 2021 10:31:28 -0500 Subject: [PATCH 60/77] 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 2def7973b8..155a0d959d 100644 --- a/internal/apiserver/clusterservice/clusterimpl.go +++ b/internal/apiserver/clusterservice/clusterimpl.go @@ -581,18 +581,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 659077e6db4787ecee07da34290c86dc54239489 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 22 Jan 2021 09:35:13 -0500 Subject: [PATCH 61/77] Fix compilation errors from bad backpatch The apiserver binary was missing one import, and rmdata required an update to a data structure. --- internal/apiserver/common.go | 1 + pgo-rmdata/rmdata/process.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/apiserver/common.go b/internal/apiserver/common.go index 34568f3616..314c45cb3a 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" "github.com/crunchydata/postgres-operator/internal/kubeapi" diff --git a/pgo-rmdata/rmdata/process.go b/pgo-rmdata/rmdata/process.go index 2848e82eab..3164440e87 100644 --- a/pgo-rmdata/rmdata/process.go +++ b/pgo-rmdata/rmdata/process.go @@ -222,7 +222,7 @@ func removeBackupSecrets(request Request) { // -pgha-config (stores a Patroni config file in YAML format) func removeClusterConfigmaps(request Request) { // Store the derived names of the three configmaps in an array - clusterConfigmaps := [4]string{ + clusterConfigmaps := []string{ // first, derive the name of the PG HA default configmap, which is // "`clusterName`-`LABEL_PGHA_CONFIGMAP`" fmt.Sprintf("%s-%s", request.ClusterName, config.LABEL_PGHA_CONFIGMAP), From 992b1d855751ef74b66106f192f38a2c059658b7 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 29 Jan 2021 13:13:43 -0500 Subject: [PATCH 62/77] 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 c780536e71440a4ac4fa671ab3b71d7420d12c14 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sun, 31 Jan 2021 12:37:40 -0500 Subject: [PATCH 63/77] 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 97d55672c6..98f6c4cbd6 100644 --- a/pgo-scheduler/scheduler/pgbackrest.go +++ b/pgo-scheduler/scheduler/pgbackrest.go @@ -23,8 +23,10 @@ import ( "github.com/crunchydata/postgres-operator/internal/kubeapi" crv1 "github.com/crunchydata/postgres-operator/pkg/apis/crunchydata.com/v1" 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" ) @@ -134,17 +136,20 @@ func (b BackRestBackupJob) Run() { return } - selector := fmt.Sprintf("%s=%s,pgo-backrest-repo=true", config.LABEL_PG_CLUSTER, b.cluster) - pods, err := kubeClient.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 := kubeClient.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 bb771cf448d9ef60b092d332af00e3b6b395675e Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 1 Feb 2021 16:58:08 -0500 Subject: [PATCH 64/77] 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 9fb6320436..03bde13213 100644 --- a/internal/operator/cluster/clusterlogic.go +++ b/internal/operator/cluster/clusterlogic.go @@ -98,15 +98,16 @@ func addClusterBootstrapJob(clientset kubernetes.Interface, client *rest.RESTCli 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 54c8437c1178db3028790dd1c518eacc732b08c2 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 11 Feb 2021 18:42:46 -0500 Subject: [PATCH 65/77] 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 00280732cc..8c1157fbc3 100644 --- a/internal/apiserver/backrestservice/backrestimpl.go +++ b/internal/apiserver/backrestservice/backrestimpl.go @@ -215,10 +215,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 } @@ -300,54 +299,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 8e5163e9a5ebe4dd009ca2f1478d333c1424f292 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 22 Feb 2021 14:27:36 -0500 Subject: [PATCH 66/77] 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 314c45cb3a..8fe6ead259 100644 --- a/internal/apiserver/common.go +++ b/internal/apiserver/common.go @@ -131,6 +131,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 c36cb7bfa3..4119978d46 100644 --- a/internal/apiserver/common_test.go +++ b/internal/apiserver/common_test.go @@ -30,12 +30,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 108146918c14691d60e58d9e41434e4568cb8b28 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 26 Feb 2021 09:01:52 -0500 Subject: [PATCH 67/77] Bump v4.4.3 --- Makefile | 4 +- README.md | 2 +- bin/push-ccp-to-gcr.sh | 2 +- conf/postgres-operator/pgo.yaml | 4 +- docs/config.toml | 4 +- docs/content/Configuration/compatibility.md | 6 +++ docs/content/releases/4.4.2.md | 4 +- docs/content/releases/4.4.3.md | 46 +++++++++++++++++++ examples/create-by-resource/fromcrd.json | 6 +-- examples/envs.sh | 2 +- examples/load/sample-json-load-config-sc.yaml | 2 +- examples/load/sample-json-load-config.yaml | 2 +- examples/load/sample-load-config.yaml | 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/inventory.ini | 6 +-- installers/helm/metrics/Chart.yaml | 2 +- installers/helm/metrics/values.yaml | 6 +-- installers/helm/postgres-operator/Chart.yaml | 2 +- installers/helm/postgres-operator/values.yaml | 6 +-- installers/kubectl/client-setup.sh | 2 +- .../kubectl/postgres-operator-ocp311.yml | 8 ++-- installers/kubectl/postgres-operator.yml | 8 ++-- installers/olm/Makefile | 4 +- 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 +- 31 files changed, 116 insertions(+), 64 deletions(-) create mode 100644 docs/content/releases/4.4.3.md diff --git a/Makefile b/Makefile index d92ee0e944..14fb0c4c46 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.4.2 +PGO_VERSION ?= 4.4.3 PGO_PG_VERSION ?= 12 -PGO_PG_FULLVERSION ?= 12.5 +PGO_PG_FULLVERSION ?= 12.6 PGO_BACKREST_VERSION ?= 2.27 RELTMPDIR=/tmp/release.$(PGO_VERSION) diff --git a/README.md b/README.md index 2e4bbb5cce..8493c8f1a6 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,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.4.2/installers/kubectl/postgres-operator.yml +kubectl apply -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.4.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 f8b08b88db..08b9e1e709 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.4.2 +CCP_IMAGE_TAG=centos7-12.6-4.4.3 IMAGES=( crunchy-prometheus diff --git a/conf/postgres-operator/pgo.yaml b/conf/postgres-operator/pgo.yaml index 2c60f86968..4b58df00cd 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.4.2 + CCPImageTag: centos7-12.6-4.4.3 Port: 5432 PGBadgerPort: 10000 ExporterPort: 9187 @@ -81,4 +81,4 @@ Storage: Pgo: Audit: false PGOImagePrefix: registry.developers.crunchydata.com/crunchydata - PGOImageTag: centos7-4.4.2 + PGOImageTag: centos7-4.4.3 diff --git a/docs/config.toml b/docs/config.toml index 3e34daf864..a43e682862 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -25,8 +25,8 @@ 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.4.2" -postgresVersion = "12.5" +operatorVersion = "4.4.3" +postgresVersion = "12.6" postgisVersion = "3.0" centosBase = "centos7" diff --git a/docs/content/Configuration/compatibility.md b/docs/content/Configuration/compatibility.md index 669f94aceb..99cde8fa72 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.4.3 | 4.4.3 | 12.6 | 2.27 | +|||11.11|2.27| +|||10.16|2.27| +|||9.6.21|2.27| +|||9.5.25|2.27| +|||| | 4.4.2 | 4.4.2 | 12.5 | 2.27 | |||11.10|2.27| |||10.15|2.27| diff --git a/docs/content/releases/4.4.2.md b/docs/content/releases/4.4.2.md index 06eb97de49..28e75b3832 100644 --- a/docs/content/releases/4.4.2.md +++ b/docs/content/releases/4.4.2.md @@ -5,11 +5,11 @@ draft: false weight: 78 --- -Crunchy Data announces the release of the [PostgreSQL Operator](https://www.crunchydata.com/products/crunchy-postgresql-operator/) 4.4.1 on November 25, 2020. +Crunchy Data announces the release of the [PostgreSQL Operator](https://www.crunchydata.com/products/crunchy-postgresql-operator/) 4.4.2 on November 25, 2020. The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). -The PostgreSQL Operator 4.4.2 release includes the following software versions upgrades: +The PostgreSQL Operator 4.4.3 release includes the following software versions upgrades: - The PostgreSQL containers now use versions 12.5, 11.10, 10.15, 9.6.20, and 9.5.24 diff --git a/docs/content/releases/4.4.3.md b/docs/content/releases/4.4.3.md new file mode 100644 index 0000000000..2a6fe21035 --- /dev/null +++ b/docs/content/releases/4.4.3.md @@ -0,0 +1,46 @@ +--- +title: "4.4.3" +date: +draft: false +weight: 77 +--- + +Crunchy Data announces the release of the [PostgreSQL Operator](https://www.crunchydata.com/products/crunchy-postgresql-operator/) 4.4.3 on March 1, 2021. + +The PostgreSQL Operator is released in conjunction with the [Crunchy Container Suite](https://github.com/CrunchyData/crunchy-containers/). + +The PostgreSQL Operator 4.4.3 release includes the following software versions upgrades: + +- The PostgreSQL containers now use versions 12.6, 11.11, 10.16, 9.6.21, and 9.5.25 + +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 + +- 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. +- 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 issue with pgo backup where it was unable to take a backup from a new primary after pgo failover was called. Reported by (@mesobreira). +- Do not trigger a backup if a standby cluster fails over. Reported by (@aprilito1965). +- 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. +- 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. +- During a major upgrade, ensure permissions are correct on the old data directory before running `pg_upgrade`. +- Ensure major upgrades via `crunchy-upgrade` support PostgreSQL 12. Reported by (@lbartnicki92). diff --git a/examples/create-by-resource/fromcrd.json b/examples/create-by-resource/fromcrd.json index 29d4ca4341..f93a7bd406 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.4.2", + "pgo-version": "4.4.3", "pgouser": "pgoadmin", "primary": "true" }, @@ -62,7 +62,7 @@ }, "backrestResources": {}, "ccpimage": "crunchy-postgres-ha", - "ccpimagetag": "centos7-12.5-4.4.2", + "ccpimagetag": "centos7-12.6-4.4.3", "clustername": "fromcrd", "customconfig": "", "database": "userdb", @@ -95,7 +95,7 @@ "userlabels": { "crunchy_collect": "false", "pg-pod-anti-affinity": "", - "pgo-version": "4.4.2", + "pgo-version": "4.4.3", "pgouser": "pgoadmin", "pgo-backrest": "true" }, diff --git a/examples/envs.sh b/examples/envs.sh index e6bb782306..e303713464 100644 --- a/examples/envs.sh +++ b/examples/envs.sh @@ -20,7 +20,7 @@ export PGOROOT=$GOPATH/src/github.com/crunchydata/postgres-operator # 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.4.2 +export PGO_VERSION=4.4.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/load/sample-json-load-config-sc.yaml b/examples/load/sample-json-load-config-sc.yaml index 39c3e9d82b..255f5d857c 100644 --- a/examples/load/sample-json-load-config-sc.yaml +++ b/examples/load/sample-json-load-config-sc.yaml @@ -1,5 +1,5 @@ PGOImagePrefix: registry.developers.crunchydata.com/crunchydata -PGOImageTag: centos7-4.4.2 +PGOImageTag: centos7-4.4.3 DbDatabase: userdb DbUser: postgres DbPort: 5432 diff --git a/examples/load/sample-json-load-config.yaml b/examples/load/sample-json-load-config.yaml index 38f36497c3..a29a9ffb9e 100644 --- a/examples/load/sample-json-load-config.yaml +++ b/examples/load/sample-json-load-config.yaml @@ -1,5 +1,5 @@ PGOImagePrefix: registry.developers.crunchydata.com/crunchydata -PGOImageTag: centos7-4.4.2 +PGOImageTag: centos7-4.4.3 DbDatabase: userdb DbUser: postgres DbPort: 5432 diff --git a/examples/load/sample-load-config.yaml b/examples/load/sample-load-config.yaml index 3e4700e850..291dc2e1bd 100644 --- a/examples/load/sample-load-config.yaml +++ b/examples/load/sample-load-config.yaml @@ -1,5 +1,5 @@ PGOImagePrefix: registry.developers.crunchydata.com/crunchydata -PGOImageTag: centos7-4.4.2 +PGOImageTag: centos7-4.4.3 DbDatabase: userdb DbUser: postgres DbPort: 5432 diff --git a/installers/ansible/README.md b/installers/ansible/README.md index dc62f5d4c5..7918e35439 100644 --- a/installers/ansible/README.md +++ b/installers/ansible/README.md @@ -4,7 +4,7 @@ Crunchy Data

-Latest Release: 4.4.2 +Latest Release: 4.4.3 ## General diff --git a/installers/ansible/values.yaml b/installers/ansible/values.yaml index 53e8b9b577..eaf6cbdb4e 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.4.2" +ccp_image_tag: "centos7-12.6-4.4.3" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -58,14 +58,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.4.2" +pgo_client_version: "4.4.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: "centos7-4.4.2" +pgo_image_tag: "centos7-4.4.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 232c4e06ee..3afc84ada9 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.4.2 +PGO_VERSION ?= 4.4.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 cdde5b8892..83896e7d6f 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.4.2 + export PGO_VERSION=4.4.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/inventory.ini b/installers/gcp-marketplace/inventory.ini index 023e5229c1..ab381926c9 100644 --- a/installers/gcp-marketplace/inventory.ini +++ b/installers/gcp-marketplace/inventory.ini @@ -16,11 +16,11 @@ pgo_operator_namespace='${OPERATOR_NAMESPACE}' namespace='' ccp_image_prefix='registry.developers.crunchydata.com/crunchydata' -ccp_image_tag='centos7-12.5-4.4.2' +ccp_image_tag='centos7-12.6-4.4.3' ccp_image_pull_secret='' ccp_image_pull_secret_manifest='' pgo_image_prefix='registry.developers.crunchydata.com/crunchydata' -pgo_image_tag='centos7-4.4.2' +pgo_image_tag='centos7-4.4.3' pgo_image='${OPERATOR_IMAGE}' pgo_event_image='${OPERATOR_IMAGE_EVENT}' @@ -29,7 +29,7 @@ pgo_scheduler_image='${OPERATOR_IMAGE_SCHEDULER}' # PGO Client Install pgo_client_install='false' -pgo_client_version='v4.4.2' +pgo_client_version='v4.4.3' badger='false' metrics='${POSTGRES_METRICS}' diff --git a/installers/helm/metrics/Chart.yaml b/installers/helm/metrics/Chart.yaml index aa1a37f1bd..1893c60ec4 100644 --- a/installers/helm/metrics/Chart.yaml +++ b/installers/helm/metrics/Chart.yaml @@ -3,6 +3,6 @@ name: postgres-operator-metrics description: Metrics Install for Crunchy PostgreSQL Operator type: application version: 0.1.0 -appVersion: 4.4.2 +appVersion: 4.4.3 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/helm/metrics/values.yaml b/installers/helm/metrics/values.yaml index b3118d7858..bfb1c8693b 100644 --- a/installers/helm/metrics/values.yaml +++ b/installers/helm/metrics/values.yaml @@ -29,7 +29,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.4.2" +ccp_image_tag: "centos7-12.6-4.4.3" create_rbac: "true" crunchy_debug: "false" db_password_length: "24" @@ -56,11 +56,11 @@ pgo_admin_password: "examplepassword" pgo_admin_perms: "*" pgo_admin_role_name: "pgoadmin" pgo_admin_username: "admin" -pgo_client_version: "4.4.2" +pgo_client_version: "4.4.3" pgo_image_prefix: "registry.developers.crunchydata.com/crunchydata" pgo_image_pull_secret: "" pgo_image_pull_secret_manifest: "" -pgo_image_tag: "centos7-4.4.2" +pgo_image_tag: "centos7-4.4.3" pgo_installation_name: "devtest" pgo_operator_namespace: "pgo" prometheus_install: "false" diff --git a/installers/helm/postgres-operator/Chart.yaml b/installers/helm/postgres-operator/Chart.yaml index 6a388a3de6..b568d29047 100644 --- a/installers/helm/postgres-operator/Chart.yaml +++ b/installers/helm/postgres-operator/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.4.2 +appVersion: 4.4.3 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/postgres-operator/values.yaml b/installers/helm/postgres-operator/values.yaml index 988b9e6f80..6f4faff1cd 100644 --- a/installers/helm/postgres-operator/values.yaml +++ b/installers/helm/postgres-operator/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.4.2" +ccp_image_tag: "centos7-12.6-4.4.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.4.2" +pgo_client_version: "4.4.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: "centos7-4.4.2" +pgo_image_tag: "centos7-4.4.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 b4f9e4bdb9..65e3d59b56 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.4.2}" +PGO_CLIENT_VERSION="${PGO_CLIENT_VERSION:-v4.4.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 8b80b430aa..30c8ccd776 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.4.2" + ccp_image_tag: "centos7-12.6-4.4.3" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -85,14 +85,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.4.2" + pgo_client_version: "4.4.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: "centos7-4.4.2" + pgo_image_tag: "centos7-4.4.3" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -174,7 +174,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.2 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.3 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/kubectl/postgres-operator.yml b/installers/kubectl/postgres-operator.yml index d77db7974a..d51daa00a1 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.4.2" + ccp_image_tag: "centos7-12.6-4.4.3" create_rbac: "true" crunchy_debug: "false" db_name: "" @@ -180,14 +180,14 @@ data: pgo_client_cert_secret: "pgo.tls" pgo_client_container_install: "false" pgo_client_install: "true" - pgo_client_version: "4.4.2" + pgo_client_version: "4.4.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: "centos7-4.4.2" + pgo_image_tag: "centos7-4.4.3" pgo_installation_name: "devtest" pgo_noauth_routes: "" pgo_operator_namespace: "pgo" @@ -282,7 +282,7 @@ spec: restartPolicy: Never containers: - name: pgo-deploy - image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.2 + image: registry.developers.crunchydata.com/crunchydata/pgo-deployer:centos7-4.4.3 imagePullPolicy: IfNotPresent env: - name: DEPLOY_ACTION diff --git a/installers/olm/Makefile b/installers/olm/Makefile index 0ed6d4cdce..3a59c75c36 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.5 +CCP_PG_FULLVERSION ?= 12.6 CCP_POSTGIS_VERSION ?= 3.0 KUBECONFIG ?= $(HOME)/.kube/config OLM_SDK_VERSION ?= 0.13.0 @@ -10,7 +10,7 @@ OLM_TOOLS ?= registry.localhost:5000/postgres-operator-olm-tools:$(OLM_SDK_VERSI OLM_VERSION ?= 0.14.2 PGO_BASEOS ?= centos7 PGO_IMAGE_PREFIX ?= registry.developers.crunchydata.com/crunchydata -PGO_VERSION ?= 4.4.2 +PGO_VERSION ?= 4.4.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/internal/util/util_test.go b/internal/util/util_test.go index 2527772df3..d548ad4eff 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.5-4.5.0", + "image: crunchy-postgres-ha, tag: centos7-12.6-4.5.0", "crunchy-postgres-ha", - "centos7-12.5-4.5.0", - "centos7-12.5-4.5.0", + "centos7-12.6-4.5.0", + "centos7-12.6-4.5.0", }, { - "image: crunchy-postgres-gis-ha, tag: centos7-12.5-3.0-4.5.0", + "image: crunchy-postgres-gis-ha, tag: centos7-12.6-3.0-4.5.0", "crunchy-postgres-gis-ha", - "centos7-12.5-3.0-4.5.0", - "centos7-12.5-4.5.0", + "centos7-12.6-3.0-4.5.0", + "centos7-12.6-4.5.0", }, { - "image: crunchy-postgres-ha, tag: centos7-12.5-4.5.0-beta.1", + "image: crunchy-postgres-ha, tag: centos7-12.6-4.5.0-beta.1", "crunchy-postgres-ha", - "centos7-12.5-4.5.0-beta.1", - "centos7-12.5-4.5.0-beta.1", + "centos7-12.6-4.5.0-beta.1", + "centos7-12.6-4.5.0-beta.1", }, { - "image: crunchy-postgres-gis-ha, tag: centos7-12.5-3.0-4.5.0-beta.2", + "image: crunchy-postgres-gis-ha, tag: centos7-12.6-3.0-4.5.0-beta.2", "crunchy-postgres-gis-ha", - "centos7-12.5-3.0-4.5.0-beta.2", - "centos7-12.5-4.5.0-beta.2", + "centos7-12.6-3.0-4.5.0-beta.2", + "centos7-12.6-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 90085ef52b..425a2bd9b8 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.4.2", + '{"ClientVersion":"4.4.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.4.2", + '{"ClientVersion":"4.4.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.4.2", + '{"ClientVersion":"4.4.3", "Namespace":"pgouser1", "Clustername":"mycluster"}' \ $PGO_APISERVER_URL/clustersdelete @@ -90,7 +90,7 @@ $PGO_APISERVER_URL/clustersdelete Schemes: http, https BasePath: / - Version: 4.4.2 + Version: 4.4.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 e560721dfe..614358ffc0 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.4.2" +const PGO_VERSION = "4.4.3" // Ok status const Ok = "ok" diff --git a/redhat/atomic/help.1 b/redhat/atomic/help.1 index 3790f3ee02..3786f27fa4 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.4.2" +The specific release number of the container. For example, Release="4.4.3" diff --git a/redhat/atomic/help.md b/redhat/atomic/help.md index bd993a3b86..ccb71f370e 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.4.2" +The specific release number of the container. For example, Release="4.4.3" From 22de1b4d88477cb784a23fb95b5015e2d8ea6ccc Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Fri, 26 Feb 2021 09:58:50 -0500 Subject: [PATCH 68/77] Fix build issue in API server Someone forgot to cast a pointer. --- internal/apiserver/backrestservice/backrestimpl.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/apiserver/backrestservice/backrestimpl.go b/internal/apiserver/backrestservice/backrestimpl.go index 8c1157fbc3..c4b172ddde 100644 --- a/internal/apiserver/backrestservice/backrestimpl.go +++ b/internal/apiserver/backrestservice/backrestimpl.go @@ -215,7 +215,7 @@ func CreateBackup(request *msgs.CreateBackrestBackupRequest, ns, pgouser string) } // check if primary is ready - if !isPrimaryReady(cluster) { + if !isPrimaryReady(&cluster) { resp.Status.Code = msgs.Error resp.Status.Msg = "primary pod is not in Ready state" return resp From 097e5e3fb09ac3bc2cfbee407cccc9dc6af508ca Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sat, 27 Feb 2021 16:44:49 -0500 Subject: [PATCH 69/77] 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 a28bd7d5de..e9783c4e21 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 4fda9b3d3b496cd6b4b183519ba20eea54b7148c Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 1 Mar 2021 10:46:54 -0500 Subject: [PATCH 70/77] Update v4.4.3 release notes --- docs/content/releases/4.4.3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/releases/4.4.3.md b/docs/content/releases/4.4.3.md index 2a6fe21035..8b0a10e0c9 100644 --- a/docs/content/releases/4.4.3.md +++ b/docs/content/releases/4.4.3.md @@ -18,11 +18,11 @@ PostgreSQL Operator is tested against Kubernetes 1.17 - 1.20, OpenShift 3.11, Op ## Changes - 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. - 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. +- Revert setting "UsePAM" to "yes" by default as the bug fix in Docker that required that change was applied roughly one year ago. ## Fixes From 33d086732ade49b448bf9e176718972ac81f5f14 Mon Sep 17 00:00:00 2001 From: Andrew L'Ecuyer Date: Mon, 15 Mar 2021 20:23:00 +0000 Subject: [PATCH 71/77] 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 e9783c4e21..d25b24f158 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 01f32668fc0d7f9e3a6750a8a0d143c776ee67df Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Thu, 18 Mar 2021 12:51:10 -0400 Subject: [PATCH 72/77] 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 0ebd5af279d6b34731e552e94655c067e77daf8e Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 22 Mar 2021 15:22:35 -0400 Subject: [PATCH 73/77] 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 67bba9017538c70258f8e85fcd9ad4e64ecaee1f Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 5 Apr 2021 12:27:34 -0400 Subject: [PATCH 74/77] Update general descriptions This provides some updates around the geneal description for PGO. --- README.md | 141 ++++++++++++++++++++++++++++++----------- docs/config.toml | 2 +- docs/content/_index.md | 69 +++++++++++++------- 3 files changed, 149 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 8493c8f1a6..e07483d0fc 100644 --- a/README.md +++ b/README.md @@ -1,15 +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](https://access.crunchydata.com/documentation/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][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 +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](https://access.crunchydata.com/documentation/postgres-operator/latest/architecture/provisioning/), while fully customizing your Pods and PostgreSQL configuration! @@ -25,7 +32,8 @@ 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](https://access.crunchydata.com/documentation/postgres-operator/latest/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-task-tls], +including the ability to enforce all of your connections to use TLS. #### Monitoring @@ -65,16 +73,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][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 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! @@ -83,49 +97,80 @@ 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 +[high-availability]: https://access.crunchydata.com/documentation/postgres-operator/latest/architecture/high-availability/ +[high-availability-sync]: https://access.crunchydata.com/documentation/postgres-operator/latest/architecture/high-availability/#synchronous-replication-guarding-against-transactions-loss +[monitoring]: https://access.crunchydata.com/documentation/postgres-operator/latest/architecture/monitoring/ +[multiple-cluster]: https://access.crunchydata.com/documentation/postgres-operator/latest/architecture/high-availability/multi-cluster-kubernetes/ +[pgo-create-cluster]: https://access.crunchydata.com/documentation/postgres-operator/latest/pgo-client/reference/pgo_create_cluster/ +[pgo-task-tls]: https://access.crunchydata.com/documentation/postgres-operator/latest/pgo-client/common-tasks/#enable-tls +[provisioning]: https://access.crunchydata.com/documentation/postgres-operator/latest/architecture/provisioning/ + +[k8s-anti-affinity]: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity +[k8s-namespaces]: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ +[k8s-nodes]: https://kubernetes.io/docs/concepts/architecture/nodes/ + +[pgBackRest]: https://www.pgbackrest.org +[pgBouncer]: https://access.crunchydata.com/documentation/pgbouncer/ +[pgMonitor]: https://github.com/CrunchyData/pgmonitor + + ## 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 @@ -144,7 +189,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/) @@ -181,16 +226,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 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: +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! -- [PostgreSQL Operator Documentation](https://access.crunchydata.com/documentation/postgres-operator/) +- [PostgreSQL Operator Tutorial](https://access.crunchydata.com/documentation/postgres-operator/latest/tutorial/) + +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) @@ -224,8 +277,7 @@ If you have any question you can submit a Support - Question and Answer issue an ## Complete Documentation For additional information regarding design, configuration and operation of the -PostgreSQL Operator, pleases see the -[Official Project Documentation](https://access.crunchydata.com/documentation/postgres-operator/) +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: @@ -234,3 +286,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 a43e682862..5d9c641624 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 a13b8c960e..21290dfb74 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 +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 @@ -70,16 +80,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! @@ -128,24 +144,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 3935a771018041bbe1d1bbbf80031f736e147af0 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Sat, 10 Apr 2021 14:47:51 -0400 Subject: [PATCH 75/77] 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 +- docs/content/installation/other/_index.md | 2 +- .../installation/other/ansible/_index.md | 8 +- docs/content/installation/other/bash.md | 76 +++++++++--------- docs/content/installation/other/helm.md | 13 +-- docs/content/installation/pgo-client.md | 14 ++-- .../content/installation/postgres-operator.md | 14 ++-- docs/content/installation/prerequisites.md | 14 ++-- docs/content/pgo-client/_index.md | 4 +- docs/content/quickstart/_index.md | 69 +++++++++++++--- 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/metrics/Chart.yaml | 2 +- installers/helm/postgres-operator/Chart.yaml | 4 +- installers/helm/postgres-operator/README.md | 16 ++-- installers/olm/README.md | 4 +- 23 files changed, 158 insertions(+), 107 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 e07483d0fc..4781fb0fb2 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 057ee739a3..1fab361907 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/other/_index.md b/docs/content/installation/other/_index.md index 9cb7caaef6..8044c3f07c 100644 --- a/docs/content/installation/other/_index.md +++ b/docs/content/installation/other/_index.md @@ -6,6 +6,6 @@ weight: 100 --- 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 40b9bd3e76..3a62fd51e5 100644 --- a/docs/content/installation/other/bash.md +++ b/docs/content/installation/other/bash.md @@ -5,18 +5,18 @@ draft: false weight: 200 --- -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 *conf* 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 *conf* 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/helm.md b/docs/content/installation/other/helm.md index a6698cb309..c940cf38c4 100644 --- a/docs/content/installation/other/helm.md +++ b/docs/content/installation/other/helm.md @@ -5,12 +5,13 @@ draft: false weight: 200 --- -# 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 @@ -205,11 +206,11 @@ helm install metrics -n pgo /path/to/metrics/chart_dir ## 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 %}} @@ -235,7 +236,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/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 62ec599413..8243f9e8e4 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 +# Install PGO the Postgres Operator ## Quickstart @@ -23,7 +23,7 @@ the PostgreSQL Operator. ## Overview -The PostgreSQL Operator comes with a container called `pgo-deployer` which +PGO comes with a container called `pgo-deployer` which handles a variety of lifecycle actions for the PostgreSQL Operator, including: - Installation @@ -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 PostgreSQL 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: @@ -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. @@ -174,7 +174,7 @@ oc secrets link --for=pull --namespace=}}) 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. @@ -62,7 +62,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 f78dc13974..600e951423 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 4eb0572c23..012dbee381 100644 --- a/docs/content/quickstart/_index.md +++ b/docs/content/quickstart/_index.md @@ -5,25 +5,26 @@ 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 [Google Cloud Platform Marketplace](#google-cloud-platform-marketplace) 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. -# 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. ## The Very, VERY Quickstart -If your environment is set up to use hostpath storage (found in things like [minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/) or [OpenShift Code Ready Containers](https://developers.redhat.com/products/codeready-containers/overview), the following command could work for you: +If your environment is set up to use hostpath storage (found in things like [minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/) or [OpenShift Code Ready Containers](https://developers.redhat.com/products/codeready-containers/overview), the following command could work for you for installing PGO: ``` kubectl create namespace pgo @@ -80,14 +81,18 @@ kubectl apply -f postgres-operator.yml This will launch the `pgo-deployer` container that will run the various setup and installation jobs. This can take a few minutes to complete depending on your Kubernetes cluster. +<<<<<<< HEAD While the installation is occurring, 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: +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance ``` 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 @@ -124,9 +129,13 @@ source ~/.bashrc ## Step 3: Verification -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. +<<<<<<< HEAD By default, the PostgreSQL Operator installs into a namespace called `pgo`. First, see that the 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: +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance ```shell kubectl -n pgo get deployments @@ -152,7 +161,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: @@ -175,7 +184,7 @@ pgo-apiserver version {{< param operatorVersion >}} ## Step 4: Have Some Fun - 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`: ```shell pgo create cluster -n pgo hippo @@ -196,7 +205,11 @@ created Pgcluster hippo workflow id 1cd0d225-7cd4-4044-b269-aa7bedae219b ``` +<<<<<<< HEAD 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` 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: +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance ```shell pgo test -n pgo hippo @@ -214,7 +227,13 @@ 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 pgo hippo`. +<<<<<<< HEAD # Marketplaces +======= +## Connect to a PostgreSQL Cluster + +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`. +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance Below is the list of the marketplaces where you can find the Crunchy PostgreSQL Operator: @@ -224,7 +243,11 @@ Follow the instructions below for the marketplace that you want to use to deploy ## Google Cloud Platform Marketplace +<<<<<<< HEAD The PostgreSQL Operator is installed as part of the [Crunchy PostgreSQL for GKE](https://console.cloud.google.com/marketplace/details/crunchydata/crunchy-postgresql-operator) project that is available in the Google Cloud Platform Marketplace (GCP Marketplace). Please follow the steps deploy to get the PostgreSQL Operator deployed! +======= +To get the information about all PostgreSQL users that PGO is managing, you will need to use the `--show-system-accounts` flag: +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance ### Step 1: Prerequisites @@ -243,7 +266,11 @@ For this example we are deploying the operator into a namespace called `pgo`. Fi kubectl -n pgo get deployments ``` +<<<<<<< HEAD If successful, you should see output similar to this: +======= +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: +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance ``` NAME READY UP-TO-DATE AVAILABLE AGE @@ -330,7 +357,11 @@ chmod +x pgo ### Step 6: Connect to the PostgreSQL Operator +<<<<<<< HEAD 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. +======= +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!** +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance In a new console window, run the following command to set up a port forward: @@ -344,6 +375,7 @@ Back to your original console window, you can verify that you can connect to the pgo version ``` +<<<<<<< HEAD If successful, you should see output similar to this: ``` @@ -352,6 +384,11 @@ pgo-apiserver version {{< param operatorVersion >}} ``` ### Step 7: Create a Namespace +======= +#### Get the Postgres Operator Installer Manifest + +You will need to download the Postgres Operator Installer manifest to your environment, which you can do with the following command: +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance 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. @@ -365,7 +402,11 @@ verify the operator has access to the newly added namespace pgo show namespace --all ``` +<<<<<<< HEAD you should see out put similar to this: +======= +#### Configure the Postgres Operator Installer +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance ```shell pgo username: admin @@ -393,13 +434,21 @@ created Pgcluster hippo workflow id 1cd0d225-7cd4-4044-b269-aa7bedae219b ``` +<<<<<<< HEAD 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` command: +======= +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. +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance ```shell pgo test -n wateringhole hippo ``` +<<<<<<< HEAD When everything is up and running, you should see output similar to this: +======= +When you are done editing the file, you can install PGO by running the following commands: +>>>>>>> bcd1d417d... Updates to installation instructions and other guidance ``` cluster : hippo 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 7918e35439..1498e1afeb 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.4.3 ## 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 83896e7d6f..232e68c9c4 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/metrics/Chart.yaml b/installers/helm/metrics/Chart.yaml index 1893c60ec4..f0324b1373 100644 --- a/installers/helm/metrics/Chart.yaml +++ b/installers/helm/metrics/Chart.yaml @@ -5,4 +5,4 @@ type: application version: 0.1.0 appVersion: 4.4.3 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/helm/postgres-operator/Chart.yaml b/installers/helm/postgres-operator/Chart.yaml index b568d29047..3e8c477fbc 100644 --- a/installers/helm/postgres-operator/Chart.yaml +++ b/installers/helm/postgres-operator/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.4.3 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/postgres-operator/README.md b/installers/helm/postgres-operator/README.md index fd0362516e..b2b7e8e264 100644 --- a/installers/helm/postgres-operator/README.md +++ b/installers/helm/postgres-operator/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/postgres-operator 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/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 c962858649d077d30cc3df1061594276dca12236 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Mon, 12 Apr 2021 21:26:12 -0400 Subject: [PATCH 76/77] 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 zcmbSzXH=6}*Y+K15QG3yR3M2WC>;wRHAGQSDWg&Zq^c+)MS8uXL{a(-qoPQ&fYOUd zCsYxU;vmuqMS2ar1o%#{G0r^i`#v9Q`NOsJKIiOx?Q36qpM7}uihbD+MIa(x(+RS` zrA`a?_xPGaBHJY0``hjX-tgF`f3!)P*P>ZGKk$#ezaKbs zR`1PlR~zS6$&@yn(zPaY2DGb-4$n}=Yo;U15OE1{qnF@uuVRms1NxDu&gC^<&SpqM zp*}B^ft$}`%>%U?8E(9^7BesK!{P`5KDAabGaR)3U@x|0((7j7t|*}I$pRhR2T8OgIZ$nj*eNC?0x zUw3*BK|#ipEOO<$((Gp~rLUPdJ~5(}PeEAjA{Ib3mOvY&?%3#yp%f>9BDjdaz)=e;#7{V-W$>pJ!9`icqp2^GAISj9kbO zWqq(SG7Q4I6%OnaA*6qaDuB;)+A+v7KoIY1ld*1LI;0afZs>-eU&Q;?Og4-F5tT~& z_EqniBoyw)xA_Gq^iYT)oA0u&TUV}WM4%tb0Y##yP>D{#15D?+f z<3PbDM>p?RA3?0rTQpD0kd)Je5b*bpn(J0@Kniu1Q;q)lGjClTXMB}gy$XzCJ3bH@ zQ2Bj_$TA4xoym@5{xVbGR(l%^1Wh;E{kml&##;d2B1X=OaJ#DmA%1*Z27KK8QDt`m zhs$7aQSZQNtr%fS--??H{_azwLMMZfp8LJe$f~a_kp-3j5UcvsF}J~MaelR}rA2R8 zFdwv_xSFl(mSWbU5(Ecb4URVt(aN$2V7#wC1a*`e)P0fHFGlrKlzcDGWGavRr2TD_ z@8_1EXE^FMfk*a?kMLR{nX~!JU{hK!yioyLeQ=gK>vk=>q11D4e!wqAn}*8zP-Sxf ztX|^U$|{@I?BZ5~%;f@0>xCxjcDey4_x1Kh*>Fye{DiAwuG1hMX|I>Vf8;KDLdz0K zu>y-KYaPZy5F9P;yIe45mEkuWgUwQs;>AToLimR}1uD+fJ&+(wIU+5Ryaz2|*lru{ z`#GVZL%{#q*0PJO<((c@X}KP1QYLvydCSZ1e=fQ|*U4T#=Ljthm07SAq5UiHU!)`t zI_P5R;_zf$^DgGdxxS3EFv~_beqHdh4b&4GAY_{(Lz&$a_@1Yz5FzV4oA11XTi0EK ziUNQ*lCcJ=E=BoA!llrJ$(zgTJ&BN!Z8QLtl9a9xjI-3pGR(9 z>m-C_noflQyan|6H(@3AA;8L+(b0QTfCJ>eM9IIQ8MV5%y{Wgi>1S+S^d79!GuRc9 z!%;SaDeKcMMD7~9Ke<|+&RYsW$+5IE>fC1UvZYeC;fACUL@9ZNyRV+4e1yvCk05gZ z9k3rDh!UV5_-|0^Wri-GaQvPSR*K718gScAd~U|{Pvi)7=84C#8Q?j)Lg2l2>vF!i z^7pXk)QPKg)+|sMj?zeOI>JopyDd!rmEykI^vw;Z2eYlmbE&Q}>f+gnfS(M6OS_AP zU}p`;Vk)q-M#%Z9FnqIpO57|(voruSzc(g7n0dg zse?}Q*Zp*a*+8*qa)Y@W`k9zz?`KJ>wDP|x&@Xm!R8}KxqNLe7iwN992Gm;=u0_(W z%ZwFk>kp&4jIRD*jWV3+`e5SZHOjoYyUO=<=do`Xl`Br=xMArsa$d^fmHrlEQL z_K3(`VE>DkT!+kg5yZyL5gvIhGxP|uxdv_8QDa`#x!vg}nZ$|$fZV_kWCAL?`=jJ1 zc!Ak&liIOF@l!e{pg1MdnXTM7{_0UP6aqS7Lun|L0PAvZiYwQVi?EQ@lYS2AmM>tc=4oO29YPG<+FQJ46UFe>JZMVelDh_pr(w zyS%+fzkh@XrDDF*?peHt4ZS!OhuURV3K?km=Nn&nUCoqLbSt9vRCb;g?GW5VAFwS* zLtg+v9~2dM2*_Lygcdix#iJN9gw&z9OLRz&sbw`Ss;N7c*jsu3QDFPJs|*YFT+Zrr zk-c#)J+%8A^$W#_N4_QbHhby^Z{a&sr$h)3!rD2nRQ+_nt+dF>RUTFM$4kV5-9HZ+ zwueGb=s;qE;C+O216l$Z@7RLvK;abTq^EZi8e|X*2qL$!!1g0la@X0a=_z z5ZxJzQ-ERJ&%n#BE=@Cx^1BEP+d+b1!5}doiYVeu<0+^z<{po2fRC_aO=U>0elN1? zi?h(XPb|OtEiTDS0PrwrSRi_R#?AnCH%w4`vm^gy?Ta<%I z*G86ClbX-t!FwE`8CMS&7oJ+S_w1wCGyt;Xv-yqKDHf1!R=hCYsUObD9j<(uO^8s8n0-z{t)`2ehRf@HAv$3l4Z`SLhkh!)q~l$ON-f4wP*9|lo348Q@_sbS@mRX{nMpXGhy@{7)+ z<8x>1DT%MVny$ms8HG#m_^O-;0`j4u=rWJo-JHdxCEH!h37ohSz*8G4C%yjc;g?UD zm7?k_uWYidqNp#_zzm|C4O1aLe;tt5BvIGafYo`Bs>X_OKKAXjnsTZtAM(WRPF-G2 z3s73;RqIH)g`C@4X1c;nPnZpWVGjX6rcwW#UYQ%|rj_gi>#f4a>5wenxnSN=EJnY_ zFCi*O)p?UhjN(#*hFF1PqrW>ARw4H4BYWOb*N-EJbx6#?)4;{p>bHY}m-V;xX!0Cw z*@{(8xef3eBLgMJFFq`)MU^cX!5!w~OC+~!80A0z49KP*=Jt8?UY$p!MN_WVaFey2 zj{$1a0Tj9ecbD}lP^TQd)#L3>W>@t9@z5aw@c{D3r0Ctr)9uvWvb!URnKQB7)MKVS z^{*|s{gtG#6oZ?7!wseT)QnHB`t2oz!8TTYks(kS9Sz6k6K9uRZ$U2}-o>*CRoVbm zv%yf=6&(esN!tqXfHWR?G>BGj8S=U&6nEg~vT}DGF>rPzt{=BxfF8dw>Fx&1CwSe~ zp^+13NT8{T4~}9w0JnDH#)IFi`8EGl0}`739V&adu|$WMooWjUwj-+e{bKbx^WV&Q zmfgvSzsHg1SW5~cSM&pUQc?3r5cE!;BJC9(tFB_3uJ7ZUTI2x$@H(SZ>o{bApk)i0 zgjZB$qC*n3XOH7+sZI72hW7vz82}VLJPS zZ}$CCF41iw8K4`uTRG;6;~;#;2-7p%Q#Ck4R-q=si+!ER6I)A=+tv%+RJTb#Wokq# zvG4oE}KxTN%M3RR5tX@(>`Y6cB*#` z0y^2TCK0QZbjT=9+?5FE7KHyJSQLHPMOws&L%2|Hb&#VM9k4zFYah!q@Oe^!GOgfx z54MxwlbZwO?OpS*=h|bKe0Dv-Aa;ZnG&!w*}%;yYdP1H(Ru*hO$bv%5P`}X0MeqLsXh9AxR_^p_(knx z?M*3P59H+|SVA|kZxBJum6_9boKaW4x@M9 zW7ekY`T|%_6Aez0--&!TiHjLje>LC7jnC+0QWgi-4bz@7Srg%{5`U>`e{<1%3L~&i zUg?|oX$$Ykc!1Wb4?df+X2TAUHL;vHhcd?(g;|_@(RRG@Xp^*ENNKZR{l5{wm-6IP z5Kre*&%v;zZ9;&sz$ZVX9!6alaYawk24y4bmp#IJ`B<4YeChXj$8S-ZVK0fJDF(U2 z_r0*hlxhEm^Ox7)cQKnhB2M$jF`7pX^+yGd_YU|)p~^t241P!g|8)};fDK4#LOl|L zHi1Dpfx<)^tYJjJ?lFU$@^#a-at! z>^!wnd;O2G&2|F$!u%c0PTses>u6ZM~YuxB3jQQt|o7X3dYcW|~x;)@0=V;6@PH0AJD= zx2iZBq7^&t58MlL^@_c&iuT90Zf|VAv597aL7B|2h+q&Eh>3-1IJW4bF+MximSi}! z?^o{uKr}=Z>2`|nvWP0PV?S9TDKkaSq*bZpVM1Aj>5>_7+uPJdcx~02MvR_<7k$Z<1cv%if2H#S-^rqAzGDN>&P~6OmAhn~6@W1T zb^{y3YGT2#Imj+Vo?7et z%a3<`ab0SvlJ&ac?xqUKE?(S;!z>6Ql?5Ywk^DFk`2XQfZxam;*T{~c?oGgv@lW#z zgN_MDBgw~uwF?qL)pr4_6g27Gg}d7QZ3YUxoc)&Wq4juQvav@sPqj^}??AXV+W2j;tL%R517+E>OBIz__+|c6EUE<8af3M@yc=A6Z|0d?k`k zKCf2jq-}>JUn^WI=ve%{OS$8Kh~kis#jy10wD4Ei3RmpS46^TWj7K=XTCs}Jl%rW9 zegY=?>}~qScgxGg^~yWo3Er;mDlCykF!Pa5Du;rGRf??^nj#~An8F$;27Yk_!+_7b zN!zivN!xiRRdR)NrZ})BL$y}c2=~aHquvqvq5xPxJ%QXNF`%vR62gP>aXOj^;nzSd zk!fEG+F8T!)-F(n-=8#XyLRKtZ``;aYjiW1&BQ`MhRU49p`ME4#p3q%wpB>bx++JN zsoPJ~eP})vYI-7A`_RYLx^Eyb?fY**;G+y*jxlhpzYpN=<3qL<3MOYi+CYIFhykr0 zKVI75Zw#P+Z0jZM=t>9%UXK=gdu2&`dmu!UL5r;`vZ{`5N>2Xsl1vQ^BR~X$6r>H6 zT22uCwqU-1;)n6q?DC+~JO~z|YJjD(0q6>}LMxK}eY$^WGYF~^_Js%#U7*@55Fo}_ zq8d=W9f8Li{@ay!Tf5aaEawT<8jsJZ1M3{+2m*=qJO7ltDxT;;bn60h?_FLntZ*WF zDU8SMwWqaiQ~4%U?y}O^-9~kNSWd0=E}9*>{b}eNcjsg>y6dp0JaO`n>G}mb>Ir+H ziS68iv&HGNeDTfIpNs@v=cFaIRrtG}&i}NUQ7;@>fibl|>sF@v=Z5O{xrXq8X;!aQ zc9ZpVknei$Cat2?a%Maef-sQgQT21O*W>?*J{O>c1UPZ#tqI-pZ|#s4S?-gim*+Vd zSWDVF3VS>4=TbVi|3KaBV3!q50_2*#SPvq9Wawt@x&fdY&yE2H0tkGSG~2z zE4UecxKr(~NPn-lN12PHC01__yX?>AWgZ_NO;n~dsvC~1wODI6cMCI7JjHcZttRIv z5k97^DhBf@dGOqvPmG6zZ?olWcPKc&8K3IAcM)BE;?`@RCHwWq{54QL?vEfkaWN1C z4|C){XNF)5p{{|qis;LSX(jbWg#c*R@I#b?E?`$A=5@)g@xIMjx(sCKoTD83MF`(N z3&|MuGQ-f5)6h+(i)i(9sIWHJMfJmtpE8mgmmZt*OXyp0>1QN%;R=?pKSs>8|=5e!&5yH?2 zBCp|dpC{i6qcLMvepeV$pT)3l^ca5F1;~RFsiA`@TQCi=w!4x49kt68LS-{UrCUGx zd4pDt*3T5me;DKsDJ153pFof8rS0GB4ga4FZoz;GdCDw*lmoz7M*e4gY+eD-k-v)& z7UD$AdT@cE^uHnpm~MF|4y7`*6+z6~RG03im8E+SMCT{FpA;qU`Y&zJkhTEm#Zz;m zf%4s~B}gD4oV6gVAjoHBESyBqs1NOQ@PEab(=hq?Z0y2DvGo1BP|$~Fl^$sO-N6)I z6|Y?&a5cyxosCtV&n+3SL~!4i6R;p;lBP-uoBbH^k9-OLw+VAozMS?Ziyq^!V-aGj z3{d(Af>z1ZtSFD=`^MPXo0Un>qoKar1=A$1?rIa^6u0;7JKOumgR@a(W<*r9a1;p^ z@BS(r>Yjw}oYkAGT3*)4r|d5B$hAK0+^|yimsy0V=-F$I4PC{l@43|ki7zHXeFmIU z&%h=gBWSO*(5kVS_Y-*_n@Ywk_^7gDy>kj3JEanJ697VYz19 zouS7u^LP#XU!jFA--mYOwU>pCOZh{kVH;hlA3Vj600;+7)sj}}yg^RloO^#2s;o#j zG=j1Fx?S>&#e>}h3?b}dU$y`FDCkyY2MaR~4t^I3;aUG)gFg2m51NA_IOc`}!1dp- z-d#Mw!t_p8**<%ym780KD7`Fqbvd=Lh%=3vd%keN`~cBGg*fG!$xE$2TZs&UdJ_cLalxg&4gH6=;s0NEr$jCIL=#bK zyNK!fUAf+;7R|>tJf2d$S+01Fk4CE!g61e?7skz4P?t$myYCsjWefJS-5|UJt}sE6 zXv}{)>3>C_4Y%9eav_>15kDX{SEbd-vZ9+v>+OKX!NG;%`aV$FOuy|PKX*1kTEFAo zonns9f(2<-`F-E*QxfJ=o5dQIr)rv;6eW%*>v#{h@6@Sj-F%QC}B$`gC#NdCxlCU+#;a*hCh* zFnJKzCk5DNH8nxoEIF5Zs}DLE2AomlT=hMM2-vTUT?Ru<4=*b&^%lUr_VUwrjlO1k zumu*(7tq(mZcb{2qS&uZq%mVBr4^qTzl{ph-o*ED^Os>Dz&8^+Jr)o-d<;PF7WL{W?D!@nM9 z+*?!|{w3ED(mc2jp7CQn-1_s5f3aNvharI|?PI=%C8G5L4?K{cxzzQn8GZ(z)p90f z`MM82=|B~0c>W_ke}v~I^4qFyiAu|v{-icb9gd#MFQ zH%2NiP0FWe+cg*zp+`s6hW|rxnW)v#G&h5eF8 zPRH_FUygxO_9?*QZfNh;j1|RrCH8N7f+4n>;8s$U0fjjZ52l7J-3Lk`h zVm#(zhj0)4Kb2Ec&$qDHJv1h}KkjGSjsb2j+I(fs47eFw3*b^g3ZmHDZw3H=5{d@( zCnzgeXGnFx^N#-)&p+0&nvDfVvXeVtc@ZRHx%ibW-wn)0yI@TKN3jM+Nocw+F-a>7 z^+Db6c=A7-1OBxx+%Z?|0t}b>lzCMnIf(wxWGElJD5Mo~Zj3vJxy0d)_5llSkuxPZ*(#+|q#v+}u0 zZ^}F;YkSH2O@jLl9%u(}#nWH_eCzJ=VccE3%PZYf17*q9(=qcOzW(dSU*@cQ2CUI3 z<~en+^<{$?g5i7p2@$YBcE9@rqMN0Wg*4Hj2pE1zjDR|VG?0MoUH*4$7PaN5rru&M zNC}|>_XNNyggeQ4IZ|T=@(}bmyS21$c;OESDmeq>a^@ZabVRoc40FIAJ3?}Lis|dhS3D<7bjS%1Qoin76SikV zjvo_`4s|GY9ZcZMiF(~KUMr+(xS+jgPw`1BdbR$>V0D4zH%2JdzRsY^oxAa7V)!jR zN7W+##KBh1r%-NnaJWwig3L>3TLgvLkuzY6_Qj^sfSZc9U`*hpi*yL0{zeLj zs|iMP;)bF@SLJJe;U~b8=Tkrm&<+y%)0iBgI=u53j#h;b)L%-wCP~{S9cN$Wmo{ul zUZH-z)eff|-!{TJdfA5^Y9Ll;bR=696<4t8yYvuO^4?`!SBcgQ-8H6<)(NlzpHQJ) zCxhW1{>Rhv$Gojvl)3^I&=vAYV7#F@r0W9@?#lfQXytb-a)OaKuuu74x;`V`SVEfWzu6nC=(Bi$qqb<3dc4qrme+GYU*R+EuJ%2_3#?~(@VA} z*KTdoq_$UcC!p)f!q_CN?X+(%!pU=&xX zT;Tv=0`8^fPyxPA76HIE1`LFE>VW!h%LyIy&Igy^}`Ne!XkI_NG>INbx+*Ga6K(H&x2VA`7oDVd(XDD0qC3igK6$w5gm^A)5 zgnX0}f?~0NzKg(xh1D6~*PQUZA|87fm?lk+lbDm`gWMP{`A3EDH{}t0dT;c>EW!8b z7uJS$t{m=E8sggsy#cu*r1lrWIqiax^hy^fy>L0BGyWZ7E4YS^5ABRTM@d|+o%BFJ z=IXQ^2!kD*^L2I+HSK}3+}C^bdDL^G`|t7oyh;A0clR^4UWjZVYI1sm%lyhUkJW zz)K&S7B3Hi8;LGB7qEHiCC8_Cez|S<*#!ETB?gESdX5EA)5pmU)3U-?0yvxu-8C@c z>MbPb%o3T6!n@f|v;G)n__dw$L;0GX9&(g)@BU&rM5HzI zN=lM-B=2OQ*iBvI@|)5Wl#5EFe79X?#4ukwTjg%4A5@wrW~#?wsFDibM!5`-0xlFx!`XZ8 zvbZWLneKH14~DVY-pIKGxs~o__fI{Sv$H8C=5!?rrcP`J)C`W#&xT+ye``1Wu_-F| zT|7YLk`Y5s%5x4dEc~~-pMQGe$`KxAWP5*T@i2o0ErWu^b&?H8gS<+F`O3<8FeiM^ zE1S{PD^-CFM_<8iez>v9W{$rsr0*b@zog}Lb6o}$;jHWZ(A2l`hjRK-!cpLk?|)nL zRySfcWMi>ApKUVyYDY$9ac*77cIa~l+?9EbI8<6dbvJy$;A7=(rr?)VsI`?(j%^|S z{1Bm-c3J^&+K>zJaMJ%_EyFwAh$qht$Y@5|G`6DLc{aD&`*0lJh8Zu88VGdp9D!mp zO_knyHTuzMo<=8hCiy;8xu*~Ef;5;ZU;{=;FG&qoByM8fufz-g<7Q$2>kiGJaOQ@t zQL(I_1SA|Xr`Glbl3WwksGl_7K|yyb9b^RN#M%AZRuaPb%g)vxD%p!PQupmjUM)Pt zqCb8PaPGSYi-;0)&`&!xhJS?z4chO6G5_Ed_^T@I5x&Ko4gdh%8SbD9JgBph&oQvL zPEPVs6+GS&ML7(888N!9{sb&-!k3t|RVP(}n){}q&QZK1J-I1_(w5i4)$r%Ac~e5R z)$8*VeUO5PU9Jxf)c7XV3iSiA67a2nzd;M$-2MGZFFUOviyJ)qOX;uBu>AZS zhscL5JJ6rBFGidAxTW!)b|2YJZ?0MEKX)_kmGo<`GpyJ#_jp9+Ar>K%q*Ngewi;pm zIrUXK1RfBbGw67kZv*JQbPyj$F}~wX;bJiGT>S8K$5+z#MXURYvtJ^4>7WL9Qw!BvmksH==8(iCPx10hEW&{L%UX{M@?6e zU+-lFoj3?OBI7}Z6@wgfqo{>uovs?35R=9fbYh>7(^~S5dP~4J5`f>#ZHXXGPk^g` zOm>})D-RCh8h1rs2o^om6-=Y`nJ9+uQ+dMhPMv>MK+A3)R1XhZ=1?i}Zf!zrV0?=X zVrv3(bTapLdF%Q-Im$V2<4C-aMn~w%)i21SlWAZK9ETns%1i$UOps1o&S>o$$+b=J ztOxbKK6p~mz=$B)f!fIWeQ2s`N>@ivj&9+)!wvYxhk;Wh<-box{8Ixhp|fy;B!-|4Io z*EC+d`v`&wGCvQzaskM80ELTj)S(e=cy8b_8#cK)m1~;%Q0#vo3K~yHr&-PW+1&ip zQ@_1Glr${7Wr!P427dt<7aecw!`y`$qGqzYZ!$XK(77WrC9NWZ14ZK*bVhRbV!Bd7 zs^1jlFheE#Y1akdiAOL$4w`O-_o(G79`>Nnz%e83+j{0st?oe=Mo!jZMwIqyAdsE^ za*x)09qQ4PbnU*#G6b$dq3+!9TgU|)EKwz}724sJvPGz{KaSBe*|(`j=Njt-^!7>$ zZ+3n+4S;eYKH|30-c;-53G|Q#{B=|sI!@MB&0l^!FJis73+AUsQjSK}Hl;~e zmgYcZui)Ro)eZ5VGWjnilxhmEVrBQu@LlFtfLjQSTB$qSo-HSeHq|qSN5*hMyw>Uh zG8e(ygK9nhNqtU9LR^9A?UbV_1e1ywd9{~zaE$&S^Q5~g1Stdq(asJ&qP_MRB;jh! zz_`Wk9wQ$0hzeAlewFV70R&&TO0lFxmN_|Qd z;;TSGyf;#ew$V1i1VnPNv1G2-NGmhbMXu~NBY5J8BH^OQ%|y{`))yXV4v6p&P{kKK zgy^2NmqnX)rWLhrw?YDHc(qq{#bgp3;;trXgmP=xEwDl-~UFy$RSs(iN?4eMo z8nuU`XMwc7`Y5zfvpup3{DU1*7xE7_H%BYE*$p(mT^GvHTUZ`V^KUlwy8c1uKwu;> zEBajEIB0ads^T2FInzYxeDJaT3Y%lR8N^b$Smh&ct}lrtzxRu z@Zz`20wdrCw}i5(!&kDd<;QvrgDn zPT)Z+o1}r3))OBcZXfY?%SyDHn=-fBM+`6GOx3#3y01ih=wPa8(Q@yMr?9$=MVP=t1O#f8 zur?D45XB906ng%Ly?*}9iTq^)HKL1#{~;E5kr)B_$55HNq-(nI+G4TB3J#zq z=_@!M?*#wO#0kvSylY<+>{k!jHycs-Namm%Z_9FkgOO{Q8-YMubFql5`>W zN&aB3COv;aG~MA`eL=E^eWt%iMxy5@bFPCg{gVwlN7G0`re5RO<>RMA`b4T+=Sa`o zCiFNNNTYNR|8~#{s~FINu5d%p*I9xPG#KfZyN51u2Od;5TRn4y>qxFSTL!c|PG;T| z4Fv@ScTV{T32$z>p_ppAe5b*>BINGVsfrR|GJADE@VFv-hFj2Vm{-+H*K?v{;Pzvw z(JEfNzUwPw5_0=#yD}z^#{%V*p%l4$yA^y#Z;Li9RE%e+frM%WTK8cs_zj2fQs~W} z0(xqjLE>ducD?rE+4k=ptJgTFCs&;TC1k*g=dkZLGjrtH+h9ut&kT}r)Y!wlFf-J* zp9O1MkSP$BQENl-@B0*Vnm50)M4eh#%pc(sZ)Kn<%c_%ZAZ9Fd zwG=YqdB$wql+x+cVt67*uPJoKvf*Tjjk`$IHHw1W4GDP`li!1@9a}Fria`Vm@Jj52 zZO@`QD5m@t5i+MJrO)O@j>gr(pDlqr2F==`8-2&Y3^*7WB7Yw^fXW<;STT16A!{3D zUm#&02>UjGmwyC`=b78638OKli@l!Nn27+<=Sty~_KqLhzic7#mdK{%hDk}ij5KjE zS4ISmFfD#mvy@Kv8{r<0+=sW8UC7UH&2NtApocZDsBWRxrX2 zl-*y<6$4Ow%@+#YKRPuQc{N!oRS`>e$t6t+cG;iq4wNo-=Tt;xKE0k+ygbt5*!Cqt z@>nth=O2zHOppu)eEwd_HZ|ZxEifAOIP(S@xSrym4ZTyr1Uk5?pWgXx1P;VmYB+dD z2p-$&j6qlMNi-zG=@7+l0Hi#bn(&cCk}PrR(=&#HM`tlNb5T;J!)}@U+Cv1@$0k?Z zGjk`V`)hjc8<5!O+koo2WY*3x)p-ZEKdSt5|6$X&u$kBLz^lzypdM36=Wf0g92WqBI%L7#%Ula=Zq5nbR^@ELLLZLI z##&GkNsgQy!tN-0nakmrvWvf8pq@yQctd|{NPVW4()op7=R*M21DFjAAoMyuhOM%X z(GuSfmPVL60%;_v2TXTipQ^jFuh<=j*&50JfmvSAA(_J))OnOzu6g_ciJs)80l^xj zb|nP7{;g4XxeG~||Fj$V1UDOtooi924keNt-c-{SXtMQWH=EA9JOqQPfnW5a-<`XH zGM6cfr`h6u3#ox1Ptdf)WE`WR-U4W5oOS?*kYFV$pgiK^p(2}HK--a*Q zfGe#lQ;uJgwnWyenO0lp|A)~m8YT0&^>)kL&=r8!xYlIcb=T&24A>bn|J>lY%ingZ zb&r#HUDUAr<%Kj}BNP4=`iz&=_u;-f_g)|< zbg1-}#2r6sMWu`5?-xvL2LsB*mt=?z@!*ziPefH+>aGpZC^0l=e3;^{C9M)`X9u%opX7R!vS{V+Z*g zWO_^&*m+^4IJ-`&oPb&YR$?r6d7;Oyeqbxnp|}mUcbBM}A8XCxt8%-g-%#ux#Ct?9 z-2DE6@Zb$y!SH)$5zs~2O<9Ki26jyWW23;%o50k#>x<5UeZN8%{+3RdcH(jkByA6~ z3H=FYO^DHz#5!*v_YjD2O(C_#VI6pf?{s*~a{;as647@B(%$Ry?Pj5nbSg+O)TNF* zC*D7|Mk49hbb=n)2MRrr1n!Z#6G%yuCQhHli7K(V`Nd34VP{Wb#n6}T#L7xODtzCk6E6@wInK7?seF+r*X z%!Vd1PalybYVO7Q2E{Rms#^E-*~A4S>As8`A$wBA5hM^~s$QHbC}l{b7hf>xJ*bqb zsNAle-CzeRHM5iPKE3Bx+#0ByTvv>G|B1!&9X;9=YZ?f z1}w9{9-mAQF?j0juKNep%w|*)|9Rye#~8(kBC@*7lqTt`K za2)Igt^&N5GLz=wU34WAi${g8y{q%gw$JBs2nKx|WZ<}VzfE~VuyIqdTV3C}37b%b zRe_G`lCbyM(%|9KELZMXWjzv^tnYm9>xi;<&J zv?smb#_jLzCKzSZKzsGCc+Vk+SJA;mi@>N7iYBiA-bA|E$M$Wn<|o;9RfNY`A+ga& zl_isHae6w5+{qUZ{P}LhZD@OUspys7KxuZqa?poL-x4@}dD&xbG6co@dekU8eePD( zVWM??w4hM?>WBepOQ?{_d-G#B8%l)jjhSee%t~3!8*Q2lhM+58%Q(xZ4JCOHq~n2Y zUy0*=^r+MQdN9Wf8n}NO$YI^_sG_gDM4fY9bc6Du6p#&sXN&6ZM#--!jHqvQN`mIL zo{^@cp1Ec-H7XT|c%kCUok_f;B{!jbNAO!ew#hGxBdQo39c7=0L-f}ph$!DFKeVCk zLWlaCeSt5Sg+x%Pxi$pZNnLsH2*_A5>hwdBGDttuaE)}; zngf(@H=~hX9lZWkCBG9qH_6?xV}%}^gyw~c=qirhoi7BVEW`;8ASuP}tV|&%H-j8s zj?~C)SV=hYZ&F-ZtJl<}jO?3zLiP^31RdhUSU(MwhHWRqSM8RLP=Me;L$5K%U=%33 zJr`xWq)ZEkEKEDpU2e^F7HbK3e(}zZ>ExdYmphMINHSX$13eM=o%yj6{=AVX))0h+ z3q@sY9L40&_1BiQIkWY-sl|zp&yE)rap2rU91|zu^%X0aH~O5T7%7|{x^kC>tm72F zhR*G8=#YSG9_>@5)?Vh(fWdoxjiGjFK1T5V_Lp1x$J4o61jcUbR+wQXAHoF_V#lFJ z3Wql;u{X09D>n-IFr3K;IhI`&mA1Rh8s5C*r|mlV%I{k{O3U_A^NWO=0afw zDK=(@<=+G_N1oTV%E}m4FR;FF=sSem6MGQBEVI((Kl8KWB zhpUHM!vU(R5a~~VDOUiAmx;!BbNQ~0npw;2Bvcjw#R|q&+;{fq`J)Z02);RV(t(3K z*AskUX=Yg)p3q5ON}$s>@)y3JjyT!8A@++HfkD zJ?$zmf_4Pc)v_B!`B9T!_#XbFlIvpyBFi_Uz+l~QZ9IpX$!Bg}x6xa9A$jop*HY=? z5GXHvIPrJU$31t=UG+7U?Dl;;xeY7+%w*dF&`#yz&^ib}HqiBhFEJgUyYg1}7OL<3 z?imXgHl(tA-;+)Yui2rG7PFWxC||C(FVk;?99OWhVFTKJBL!(DXORcUkddnNC!J5y z;Iu?pWG&C!{wxF@-Tl3Oim_lqP3W%fU_}^laf42atZIZYDwWM|eXy`*{38 zk8(0}*u&REkbdHl4ByauPo6jV`{S*Wr4G!~)nX}G-M70$O0*$xtW$M=|wXq(Q&teWJJ{|Bv zvuJv>XRxveeL}Fj^*r?GG$aa#_=6M z&Za(da8o%FUsy!Lg~u28%gOSfPumBF*=uOUksou6_q68Xbd7Y;z|FDBh4Ef5*WF4| zfvU-C!E{hJ8x8$YUtK{9(h}tj^!v0l|!2 zk|exQF`iO#`o4QvERoLy!5^}->1nPzPq!J!nf`!i4(Ag$vktIV~KXoVxS zTd*DDd9yr{l*Ue03;HdI);Qk&0ckEPt3BuUomdP*YHlqILeKzcKZdn<(@M35X%PS; zLp@55J^VQdQ|656={Jkr0-iqqZQkoS2S(r=N!N!{?xmeqKiQ||J_cdf*1J*cy*?`{ z{B8bFuFJ|}88YKBhcb3J3G)$p=`{hUWW%<#Xqsmw?Lb%(63d=gg(+c;$Nmzs%Z4gfuu~u1nk}?YNUshIW;mPPo84xRhtOF^2xh-}K zoW#&1m{pK|zwkA^mcIVL`)nVc9S>zEO9!D5cWjPUU5ZnT8T54doeP3&XyIurLCXXbSQ|1!>;JvpTbXUFJM3tI=Q8S8*4kK>jy)x zNoev64E0swIj*3LwJ%z3x&ErS2{z+i?dy!RB7%o)WwLc03)nuT_RUY*sIW84J|gQk zV$Z=R{3pCXIv)X*;4aN_c%_BN7Gk$RNsDu7u#daf>RdC&ZqN<^MflcLSrr4uB;RfL zTsX4SJ65teQG>zn!ZuM)s39mfU7@R2*22VgVRaIQ?}pkc4|b~w(EsK13~B5$-)ik& zy;2 zwWa4)xLVr{t}(0;^bOb6)w~vF1mOPr1NYWmK6^v(U68`J}f+uSBpV1{#jG!-8FN0z-zk6qu9FJPmNuVxq)4yMc~hdRRS>;Hr4cU zek65SE?p~5E24I6k$=Bxi_yu^-f-TP{2eXRX}1?M#hjc#J9=sL?KqruU6&pDV%JSt z_jqaZyxl)YYD}Y6)>m)Lc;`ALx8!-9;mDljNOg7f=MX#S(_oZa*VWsYgWiMWH}#U~ z@i&>0;_JkKm+rKQu9>(mk@lJ1|QoTouyGKTBn3|w3aU6KmnQZm< zOY`x2!LMQ)ldn_7?XzjiPMWVRQ`9AFt%t6}1}l-Sle@d-k1g;bSp1sEjm10V@;!aV zKUNk*94?c)EoTvu)o1l?(fr!Jlt3M$u~D0|Jxc=R9GvF5t3|8lC0oG!jq9Fg)tbM} z2+JQu#Gd8lUB%;vE#6~A@zKdG{ob~=5|Yx=*1B79ro9KIf$Z1fP**s2 zyJlVL#lb(+RUjyPdrM0TEVB%$9CYy7XIC6DzPkOI(QBg>qgM89>BCsLwU~ADIcbQx zEzCjUg>&+bKv%=E0eF5SjF@Wro0oH*)Mfn*uQmPCYl3eMe~J~nJoUN=W7{`R`n{MP za?}G)(S;Iu2c2=p!o!~qXr@?_+ZN%_s#+aItE*)7TLlLXA8u{y*-G#hPMYxtg)Rm#& z6#_*RQfi#?IKLRb;GXk`+$?EgCEX(U)4t`+#2 zVF#Fla`u+`{o|MCFFpQ1IYUDa^78UN>-h1(hM{^39%+|#S;s1LdAu8P<8zmmmh{hd zd<_HC1|m7{%#|{upVKq5AG~CedX7{>%HJm;FtXq9wvfryw(W+-#;2^TtWxSZp?Oid zi$J=zJbqZIl7Hv+*-Dj=&?GM*x;a&2Hqx>gd96>Vq$x!5&-0#0ntKZX1X>~9(adEUE%!d+PDpm1cQr$ z-uMllOwDKLIA%^8o)}mVa@JRR`TAzhIZYf7)DQ}=@<|iIzhZ;(rJL)^ za|2<-bCSi^y(sHS*?m#b446+kVDwt2t<`^R;P&n5NI%x-;we@|btb5RfeuU}sDA85 z5o>Ghc@4rNOB45H74%fA@WzOK+{Opfg^}jw=3*irSqZtr!+*UHd6K=jy1ag3UuO#b zPVB?pf~wh&W{+*%OEZI4FJF$I#E#BHycwG=GS$*qys&Cln!EVte5Fis6n$J@+#6;sO@i123+Y zowly33Zs<5pU)Wa#W-VB+AVLcg!7fLnNrDQd+H2nwb)Ao0p;yj?2OqRJGP+qu$gl8 zAZ2LpW<^ zZ@WJ~!paTTPeSIb8CENx?H~Dx>iRN2%{ja6DtcsFfq?d*ezq1C{@C-DLhhjH>%27G z|5-U5QLvR{TuWbXKU47k$olTM8pHShCvDN7q@AKfNn86=6wy!`+JsU>d!2etLrKes z(mWw8EwpzuNLxyK(4HzC&ENIJ=evH-A6{NBFXy@M`&#eoeO=f6XiNlJcdmwAka^u* zP7*%I!EwH^u`%T-ee1!@%*>nDt{wJSn@rWB6DrrsGLTdzN7&CpB7TB`H_8N>xr3#* z8qvx5LQ-vYg}Xi%>5e7C?Im=tVP$T&s=d*3oQ^Ba702+U(qAVh}S4!)shzJa?u;mOE{45P22vQwhwY;+kmQyojm>b0x( z@86#lv~>YFvKN+tH)?&(wNtvcR4%Jv}DJA@$mZ zAjqZH^Kjky_LvQ*9PLgwNT41abQj(a-*#FvsJuV%$-$0%dv&|e9QiO^#z(xu=BPrc3ve{f(;R!0j4YGw?i=32(BqZ|Lqta`p{hS}a%aXMFwob$i^M zitmAou|1N?-mzHRUH@$q#K^10u`Y6RkO9^G+OhTGH}venghs*yDXT1OZf}VeEmEc~ z{Fa-I?HpvI!aiNAVx?Q{*+%S= z@Mdg!eqM`434F4>PYwq+_W?Yj8$;@gXjz!<$|+Q8;TY0%^-&zlr$HqB7RU*x87=N; zKK6FRN^s|NPWUrieY8R%dDzR4RLz+Pxajxpz2VL)NC!a;u25M?lkH;TV>f+$d&e6%37C~@r z;9}vHz#SKh-9I6Zd2?bu`P~^Rp3)jtO=MSsw6RpJxsd0zm&sDGf-gc;^*IsI2kNCU z&oDCB-#>O6gU z*`caUm?@b$b_DTw8bclt9{v>DYe4^Ft{~5FQuaxMU%Y2>J0~V=r#DMVN@7*cATB+> zemPA$`{MCsE5(*Yk^PzEh^7F9J%|XJ5aHqJrX_>2p~!5|q^dh|fKY|{nrFodhW770 z70aJ(S(z!`#_gDem7i;7~jlavz1#>V392}&m=Bs$jmB3rg= z%+u%I?eXg0g`_a~BD%ZDXi^UByksU2oC4uljXM%?rgN0-tBR+3hB6{v+hQist8vZmLK@C^HJQR3|C`h*R-ejZt! zMhJQ|u-r%gXSq4dCFHpXg+&S%{x16Z0af8T^b~RASo|z`pcW1a3Zw$vft{swEPcWE;w)ifGPV3x^^&v0W$~MG&lqyJ^g*c zd31F2$lfn5nv<8PTpvbzXyKFeF2$Gu;5)$IFxrVOnbBhUmoi@2=inywtF%3 zBBnptMYstEKx8)o4<{M&KM(KL%_~=uqqxShUqwCWeI4UdoTL|f>^2Q6E6QrBMb}n_ zAjNhv-xYl~ie5P%Mw0QV8O|Q>U-5_J7KO5k?k?Cx%&e=c)1(#hY5R1nyMc2r(%=uu z@EQxO@JK$#>|Nx{lIbBb8f&2xaCR!I{W-ftA22o1zI^%eriaI=tehP05aeMw4EdS(DM6VLK*9;`LYI<2{|rf|Osf z#To2_1^-Zm0Ig4p!&Z)xM?Q_+^Hve z>@7t4-*<9*SQf4cSr-=+JR9&`pZ&HDBXWm#`2++rKv?vih+>;;3*!Y?aK>WfX7xG3n9G^>gFJ#r;fKIjmw<{p)aw0tsY=u z#WR+kQ14KgiP(#1fg}00yXLb8H;Ipo##87RiPvI$vE1fwjI^?+Y;Jjsg60tEAuO)l z`(OHMf91*{^P;n$t~m(@ynK|NSBwhR461#xn%a$=ifCD@ zuz*1=szud!CW3C}3x9?KtgNPk&Lgh$NQ!Ms3kboiT^6(58Agl<0P_q%hfgCRYW+gdhQhxXaWm8DJ%ONJ9$8vK=M@0eMDELff~8#=2r0P z(avuNV!wU(|NizB;S|Xz6|OQ9SZ&)6wo;*&*Axxk|2ThUD-cR;ez!vSK)B76orq#>1c(GX(L0|B_t%!Ec@$+=xK2i8SvYN z0K}oO&2;cOLcBS$=C-yx`E4beQ4Br!OO*mCQ2|}A#109bzb@xCc&t-huM6F0xua8P zQcgYbew259WM#U`v{Yah(i>`j-Asb+`;{Ut!d;~Rlh|u%Q9}VhFMNyWo}QkDc!Bhz zOkKrA10p9*JQJ^BpahrG&%1#jn1TabPu+V%>c!6auxQy%f?m*c@e1KgDCSPoFwfpVLf z$fbJ(6T(r9ym{5K3uUC*`qP-K9laxt4dF^kpeR5fEMzoox>3*73_d8X90wP4{rZsv zB_FxJj2aTfpPg`zf*1cp@9kWUgtkHWgJ367N&g-J0Rize3dHNUKPtXg*yj;uT%!;S z7DBgn<8sw@cIBdz7;1_I)LX~dABdxU7w0a#S!pIl_)43rE>w?u>q|1k1vD1%%|drE;`6BB)ChBIU)*j{ z?!3S)%6o(4=s+$xw_2KC9INLgy2{7@-rB>%c!3O=X{&}7F=+T)ZTBOmcH*kB0Vm?m zAa^wvq(oEjd7+dRS?+`Loh~sxi`0C0gX-)-m?67DM5iN>Kn3?ia_n_CPCZ$X z1>0anXuP7g^uOc%aVR^KiSY2dVrf?Vn=uX$2*C#sZq>I~9>Nfv6ucE#mcVqx^g;g; zKXT|@|BrzzxAhd6=4eLzNjbULe{%Tzm0szT?}kV73Z2qKnA<}2r})sYpk~_{GjsDM zB0JJ>-Veoo#v3p?VOB~W88+^k#(tfkB)L$koOEm~ZRZ??V#Bk|OP}=)^|3k)?oZ9g zYc`?a`O?%RwGKQ&w3d#}I5+;T)`CiXUyCBi%F!{evz6`2Em-e}++|%v_4jHtLcjx{ z8tRPYAl!W~=!(4qw=I-;NDIY4&oeB*05WoBk5>~)d9&M&sNdO)4|Y;~58gc$z=$a( zE`17~czO2|<5$XFU&*$<$~o9nTm{A?sh}WC0wm6x9SvP3x6PF$+-vdlNcVBj@G=W$ z@*U8F#Bvb;^e}+M7mK{|72WY>T9U>h=-C!Ia0oJH78cELB1erVc+5&%gvQr2q&~ZT zIos(GlSQf!6BpOpI!lg=tX+Bc5D5f$L547^gEz>z&0I2(??*;MzP)k%vV1G%dT?yo zES|uRfr3vqC&=Ff%So+%-b@U79Wt08ni8cw=4A#pNtAFHD0}XWE>sJSd2{U#57L)q zJqr8yoeFP&qy#}qvG`5Di_yz|Jypb+Ng93|`H|JvdJz+u=w(Ywoev*AWQ{Fdh=1dj zo8tVMk_W*pnOERt!y_Zd@$pHvVbd}C1~0D^sB36o|3=Nck8m=}ogC@j3rFM1L})er zb`ZsM_-_h2bObn?Vkv=eR<4q#(Z+b+BV8kyN1W_Ph5ufqbY`LY>(@)oA4tVR0TCf} zH7W6QVM75J>^Vk8xN(2o&C#c+JK4_H>C1UIep>7u`*z;(KVLydM+d=1I@(Y65+q*A zZKxH=BHQ|4H8txAv$Ox4;!iopk<)Y4)Ppoi6EQS2rIt<6?+(M!l<;TgP*U(JFx&1% zX0SL_0)AV>J`6i`ESE))g~xzu4b{8^2Hu(WRqRQLQfkgWRZWewvH^@9st$WHVM z(DI$WdaP>{7LFh*M`8cg$*++rH;kK5M^syG;XQ7okL&El&Y)@4hd)vmGt``qBa;~5 zI(bxMmbuWnLny`FS@;4Nr;EBgX$a^l*+>ZB&9YCO55^3ULzRMzjD|s9vtB%n9BIH% z3+F$msF|PF_GKa9FoFUqeFu4sq?p*F#+Wc0U9~wr-jQ-nduD9q5{ilm-V4=I)zn-P z#*{pqpYt$jJ`Das&PZ=SMiYRM8rM#PA!cLt22aYdm94SAiRgDog1o@{(~~=0LTZlJ zMpSjk9{9cSXX&5AkmL1dXih-oqnC6oGGkXJ!wxn+k&Q@!WjCBRi?*?`aaKGo=v;mW zK&}S7p_zi$r9-CN1B$%B|EUcY(qBeY6BuZaR*AN5=Djm)2lLMNJ)_FxT7KKhbjm^o z(`T?JEXZFE9SVT%il6vBFCn}f^RFCe%FDHVgYEDS$_AY2($Z3K;`8I3<%$U50H!wk z39TYJrJFn1XKSRi`c~mQs&tEt##Mb8$f$350x>VqT*)Y}t-9<*zzu+Uo z!-?%{t&c&OrveF-9hIwOZC+ISCTHXkcA=Na`;Z3HF_3(JFFEoUr0x&cO%nD6Ppe{O#kK&F+)Pb@ zOoYh0qjNt_wgzV)6ygI+q@H|x%&f=(Z`j!#8&BRaTTs#1Yq-}h*y%W?Wl=}6dn0+2 zoAbtE#)Sb0A-WRqt4F|-or6mQiP-Ps8XJdSLiq%bLkQWSlpT!L^o=`p!N@L{6hFp02&deEtK#jEA8pir)K`G2*Lay044K!375CAtH70B0MXwB z(SPpHR_4WCu<$PW1H)q^Fcv$aX$Z9KOXDrm+!JaBh^lgu&-CnIls&ks4YF4KALg;e@2+AT=_h^B*Vm3Y=7FtX|1uQ}iP61DMkJ zVU@nFKYPlf_2lNIAVWC=lK&4kqj}_?#>VF5<#AHED+I869V+GWOHxJ?|2v(+eSe*r z>dc^2BtRmLYX2;1T>SClTI^qCAaabzDa*^pjdl;{2yr!n4<~A1ED3rK2{dOb+Wa}> z3so+7y1&gGNcxX7uDZHPHMO*KDHhqRSzTGy%_p~z<|7T&+@s6t0yv}0gugr2R~)ag zXwn&`Zc`h>{rTnvYX@cUr7A}doXi>GO{&#p3zvp?V5~zyAOcK;T#nS=>u<0(RTa1m zTA}~3#Ru~4bMM)Q?WNm?-f<*vgAhlJM#@CNsa#@0qJ;bzpmiq7dG=*&YspniCaL}y zHfT8eBo*?=8;*Abv$vmzJnV23+>NXSz^j0p$<@~y?B9ufQ|}8G0JiM7uX@n@)aTEi zmr(z=p;K5ZV_Ky7ge3#*xdw?_$uOoAl zwJXX2x*e?H21`c};xKlOz;PykdSg%jyVdnO|FkV4bRi&?Ra4_s)gP+F?~m;2OK)M- z13(G!n!5;m<`pOgmu$+@X9W$am=mOo@0nibA6vwL71ddUSb2?;aJRBrB^AM8>HwsT z2UiGC=9nK7TwQ7S&s!ecYlocu-J_s{PJIBda(w?vI#@FF`9L+bzP`RJ&xdh;hLSN~ zmcFOqV43gB%KFM4QK5+2;W09{fqB_jz1U_ZeidfA&lPmcpVY5I1OdbDLkUCH>s$W$ayqXqW7Cs7>qyHnBEl z9x@s!d(D>v9xP)I!|7O0yn;}To!rRj1xTJ4oKDF5GX&{r>PV!e+>H2H;JpYvB(X6u z4dDKGsWGw%x~dDEnTCmLDhM$dcD77TM$>zZ}VPt(RpNTBBPi#)NhIRuHT-QXRgl?sll znCQ1tqC_Njm>DQQo=LC_+>5={#U?NNUp(c%VPiAR-H_?Zn#(XMl=8Be*;>O2MY=0# zlsp!OROIlayV)=Qyy>x;I7gK)*_LM)5gl%83yI0x>e4Rc7XKJ6+W-T5&X@s$3jkVw zLS`4E^!~pp&n0R33hirpjc!mg3FJ;VHeU}IypJn7r>BBt2B}ED60Lr z*#l1iW&d=9NP%KXf~82BEti&#!wp%OjvObWxvjSDa~gZekWG2iR=V%T159TR?kr2;}@%p{mr+Fa08=_=Ygax$lL)v*KS&^ z^;#C^yQcGTd0n-0{&R>KN(AWr7a7$B06puB93b3zH9QevQq%dm{lk|lUnWK9tno~W7?jdXprV?`5pR)h~T5fDW8m5%b}`{uXjjVTlp z_2izbaEZ84P!Tr&3#&2n|HW$Gt)%K3RV9yWU$}rSugj7lzlFy3A3uIvcJJt>-2f%R zJR_scjfmvoJgkUidG~88*N>I1Amc|2F=t*?vA0t?FlAt{FT`h%oDylkXxtLVQFZhD za#In1-`L58(}ZnfD%bZPi{J8}lwocs{u0EUN$!S|OO8FLe>w+}5g+qm_6 zr1G7SX;YU)eAjK6ZSvSdV=ORPqKTzr!yfbo<%h-!5#5u3q&8llU+r*OT-FyJv7Zs^=Q zh6IpoT%}&WpYF+mXp|H;A-$~_I|+kO-|W&tE7i1Lq)RRh1>BJgTKV{=XFkcnX|_j7 zt3fyIH{QWHM#bBq^HXj{fA?(Pi3*##K9SqIwQXC*rCZQNg44%!H>^`)xlN<^D?X*9 zvLFiDp{lsS#)rDrB#_}BRkJD996aEQ0xfvm#*jRR;TTF`aZukVb+pf<-^Pq@ph^7cZoGK~gtd_?gNmJCxX`7@yZ zy!R(6=bm`T%-tHzd;IY4$6e4>cXT!Lj|EpXRe!E5g=49wy*$OCF$b|=iRgfhofZl< zXrX9G`BpUV4*WPmP(0Xu|BMx~{H1DpaeXmLZ>yItss!gTe?8Ixe=4d;^x)3g50iHc zDt*xpU>iaZxR?NiuN>SQe_Kbz`^tQf+{b>DXE68WIUC`X5?V*V1X>p^EdLTBBaXia z85KqUoHr-meq(pK@!Z$_$(zAWX;>}eFKl?2QJ3q64ec-1abR78bvGEKWjbmHw>QR> zxBHB#6WZyO8c05CYMPV4?j_!L4VnL`dv>M(^@Y9`P%TyYR$f*59y02<0J3fq{ImRV zC#DCjiM?biq24}X)Xfv`W*jtcDq#CGUkfKApUBg58$ae6{JuPL{;c-oXKZh}5Bw(Y zL|$jXKipkWS-d}`&zcJ9_Olf?H#561-kgwWUBqWKgx8$BqCRdX7d;ekN)*nYsKn&L zI7~H5B-gr|z@injxHO{u0o>Oe%0nL`CT4@=O6lIQwk^BP50u9TFeDl*@m5p!yB~x9 zP732-WBWwhH=z@!_NK>KQN_@Ezw;<5#GAIzq2EriZp_onn_iHS%u94`r4~O5bL_PZ#DPk7zD2#9VD&9`Ie3y+sI6Fr*QpwxUC77+tI2dNbgXtn3{-jS@%j~h+`zYO}vureE|M&ghZ#6)&f2ftx>*$zk96Ij7X35HaCDYTaZ{EIT zc*K|3f}05U$bqh^El%yne(RkZtjN)ZDs|zFT|^tIt;y9<1AjBwQ2q1fyk+ZemA{kj z9&NeTgDv}EI-I|CYS_y^2fBx%2wglq&=pGxs_JUK@2JqxC>VC{O5RZ}>Gj2Wo^XxG z_wJ$gy_{$SW2sU8wsJCUE8C#Ys=2wm#nwYTxo4klhEaWd0!c6M&PCH!Y*ypa!CW7c z^6W*fx1Ftb1LEg-WzM$Yf=bIrlaGIYC(F64 z9w=+WJh!^aMoHX-$S-gNQ0Tt=r#t z$wtJ@_K&z(LzIN6%Qq{Q@8g23nOrv{4$&^y0iOmPbmv{e+S`t85a$M&B7f||pOlwB zPC`nE{S>Rvf=MH9OXx0^^#wArOYUH}%X^Hl-Quo zNkpleaz&o8cUc*P1aPz_W+GR+!9}%_$Hm1L&}rLJAAZkzsXkJ`I!$T=Qp;ko+b5$3 zFKVE=jlgA4J;nXGy1MGdZ?=)nmi^u0)~nE#j+oK>xXEu_UF$yg*HkHZ-dmDCe=roV zzUi9?n&TeqboAP_YahoMT^g_egSDYLEBG1y43#zO3$-1L1U^y>4duCFn2S2j%g;#w z%6IIYwq;Su(4jzfi{&zfmLn6-{ZMqx2Y-d#d-9Lw<#>~+UBd~{T)m5&y`;NmGl0#5 zvVTq0av@|PgRD~OT6=M4dk6k{DdQfHlO+ z`eh=4QA+HlrfH!0Uz-tc&)B zOq*_ej7Vkjl9G`Tq)ArUVX%R~_Gj=q5xVHRwc*LmCNzKG#1GsM8P>XNJ~%3(Ml8C80`kFd+9s`LjVg>u;O(1d`Hta@cS}|yV@~lZY zOjOY!g&E#Xa0xGlF1zh_2%_xX%ip`erLMyf9u~R{sf@{&>8C+qK8a)U zs2W){by6zE7HKH6z1fu?@y+MU;&X8Yg+8MI25-k74UfKU%+-Z+WF>4}k>R7c0&;xF zGSdpftIr1TOHG_X)4@@X!^O#Xq5lDH4Zfv;HFc|Yl~>I0z=D7M?V_?ci5i-ei-l5le7y9FZZP-U(U3> zA4)Y&YGc$8{n$6xp`(1;N6G$0qtOigRxPXL53>;&p_Jq(w7p}G-K3zrDM!!sMOi1P zxW2Eb7?>X?FJSSb7OMnOB3|VMKc9<$>YKi}fZ5vB>7rHlp(;O4^+^XQsAY(+7-{dp zz1IBnT1e{j_{w!2uA*|6e8GH7ZE%-k-!Z=WbZGcj3)z~w@PTlyH08C4m&^U`gDKFK zUJ#o{JdH|8)9zUz{ZV(KQMzw_?4C&Vx2rOry;tW_urXO^tvtU#rnuj^wA)9{!aGmG zPV&a%=ooutjMjSxmdah9A!{)U91K4RDPYtpoUh#WT^r@u?k)-DBN4P8bm^C6kF2od zyn|$!-O@uPu=KhMkKL=?f|Q83RBqdkGpISj#!gBdoIlZD7!_Wx*?(xZ^ZGVKp!~(* zhn5tW;o|zV*)($onMmcT^DgvdQ4k`HqP}38cOO49@YJU35EX21BKGm$PVVmoy&p z+d260Jr{iBzfLF2dt>bids&(;1L8dkS4BL%A^QNZ^hR>FxX#LuY>?AUz+!m}$VVx$ z>~P2Mu)1Gi9I?YTZKqjtzT4KcTr2!q!MIa|X^`dod0DE(122Z|4^x|5eFY9nBNVzynRU%-UY$u70QbknV zZ(IIOwj19e8YbLVLyL8ajerleEpmHjHghVKj9>;h{j0%uU4}&d&_Tt)VrRj>8S7X6 zY(GblF#8wgC_$(bl4sw6rk=9wQh+s3K58kxP))t^iSMKvKn_6QU(Kn$3Mgd`qT8Fx zFhpOd${KRYuvW}e<{aq*pPSmveq+@@D7a-BAmyE{baBKscNb+gQ3 z)b%)ppRcsI_~XX5-lO{waf}R-+{IX8zy3D0QGpk84&6z9>31T_(f1Q-AX`b*88@y{ zi@|d5E>-)tc_k$#LdoC`hO*{TeynOFAMG5{<@DToIXzRE zy6&5;uWv;&B9?Zql{^+lvupFjm?*?^*{~YuTc`e8pbEj%>)Z7tP_HPhvYizy>rw=8 zqh6DfP`koe_Z2z5%x_(TE1tBET~5pMv`;%98F$9I4=7|43ybX1JritAL(4Cla@L`E z;jwo{je_U2v2mR`CC}IF-{$@p6Af-ifBP&hl17mj63E-y!uLvIOoA=V2iC9=3zRHy zTli)Lx&Tb-_ zaX!*?eb*GEz2I5&-Pv0AJ934-zMf3I{LW(*g-On=RsZ7tx&AUwiPfP1os25IDTze2 zA_EGZH#s?7=2Xk4@zQjP#7{kkXdp-5r>i+=Y;LXvE%~yX=v>>eGG@4A1=g21J#_Ul zl%rOhz6Za$jwws4DAnr!;ow;>#DxSVt7Euns4L-uSS%_(sNe^R%_$ELEngMHWU}1IM?WNV%qt z;!kWZMxwWTum$pPD&dP*blG#(-3L7DWm6aV-bkp*OPsW5T0#hWARkWyw*G3F+3)9| z&-vRUJ3TXAL%u9DYhGY?#EUPU^TzJJT7OHPQa||T&z~iAo3_EMvJ8fFsrD;p~tF zFLM3CL>-~>(#&M6niRf2oC=QrZ6jy?{h-a*_^F|e8*S)88EI)lciL7d$M6SS7hmS} zYF91TEpmrYwZ{zBDnwd_zOMNaz)-=2e|WE&Gj?Qbe0(}yRL$rN&FJ#7OXhIz%5L8h z}y?;bc{c;!LjTxUIw!G=L){dV)h%-=NtFyRmHPvg} ziaMe?AFy^acEQ*mSEGx&FLHRL*WJiYrdQNH5bg-&JK%qd=fsJlFN998kBqQi7qse5 z0OqoAK$(5Q7l0a+wi{C7v+(*&7Zb;fOa{{x`=(%W2T6w(#*V=CaL47zJ}BKJuAh@9@v2se zuRvAq)-@&vDG7-ukjX5uu}lzRx;8O|>-TOTEgiH&S?41c7Z(lB-k(>KggeCT>=U2( zJ+d31M!sTE=>P>U^Jv%g$i00Qat335*uhmbf=z_ia@zb>1eb;oA7Oc&-JbmfoG3H5 z@53|JW)wWOVK2|UC>D&xzYwB_#vk&2fPUY0lTFBo<%AP*!Z>axL9LNasX=`f9X5ov z|C%h@C=zF4Vxoh2Ffem7KWgYPaJN!X?7f=3?jorf$nz1OdL!7WCB$B*Tqke~S`MBDpQ6 zi#k_bgL%vCxt~xsLF#up*__gMb;d zp1rR@n^`)fkzMjc)s``wvg7Sl3uDBQF<(Z)G zSc%q>wXU^e>VrS1Fu{)_5m4(}$ z8}FWM`nJm*syL2OjaZFTD%cdYv=rSYPS`{LI%XEGEu9PoOO=bh$~=fJE7-($C_05% z)~$X94l*U2A$Ts@eW&2sDsE2cV@Sa}69YkfEefIVI>cVKdyg`(L0pXCpP0O$Fe&?? zSZ452lC_SsRLM%o@a-InJr*A3jB4_XSDg9#)2HS&ESJ#1xA$zt*Wmh~cC1($6Jz^> zv3C6YST%JQ1<$o3p?5Q1SMW@VwtZRKTA!yY=!xTzZkkVYh~@8OGg&z%+N{V^F*3;2 zvuxvi!aZYd{##1OytXB}>3STgRwUDO2ik4H34>Nz~d~4F&&>$ruht>3-VTKjG zn1FH@l`mf#{cxz#1+#bJQF48>gq zn7z~%^G3))LpqpKn1%Un>$x1$%no{ugFP@R{Q8aBoBAx%LX-J=TcUltSq{PKDUDJt zt&W8qLt$)E(j7`Om2?Wz+0XCne3!1F`VS4V$*2>4W$*_7=A4Vt4eSb?*X8k9zGwmi zRZYX-HJnA+3YeD?+0`!g(i<#QIoi-7UOKRa0&EMZi{YY$tJDsndvD`U9qxzAz7Yc7 zo(r3km-4M^rT>R~O494PzUC=zxwDU2@w^b4`#b(+j*5qwu3yn_sD7ek>pvakcB&?H zw3A--V9(dH?(e^-%_M@WO%<&m@j+7=R<#|86lA|6u^q++EGO5nVXlsUmc?|V)>5gU z&%tXea;8n5y;o@9Zab??*3+#Ga1%!YbPkSjlhv|wacKc^Ht7Eud8zVz7tb!Z2NLdy zL+!E1&_POk@qHG5t5(i-eLI>uQ@IKDZkU%bIxs~i-xObu?V!H3so~a4CU5pdY zYHAoH>#CLFPdW1Sm%58`DdD?MZjHoce78TxZ)SwAtkwP;5XU|lG$XtbN~3&Vpae^IhVS0&z4eh#81cF> zl(c1oU;O@)E0F%gGm-24x6|nY(PQg#;2A51FlBp~@0X4$i_AL6#4D8nbpO*gh_@dt zmzkmHVJpQ~&J6ze@oMbMj$iyHcGR7tB=^q5z3qMnm)<$l9^dN+nVunxk?nQ-G1>M~ zBg;J1d*<>=aV|$5qgO_=N*LuZKY#wXXjS$Z{XWpgJ$*XK`V2BsAHH7}XNZfNSgUw6 z_h$(mKQqS*7fJn;lrosUzUB(u1$NDpztgKTpkaU2r)(Vh{%7S6)WVE86!PRM8h=hW zU!l(LRtWYkWQg208c8(o6J<2fycq#S9SDG#C7A<_KB|aSlCL#Frr8=SpZT;ztw(26 zUiz;0C^1rjina zQhpqcW#?A#c-Wk%*qft=?n3>C+Czyx!6Xu~s1>-n;xy#%n z`aWb-Kih!YdV1u4)tfEgr5I*PJuO4zX;>NY3(&=QEBq_UV{CdgK^mDz zs1*N(q;yZ1C2-->vU`rEw6bno`n?G#G1YC+awnJ6+0kj6vckggsSoQ>-Ud^fT8P^S z`sp>-dR=BxW}Mp-jx^r^;QM?uCmlLlm$j6`9E4v-^m8Ta+x1=cvZdbE?(Hmz6O^pG z7)zr-g6qH6#h^_v|AY4zrmYgYir52q-6+A%jXP;_a8I?f$$1kUbBDg7N8E~DUw4ar zx;&$h=($iWKlhhn_mF7Jqc?j1-5v9zrYxwu>2tH^ih(Xwmb4JgFKLFv%jZ zwpLR*Ox=GLx9GKyng}SbPPori{#o|pVHng5 z9u4!+zh_GlZs_Q=iyrKuDSUBwwxzF#r&U9mnmc}O4 z$M$6Sb%p-XrCKeIKzECf69!;BN|%$2rWWfV1u<@e87ujcd%TKwp@ep)Vu;A>2PF`WJy6t&^WG>sb2|t{bn!m^4_q z-=p>Dpwal^B^KkgQi1-YUhOhV9!0OH+xJ<@Km<%%m)}(sKZn^atgGuVEWZ1!;N~x^ zenTk1EGxG}r?a~M^S=;aF+2HMz1Ui-$MFQa*~>PT-_WroySkW(x^@*Bld{Aj_PytL z)B;Fyd5I-l&pmVc&!4DvpQa|COvTFe>0=Zx+hCHk#PxVwv8BB2ksKZxY$yL^8ENyx|VJP6b>I%cpaQH@{ zo)@WBD3{5!~)xM}npet`;l@)G|*b`Ok_7irwVgHOK+yTdgnsA0$PnR;kr z$sU!_8-G&oKflMVJiw>~+AHm4+Jfe&Hs06;uEk}D*$D;2HuOHp@cd=mdEtAJKnabk z=kmlwk)=wY>&8@$`!oD9@-FIxeB_YYnaT$b<49%Ut#LtXZ+lj@jbRVztlpO1CQ|Y| znHH>;(vBygo$ITYB^`?6wPD(NUhR`B(OK?=5F0U@hMOJ4e0SqwPQ3HLwy@i^vb37| z_AW*@Y(&v}^_AWGh}v&mns(3DhXNSH)BGO;m41G#emZtwq@3gsY4=@Em=tku@L^`R zq6=^dA>-r0Qzm$9BT50WM;kjbp1)PhS$}B{zm}b=tb=9}US4&J53TJe zckq3A86(_B7sI;#{K#vS59pt>I-h4c0TUu7rNPo)#>@%xy_7NZ#g?<2Ylavi3{WXZ;BdP@>-aa#Xcn-h@;s@)*jaHjRi)XFcJ z&gs-=AL|_MucGc{Era+atsKg?%!i05JWm1ZCXq}H6a}B3eDS~#5<1xgzr7F~8Nfln3oc4NfUs{Xu`iz9i>ubm7Le3nuZCdt+F%X#Vux0*l z9~%9Y72hiG4@1kI?^K;`Gh;QWubG5Smm9jYM=(+=bE+D>z2&))y{a2&|L3ysLbFx0 zyvL_U{2C@ZMC6^%L$~M^jXx8)*VIN;8Tn#(l{iY62#iaOKuIWt;Dh!|4Xsd36AxED z+i50%UIK@!`|-GJxY($7w~{SQGPTQx4uK%vkLv^F3Qo*d;DA{(r6lQ)HLN|g4ssiG z54aY1T#PsWTg4Nk%thXBDbzcLQ+D+CtwfJ`{T42*@H1gORljTAcw(=tEDR`kf%WP8 zGX!!!3{bzv`_V>?0{%FY`qAMdL{wLvo=p5zjqVpTh5jNJbaYZVWE>=~*amX9(uLEh z+%Go7)8ibj4lpmFsq9?hUDSj*OyFlh;MipV;KJ$IV!lAf*}w2fe0Mc@1srmI-+{|K zr|$BWFEz`vT~fUX!*Ej>9=4(Af%%-5QeWF&h(&Ook#LrjsvpM>`<@lrEN>+j@1R#H zGAvgQ?firU(kM0HS%0-isj+Ajv6S($C!(U@2Li7!dBH3Ty$b2oa$95zH0}Qo7}H|w za0qCvC-fxzkVDhPrarWj;I@Z{={KS9}V0%PSKdf{(`Coatyg*y%YkSxGJG?jsF zEY>P`EZgyJ)ig-y7|;r{ETN?2QXqM@^YWxD^P2S*S;&g&;pxnixm$BOK5 zS*hiXh2mz>Z9m33l%Ka_fNc_V!GF%N+wF|B3Z{Q$>$}X&#gy@^Ih_ z8WA}ELsNaqznP+i*twTYHQ#DM{gC510YzKh_RI~*qB@lji9nakhCKqG98GEhjD%+P z{eF-8U6!{=O}hDL_Czq_LSD;&{cO21&nKC}j8Nxq7VEjr&5IU;FnxLe8iFMb(sDLT zoZo&~G_ic?b9yPXD}GK5P70CFDdffHqJ{exu2Nb11=wz!sPQHX^w>MuWpVe2b>`3Y zJE6DYj!gP^I}Rrnu@v7Q4)930O&b55!dRpH3@uE$agy7^B*<+`tnlnj<*Ue{po=4} zyPOyYm3@|)WYRURZc-zcPD6&pLKZj$-!+4$mFYTZDASTN3sH5Z+hGmVbpD^$S@&t@nt1kBFz^>tIa zEcP(v9NMH{{9QxMX6c?t%Oj~5780)|y8y*ADfi#DPs28V*J!1% z@Ydpw;s@`a)A^294<4})q+moFYN2Ix>XDi7pw2FY9Q!oDV?@=JVuxg~Egt!1dBBoQ zsT;nRWd@%Vx-_bHf-JB|KR)i&O=6q);l~%KWL!Sbc@GB!JqUfWoo>c#BWM+yy+}7f z&yKr4&sDkct1W&VkLa?EZtB0^wH*0#y67SWW5Xv%aP=eW zN*Itd0_6Shji&#ssgd&(K34-tE{5|;Q$IjPu}Hqg!n!SZ_v)a&KtD@&%_%3woc_Ig zd1gc&lwP^WDf0XMo|O&#;)9hJeMJbZ4=Ib$8tNw3bA1o8?eD@hZI<1irD6o8pXQ9l zX~_qbBfDN57}P(qHgLBk@7KG7$VnVrd0EVeOWXPGAzb6p=1#JL52It+q#J%d-TkS& z=dV}#=bv0CXI4$?gdyXpxS~VQRT>0cr2^W4XB=IcHW_Oc8EXo)`to?_aHsg_u4H2nu3&_IcG^M*JY%p3mXp-OrZSOMGjmHPn;^+r{1I`p)^_zTuH7 zLI?~h!ABzGn&^2+hL{T{jy^C&*%V#=$BH_H+$p))*>}TTI@%&yj#58QRgy;NM42By z7!D{pdBUQU;~JW8rf}^dr}=VOpXYLtUd5n%*d}P$!?`cdC1e?7f*1}+9Hb83&wnUY zuPLF3Mb;K)HD)kyyt2h3cCdA*!SHi#eUpIJPavEr8PCo^E5Q|KXNjLDo1e{#k`c(@ z>l6*)pw6)zIFG`Z=|5+%7Jr;Z?ScwTviqxrYHl)gN1Ln`ejlhk;{5B!xzwlRrT{{v zF4yaAnTNhxSR-Q8!gk_=*m1)l9i9?=8s*Jl)m1M2n{ zzUUZH{rM&5ooFwe>E$b0tbIo<=QFir4aq2+PAV%Wc`--7jiEtoX+f_!X?ZWD7Lx^r zqGANyFDvR22X~5yQr}sXPKo8(Fyn0Dx^RR_w4#Nimf@L@nCPY{o12w&jl*bL`B31a zOFAd;I8A6t(W2u~pgXi-U2IH4`n2Q}JhK`r$@9EYXQOAN*YIq?soOR-_1+4P?W{;c z3^j%>t(t$hPkdi>+kDXV^!xYAIR=kWPngRKUA;^T@~lEIp=yFq_tNuz<5)d1!l}$jaI@BU*3B? z%Nw7bBVuQF@4V2c;lSXd_Iq@!vCK-{$37Suf!)7aD8p}V>%%?Kb89P*lT{Wq<97G< z_6|cWT4;RBm}WTs2?G*zhz<9^SQfSOepDhfV3nV;XF5Ge|G0VN!uT`{* zrs)U)sj^bkDR!O(&Zgts+}8Z1(e<&oI~ILKdxbv!b%bMEABWIzfDQUn`}Ze4rB+-^Bc*KR?a%Zz&yDjRrb~@noqCr}FHn~yEiK(6 zlX*?l_qT&CY3K&qG*f|prKbrM<5p{+Y)F!j&$!0!MW1gl)U4m^gHMv3`axdR26B}2 z`>Xf&Wh%DwVy4ZTtR!J^$ey!~)1r>U!$$edshHzHAr76=X-v3fKdx>|pJ5;R5g5-8 zaGebmf3iI^%zpsOio5&u{Lhi3r*Lvw?~P9g`;5($w`H6u%6jbbAsK7rxTF5bVxw;} zY5Px-)-Cs6ctfsG)URW%zer!nQ6$#Y)OTN zLiR3%hGcVOlubDH@4BhayYH{ZqyEc%x#sh_Ue^elSTM$S?}4CdY2`#NcXV(VsPMFh z6(E718g{}9j=`n!`)3hF1bo>+B1$=w(8ol$-&$d*&}_I;zF^w}BtED}FZxZ!^W8p> z_9t4Z&KTD|qT}*g;QWH^nJ4X_P^F+aoz&pvz^m^S39_emo%(QL>8X8&O8V{duT%K5 z0pdE3*4}!QGp0IHEXpTg@2s%n_K!RkhnPLPp06S7?ZrBeR{X_6D5m|_fos7S*F;D; z$7-icLvlMDCRP%chHMCgw1a(0{;o1VhyDunlY!C=z?z0)`KRpdrGu<~4aD$2$h|aw zk(+%kdkbF%nN>@HuYR%Q!{XJP2NP=Dfu_NoWugY2B%0~NvEFE#YcK|bw)F?3EqHy} z5A1sUJ@i<5pJs>m;_O%%2jCVfxZag;N8kVc!aNHid>LZT7d-flW*n7HRAVCeAHqz* zA(Hm(SFU?XcktFd5L2))E!_TvN24-4JY3Cl>=p~a_7cES~{fxXkd8xBkKDD^Z zO0Gv@;ZzMuZZqA_TOaK9EQeL;EA|9o>+7pNqqh7mzhm7;(sE)n>+_;IpOLyG9WhV` zjHp{BUgx6KcXqEv=uKRtCx)*X@h|tc%l7$dZ^bIeJ4kNlc6OYfuOeL3eNB-#a>- z=NE3>gt-?goJ{Et*dK7tZ8O`h1;5|cb;h&cHiDoc&bEhaRz72eC2`dc4o(+xBQ0bA z%xMs%zYHPd{KHGn>@vJ0XID~b??=Ea2aLJ{0rM`)Gqq^pZLU>k8_{<*WL8K>$fHFy zGUudoD>T*wg@>k@H-E+?X$AA=n0)<0i z)M!QHu4nLh6wFsxy6pJ5LMc5KC>?j#?+q=A7r;@QxJjyTvmIg2v>$ojd|TSc91Xz6 z0ZTRygycw$ft7k_w`A7r{$3AXyzt@6HucXH$d!tm;i&WD%>V>oAKPFt&+R~{!mp@a zN=k}leU<4fI?CT<&Yw@8`2|~>?VE#}9`Tc|H*I;M#}?-7?EEt*0NO@-cb)-p>cAX_Jn6p#IjbX8)|XxccW5^FPy&Nvr0l8dH8s5gopR4_X4KG z9F9|?>~i910a6SMH7$BH^!@ZY-;*oy+NDO^8AM|NfljM2p!z;l{oI@BnbxQ>J84ziHP|wW&(}5Ux(L2 zt0);${U^uW&Ut15Q*@}Vc}4cTByYGXjvy`l&?QwT^X9$3e%B0@LtJBg^v6fuB;FD< zYTDrKz!2={V}bA|66bg%78D3;?Dt%{%8?uZDM_PnzqWNI&6D*hZ)cE}KV7j`6LVKY zaPnCz?n;bwy+f|gx41#wy6R@c5ZzQ^A+_) zDC;!S{f-R(X8Pb#{#cSW1;Y-?O=w_v=u@x~=CMIu3trN(4cY_LQ>=9`{Zt0K?6S|? zlcF)uu%SD@sBVbr&NFt_!+xp|-GofWC5Vp5R;sa#w`pal&; z19(UHsU9q!cSy4f@XU&_v0}^Xem3D3gCnd8#sO8&%fD=OIZfY^UuDORJ3Z%F#Yi4m z8!0DroxP+i&hzrM=r+n*<`C-Q)o%A_=GBq4U#%C9*Fm*c@j#3G_>41r)fKyG;k0q} z)At7}EHljj)!hzTDWskbnQcrXkQJz|;}tj8|2`+R$`2$tS5zDI=YN}>ouDg&m1g-g z&Yc-}Jciq0_=OQ)zxDlan72(^vk9{wgn^Nds&BA?Z_lO+-Hh++tr1(n5Mn^`Qen(sZVC_r zXQV3@emN)=frX46okg{36j;Q+?uGwBIRhh-`wHfT<@mfB!ZgmF*?f&d-e*zw!A?2K zi)?YPje#!@-8dCmn_u+65&BXT7|dchwJ8hfKQNE=TGlKB@L9_c;Il0^3>RRQ9-Kr2 zoFrT!;GOkqJRfhV!mPA`1T=Jf{A}Nes`~!rhA?!pxW0X20-B(#e798!mGwu`KRraQ zjOk{Fi4OR+hO`yrT6tJ&NghLM39qVk?3$?K-_OI!eUmLCi9YZa*w*KL zl#ZCEvf!wl=8>&xA9y{r!S2tyxOjQ>rC}>^B5wPC@Z=Rdy)k>n1?15^J=}`fL(BK? zcrfs^2U6_%sk!zZ!V&-cfaiqwyywV9PdS2DyL?=awZ zLS9XI43WYkW8h&zg2*_d%yt+{=qb%uWdIyh`jWm!_D zp74-!DCAGGsP5fN^K`Z?u~2==*_m1~b1qoefK!x-f;5@$j ztWuM)F!p$%{wT&KTxCRyofywgcVqoyCi&-`ov*!lv(x_S{!=-Jq~xh^`hz`LREgrc zecTeYlK=7G-mUhYX$WQtYBEaOw{v4t@o{ZOn~pm~dGvM;ZpDII_Bm0xTlB>^^bJ4a zij@^U;Kd&XJlX$dJB4uWJG!;c7us1n9Gq5EWp8qfjg~cN%2k1E*-IB!HMSTRZ>Y5I z;+{vLTf-j6m}OY9U=4*IN1J-d4#^hIchF^H`nM}>b=*41M`1?aBh4~p^wvGL-n$(QZPMX~Ge?L66M&3|YY0blOdhoekgnHVBP2pp6)ObUP)tECnb!!W zWPGZln)d4VNfC*fKD2ySaoDky9{U8UUZ)k;wQQ1Si%m%Q`18pSo~`}j7G0#oGpL71 zJ-OvfH%O<{*+inSNJvny`mB3T!2_f1{3x^HF@wE4HY4DXDZ z;V3HLPWKwF%BBEngJz$^fGLX*XU%J3Kt70!X>F#cLZ6u*k=oijBR0iJdU6xsPk!au z+j@1|T0br|K#;?hgX-xU)oCw`mBsT`I?c|kJLG}bzR4f?9-NQ1-f|ka?agOv?g-;{ zmasi2HPBCi+E4@fwR0qh;M})urKz1CT>lBFtd9^Bt0gC_ARWL;QM`ZnB?SDcyyBwN zWH4G zDEUDR@zDOaF|~f0PhBU^D4&ab;G%~I?Ph%PEu2t#MBc-HetMW~k8Z0}K?eZKpguVZdj^*Kb{r=Y{10)aikXa6{QYvPAdU&w3YS=B4hQq`w0 zE_Lrqen*z1;@B-2h&)$hhdh)kPHC>XJPi)EuMliQi;r$fjB0XE7OIOHeR(UisU$4p zYSyj=ZQo0mv>HpKLOpS$+W@Ff?Ov5vJC1s2iRSPKQs49oE1-z+2xxGEfoKrH@YK%K zKU_hh@4)?=aimh1%3#e6@z)C`EzgIZ`T?l~!+)4WMP`TOy zL^sd9cfTQPk9;#HzbeH$oqiGFp0Wsa^VxT+eh0*v`_618VHOoL-m%Bl5py_r-pMX4 z+I;LD&;d>7YtrYxLofK<*LUXWEKkIm6=QmT7a{)&dTOG=fd4dQmobwSgAS%~W6@~e zhRJ8+OjlBgR4*aVO{)wc^>3WLWLPS6;A{-^zL>^u8)szN^7<<5j3TzxgMDnbRHu>O z@oOKukkQ=ljqg4d!ZN-Tp?fbOVLik|wc0^bp8}?L!$*9y_R3iEZJ%2(Fp%;W<5O|u zpHgR_*Z@F@+==3-UpbDZjR0U&h$;lt4Xv=O54r#pC7S|9fJwYJd}R7byzRrAuN78f zllq{yPub~V%=;YGw}-VqLBqpN((#u+IM}vrhk^J@zSfo5?A#=8BRa)w?_0GSbX?#L zZEaDwh#p@PZ!P!WGbua$$AphUC5PP_*#Eb2d|vgQ0YmXQOnU(=VOpaBk-%<2B0pwu z3l6iSHy|&UJ1Rfo9T&n@;{e6*UEHta9y`~85E%7RZ(=)e1_Tww8jG8Ai$O{O%B_7} zD=T$e^X==`-0)5n&%p%Mq;2Er4Qwxr{FmR{@g>_WjFzDsItR4a%%uWUL^|s?y4Rg! zK>`xMv$V5&zJ9hUtZW9nn^#3I@Q1Eaq zSLJisB3o6#HJIfCcy|Q6{b(?N8qX}-BB9ceFLur!6r{0mCAmf0CRnBQIh9biL}O*e zQQwI^_blTi!D^*FHM`gEJGOb34unJ@Et?v&rbZy_%G>u2DODR;dnh;`E5!CFouab$ z?K$Vt3iqr7d)%JEi<2Ew4>FN;$XfbVNK=h>J5_h@LW0$+nU_eU287K!aN^Jp5R0RT z(|1YYP{7ezxpW>61MOl=buIxhYG(e0Twa2?OOx#dYY1Fg#|E##s|u;6eJ}b(&+!F+ zd<16gpum=GR|}#`R4LQmMIM%Ztzne-$*xkpVxYbrT`KiO?Ks=LTtn=02*hbN=bwr_T!HNSXQfP{p=12a zS#3*5>Gp0$_RSyeD}k6cKFB!=^9g4${=DTP=fwI_$KMHLCMn`sin8J8JH-a8Av5Br zbBTMA6mxwJ@$%(QrAU-#=7wqs*^k zCL*`;+_!--pzwt4c?{b(3&@4#*(z;2l;V9!&1@;>+t?;!C_3=GmU6C0KE;*oYg$;v zsCxbC#Jig&o0^Qwu`R-ly5$E&&kM33nb_TCP>eZrg{(jp@Xx6!sX$btKL@7IPYghx z9pG=cyUNYbMJ*_z-Df`6?g}+|hnrU?DyvVGa}020dNFOheO2UHZ;?Lo^mo>RD4|2@ zgLAHihQ=1Y51%9iD$?aoD>5ak*(J-&F1C-)31mKSH3=@tGnfeAg+=s01IqoEHG!<+ z3UKJNJwgbd5vTV^^se*cmUj zD>)k)7^07ekGA%htpAT&7*Y~<>J?iEvED9a9*DnY_y86M- zxIeZj9Y6U|v30*BaqUwm7y59KbVSQ)QhqWiRd zV9ER2x8EM-N-|=qs|8P^+O;QmcC=%dYOM$wEC*IaI&*92R^IE^J=@po-#y&sNSqR< zROXpm8{Nuv?Y?5hsn5&!c>I#J#J-Lu22veH)22T(J&S{cPOHO`QxZQbycOta$OI?+ z3I5V&10IEmej_2oPl0coRiSFOqxg|!DKmD={AS5!hqxTYCuu|Ix?1tty1K`S`m8<3 z`%fkzN) zqgeQ;B|jgZyVM!b61DxW_HG?n$EF{p+x9CqXM-Y%wbyfFER+~jlZ20#j*j2jRe*@w zgU%fM8g*xFVtDov>E@iUvX|TJ-lpg zyJGHZ^z|fgGYE=(ZSQ@!b-JEZ!W!6P`L?TE&~RR`yzQ!g!dxP-{lm#N$Cq-GET>Ms z%rBIJ2AEOrovu>BMK!NSV1W(1v^sG8PbAC)vX5R89s_o#?$iByFO1LbSI8VF3HXPG z6#9H5e=Pb=gv|e8co)3UO;2BhN2g#Yt_Z0)=P`JgV1po9LA;fotv@Gjr-|tVEc}@M zV(><_c3vYwrZOEX$@z*_q*IJV*3uu(iy*f9i0rM3^39-c*L3@au>z#(|Jcq_%N}fX4g>}^=>l6us;1ME@us&fIvTeHP z2-`=2onr^b|YGd!*p7F$Yr@dxIbY^~h;ND)Ef|XmRegs?K(%SZJ(7~U!9D_ywhT1_~Mg1^5 zXsF~f?!~6;v?h5HtiJ{D?yB`e!R%1SL+__C7QVbiVXccl?%3dg#0JL-`y1%YZjP;= zmxOTCT^!%ubwl-HJy$1p{KyzfsET03DaD9A*Yi@A28))?HKkt0g=qZVc{pE9ko_cF zeVNLi)lxL@_ECQQ^$}IA5BXG*}f1FweoQkf2O!83< z{Uott;pO}XG_60-ABz)vAJK>0+S2Kcv#(ulChcy~k)}irl$fgsquG>es-{cDLW`3+ z%O3D1tbF*7Fg>916L`46B$%%<{avmoVm%CFIA^Zu1&@wmzS0od_99!zPvPkC_wS)E z`dV7z_;8mD=hLiq6jUo$VhZUO`6s78YPIZ9?0Uo>u*!KyB9B#XRwdlRVgLG}w&_FdH z*0g51ZVv8Y1_{dZ8iz}cd&V#s&_z18WC|hR&j*r=xz`oIFZjkpC+*Z z4eZZ=B|m{B1)%OPi-KP6o$vnx%6mq6k%LnoRXXuvhhjHXazJ704nV*A+wJQf3VX7N zY0jXfIEsz$#E;L2qwp5CMY=Ad7#Wl0lJ|Yk%{8jL^aj-ECVl>=i}Ct?*!*hE zD!jjRbT&fcBys_(ltll9UXFVpW8fsyF*}1W-@du;?w&zkJD}*hvH!Gp7H}zi8(=Yf z_xBT#%tgBEXVZ0CITWzO4&m0<0p-jI4xF$HZuVHb(n z(Fu>Al>5x{#~&`D9)E)2VL3$H3t}IqcCx!m!IWvwCLicN1@qbkzLHd!U)7^Xo6iIJ zn0U-=r8aobD79@I#Pg5%KY#xYDCyqA=&?)5VDc-@ara-7kJ~`Hz6aWP%AD!v+?>+P zEG^W{V68KxEk&R({UPEf6QVtV$L$Tk+dE#@s_Fpi4eXThw!U*!`^%lcF@r{RXCyLP92hyf|t z^W$m#Q`oRPMR~KfpQa!=hlhNPr z&O;{9OYHG!sM-{Y|TSu_sKeMU-9Nl~TXHUfop~SmM3fxqV=?i14;j-mz z@G|L!^y?2FMl9b9S1^)L?g}AI=-XO8PN%e#CyYURte{FaL_`2#kN4#(uGoSgDCOgz z!iq?X()#Vs#;teRuYdn_Kfe2TNJ>S;AhbYP^Zl0Vp1EXP$BS4&3vq+z|KtzP0+{^u z@Tgpd+*HUpgXqs}ppKMHo3$_bXV8D6ZVCYrTXl>gevG#VBBk~Jq-%EyXZ!B)bu((T z7^glSsq7zR34&SDisX6G|3lA1fm(xb7QoqJP z-lh&TjXU7G9q~k_$%q1X#Ef?-VyR<*C2}&SVgZ&}o}S1_`Ae_Un;=b_njZ?3Xk=`VLg@v7Ac1Fc^O7P}tP=w!j;CUji3EOP6PLmi6hB zA94KJ(9j`FrdeGs@~lI;rnZLtP%KYJ*rl4M9M7Do6u9pK&mUVhIaS9pB-bo;G&6Vc zvA=OU#*`Nh>c&1|&d-S7&FFPoV@1`N(Uwq9wYR^wQeO~iKIVxf`C89HkqhB}LPNh) zJs?s&h}36{o!t_lqoRLZi&JYk`hRpS3d;P~;POuEr#t7RI<`zTz?mySHRsR!7R<91 z*^!PD9v)wKK4nuw9nET9D3iFM`kW|oR+6IU_-n@SVbp+M5of9hMSfnxUW{U<{pQRvJD=?>W{ezSLmz08 zmzawTeA1)Y?>pV2bNq$it=5{z*DWJ+D9w86&7Qd6b;g#T-+}_H=t(wW9v1J^0;KRIKfPH ze3Qgn)YxR$?wcgzsUzn_8~SDxOeDL#(5i$ZE38U(K3K49@+Ub#O}!ZLDV7eC&I?;I z@TimqNs!t)ds5ms+v9ETjO>kP95ka!~=*ZtnV)7LJLhHR~py~2#N=o z1f^CH9MyOI^jRY+p)dp!VJ3)>0eYv4i5rrZW`7%%1oCwU-b@nR*uz2pSCR}QFL)*? zx-Np*ELWB?ITZFUW28wcR^?5HC(*fQ>oF1K>3h5iaiQdwll3 z0^FuW0bwR;SdjE8{GyT;=SEweVN(z=#&T<5zNlr{86n97e;l(%9~%Q-;PnlrU920m zoEEP9Xr~)nT7(qw91qh0dM0W(!BHF;|B$4wH!g9J@PJvGU0Hzv|7JZjx2%*pNQlFO zgoFgXl)#)C|9mwwAWh8!?K^Pt#u+CkIY4$iEPRz~^I)TR3H|x*A{sj____t|pjT18 zSFUNW&b=?B@%f@%oi?HhdPJmQ3-D(j6uc!@C3bW<%MDjQjFB{_9FUs>YF#nM!2_X^ zqe2=jRc%!#m*3;CCxVq-mXJ$ zj3g+LGpP7V`3Ht#us1%K`+bq0zhI|(a3OdZ9eA~=ieuOQfoM>f9}1N}yOOy^L<@gN z;pE0NsV@Y{s)uJ%R$UFwFluIqk(3H=IZ}|f|6xN^-`O69WUrojBO+BIAnnzQ`Ei%T zZ#tm0h`zD^M1Rleu`cwpP$07c_aANmGm=k(qgk?Ne&XG8KA-5W;7Z`D|E|RofZY&< z?D_G_?T`t~aoUW+;`+2c04WIjdwZ3+n~Kh-zeps@`KHmBT@Mv9uA%s1O&Gce5gHp{ z{_d;n@F49NK5z8ep?nL=dEz%SzLT~`@HiAoHOB=sRn3?|=BOhaDyh#>Pxrwk!*bnz9ny!`Hv>y4Y z2OS@>40veeS}{`}7!F(tBtUf~(h{@FnYA2-N7Y4f)O=?n1pfT$?DeOB<6LiH7GCi@u0A(S(i!z4SM@S z{qf>IwD36U0*g4nU+cExF0l6YQxFWx$6~+I8V$yg;}a4%N}%8GftvskX!o0Um2*(u z{=7=aXu5QOMd#TU5@c6tOj<{mL~y`=D6qVTH?+T&yB&rUSAHjzYIX0iZU4&3G!Gt! zdN>ri*Vpej#1g@HV4G8gLKn;O zDwt2>iPVk}{i0l*F|`zoE@MPUms6w$12_=U z?O-USac>3O3F5f;yEhr$h>Sl*&3KV4v<|wtkQVYsG(_1Yx(82vWnoA@2LVeEvZ6nR z|Ew8DEeKNO4HSt&`MU_s(5|75_x~P&s&d_XV84>!c zujakjI>^ll&|sSQD^e~3&MFmKxD-S=nkT6zkqjylhK(98IgC%f0|!a6#y$(pXMaBn zIHDkkpM_|-6(x_CaCDBa66tH9HGT(aeEdcgx=u9zx=8#YdbV7SzSPt7f7FVcpQ72# zPG>xAc4AHmdXeo4O%tRLRaI88pH*XHu1{xwsU0R6Yz&^+7`EXv36k?Ig*~wo=D5{g z9rCchG+5!Ni*+M%cV)Ecwr|*oZJmn)Di^mwt92NU*s|);N_HArA8dBx0Ah=vPelJi zGwcZID6}iJ#pQ0$>H5QM2Tjm6u08D#gj!@iOv!cIUliONAQmGYp!n+z1E~po{|*=( z{;SA-V4Q|`becjr0=!MXWt_x!FMUdcc&r*m>k*r=V@}1|pQj0c3>fKpQvg{a|8zJY z2$S4M*c>3;7&CS0?u=qGj9_ipmt&km$2FMl(=OYzP|FUd@UWMrtvITr`QlXj#z8@H zxDj;z%i*XO7*)UPm0vvyse#rx;bK4lE4>6Df^i)*PvKe@pDuzNx(rm@7!4Ic9J7t4wTmdYIH zqI{Zgn3xN9R7~`axlQ9>oVD9tXeJBi#5dZbb#z9lvVIurf3mhjkXTHbYjIRPo#BO6 zm1?B4G==x47czr38LCz4!T^|7jAY z1$4E!wvnOWIhTAM5>y+hFj`=m@C4u|U@GIVFsbI`(O5n_@*C~P-VDMR1;oURb{>Wd zp><<$zSLZsAtNLcse-?u6qMTptb@u^gCMXjpk+3jFSL2ow7R|H#?&&h%C~5wv<8$N zV;f=FsBabXv<4Ef{hm$r3C*%)D9*PSHPJ4?zY2hl(!q@wwa?(?lUpl5 z|M)ZqbhwVG;i$NU6kojfsVBFP(vR)U+$yhBVQ?9toc~x?r>=HL2XHxJB4xW!d|y9# zmowzraz_tk=j3x-0n)0!Dws&o7*Tis5LIC} zofqXUJ#&)f+M!Xbf6)LTwj-ZK%9Z*Yo<`c=qQ*5&}BSoj>)>B5hCXOusThVY(L+ z<2r{tHJY%BJmwF9xtB2BW3_(3!=NgOQ?Xow>=54WR#!)JKKW90tTcSd;lP%JuV(4 z;*gd{{r(Ih<5{DAGdCO@9NwQ}MZ_h+ai+sy(!$ZO^uTgn&K%P9g&A1Vf2uwfU`@PQamb`UdLRm{o z1eR13RC+&vS#U*V6w~HpGH@n=NOApOsK`b|2pyQov7knVDG@zXngaaB4$@8g0kCp|Aup%T)?pkZz8=*U}k}g&T`8FZ1>v6Ajw?co|VfsjlsE$3r_=H_=Bts-H1XKo^^sKI;DOX1pmZ?}(ImWGQGhp!UKA%eA}(Fcr-dllqtLPYXI zkWv`#`Wsu9JqT_=4bOli-g^PN0H#A24n=cVe+>;i|8VW|`}fz=z*FDM?(mguECD?w zd4;RbAQzyQhSZN27oPpu-x*;eZXV@_|E_g3Ku;UJv zS{=AbQ3s%7Hzvn9a}{TG^T+mK$irY5@fDu{LSh1tr@jxd71xVF{a(f_$_K;>dlhTk zJb|Cm#Cl%W5I(O@ZU)pvE6ss`6-F#aw+@FAe{)6f!)-qvvBfQSzt2>$8?HYS0nc6V zgV0srr8cWhb@iO_l5Q#RyMrmzX{_x9X3Si!5VhbzVBpL2^xG|r6ixa8_}$zvb=gQ! zj3m~sIDJ08XIqDcORXmfzkIMZ;1zZ8W56qD99^rbY#NNp`>GF3Z_7 zBNJVIy2z765KgM68bz@fND=WW%`>SDXp)u0OEL>yLC8B-Dr%8?mNO^0=lPm9EKl3i zPm}TENqI%fLDpqw0Gpu}6{E{pIu~5kd6?;8s)rcxMN$++ijD~fj%s43INCNc`uH7R zH53M*S`KY+SYJflfu|L2!sS>&&4){m8F}&^o*+ZgtlYFOM+DF0iawi+2Zl!GQGXs(7x6k_C#h-q~l)1~vH1f9=JFCdT?`bS2WQ<|QCz#;t4X)~zcr7af-%WCe)(%^|8ey)bkUj&^= ztCq#~uZu%_?vh&>!ENu1Nl5Svgpv;eMIZKyH@J{2Dx@i33A!x_=)9xSyj8x>!V)T^ zo0CCLo1=M;rP7HFb5oA;?|GbkE0&= zi<(pR17!BdE4t^K`0=`XLm#HT6@S$?4wC1mlV95)+iTbWYC9xJQQVt1=`sV@Ga`t< zi`G<>34~c7DN2~>kdSUqz)^fX%a7S4whpsOJjX+2`k=`*_UYyLr#}<{C=mZ@hfIF< zd|uks9}nI~!552D+6phVmg@#A)WHo;3G5yJvFQRb5SJR&o(I|4H0XeLFj6W$TnBpE zpkY=U0G`100ot}tYdmKy0ZSO$ku`)lH^*hZ+W9N^f=jwYad zr{3Uv;nVOZSqYeb1RCLtuJv?)?(M;J@25X>{|_~y%aVVg8Zo>tAL>!NHe0XZOk6S| zbT2P5hh9LI(CLxB?1-LXzKaRsHPLs@D3EJSw~5c4JVQF@y8Eo;==0;ptmAScnh?^f2f?AvqP+zs)uuc91mpRxA1)qIGOwsY+`N92?FjQQQ44o*h$K7#&_ zk&Is>{W$i`Uo?+4HhRv*k9?Vu?eb$Pn#;`nND0)9=@7UuCbh{!#WW28^g()`$2sL( z4`WKRwCdWj7RLd&r-~qczCGb8r2rJ=MY6tLpqIdu-t9)v{G1LBBoef^q^}Jt`bU%G-q$D5&sH@-(Rm0e+Zie17z5gr4KdJ?Y`>Bz@H+w1@SV#y$PlWqRt}s_@sorPK2v%D9c5`a~^*BfF*bJpdUB(-*n6n}#r^cQw$H|th zKXXmAQ^%;~ARxs5$gn!>Ro%sC>vj|tNFy)G03-5aYcvM#@GrgLFY@@9EEjnj&6@^7 z5IO1JYmwwCSbq6%6HpWTHZRBR%vsmj8r72izOnL-VI8;)AcVtzO)q zj((=-B2BYv;zO40@Ut)dVa}o;#vE=kCzI@H!LjP>6uiz|Ha29Zj2=7fWX6J;)`F;& z8V)~uR0bi!-Kh!Za_`;kEW}zqvoqhGo<(<6{2_?5>V_Ccw7gaIqt_?--K}vafGzN+ z_%aJr2;uHUACG{_aAj;Oh{!M+htC{ZNMay3N+K!883>;ThE%cxM8wDIborn;v7=baV9l;x=tE)y1QRjQtmOe^9MCFe>wD7Bn!(&JSaVYIFTi$6L z5UhM#6aCS37KCK>KkKTO|793IaMUvPZ2iIY)_MmwFd>KT!QCxa*c)uAPB-*f45&HK z(pTI8+i0fPfwHV}IHy$h>(|rv-5EgK$_iL_N#t_6XrWu*bk{`m_?n#=T{CmH-xXRj z5X|+U_`-xIIT%iI8${f_fr@aeGcV5-_56A&t9Kbc-d7z|kr|MGD+`4v5@@s3)cui# zF>thWeP4AWw^7#98*Be1)<|9^@y6B_%}RUdoTprR?nzoHj0MkB3b{~U+t>GfeK{$R z1&#orM8w9&XBps-ZQ@X**JmJn|J5yIPg{rfOoBi=pfwbhu4we$7BD|D{{fd}zsZ6O zp?>fGqx%WFE25nGLBett6}nJi!>HpnOSd_8?0uSE=J9qE>)?Yw?+gIRWvmfbY^zbJ z+qzyJ6_A#w&i~G5OKWObes3i@q61)@U zD&Ys`ikMN2Pw&iRTlO7uS=P8Cn=`_`=a_83>`7TO+}Ht-p_A(Ot}Qs`dI_ZD)CiO8 zs`}?D)4mXt15pljLfobmQjn9-bk2s-%fw2d-`p@k)yCRrMfc(1Vn1+aWR3WXyi}L? z<00H};0Y}8#C&NaWe)=(ZX-fmkHa5i5+6GHF>Rv%_7%<%_O+7bNd~>k)?0uO6>o;$ z#h9q%%h=wEmJykQo({v3PlzhV&_9Zw#yO*+$B|LDHGC{vPT~(ev$N127a^i?*SP|^OKh@wbwC#Hr<5-K5w4AkDb4U8(0tPo1Mgw%hFTR;oDjNXp^w{;ruiIs(UsA zVcPxv!lEgu)XxGnyCzw_@9?=i29(QG`Pp3WjrKL`B6Cwt1g0wnI%F&y*UKr{yhc2x zw*AB-P$x-*7_`TdmAIAH%wFC1%N2yW>naWzs(~tG*|W^TIO9~U5S*>i?6QGg(zElUpmaQI(J!AU0e zIm}+S7Ff#LCQN*1ykyxj?beq7b8WHHbz*qyUx`WHGbWbe!_kNV`Xk-Q6* z0=WKB_BG;~HQyY~EOa_s=jOMGcaLPNgtMDg-_viZt}3HNFH3FY?b^arL~pg6MeWJ> zAg@J#cg5pE^@Drpp3eX(WF7&x&q--GB}rTNmbIcWwxX}~&aGAEX*ObBD@Y6th_R5a zNPdxc$r|FI`{~`TK;n}mfC+CoDaF=W0igLW)OB(edOs@SRR(SL!Nq}dc+%b`1cD(a z#g!mk&6Lp6o?KG2m~_anvSpp_F&Q*~@6MrxiKK6@zOSQ%tPdE^PA3KaoKO;WcBPTt zfOj$aFHEDG1joB_Bv1wzgq0&$CzRlRqIDcf4%mNHNlvnl+a$Sr>DI#*2 z$#-ck_G(F#g3C1muO2@0>oIV%ZwZvh3>*sP3o(@8-&U(AM!nSIze_1Hw4}Gl1EH7DqZ{h|`FhTi|1`i9^ z_8cKnlP+oJ`aPGe?2f#nKxF{sO0(9{}{0?=koQczx$H!;` zvK=GOc;Q<7-?*=jkk>l0lK2~gQ;J$W>?RK#BX4%OF2b(ooikVjW^*@+#<%=i5qTr9 zu#j1Hd2JA?hu^NZT%gf*!uR=$4D%a+Y5p(4ZtWZxR!Yhi{IVS*80a+?U>4gosYlF# zobtMAu#=C^aeK(O5vffOS^;Y9$YIV%I?iu7J8=eYt3(~!zkVkKd{!L(ryvIA7zi?v znuu)?yB2YCH<~u;rBTYw)LqxGEV$0_dt0(d2}?!2QC$8W7q)<)Pzw0s(4)i&{ST*ezVoEXRUgpd#kezm3_+!~xx8ckK%<*JzcVITLJ9$!1pMhj> ztb`Al8wQiVG|B)qbv!`2E65tbHb%6mzC8F|Ka*KuysRFi zb<7I9+^FDy!>{L}z>h825Aa1FDcwvvl^$Br*q?5KYJm8H*D)f#69132w}7fL?b^p5 zNBVsS>ES9``-K7*S_}Nusz)~ec=)S;U-w%A@f4s^+uNmE3iQP+Tn4J z9<|0H3o%zpP{#N-BuG{Wc&Muss)k_J=nCGvaL^o-{Nxn2Z}5HiEeRC&(`z7=- zDIhRaC(I(k5mJU9cfJEEJitnBSYZO7@U^3EJc94sc2&PU6@*Gy+N`5Wwg|-2qE5Tu(i$r}gq&Cm7RHTQEUEjN2 zqJOMEFjPkRWQX1By!?@uZ@N_KyW_RdGV4t?_2siJ3oB&R5X8nCr%m&E{!7{eE-$G?Hit-u^OdO`l-u zYB|W<)uI_h54c+Kr5lfpo?iOzY>k-yh9bKOc1$^snFDXy2hNmV-~G}1S5(aF#UeJ=yzDw#oh-4O7$q}Zzj@0B2I#82RF=OwhE#1* z6kgJU7%8+m`GAXb{(VxajLeXnqR2=IFY*yv8P!S3d)L5axOsVNW0f4yhX{y#N++1n`&$ ztWx6GTpv>jg08h#nZZjG76Jk802WVP4ZR9}2nr#HY8ZA&ItcLb7Mne96x%aDud9lB>8M3qLWt|Jl(%?Vg%CMWSULpp4hp>#&kRjeat%yW z(8E0HvRvv#=Ngrj_Y+Ypz#GXR0!z1)@FXMUg_rmk!7H+D2~iCINLTt-8r`>3wTLB{ zUW1NB!j@`a*ROXa0GqB@upvvm92}MQWslSp5_f?ZUP!+C$SwpIgUK@WyFPqLQ`O;@ zOWOcaCQJJo>Kqn$*MOwE;Ju zgJ5>Q#01MbJ+2zppNM5swjF}ku(hvSt+C-~LiiVr8wwxng%5g3iFhMu8r$JcPS9A%+bZVE?#i4-ly0=qcb0EpNPyi z(fx45Nl$dx4Re_hW$(R2q3*JwsoA-H666<~g)eKkdLABX?};M(@qE$0zTf_x%hy>R zmc6!bbFe~)MOf4eRX*2X?b5Vz5bN3LWaE0hUM$2ll_z~3tz@U z3gZ)C-^7m6`j9SqAWkqY1KpfU=mA%^A1}_M?s?v&SU*}O5*W$U=PbvhlGBijC@q&f z`mEutX=GF@5yPX7iLX~-+|kkRktQT$I6W}bJn)D=bxl-UbE#p4LVuQI|Nj#snW9v^ zokX679Zk6ZM!y|p`W_G#4Z`5verjb|_aEmuRxf=(cUsN20bLiIF73^TEWQv(c+pq| z^HN_P1CRXt?9(|91c_ILrz=dU%BuqIkZQDU!8Z^r(-u;`Uw~p?fT8NYJ<5MLl=~h? z4a{6uiB2Lvt)+kJ6SgT~xmREkPu9jpUo#yV= zK<4j2+&6$-m+?*X_z*rk&n^1Rq8VSGGsK{s{>}X~T%Lsx3VhvRAeqFm2mrJo>}UPO z$o-^H^^|0~ab~Gjc()(|`pfa4XmdZW!^?x8vn?II^e>wZT_Ra{EqSJa7L3TLP7^y)rk6&`7NMV37h$I#*0Sv4y1IsY}8Hri9lqN{H2x!ZeO%#0xdyvSE` z@QoPA?Gx$dwXC?bS2}|#!9Hy3!7V5I5wAXqO2?>sg?uAnTJ3qeg&n4fCTABSvI}f} zXnX2qh?kx(TUdYNvNJKvJ&ZMz4<-){lfGv2!B{kDhxdJ=|Lc4*eNCFTlfy44P$)bi z*ggHVuP@DV@os7#4xDLR7V|y>u__pD1?`+s3$F$ay#$leor>j57l(5(j9{ zeZK}hwD@ZW(N8P7@)*jR!CyWPGuqY@Lt%!lkTwBcIFE5N z9~p7H^Ef`(WrA~8@LTtU;Rs?iz~*-sa6#Ing>su;DXMV(@i{y7)w4QmBJ)$izEGq} zSxZZ6LgHAY`1)X$5~-UBTr6x#>Mpv(PbhKN6K1|eihJPqe2EAx+1I}yFZ)?q|ICrY zfxEk7qz}I?^0OA|ht(&5sEO?O@XmH!=6Z#gvHbsSD`R(b(BLHU5CY#UF7CITkYQ$z zT{+BG?=C9UCF4sdjeO=AA`d-av0SZ5F;u`s=JtqJ1wm@)+=x_J7k=By z-ru%Daa|r@MVztOP`JZ8wuz~xiv64?w$Dxt++?<*81a zHG3YrYLaGHKJ$IqDephy7Gz3wVh;N<1?rHUANdmCI?Dk|lE_$5Nxokp$ph>maF z)`kM0;U9SWpHax#K>Tq&CUv^ci_IpkM+QT@DlTbWJ%;d?t>HK)xoM9=01d@vfhhVjhD{QR+IAutPZ`XfTdk} zT#}Y8C{i_UwENhxJ=kFWvjm|vj`1Q!EvJ6aI~+PXZL&t1=;3D@O~TLMbc{>#>~%6` zsm{)T-B^O~zN3~NPhYb>*c460hrdN1+$G$T?ZCd*1%$h|0#>Rvp4gHL@UZ&IThmQU z$!4Z!ef{*YJF%dmVdl#;i^JVR=GnVAx^AH@`SmEIO@HGWetCxe9#vbItu}PhF#Z zG8@Z<;FQ)?8xa1FpY2S1jkL<%2=gwUr&dGvXCyp^FMdCMIAZiv1bNqg;G_Rf@MvtY zwlyGu$*El2v}~c~=^)9=?C(cArT`(`O~OKOqhJDhRhg7W&raZIil9!s=2;Puypocb zmu(&OR7j|(pIOjZ0TZEK8^y#|k(>hz@wpx9hdxUC^LHr|@d|*0djW{uAHipI)2i(s zu1mL%!efy6zr*lC?s)FrAL!@KdjQ7~)j90l=i7JHpqpc8YKdCGDGv!MWs1l7Wbw8z zXW?i=Y?cgi(M^PIf3gLo;m(BIO#kqhli3%5>=loH8)u(@%!k8+;)K5+P9!Rvk>GXS zM5X-9J|8n-!<(E52ncn4)0T(W%ZM=t`%x27N4Z0>fClLoWHH;NsSsKJNjE}4D@hD5 zU=`bA)JoV;q~)H0O%@P&wcaw@vJ9*yZ#>WbXyb(J<2{XE0o-R`yFPRsEFz=Yh<5X? z<6alDP$12_Kmre}j}&vanqPxvU{--Jt>I%E9^JK4a+uabnOdovM}JFMEE^SrvEdX%WXmz$j5PYr-s1* z00!C7rCNrzRu{K-JL+T19?lm^@t;gXFJHedrGI?Ihulp+a>Tf1?z+*wq5LXlOEMf< zv67@jd-tB_;mO21-}KI$wRBK=o)lP++8ml(#IGYybsB!~m2-{dGXrcl;`rFPw5-(A_moEBo3Qkyk&@ZsPAqvVkdE&P zoBeLU?!_U||CwLwRd#!4_^VE{E%Y{H8cT4Y`T2K=BJ-UYtXf?ed^=SU96z@30h55| z-yvYE>0#T34#oF{SMItAoV-5*3=2#I--T`K+w)@@zd`BNIz(U7mMUWpIO6g6MF{e>al)5eB_?~OLyTkC+ghWk)fTrOZoLY9^V%M~qlPd_y`&kj?=a*GKf@Vn&)HdkF z3nA~|d)r&P2uPEm$vhi$HT{|4Nc6?cJn$1J>`5T9q28KAQ{v zo(3JFrvrq|wHoyKfmDt-Y?9N7eVV`hR+x>_apqWB|04e{fC&8`h{)Y!s$}zCmvpa~ z;OV}D{eIP~bC+$qLQ<(_#6Xdby;2URvh0-;S=}~$+)<2n21f1upFbE%*pe$^iOkDz zIjab8>Uf?k9-ty#sJ9LC4+$txjo;-@5~XbUWTDc1&6fo^uot*eLt=W=ZZLdQ`9MZO zxbTS&z~5g#gwI-#oqwMJG3dX_GG1OwqgE_>TqZE9iD9I+I?A(SEeSJr<7#d)cxO?3 z79_GcEDbmHiP^D*RI;%BGk7z`C0P*(-M1sQ8ht)IR(d4z^E$_zs9EwBx#J;mhb$FJ}CQbzuy1bwLoWGiT2_DEJt4i+Y%f_Gb1*Rn4D(y3x)pT0S~ z;}TdtCla6b<~f6DN3lIQQR{J)tS%x6L&;BNI}g~sPAC5q6R3NCcy;0lm^iRy9iz?0 z-uCaDg^c7g=z4z~>4_^VUHeaDUy31n^bcsy8c z)F~=qKiPB7wOd}*^3J@3+s9c1@0@W9!o2@Djl(4R{-9izRfe#WX*i3CYT&ER>}fLBXS)8HxrG=78z1LuTjdCC@|cd zAFwaRNbP7?KJ&}7CMsNFJKuvjGvB{Era{448O_`M(1lAdkj`kCSn*$cjZVaua`aE0 zvqj)9d`)iAHeZuIF|D+_d!no6Gy1vgU!F55(6Exm1Dejk-SlSU>6Iigc2RgZ;J?R% z070yB{Tgfx@xd^cx%7%7^iz{NKGSO7gjNWqPwl#th7Wp;*gxC(LthITl0ab43Jkq} z%l9~mn_8rJG=6M6?@Wz74xr397ULZtWw+CZPvkUzJ~W~_D)U1WA4QsxOa|F6an64- znt$aV)QfjtExYHKo-^l$Jp-1*F!B?5?Q7c7H1$7SHxF%$il1-+*-QA{Je-$nN9R0aN(LYE3DJS4cey%UO z6Bel|Ol-DK8(R0N#LRmt-x)>(>%DSIWzr!2rXaiPhSl*RFA`cVJ4t(g+S~Vqfhke# zXUO<*nrhpT@9rBfrc>3Tg%O?4#!ZIEe;kJ!6?SJrd@-6JjFeZ^5*+x*frscEcyKOJ z5_%T(UE!d=xc7hMKimDtc%g`P9$d4%vsQzwfKnv_4E+IOK!8HD?%57ZtEC_L-g*GEfP#yoy>{Cco)B z6@?`P&J*n^Oujdsnw*_W;@XLvNr##GDLapWPslTkoF(Bq{==|rGy3+D7joky9PtSp zksrIoqabCA%4DhGeIJyyA{#T+4}j~JtAHRfcP{55v1iQ~Ibt ziFIy)vORVD0EW8JtX1&dc5R^kkJ47?+T zXlJBMuTb|mcPOsibG90Eg=aAM1*pwu(VwGX2df^J`yRY=k>HrO>XK%3Lw3D@qGN|H zVbz@2Ba{_ES21Y`D}^fVYcQR51IH0Zx(q)lQ>YGv4g^@`+x$_s_)Bd7Km_nC>VwKZR%Ppq=gsOiO7(+A_< zY>W;LHC3S}4L*{B)*!XsPk>hA38OPvo?edYM^7`_HJ7h%cWsctJUEC6%y6kxb>wMX zO;N5aI}9sh#0)=p3Op(QEkC2j!CAhgU9Kjb#WH!V^e_xb|GVngb0~v5N~RJBo+#>W zjcrk4JuuqE?AOpNX3xREjx_8#^#=^LG#Tcd*Ov+4CNH^M>je%%_i9z!HLGT+5ppD6 zbcYEHZdDaK6e(+fd8W9uc+5CI7Be+hzz!T3aVBofcA>@|Rd*m77XjaC3cfQ(*T-2t zBOY+{!mEjE`f*Sdj?DYxTG4;L*9uc#!T1E0nKIAA0R>f10zs+{*ESwIG|sz&yOu*U zy+S^6ZPY{8x8jiWj!G`@oow%k*6w-UYLqR$+(t`+OAERG`4%9tLxYo_49&ILY#I%; z$z>Dy8!~IhzG7}3MSZCX$Z#{jHjnQnqPQD39MEAu+9XdE@X9<+*h$t~;EKW@j{cv| zs%*+7xK^7LfLTHMw-Xgu)YZ7uTJ74RRJd|Dkc;2wP;PTZ)WFGwKA7F4ci)%3;ouMS zxQT^ChUDY@ACCf?7Rnp{q_**g_)FQx(r1^|OzvJuRb(Z$4Jl52BV6c-+EiYWb=uS4 z^ZRo7;d1qToL6D^&f?&tVaKSJ0P8z3o)}O?{UX@@*(f^P7t#))^NF5gbv=zn$eIA8 zdpE8KkMjm{)*gRKS!L>yMm@mdvzVTr`iAZ)pmbr9TrrnxCQmKReSA3!ZtxF+9bRQwZ_p^yR^MqvDwQVK}DiD9x3z z-8zSuxBUSMfaagQRI_8t#!t>UcfyB|iuKeuxK&k~I!cX0y{fHhBHU4GJu(VK4&?W~ zmW{u?x3`AwbF{47G>nORAwLysNe)M(z8bJ`dyE9;1womgvbM#8%AKus&&e7(KsBt; z|05mBxG2!(?M)AJBoY8?j!O_xwC;qrww+$Qg5V_fty!jIH%K?F0cdG#R~ix`$r!7) z8PG5DOrU#T zz65D=)6_sTdO5#?ZT6mLilNay!m0b1?_y`jn1xA7t~U+MeWmJl#8U8SKH;a#s|Cu> zHaK;kGHY7O@bya4>D^+;{9{P@GZ=A5`dP383$K92X7ISF@96O>$3$l-|BFC{LZq4u zsW=y}&@bBW)y6MaavXfuWv6S`ewN}$_{dN83RS8|Bw0C~{18>P<8x+F`(+cCpHM0g zTAgNAphn_9j49L;zStzB?1XukRiB=6k>^$UyxdnmBKhNZ8MiWYQa)|zr6X3&#I6=t zwN`n!+7TLiD#D?n)lVjx|06t*i>>;32>Q^r zh$c!vrwU>jA3OHHeFR+K^G^nksttw}<}dm(LY20lU2RMA}GWaI{T*Uy}X@6?dMWSmqDiko@UsBSx#_zFBS5{E~V<~>iHnGaGPUB5V^cVMT z!~t{*C`EVk|EhF{8_cH>$}&C2j^3wJ1%vqU&H$&zq(NP<$tC!mQ|{X3xq&eG&yPK3324x@=4wu(>(5>M7Z+0Iib&)vc=Lv zD@(;c6&ZL9=U#LRpslxEu9_O_K#3122mMf@6JSH=%ZxSaDH(Erkn#BErNQDR$6*i# z{tbNiALgMWx~k3Y?okRSXQaJ|-TMt|*{X}DW3L`o9NM?Jwd|2ZEeFNNM;7fO>U1x& zQ3iF{Pi`rMg^6P~7Qg4VC{txttlGWwQ!q5Uk5wLVoFm)m&|**7ED5jcn68vqJo?6O zs={m_ky(KXr;KH6ASX^dhrx#s4%QJ%ICOCmFJ6PZTl<$_K5(1cQW2oqhwHj<{->Rt zLo5{40VLiDxuq8;Z7!NhdiTlYhSb`z{yaVE znwUqAPPBP0-A7uzRmQ!^5y{NAX)PS~r^uMCK036rz%zAX<%tb9zr1crF(k-`*J-f3 z(bmp7=>H_nw)DP-2bO65CC_Y}-1J1YwFIb|-hYvFDmbScnjI|U!;gh{n8%9t`w}h@ zG6qRjpVhEB3TEtL(b>=e{mZ5C>ilc%gqwo_O#*T=r}A=yMOX#T`E9O@3CRq{9wJ4& z8J+87p@Mo2tSN5Cz4l2v~ zI{x4VeiZAz0BIMu&JI=#@PWSg=f(B3gFa6X{5(V;{VTDx^9@kzrc#7o4|!vuvV~H~ zw*E~{CI^U9dI*jwqApg0_}4H~Nr%wu+A_h7E{gb7c&{(JybM?1AKdx2)yK=nt`{r_ z1kO_XJ{Mwofyq26Zz@~`SUOA=!s{JXO;F;a7;2`k>1#8q0iW?pehq|#-zgSNBr_K( z4WY-eXn1U=Q&~&^6z~v>fhbyXZcey4mkQ6Nx}N4dnr>C3Mw=L=M-qdkqlrER-Qt$q zcakD5%AfuC@N57K<&#sOMdIH>c!^p*++W5;etF*)7a;=S5zFaixz^#`$b38mzh}S{ zA0S>9rLf2bi~%9?_+B!;zt7MPb8idTg#Hj}*%%y{MUlm$*g4=Bg41}cObNbKW@`Qz zrAnd{)Z%NvyT<1f?`t5c;`XVqG`S<#Q=uClMEsSPJ3>3ft^vM2YU27m(2w7~l2k!{ zLZrV<{;j2$WaopO2b!MuBvOG}$b<>!+it=09>K&b;N6`W2eWPI3e{{C+7NbxJpOA# zX*_qX_n)*Y38xpYdW1;7eU$n6cG&kC8<%Zb+^D0^TQaXB^H%m&me-^*Gz zNrzu-Q6hP#$__0wUy~{YPOed4VhhGhl-=;}JW(d$ydN6+su=lA7NQ@XUT1F^Q{ZK7 z3_s2uYu}+unMo*4rBEcZNm$k})qelg6 zOgMHb0#~^fDRw{U(C-62_ReE|#G?L)lJ8(3J$Lt&3&yA0ir~w|&Ufej2v+#WIoY@` z1yTLLpzW7T!a!~kcc8_bNcRyHU+jrbbA^t5IUVfAHQ&8YX4nv`I{Mj0AYb=mZ!_66 zOe*DOu*9VF_>(4mw+_{qE7 z$?0=J=`-rKQEZM&=&24GX}NG02bfr>9qzsG$?)8QMJ%Vx)G=@5^911R8~E(H#zLSA zPkiw|G-%h)P0Da$cb4Ef&IM}}1EKh{NtKZ65INfD=809`bQc9*vecTGup4eYRJZ1O z8h%(qmc~-wMMd-iQL#x;r;i05t%_`!HCTH*VBdfPPW2_Q=o~ROIvJS^X zVR%A+W=(#RL&V3}zQj8s(0w&ue33_bW=$*Pev~rs;QaVmkGfK^X6BiSy#33_HQiqy zF(hqM5JchWuD2(yMcy6^a5p;DW;aC6c?6<=@~w|F2+n4?Qb>OP&}3y^FJQzX6x*E} z=2@;-NM_sa7OdJNLMU1ToT3n$&0kjF(ZEfDbJ{qgg7CN2>oY;f*D+)a3O~@FU@XMA zpOxH6q>kz_6z5!p#B7z@{`}Dz5WE`IfbHu*bN@rTKX$eV{Ps5=yZ@xC19yu4+n*jS z;@R=!{{4r+9)Pzgjgo3CPeE*-?xyHcB1)u8c*sW%NH@YmJu<3YGjxRa(sDI~$tLC< z=3*rD_+!L(Uu}uuXSXE#3IL{w!df~Grci+l<%+Dkl9qO6Z<$-Oo;AcqD6hWVw7!bf znm>7+%&;OxRm1%*W+MFUfBJaB@bTcM^g@}6M}{XV+W&H^g%7V1NIz|pJxZ?Z$S*(3 zuhPFT|Hw3NKCIqunVBtF&0)jj(%;HB{!E|aLAPj+ftZ8}NmFpCN2|%vR%vGLbMh`> zS)P+9%tBp!zMiqi&xYV(g`3l=CXf3m{>cNngJf^Z%86!&xbq_HYn4JV-{!dBG8%Z& zrYo0Mrky8`A>}Sb)Sah?fkAyzeN#LGpRk58!Wd0?3Z!Z2Z^NqY=EHOA0ehT-pAMHx zx^ik0j_s&4)!$U5|0qhEZFY%rM+xU{@@wlI@LO%yBy>cx1SeE{rLwSXHeJBebWjj;kATxKb%L!QB%ACMug0!scZ;Y zk#jRRlS!icCkXp?@YIfoh6)c|S6V9hb!fZahXx{G%~cqFsNm-?=L=|UU_O|&8t`IWP8h)_h#BGN-v{HQgTEpKt`h>P67Wj#N`HKjy?pLKu z%VVakRlAaK>xh0?x*Md zS{OE41C6E|?>;k_b(C6W5>-hXI-*vRa0c$58u<&x&rxgXyL{pcop~b^iBowv(XkOiNy;H zc3@80ckzo2h6MW`>f(7QiiQ&}Reh>aZ;vn}&cMlYiAEf5^qFrv?k-M#?dR717OYopTTr}Fqxgg-p+f(t+FUR#_0;pbSIX>})%k&z zc#;pX5Cjr*-b@ia|ApBdX}M%|(P*MG-56`J6MEtZ64qj)lWiIJ`$OZmBUCnJuP^)K zgcG${?M*-aV27|-#?DVczAJM~AoA;+2=et53NO?VcunJb9R5k?f|tfBN?*9lcD4^e z2D>b4)L5|dAD`#-F41Y)TU?J`lPW@C0lT+WVUM61T7zEFrbh;FOSO$IEO zo~@$MuTrLjWEBN+BhJlZ|KLS|PxyWELg6W0Px`a)!gX!CKw0zF>YB+qt$TA3G4Ec2 z@5I^QPbrpFQTi!zx51I`Ul>y$GF0VaIaek|2ScI*x!(Enmp$|txXy}v#ylUi^L{qc z0Hjgam!H=i_fvi|CXrbGpj@{>va|K{ zf_0QCgS;3m0OEwnEJ-+VRO&grHf>0QewVo{`kd`r)QL#@Xyoo;cuP?8zpHUn^*Eq7 z5r;lmIZyiuXZD*}%(tE0o~1MWQ*S`|jMJOApRP+&!)fTuy9KHxT^ti&VEr5o%hZg81KRU0!E{#d5tL9i`I_}9HgvFI*+3*(T{ zmGP%NvD|-!(qc{H8Ow$~scS8scJGBV14^HYM$zfJT=j6LwG0 z>wA%lCm=gA>)^Tub#JT{0ATzNs(Kcc0aMr*jrnIQ!JS3KFU1YHbs{gAn-5Ua-~%4T z#GG2G_~FNad<6bllCOOfj8FK^yK>RUg}$XvBD@iZ9)d<`F{^4`}#yG-THi( zwpN$uj61F+LVfWEF#ot?wYY#FjiDXJMC2c6YyR|;%MJqzSjHVXX!bauOxRv zF3+5V$_KDohv{YS7M)rF5zeC$Mu;Bd`FBgmM+i)`=mCP1B45p~hBB-r6TW>NMLuea z)b&W4>C%6`(aAkOkhj2P#l_PD5u5BS>2`m#om(ZTIr24p(XSe!MnGnHan_laT`T;F zb{_@824a=*D|)e<+2%0l`BC zcY3qukUA?hGLCJRyOCUJZ=wB%kmGV;IHWOHa$>D`e$ zsDsCu2$K!oDR4~mk!5nu(nU9yj8NgTc$PQ9;zi-ymnceS4hk;sa? z)NWPN=;HRazW&(qcya_LKGt>m_;i-!B6X0ftjv1fj9+vKrQ4A*zv$b87KkS?ydwv! zWjh!bzh=f()APiFVqnJ}pEX(e8+1@X_{%xb|0o{kKyB6?al`*Q=y*}7m95%mW^4LD zVjA}?j%9;w^OSu>uX{^#UxNsq-tk5R5icWQEeyRkWe%-_ar09BFs1Q&W+YJ^RP#jL$gPUQhToI+_>;KC5 zhCVguCjBuA4X}!w+fb$bU+Odhl&VFCncN1c^b#$>HoqDPsgiI{?c`?r)S*rpKQGs3 zPwd7AGcsNhwDCjq@MKjDo$PZ!W+ucLq7M@Yow_ol zwznQL4QZ6tjo2uL!$yh<_pwzKMA082Kmo8|uxUg`Z{6B4eO!563a6#tk8|$^>kb}>v+N__!2f9 zDq@_+Y0eYJ?vI!WRW7-ezvy|`i|ddlTwl>2Q1I`+Q+>@N!ADHH943;oJNA`W)w*1K zOlH#jCAo@%<(x-5CgF%kICG25F6u3p0zDG12_66n_Sg;E@Z9q|%vxz%ZmKLzgZ7*4 zrqy_~vPi{GL?IMn8~eX;#b>NArr{P>XfCmcDmjHJ>_XLP+-KL&=u$)XTz%jD5p_8^ z$JAK2orsV~3WdsvGIepT$g@?SUI5M;^6o|A2QPV*ojAZPGeTf|NuSvxut$#pS)4^l zxJX*B?G@{dYTIcZCRO*+TD2m0;JpZQHIvx;5iQ@rXVbBsW$(Y1J)#A%rxv?7X3>kY8t}P@_GT(SY?H8p z&((faRe`DUamf7+gC?=NHG@+MgwxN8ujQi;ijPHJyU!ybY^%yaw{{2yL)9!Dcr|2r zF%OJ@uxwMg8Wbe3o_h}A-E={O1Xusva{oh29E;@XWmnj z?Wt|J)8uUevx2sTz5niF{I^nJKx+O&Mpi(OgRN2(E%2Sl+YVhh3$)Y)l2Pge-^Irk z)&5qJa-t9Jk64445!qm_)F?K7=PTJlFZiyn$mLCIG6OrANx5zyPcQe7lmDiyAvaIt z4XnsRV0g)p*(GqTL7Nm;j@9`Xwqx{}C&Myn27!iJ>}9@V&R%=ldRtop(k1~>{=0~Z z{W+i$g8bQ^#@xw-CuHv*+YHF&qN{hgr%M?hw zI$UNKcA4lN+_7J`spfR$RYi4=N9sFXe7ZRPoMryef4I(_OYaf`Kq>=s+ALmd9w1`C zN|CC5@Z}rGDk#|RKl6eOH#-!>^R4y8%+zK-1G2k7uYyMk6cpH4`^{8_L+iZvaj!Jc z(IaE7FF1%V4_OD(H}-+5qI^vEMQzuli3Sla4QkS@M~UgLJ*VKk19#b}PGSG%PU7#c z{Cz0rZ5ZMLx}v{O?;pE?t@NVDW${Ebi3uAP__1s)(it2lT7|+4f_R-|@S_(L=lbp9 zXi>dA+N+qrn-=pR?AG;@RS16$xaW@LTFoJHJ)sQi__I~|iZ(GVR{0*hk3%fQYV@-` zeeehBT3qfZ9+(jzMiybDPU0(=){(pix4GZX)y`_^XwE&7T|mwAZMU#ug~q?u8RNgU zIlon7cgsQzuFxP3(1?cMd}`?@_;c?JAIO*~kG_2NlKkXwT?i(vY_u2&2MP2$%4^77 z^+?<+s7Z8x(L0cfdsX){f7DxNJk8T-LY>yQqO9!T)!U~qUJPdcq)vY9*}G1I%*Q~? z5QVR&$}Fg7gLDrdg@2o075b+l{wf#Fxw5SKcq>trA0|2CrL!Mh*=S2Ow!FrvAHt|Q zYzgfxK^4B`W!Bc$FCw}p82o@O&n~u`wMp=`PCNHFlsJPnic!)AnqpgDzZos=OX6JJ zs1M^{&$}sl(kINZ@ggxU4J#O4hxfmr&I{PG-0j&m zZj;SFE5sS4lX|S1=86y2eitNoQs@U)lT&6UoWD(m9K&9S4rIq??hkjRaX)1J>TdFY zqs-Mt7^SdCHR-cj9i&|QpBMc7;JUUK$p@pA3sx!1JX;s*^=JG-XlH9b4%a9RgfN5$i}Y$3|EcEd|)+8R5(3dUC8B?hsDeuqCk*NdI!XfUAu z{I)7d;^JjALotE41iUk?$NnIZZP>jU@Um_;01sdsnY{{((zcq7=768CU5bgmS3_M1 z-1E04RebtI{NoK%aaLUGfxmX(qOCPE4~fW)6I42bw+M8?*YkJac5XkYxE`Szx~Cv7 zgsYwg*5b*1bYytBsTQR+%_PC?+Zfe5(UyXOht&z&w68>HzkcJ9A{!&kR9W~RKg zKG$r?qbK5L7Lw4zaFXRC8Kebp)=ccIkGJhWMg^UsJ^F}yrw06-kcB~jR)2K?=sQMr z+Rd|XVa+9Wfr(!Bqf)n%wYq$uiiZjKiX(;fgtUvW90W=PMR!kEav#VfG{c`w1X(%2?I6qc?&0;ox&b0OnsQ`Ov}G(vMi z`o+PDt(_`~v_QU4fd4p)_4sISc;`|V{p=IX>(TV8co^oXEqpMtq_)MLl9GlPw+jOt zKnh^X@V=j;dnfj~aw%nDFm6lAa0efC(4JV&$%kMAeu7oNEa=sRD z+Ka60!a)Gfbxhr?I^@`Q=N92S3Gpypy4XIR0lBYg!1flewL%J+8H4krCF zgRoYbQh1ZwTMqO!LYo}OOt=)>4@Q4b($gM}6{;lJ(GBlwt3JuZ2qIJ&`y%o6ZJ^4u z@?z;Uim=5&8w{94t6W{?RuAL3b@G|@%szh#W0i=4#f_u?lA94xY&Xen3w3TOjIv%A z9u2cPG|2m9QXa{}bS_9tuI>&QX}@H&Z0Lraot-PQ;d7%{@t-SW2|?SV@Cs+5x@a(Y zDpDd+(dF~#5|w4uCm1SPZsU121iV>v<+?!H2PGrz*!aUqj7EZ`g8_iKgJcGL4hKAJ z)z2(nG-?uY-C{z1K#V{tKrV>m-tV_D(AmWCvchAR%j}1(m@j3C=J;aq&t+MahuQdS z{sl&%DGgHvY(talMaKO_IeE-5I*XD?1zkHXlZ(K{004TDWA4QVd`E_x(hVe^iGuue zU~{n$t4E*X**fm!OK``$S*c?hd_xH{5YI4m@9e*Pu-pRSj)e196ZkX73iT@da(87$ zP~3i|O>i|*&j^5qU?5^IKEd=rua_54W1+&$wQ7o)hiEm$Kp({Z-S%?gU+_ca%KaHB(i2nCUao34Lfdom_VU&#Rb2a0*RUd z;wsr;52K}Xy-9|bBr_E86w8T%8nD|OI~TAEL#L0EF5;Kx^hT6~{)Mjobmpv{ zjiECEKlhDb;M8VoIcqYNq{<(Q8i{_OD}yerGabHMf(M~L`ofpH-KY;Zupu3E^_(Zv z9$hEDYK$&Hl^A(`Zas8KOz6gPewP`epK3ZV-R7G=qkHAOgwJRr#9ybZUm|bI75&y_ z*O#_72WU9#nBUMblw6r1hAAv6z}J99SG^71S{W$V7v?9%#^=KkE?y|iWbxfbsSyVL z{F2gAsG`3OqX<;}io0ng*)}h%|KRD_lzed{PdhuMDbnT@RM$<)?X(efjDM?Dhkb$ffP5{OP*-=kPl z_b!VJPoNG_Q!^ac(|xv=VOLlx84)`7aFArYUZuPvisIzBz~QCt$1RL%pQl9cLSG55n8C}{4sdPHBtG@{K{IV3WRd9i6 z$d<6BTrgH?4&P}~vw0*L5#HS|w|y(7fHnh0i9e~O>5M)%$tZ&)dQ(EQYBfu#qr2o1 zyG%4S4_dL+=_)9BH#x-9G0l`G*X3&?wkgYTUveL`Cuz6XL6(ixheAR^;?H#NW1%`e zcwqCgb%ktU?mJZKYsy2*<-wshK@%`OnLQNmXmIV(q)T@7ZX}Ben{#fE!eK-P@|g6_ z%H_3BmySQl)Bln`!?QKzNyrRCrT0(<6>gA~gPT%+Qprz6Ofj`?ow6n6z-1z3wkN`z zj^iUrX|R>+H>6ZaPm<`deRgG+IKTAsp?znwIZ*WA`CyLCB-7!AsEO&Spx}XME>?(M zG{c-TtX7&=59TncB=*53iVi6LOjd`zHxUlpi$lC*pXfGalq|!3Q#V+NNPSGbFl4{} z9Zo8ui*zvTxQQ3nYUaqcBQfMPN>~b$t=VYi)*n#W>=}YqfGmo=&v-N_zkd%pXKs!* zc!+^S9+-m21yso?UQat&C`96|6g9HyhgtG4qP~-gfDh1Qi`1ex zGw=8Ql#idBcDp0&r(HnDZSP3;vC$x(u~F_9Na?%Z(Y!(CZ!d^#R%AO%J6yk)H zwSy-LWy7^^n@Sz-<2n!i+Wq!Gi_&SKs2rCgq!}=GfA|iXl0MyE{=~7r>@kcCca60r zBHeFTFcbj85=u5#$fjTw%Gqz6Dvl+UP}CrUWhWApym`?afkcUp8(k{K4o3LW(ePp4 zt@*WYyy`3WNdLIW8-lpm*AuK~!&=%trM6c8T)nl_3yWdn_F-Z6d!G<-G`YM|VKz#y zL`;Dhra||Cxjz30rmjm7GNvdQZX?*W%>2Qj5XkjeRTB4NFHllKA`(`Vy2d)gAsZHQ zh$EbGb8;d9_Y7L89e=>7;{1aIrv&>p_dh|@y^AfNU~m-<>0Qz|+%Ge~(J@1p`XHQT zt6VOeerxI?VJ4kY;5G}nx>b=Q|bIei@}CQ~)+ky*tXbafUq?m6wydVE%x1 zisfEdi^`T_b4$yZd{$c>tww!%)AF%P$o#ja!R;Evk|2QOwYqR)!RhkgWVG2{9ajE?xxj>>xo3kzSd zYl?7n>s*-|dlyS^BJ+c3Q{b0R3E<8IFDM4WK1<6D^G(N*r|7iOllWuuI-SpvtxI~dO7O#vSu3-%Y} z7wWRm!XC^kgd5&l8%rH9fd7N*R>|C+=1JG z2f9BFf&B`F=eMFO?d`)VX3&i_g2U!OP>4#;m7Stx3%x&@DFQ%cpZ=8O$(KDxW@APj z96L=+6TAns$q}TK4=kl>vu@a*%IdvkZ=w<^Dfu8?1)aX~%<|HqQwN(u>mIW!e9BXG zOzRpaN*vO@KnQ?5?@E`w{DDgx3FxL*OhQ77*YHTigMpL>%0hlSNZdtf4_v6MK1aw+ zU8aj$Y&*^qB{yateg*CZ!uJJwRj3q@+vsk!4Ctr24J@G>l?rzbxqS%iXk7@|>O(V# zVA2$ZNpKrNB7XER)mtPyc?28d2AJY8Iej>jnuP)>NtW@h)WfUaA1{sW&L|f zVD<3k=4Py5WwyqwTlP3P;y$VUIOM1$>#(q4hG)+B^V89yqgnKBg2UxrdACi92S}wo ziew*hHTwENY`Z|0rJ4p3#|KJdUGKON#4Vum=RxAHmwo5Z?5l)?+`N%&g9$ab2?U9X zs!MsxLR*uf4-3!_Oj(bf_v9ub9nS-n{286fde(tCW%GmUa*wLdBhLe69TkP`pFxOP zl1O6ORb+JG!i$=(4L7GpAG8yw>xqlyOv_Yq=y-gV`aBj|xb|x_5&~pf%4Y76<2D$# z2Tl^h{!_S#)7WFolF62JOn+VcBra|t?`$vyucnTUq18_vW-44b+$-`DtRb0`las0F zspPJrmnV=R)l(B5LMcW&Ed5OmK6_9h)X#Gvq=kKmq={iDKz883*(-ed$hb6S1rVdK ze{6-YTXuKK|54|XoSYmleG1Kn?=S_aNqW$paOvC#99nggrHOM09&Y)O{dK>diD9Oh z{wQV9nIG}KvH{tu7id|t3(fV0*l)uN`A|DX^MG%dTmU{0js=Tg58;8pKfgbecZz5@ z%=Mmsa5jd5x3|nI_mobRPqymx#T}MJyyiOSxl?payG?7;VFOT^;{Ky#Boqz7w+7M< zvr)Nqe;HmtpY1%%lOPNrs)qc*z7N@_!f*Q-$J!7hBG@ugDeU7QNMf)=MZX{pUe|^+(`%UjGw1BY=zzay?V5>4L73tr=Jck#?Q5 z;@>cp)Z67?JxGCcUV_4di|ES!6gSPmdqTt<&r(YXi_M?mjgOYh!W#Jw)@cg+87y=? z_4eP2bf1QC4Pb_2rxAF-?xO9;)Bs4qDxB!dJ9Jy%0MA(Cxc8S@B_m)BU_bz!E>}vL z6|y@{oZ?mk&v{ojDmvtzE`C(fm%uKH7Z^6$=Y7cx4FuETBt(U{z_EZINt}z&o&XRe zoaz#DC3dy9KZ66Z?$8ApNb-A|NQ%&tBDA{WJzQMAb8DnoC;x`}bc_50{dzzOr;>CA z?>V~U6fDeWbGl}1>1S{`4CdRy87m)M#A$|&k3H)A*(gjUobZr1kJXZpPkXk+F-vB^(Si`K3e>1@F&p|}ZJoQ@7 zh&n&6lqT!_f>|(wW6n$i0p0i7Cf6yqeUt3o@+I!_nC_{!+B;VSMK`bgEe!v43ZK?cYmSO3a|Lg9o8UF2#f1o=jHjU7aM_b-fG){5W$L@Kvhw&o02^}Zeu>m&w>03yIT1+Z)2gdvhtXm+|cL&Rvr$KlY?U#xwG#- z^C&8tS1U;y%wOhG6FI=SEn*f;<05+v!n6d$7WPb$YXAG3o#AAn{dG1O$DzpBqTS4} zX^==cS>!c)<8fkCR5+uH`&OnAhm@(-*h)w8%nR%?$)YZ|)l=LQ0;z|#z zvnFaTyk+*eXt!qN=Jsxb*@crewlPjo-*Uw4O3g(rC{gWYE-g6tt)FsxDV1{j@>!}E zmi&4JLeo>~VT1yDPtP{2wN@<($Po5*>v{bT8KNS$8t3&8()r7H=3Q>EE}Ew}+v1#< zRBCjj%^{)oG-Ev@33{Q~8*B@Ed(`D?i=d!~mpFwR2@2G{lFn+F zNad5UU=eNyB2&QOD;oS4CN_jW}!FOg28hsI4^` zePF8zx?gQtI9f6O(W6HR+Iifp3A%9#4}l4b`oC}cmpiQ=|PKUQ`;q9Ps|2tn+Q~R=ylNc5LwZK4oxLv!~a3_R$6Hy+a7UZ9XT0 zfqA101y6?QML^qiE=Kc%K43IX0^=1${*m%}d8+0`+#s?r+IcQEzkm3=%}1h)sAg z1XCI}IcyH?Pakk@E;MO7$)Qow2$Z(Rm+=0Gg5|wgvhp%)cKrkHy(D-%f<&K3lG$iT z4F#k|0L{5|vRAT&+zTFY-}Xu{lCS1zOZ0bnv6QI#BW`AC0U1;(6?^jK1LtyaD1=JI z{V*a}*dll^vJjPy{0P#Tds)ds(tE>IJ|P1tyb3qeLd>pnF=Sp>J`M?4?D>C{oZb<- zAUS8%9k5)ntq!lXU*7lQ69KxQ5DsDYfxUv_?w;$}l(&7hOjrMniR2B>-1C}RY|Uxj zHi6&HvmX**PLn#X?6czTQe@upgw7v9yJ7YSE;Z*Zi2_ zx}P7E32Z;jU|QFwax-&cJOGL_1AJ*Nwy2#amk96-wZ%~UeaGd7!#ozWUKp+3je zOnkI>s5)v(Jnv~zA{6O1u(!mM`ma!C_@eBfUTLv0A z=9nyKH$LxLVsmQwrMyM{81ENVDc-Y!^;eCrY0Mz$FXm1;psud2JTcPVEufLV7f+YP zVzlqY#J;0uLY>uo{(c~Nw!|#%t)E#5d(n5yJqhDJFg9)T*_?^4NfukohX=+>_{-k^ zml6nR$_%M0jvIFcZ%*Lw%Hi&X3}n$XbspAkdw15U%c-&Mth_3uvCu_yBI1aq4@B_- zB*gn+?BaZIv%FK!MDT$(oJA|ylqG+qz{B5^sJ=a73BC5@+3pr>P=^~V!CP77cX@ht zZB~aoSBYIb2C*g7|1A8o1ke7aG>hp6y@wRD_DN_>xVk9#_wkXwoF zz`8dCM1c^LAARw z@+p>4u-gW-BlKG0DSQ&Wa~)otwY6I7ege}*ukW322y@&4w;_atLJuf-8OA z2N6P80r~4i0g?H_m6-c@$ZC+#$g^J8I0fDloU{YyCzd5p!x7P5)9(U(dWA zlTwlME7b%(lY^_fx0+p$)lE=2dq5}d42B}|urzN|qPWHx&XXq68eY~$zm!Z=IO?>M z)AdUgIH_g#XO5TXCTmGslsx-rdyXR!TF|l0nrHv2o-Yt;tC-hA5fYcVjL+}kp`ltK z`iTyV#4s`}Tb(MlNGSOfSy|8e%er#%=HVboybN#AEm+1nmSTPcK_z?_(;8*P}@uEq4?>1S)2B%B!Xw=lbx7ZI`J!V%{kMtz! z?c?U=zUk?S7EExeAFN762+UysG|B%4+F312yu1Pg_r&n&`+57~ls%+d?D8!vMcQzz zZ!wU)61$5Fc>I>PF29>{ry=5&Tubl(nm+VxF>waT)lp zH!F79vI`#5Fx+g}k*>7geWu8>H(t^8)rMM-cuZW}n?&Zv6UT{gL$`MHXg^Xao%M9S zRFTvLfdv6M-}!1zt%>!FH;#q2oi zG0iNPCFrE(F{DSedE1!COjh4D>>6=UV<1k(s2&}5h;S_&Xc#aV01QO(xCJXrk4{g^ ztR}0x9%=jvlV?D(9Go-xV`jsO1n})zj6kjxD6TYZ(gW(29-~2R!p>i`}pzW6%`SM^1#fCfjz9ji4I{CVo4RdFN6HS3K+7m0`=(^1M9bP*37?Sp9`{44 zu0!Y3TkPf;)d-51Seb)NRtujct8i1GRxi3PPj9qm&z@3+MYlBL9Ko8$p}Udd=Fm_U z;U;ZSPyS)$od?%TK)A>MCp}PKjUA}xfIZs4bX5Lq4coxgt5-vuodjCE&V>bdxf$R**jpq5r<(KD9FHyWUCt{T_my0@eEIU>`lizn zBgadIC9?vR0wio7!AMx|!Ljk|ayfDiHg7JK`+&|%h{DE*7BxUsjew9)L;sb>{$B6Fi7yhwZdYLSra5MxE+}mSLN%fPg^y$d0N`S@*4x=6V68K2*x7b-x|csm7k- z-iT?fs58&7XHzDHpQis471WMrV-cTn4v6Ltciqq8?Qeh>6<&w}zAZvZcnSv|5ycWw z|L=h@TIDyD9EGA{KPShMr&7^eR=bJ2-m^p6jj|IO6K@K*Y{e1ePceb2s%pIdN^@d| zHoyCjf3Adc+Kn4Gwq%WX6Yt*}(8s5q#EtBudPlXb(`+J!ksCxcSMXc$Lj4iZ-(8pn z{&R;t|9uB<(8Rh=?RYxy5gM&`YxQgnB_MUaNtQeWVTV-(2hCvpvx6s@q3GA#m^tf_o_*y?#bp0ZAg{!5ja+9QaAJDHpIn`(9=qSy$ zefzaTTqD~#w-lXqofENWYxp*@kGSDNrI7JLR1@jp+en2a5bvPYAE9VvPh-V%nFY^_ z48V`O3G3F+g(U2`Ly++X3If(2J)pjPHYO(KcSlHT-F_Ms*`LI{KJty>3_4G+f%Gi< z(OkW_HacV{7C?Lc$BwILrOC6%7RrsWi)8Izv$L}na&vFMMVbiW=-$u!oov4v$f0&d z9ZL9`A4?cXz6x9b8kIeI^wH_lr)!0nqOGrP*-cS@km2d4qpKS()HDkcuo)tIuFvk~ zg&O%|DI15{Vb)NC_SQ zL$g;_=?aMq$dNq|2w+72$Zo`x#*IpLiuc{FT-p5x1qa(;m&rIQd2+{j9SsYji^5#n5Ws%+iO|=6TejXDgKVsKYNTg zM?(85p*+UO@}$SFS{`NQ6GHGv@^W`mlOEHa0F`P*b4it`0a(#3kFkTw(Rb!04VZhd zGA>PT=>MKn9y%L+-&z~uC$O*y%bkito*4VJ(>%782V_bC3QuhFU}3W0Q_lM&S_mv<^G}J;qhUKouRYuR}=OipWD#cF2vw`*F?wD@dqFH&01j^Dg26R6S7dv z8@`;)^APNI+#zoS(*TqV7p{Vh@p>BX*yiln3@kYoKFGwx^c{A5LlFUPd-7FLPiHU@ zz3=a_2q)}2**E5KonsD01hbQ__+67P`!Lj0~n$>-ef(s1vg1&FeTW+=} z?wTO@4&9hLI{y<>;kQn#p%A?N6M{nC)8zlgtBYDS`dZAj_|d;wU|MVItt_vHT>y3^ z7y#(^(5wVadc1`r>9?r!?L8@T#Gf2{>5Xz{3o3YSWpWm6<1B<^YiLM?4ibp>|!b z3_|;DS9eou94p^dfurO1txI@ghPjeqggrm{`)D465z!15xI;dyLUm>^p+jZ82SjL20(*f(Hb_f%pxM2@A=)c9PN&rvxK#8YLh4z%)?*#J({TqRvuJSj_mfqre-W z>o-*)RIRZXu{%hiF+7K*TS~)_*uy*QbcZ=dow~fUE%petAk=^k;elYi9&nxf2u;!m z((=<~5TX-8Uq(khR;>aq*es}EXfO8UASZ@~9pkMfix%E@FM3%I*>b}ueD%1<#`547 zZhiLB0~F?RiPZ~>i;HaxEW-`)2_P{Nv+Qk z6SEVeu36VMZ$nyk!z~2<_bpIDnKiL1(Usp^GE$jH3F;0=J{7}P8w|W?d`MnJuEu3^~Z zMZFBY2eEZuvw4QEBZOegz|uh~*@`e^6KXKe;z25S{y(8AC{I&fO>Lut9(71km75a4 z9}XHKyP&i3=+#^^CV}L@rP;*I<;3|@u88v7JB1nvRcD@>N6X90nCXK(-03a9#sFSs zL(H?qU&BzZEI2qg&OaeDCHm4)e&#=wLy&rO4wS~uZaR!f`9Yif_TZ^l{AphKv~sY6 z=gB`o_f@Y-@wUp#WC;rhtPm^BVEOr`5FS5w|J`xPf5HX7?P47i*ksSq%{QYrBI3gY zpUHrAx1g7ldaOYTA{3}^dqk6A+yJ@Ie64pvJ5IUWldAE0+YzqeT|0v?TU5!G1tVYv)s)wwS9- z)W)H9I>Onh)M&?-(P|C-TSF^aK=JuXYuupt?%Oz~nSD`zNxX_BLY=cz$+?f9qnt5q zI$)N?sbITC6k=}SOf*7SSy>e$79l$NYx^hYG7112%6$v2D~T1mqT7AUH1P6@xtN|3 zJ><%7n0YB<`o5#4_UpT!d~Uxzq+u)hs zCoqC`a06>jf!(ac^DvYg8eZv18g}3-v$KsWhX2RkSeRWJ*IK^ zy^k3o|Kw8Aqr{_5)HeknEDfUJR^Z+Jz13s)oQr`_B!-B{0gXwu;P`&i+=CjeAhR9oy%2wVTmDvc=vp()h5xv5=JJX zwO3B&+FMTac+jfQ7@|{h#}6Ss?gvulL{i)&L&P9hYVB8WMbS#u{TkVBxHE%#hK3<3bCZwvfEJ(mgTSy_^n+;V+{QMad4I^RzC4z(n zu!@fj1v)HeVIL+anEkvw@*aDGA6=^vDGHffv^Y~|}Pf$(lTS@(AQfxGUkV(GR-kO?Eu=_%!x|o3h znb5rzwI=dZ5f9O22zBke4-*jofdSkrUMEje*2W_FIB8LQlvIl&*ixTm6wl(Z?_GN{ zjc%gd#7S-Jn<`zpV(a^#R&Hl!e+3d|`)L@fdlT~Pb-(DUv+BWZrhWE~g4633JH-e$ zsZ`RzKV=V(!SAX%ENu7FgQjp|ZtHp)&^}n*J=o~7^D6{<#*0_!;2+!QhP#$X&SBcb zh=GA2;R0f1N-T4pA8YB_pLQwEk`6J~09Ea>1!p2VRMz+;^23laEx)O5qT7ADn|96L znM3b=%qOPgm6T#C&%lOn``v*5r%^>>s*pTHa$`l3MknJrA4-1 zHBr;wG_gdwp;_!WS&rf4S8?LSn7UD~0{6+7?f^Pu;Q+mnec{)BxO4Nw#4V;hbcoB2 z;jPcfhXz!}+`!F4Ot4g59^CNI&{RhNI|j$!Gaqlu(`~_w93Z%h-f?wr78Vy%J3lzt z9O6PqwcaM6t*+j(JW&lp)XMVl)2%M7LG(!GK4`Aufg;YsLjyj-G!d3_ zym?-ZE{NBc6YR}bPdcY6@=c^7BB7!Jz@TM<);rMk&dfMRDyuLcg1r5Kkhkr6weCjT z*n+r;0TguXJJ&PmS$yzsDZ&^e-ZiAPl|Mo>Sjzyha;|cz-2vFzmhYcGpTRKm`lYg1 z$}UB=H86;8f-@QT5J9eo;x69Jt?PXmJ!Nx<9mb!7bipcA>7`gjQ2glXtx>C=Q8bG@ zJ!`s7GgTgif<&n$QE(JSZfe~WPrVEgx$NE@>VNnf5f^KiPWW|f28^auST%`ph1*5^ zW)0MD#?IDY1tCBa9T-hW!greTkSbpJ>sSy6DbA_C{Xf8PQ~l5#fQE#GG()jdoiI!% zm(3jVR3BJd^A*^+^NZD9gm3_gpIW0fpI<&F7BAKC6d_4t5@0`o)AlUVe~Uc|$P37Q zN=p9MHj#II;ZSPyV#1v{a@Qc=U!vGY!{x4}$<7a05ixT$b)zHSUQw;dgqW}enL|(j zaUQTjMHv)+tf-kP#nrvQ*o%}ty88P<5C?mSU;AHR*gp9+RWUFya1(SS23CWMl2bkp znk!aUSI21qA;^dz?@r){vn@(Z)TeB)W#8ZTBXc-70?+d2h@aitX##=A#eMh$lrL7I ze6YjpZTq~V(ubXCEp|7ptwsNQyQ{h2Npl4T9k}{YpzkI-PPNd1HQ-}M*VS7d<>5?7 z5vDDNrJPpe;q?_|^ep;{s$3XEUf(N|5f+3zUPrexBhF;zl+$Kb`C8|y!!me1gSN@- zj4~47&O_}YTFuIYSS?<1?fM}`&%(+oXTd~rkr~pRM5B$NJ~QR6jd3aT2g@BA}BB|E~=Vtx@AUSLBMeCzv54+7LVxe817s z-dX1g*vm;ps?tDqvJWrWV%HYY^s`jEH&dCs&W37Zw}1CMH51y*5QAEmTnURyn1!~m z50iS@{SZb4p=e-?ud%st!^IbAT;S_tM$$3&3GdWPJO}@MVF%&$uO*PX@MV3eqS2GI zPdWT^4cY`|y2(1SmM!ZdfYK4a77&r;W#>Rj2v8#H@ zvG{?cZ1dtL-~nTDF^8Mj)u7-zb5`r7A{K$z#|1@%HS2<#AXTJt&RZ$Q7v%m!YowCG7>(XMcPstTzXJU*xxnsc-`VK6{`bK5ds+ z%D9ClLIR3ZbpJ5$1SHgiIO$N!;?M7ual$l%B03GE3;5PG9Y?od67d4u1pIG>17DA9 zsH>?-ldu{z&I0ea&aSN@2w_72s>mE|Msl?!=}1f%aJqWud&NO+DYJ{HqgVMCYA$>QnfPJ{;Hh(1vEKa)vNsAIryTvuJM z$Bub{RG|S2(-u&e2~_=~a{LAe`n7*c%~9Ca5=+(wQ^D64)CE)yLPQYMMd2gR%)|=t z?SZKtgeeHs5Ebc9J&#!^)<&%M0Em81tTP|O=;s2`KY&>aLu&`Ik0(6>{kfw!OmKVx zAea*(;}QrozAKX#r3=c(+uZQ?w*d3RYEjf+)gf|rKMAY=`ydWVK^%rxMj4*}e0_R| zMx7UsN{(jiyE7-2`mBgY9ky=4xzC;&FJCi-oH!!)HtwQQ?D$vAsnVb^lRr&gH0c2QE16YuXzeGVIe{`Ao40Ks8f6ZpA$!_t4w8Tj?R8x(2-x4^ z^^<2R?Vwf+IRd&}FKb+Cxf3L+RVS1zsyI$yT9fp>I{zz!*ZFd!%Crm;mC!L2+8dzW zaQhV|N8BBtAna^bGX~R1qkx&?;#p^$oizJ< zjQ+!!O1C;W93#|b06#99d|-VF{CH~@VJ1)x`>tvVa3b?;sq}u7l=FqJ@a|Tm!to@s z+uFvyu)$;tR)tF==j%T%YRS6@z5(#Q>j4X+2&N@Y0avPD{*0MZjF^X?oiG0aQ$J7W zg7(1GTU>+`u_N9Yo0Y3Pn0^V@Ui!C{><(*ZdFr4n$MopYqc^WqmQukQfM^psr_i?5 zehbbzc|Ve)PE?5)7y}L0aCA9IL7fh1=fub)6P116_1k<0$R(>fq$-$3*D5a9DYn7D znPmFc`pden5RLxMdCRidcM-tfNj{Jt_xoq|1yq+{u3CFMO%HX0Ou_1Sg@*^aKE}ep z1gt9jcTU&u3mEj_3FC@U0@#NaGB60~r+>eFh%U$)nvswR!??}HUn;cfyW%_($z!)B zhs>mQu*!m6VdW&wrDiN~=X?f~^C7P>m8tS>_>}?1iEhrCD{AKHzf|n7@3yBJFS#X| zJZhh%+k&wQx**}t;lF42@_nQV=B`4?F-<&u?rFBJOvb4CVOZGKeo%uMke(k*_LEP+ zVErnvxM^|pJ2g&|CRlyGEs|fPy-UzBbp7ouPs-V-^LU~xy8~#X1H97@is}{LzI|I^ z+W?_~D08*3=?<$H<~qCHyqQ*pKHx^$E$}jsV9DT8n^`>v9fkmsBRLx_#y%c{kbn!& zX7(tZZcYjO3mNwp)8U$$;oTMzc#e@TNL65DBm+cmLGINks()omF2ndU+y(WplGpy7xcz^4O)dwc(i>MSt?;#ouduVJFKekHwR!Q-03lJ^`T2zl! zPgr2W=tee!Jmve78HY7w&@6jf1j+L#6{icL1^np|ugefH)>`W0wwHu5a$x<>nyXGa zU|t2tGkK)L-P7VUX(>MCcMmQq{rx=T z=z!Gb0eY6@<+_2(rklU8#yc<#p~}BT(Wc?;F1nzUl$2x8Sz3wG-tvAMU665~*LZ8@ zu|GC;5}t@J0cJC-VwS(xu7*^U0s605uV>`03Km}>fPvA&-?d(*`;>i1#hOM}=X?30 zL?^r^Gav0CJxCN5ikbm4cJdtv;shULH-vsuVSFuSsy`^z+JeIpF*K7Hg^CpLW9J9@ zzzN|I+K8a6(IZLwFf4s9j5WZplwT?6{OB-th+#9(8H;z%PihV$?)TfNBG8TwM$eI| zuV2rb80UNufo>E7=qzDXD+g4q(CY!uV*ty>ip|g2I9Nt+#tWZB5xG$N ze?r`4!TK!x=~V*O@j@09l7a69BjZ(}@*gSbHqaU+PR;&+{D>u@gh9;~Nh+myet7rJ zKz+lI1TSsk1qgeMu4$)Z^1h=_ZEDr+3&#w0>1)|QubjVC@=}T0Lx5EL%LwG#_lnok3vM9yCp% zXUPq;o_I;q#VJ~hxRuq_=I`GxLIMc$0CJQe&53n3%@15Y#R8xbgk0W(R2L@`jKJU- zFAI`s(Ht!xSYeJ0=Wb%@e19MlU677zH>?ZA8vsb#cPqGGg8YM({^M;TK@eJgmy`1V zeEq&j(OUkROq0w@DL=W?zzWdUmJtW7jkNwzRxLUaBdB#8U6|~IbX72mFbbCk zpY}mAMpUm_^1o~Dhhx;)r>=q+g`bwoung_y@`mE1nMojCVjw4iD5il3t7Z>}B9VLo zJ7VSfm{nvu2S+M&*s0Ni3j&B|H)PCIe{k1iY~zGyXhHn{LAHwfBw(8E&$nwqZJ@#f z-am5dH(lt0SHRj8F{(kHK((sVXcM z^n#8gTur3)m#!-q?v@Aik@7I{D3KUzbV!mLVsw9M321@@srnhGxeZ=L@Hkk-EbO#t zwFSlX7=$5^vPY1@BKiAd8;;@a}Y>U4%D-VUQpEsWCg=S$qD z|1TUn>^=UV==v@~K?0N@Abk$vd;}KoeKACXm%TUe8wjG|TP^e~fq{YZf*))!1B(qQ z6-6QIvliBFO~%OhG9<`8cg{~tZRh0Z>5mC-^(_&_c%7jJxIVZ^yCxjP8NfjI!b z)$cJg#{-e7SQLUUlF=(47%=Y`+GCBRNH~nB_kTxc|9;#;=<+$w6WOYWEM~hCPB}gJ9iT*27p-fWQl8`#uPAx zc@m5BDNBCpfw@rSbsVA&0&+j*K(k=L?D7SbFcyZrw8YToBaO<%rAW@HFVI~;__|wg zL+J|TK-v`?-vT$6qBhS!(8thxLUUY-kM&@pA<@wWy>Vl#*qwuo?K&ts7rqPC3Xav( z7yk-D{{wH06GD;%yThPj#c0!cyda62;u?4U#vvp&=4TNJ)U;oC!M^q4u|MbD+LnBz-rp zQuUn>W584Q`8krgu@tX?zbX0b`1G_cc+)TdO@a-3uqfifiBdm?4xZeeTjjW;X4Ftd z5)ttLifzfwSw8cZV!^wAvZ`jTWIW}G0s8ZCRo@3={egRane}o3VQJE{G`6Di4e{^& zJV14|ty4a&+8Fu?S@)liB!vd!kS6Vu9PKZR^}LFVtuCL%^x|wW^s#2sA!FY@hN8l! zx8zp&Kf0(S;S2GnU?8hgZ_s%TUFb`b6VCh#aAhueTDvLDzOdY++G>s7B$kda)3ZFc z^+B$L9|9x8E#g=7#kH@q1?e0Ic?s1Tp~g5m#PEPOA-tNtPB&fY`TF{L+NBI&pt+o- zwWtBYNe&6=NVG=Zq7ETE2B~0BH=n5~L3;4MU018TGw zoYv;CGwqQpvEx-h(X!UVl>>%7yA`VMgc|d67BeysT0(`In1~LukXdd`S1J@WLP{~) zW}{Fzag&IDouja^k=ZLt4_zbRPwz&@E!R)1^)25T=VTQboSE!6R&atCSWJ@=1gFu} zdEu)bZ`2(GFjo3}(v+S>9s{MW((Dnm-PyElNxgiEHKy|1kD#+D!YS2^j_KC!-P*RFl+^ zZS}ln!Cbd2$h+!}9(KR9pY>77WAV3z`jKbzSgI9xbtdX}b>2yTs%>p5`AEyq>h{$V zPwV}Mnap_7#B*&H^?vr8n_-^IaP8)k*0>{)rrWzgT{h_Es%#i-mRe448Jl&m6$L|R z$m_h9E|SdtabFBnl2oow|I9EN-meVuA3@R|l+G^uvh=^mm4jAg?i6MmZ;Urs*;ag% zMh$hx-`saz7+HAjgFeQiB{Nm5vd`EMm4i&)Cplj0nR)IMUUSR*!mPUC!L`Q-bQ*wO zio3T>9eQaiSAAIj*@IATOVk&U)QX zDl5#aXA${v@+Mu7{jyBi_$#R<6sIuz>ZhY3*1T9benjk7pp8k zo}@WPx|hi_?C~_lzt7TpG^G+faae?&FdMIQ+is?8V{Nwa!xax{*mJX^7xIq+=dk*l zE5A2q1D66ve$_OZ(7+Pc6$>EYdux=fqwNUF9a?Ope1>P!CgK|h?kqm_IQ9`Ajmm*7qIb*yS8{+X$)zws5`Dy zMs2c@NoVex399)PFdaqdt%@m)V~M`M&qAq&)5pSZ-qiJZH?|?L-0VRTXh(+}PFw*S zJEWgWN4f_o-%G+S)WrT%Ik9m^xKHGSUC0)kowX5NP|F%$ui&0LkoC!w_tlsQmYc9O zyCuMP=|6}v$Gu<%tOT+&N@SOadK1iHwMZGNFZtuvy8`D0m?RQd5c-*iaI|`H+|z#t zgIow~xBY12kYC`QXB=1vK)~{V0l#}U`rJQ%OrhS8{?DaYP-UO_v9E(e5Kn+O&h=?u zf6=?rCs>%zDL$iTk^rBSpzjiTMf0d)nT!;R$I3BQ4&s^2rPWMCBaMH0e? zIVhQO_HKrQf*kRJo!Nsiu}UObOuA%a@R2T4f8bInlbvIxagJ9qTjFa~pM{{sUKE|_ zP1@W*#`cxT^cE2JfMd(ilWj`TAjV&-f4U24!rG159&au%p9{R0h-h>K#PSf94g!3t z{=&!o+O)6QV<2*~l3D*el;HsIS?4wpj5R7+pFm5aQHRU@ySiH=brZKhB#$#5D^Lz( z^dt7q!`eK&X3T!3J1Abm*y*E<^oBe?!(MFOodQ%hu-(|wWKQ){C_7Nowz0n2>4K*$ z)(P|WLLAEkDld|L4l%#wBb-rohLprNdjQc>U^`St`v#4~@9zOPjp8)6$Cbsck+uS$ zjOl_r-~Lk}h9D{?zW?@z;i{J3<5QP@d|8_NQefMne}|6W$n5KfoE%))+V8rVw~6a- zv{_e1UXdxIEfNktSD`ak4V$hMsBrdvG@=*3ROSQKxs|KVb^Z+&Vr7;VS(RqsfByp| zpSC$`AJjwTH7$2d!2Ayy%slt2O^RY_F*tlf-_tW8k$sajiG>nrbv znv7Pf)5s)uujRn%t@{nti`~3oH3AqzCSOHyCjg zwmISJ*%sz;UqPcI2!CzQvMJ5GVM06Tf@0c_{ehjMG4$V)CQT(0d_Bt?YNXY$ z+pWSv_rO!xh@0+xd^LXq46Rl){`>*m+{i+C%zXL+F1)+Eo$P-A*z=X&{Y^G3(t-^s zOaV%Mm(l0xqIR-l-rnxcJn5AdY)DW^p`cKZ!VkYKD76^Ua5Zs24 zhJtZMpa}5l;{LL~bO)05^+V6iliQojZ+0HI-k6{oc)&kg1bNp6)1*FDRaNzss;Lz! zNJrkl$*us(%;%C~DYu&oDdSe94w_bO{aGyZXoaWJOwZ2p-t|L4&P7Ym$W%<=Dg^F{C0Do4gM}I+=CcCx$1ffWgnNij=QidujZ?^f`olov+J4JTZn@Gt`4T7 zRwC*S1N4fVTS)F<(*sbRydBdn1>W;^o}(#GnWpEv!iCO<;CKbu?_~#~{FTNx2P*lc z2iKu>>0r*b6B06*!ZY1>(lWAm*Vh*mqfTCtw*7>{KR$Tqk zGMbLrLr4?jPvs93HnF;xd^WVgV(-#sOCdFrBU7{RVA~BK9ZalAtyn~ ziAhu}TD}bxCrR7u94z4`DAI(ds;>M<)9;5twf&$4`%|7;2$Vz}&9U$;=T)`BQ)9;7 zQdjIuqb~WPp`1bNl5>ph7eoGKKHRYsFV%Jj4BrP}G=~qCuUB4V>Hq%9XD^KpnQ#li zIJH^;&|v^jTDlDu&}!Nb0DAS-!;w7h>f~4o<|O*q;hiE>MIMG^t*l8oL1znHQkjKk ze=ycReiv4{9{~*$vc9^wdaGMrKsB^CyKU^qVLPX^P&0Ge+0^tCtSH^oXuFT)nwp$x z^)5Q(;5DzFH#NP;jP2!YVRY-v=KHm$c|?xB_DyTqf3#Bv1MJ<~h2D_|%hty|18c(2 zH42eW2ZPvqF`w1eu*&AodB<y^res%!iu~7C`qrjo(B<&#T}ihoh5Ej? z_bzZvcPC2tZ*D;Q>io~n53lk*IFWaWZ>kie<)yXtoYuZ(w^iO`nrX?5Z3vS;=G=Tn3GBPq zay-Ag*^`6cXP5le!YnypU=7f#BpG*7HN|HV6h#$`;jMxsF7x!qD(2Xt9U4n*qG$H{ z5_U?5;H+&Iv^t}1nBmqcnT5Ca*ih)NkmN$AZK!^eP`fy-wIt$S9)ktK+D)De&zFs} zk|yiC*O${1(jB|_*t&!gT}+WxrlmhVMpm74p)bO+HIh%J0%l__aTN!>C1DTOk8ZZYNI z_b>|HX?)ejbPyVu*wM8C;g7Tt#={MQmd1pu)vmAkBkpChlmBfES6KNa@D+02tsCT2 z<|IEb4@FuZ@Cg-O)%M$Fo;Mn;;+)y3VS0XQ!%`TQ*#U=o7ZoXDqV<^O!a}Ae8aTDt zeasgp;5+H?{M=LS>6;ltyZ#R&xc+lW*agi`G1v67OCw@F|KM_bCls=B(SK+JNUL%|G8mVT z_WK#eErF@Ot6n>mE#Kg(8StfEgYkrK(~-qIq$zcOcR3m*sK&xpwjgIG zs(-HF+ZW-n`P{5d_$P*@5)CbhQoQ@!G|UQiCBEC4Xd;wYGMe@a;Rt7)r}zwRt~G83 zf%PI%GWY#l6>}8d3+7D|$vJK{tAC{VbbprpNNKE^ZB!TDm`ha;#!MYBX6{05ajVrO z0v~xXQ9o6OttSelco{IGLnSzkXEf$0lWepv73U_I*Lts06Hd4MNNw5|tMi4SZK>bS zRA;Kcyo?Lo{n%2a?1?{3YRx|=^|LSXJo2LV+B2{TbP1>6Q0M@0ER* zW<r9U(3~)W&!pZCh1>~ z)1}!{d%TBFK~V?RfkArH7M0)e3lwwi!X=b;kF6qaYGPG>hu82mH*5u{Bq@R1{=^YB z6+{C_{f1dBh`5Yv=U)B=NJaH|KGs2tiQlOr(*La1S#EH_g!SHFhyf(ZKI5!dz^nNx zsI1R52Oi)O2Fv1G=X1}-_UqpmOsumMYQ}F3ir){)qImVhE2AD@?<7qvOm!=>oPj7o zt)d}O-H)@C8A;j;xD$Lhzj8o>1r_pfqS>zrhz9=?aS+PuN5J|+Y~KJI9VKgvY5p?} zL(kUbV%$-Rwr=zC^B4AKKWNxdn15iYh4WpvsBZ^6ITCGiWy+SUbIwSs9c~v@OlqK1 zp(WFP(>{SwtBcc%g&l?S)(<^>3mZ z9%vEoD0JO}kp6+-sN0#=ai{5_^K?P)7(PhALeWCmL|~5xjx_f8RR=o5uq*nvNlJ(j zlI*`rTYgS=_Nb=0yuBKg!R|Q3KM=dCWuAFgQxmyV=3qHauaC*0ikE_*_$(&+V0QB2 za(iiu=-M7{LT5d%L^73FgC|Gjq+lAtyrEmsO&#<}Y1#&Sg_(=saW; zHxOpV0}S9V<8~YRVobhnJ!21f< z`IyJq$wvs4uD105#TS*~hs81SAAw*=FA%%_o7G?oZtTN1myit|;0HZh1q5m7Xl@Op)*TF-<0BZBjH(=%_SiLb@~Itk+lF{HX<&L72kK ze^}}_?nZ33_Dks4OVTTkcye@ZdF|_k@Zio9Ya|n3Et1J>be|LpG*I8}s|YwgD8j@+ zxl;mx3x!v|iVe10ecJK9!07;Yh^$pV%oipqP~%Z@%GUE#{LP3DiVmq&7?yM-Hjp zIu zgA6suwVKWE5C(^7#lda(gnDeE;@FMX?wsmLyx_$r9ex!)ohY*!?V!y<$Iqqwy33AJ zB{Uo@Y*TtaowLi8j4H3<$(h&^xkYOh4Hi9)JItMVCTl9??MaGIR~rd;2!T7eu=Ia^ z9|b8sfXFTa3z;#w5KL%!e~f0nTzBfV>xl@(C}NKXqx+ zWeD@moGob<%ctlY($buS*S)7d@NLGSUmEeZ^$k`Hgw#m_5Q!mm$4Vs#cs1qXbUP(!Wha%q7u7T{Sgf&=sg34w3EXw&y@mj?b_Q zYCT*ZYW>moDO$3mb!m?{M&gn3b8kVIo*Ug?xg|`v={m-C35Ar^be1YPUn-fezgbs3 zUyoft^e+3|+`y%8kM170ksiP9 zb7Y@_kYzgL$9>rUh#ZDlqz#(xZhN<2A&Lz|(E4Yt79(NkaDM( zUm=ur>aOtf0*O;IeR;Z!26pci%3aw|BJMIHhlIP`+SLSh$Xrp8H}=2)2S zoi3REnlGwz5NruOeRzEJQYGwopH^1mqW?d|y?H#9Tl+A6lVOY4DnrJ-sU*`@9h7O? ziqb%GN=2pyMJPj*+`H@~LmEh>P?Dq~B{CBY=0;?uq70Etnciz{W9QU!&hPhrzt4OB z(erug?6t0S&C|LTVJ~L~1iw5=^Fe2&ok0i;P#7#Ot|TU&Sl<*5JXi)bS_ANc)};m- z&uHXyxddmuq5S7c;s$?Go0;c6Cr|56-0A+67!KVPPs(yA2RrlT7`mrA9laxz`-Y^ghiK@VT`4$*@~ z#YijoU5ZR=&!I!z(1!Q^SegLUR0-P2)gzz?h?VJ8Iy&$Qok$<(?BF61NG2&S2X#l6 zX*<7hy@U6{d~LLCq=*!OD^ECAdvu`mi2ujNh+~6LULXPuv`sCAM#a3|Yqm@@6XG+v!iVv~0y^%@DZOK6{Pav@RdV-fN<{S}vV{DJ64tsX=kVodUXL7HGGWYAy?nwBxa`4a6>1<% zcxAFbpeIlMLX>}FZfZ(o$0?a`;XGa+9I7Hg@h3l}Y+lJHnC3-_yta}!+b<{XWw&~c z+?U1S-uV?d6c=J?;c6PfR|6c_9X!DZ0!|+C*rE@8kpK-hiP0$a=JQZv*GKap#81mM z^oE5!SoOXBxx2Fvl}Np{GpbAW$m@a1C_7n>7`HsWmL+hii#+@czr6f|2aZ*@STEOM zyZi-thpSwqIPczHF?T^buIYIooDWpM=W;uAlAL+@OB~s>(C5B zYd-t!6F@V=x1jauf{U+ncBk>WKn|aDqpIZufb@FTEIsK7f=N2(_wC|ma0x43^f%-? zZOD5%zJJeZ@>8D1+{adUJy_})R;VBXq$C{aZ97m@wKqCNW-$j}^&Iw^jjz7yR>UH& zk*MR_?52EJK-#pcG~rUi@=8#Bn*GiihUzXYXKemh9_rU;#0LP`&I6jLg!KGanqPcn z(9M;>l*k&;YEp!5(6!vrfds(jIuoGnrhNST=?!0hq`rYEiWx~&WR)*>3taSj-J|=&h9`m`CRBRj>}dO%oU4i3@^}U1-+PyY zDVBWwR4_P9NaHVU_i6S}_G1c#L=7>DLs{<+NGaDJbAI?X3py(zVrD$p z!Nw=(-#QD!qi*U+5je#!{TOKUSK?@PQ9ey9{oFVZPN6NGRazeI-gqkKnXszUz0G!U z(l5P}?n&~1GK1t}{aJ92?gv|(Lw>C(M&5QxXc)x>#?W((iOdH@{McG&S7TT|8mOk37S`%gRSfV)|2G%jrg9IE%eU4n zzd%1w3`1A+#qRGG){FO%%;#TdXH!k$hy}fbf0YhAa98c*w=)_Tofm936QtWIvCe%$ zhA3K*r&H!C9V~{7H00qk{uI&_UO*?&6XF7QJTH~dyy~F%=1M<4X1t1(|43Y2a{jnz zM@LPXcm6@E`DZ9*R3SaV^83!BLYbNnO7)Fs1c=!WEwz6gBIV{(Imhpq`9-)Z={8DQ zy3oOWhw5QP)d0&AXYrDED*hX1mA2;H+V;_yU&BdTZEUtzr|H&s?M-HC6~nJt5K97d z25d0@9K6Iu$ZT1&d}Ihh5uQM5vyGAi9kcXvGc9mjuFKZR_z{kGSMXK{(}c~Jsfw%< z_Tz4AtW$lv*|1eSP>8X9MAN_F)^h`bl};zN+Vb#xm!!c#kJyZt&Z&XTj!`)bqbuF{ zS$2NH3Kih?W>lW`;mKXte83tvxq5%c75)5{oOUK@5os*t!B0`T=w(vy60u_fma7*E zyZc)LtQ4K|L1S!K@lLNPa5GYd4x7KKbj?VG3uoBn{i!f(Y0p`)prsw>eGYwF*?9Lj z`*x4UQ!=?w)$uH`^$W2+Tf2+9hwjHCP0$x}!XGJwkr&3T ziLH|V2TWpr|H{S%+~4UOkWBcp+kHcl(H&jDh(21p3KqZFe`3ROp;co*cdAJtjb?QG z$V=~+`8k1H1Ojl8#>1EWZ!T3LHSuuid@pJ!C>pBjIwAiLpCE;?!ogLy6N`++eXhkV zFIPFn^;nQ*Di0+m3Xl?WL#8OdEXY9pF!Hkmslq1-C~el3eeTxWXU51!dsLhj)-ipqByorz z1>bu1a)oNr{uO8D;*l~!t6%v-r)-e6X#V#zYM=VI= z6K**tM`q+Via`Pdbt5vjFzG6c{5Er9mwR?yH%q`iW_<@{f*EBNbz+K66$6bHEQ}X( zsP4hsfHp%J(W^J-XyeR-(F1qu2^MgXG1sIOvsd_Xe|zV76MMAm&ns2%cR|k4YRLz^ z*fHu7@Dkdfi7iE(Rbqs;!+f4G>Reh2do&wJhNwXNhj2&N z=ci#`J`}9(w5;62VW|&J?dxbQVSJYDk{qz&s2E6uDtxMHZm!Z0#xy2P(#$un+~6X0p$+&eNHGZxHN$1aMI*=&=08ix#^+njz1)K{bl zD?u7;PML2$dzW<`%@f53WpDw2D!nT!Q`ua8pGMdI?~&IfGuep?@%Snz^PBHc(H{J8 zFt+>J-ElFrOunfvSg<^vsg-RG0(6dHDoEpWS;6O4R> z&|jb#Fm@}ttz31(+?U?Z(O&W4OS7(r+ghXyP1!Ny%i^cV zuvJaslG)3BB{l8YBE@g2UcsAAndj`BHDgogRcLE1n~Qcj-}9p|dej>FbKA373A@rj zGl0xwnYC^O9Z)t8j#VUJ=%A%GqQywmRNb%>!q$jIpuo9r^YU_kG7<=`;cw7KAS?IGV3Xs3h{l?PvbkD4_5c&=; z!5C6*e~9Q-=-m-@XM{AS+w~vp0I7)rT%R$4ONffYtk5U={un#a_*7Q4InP!&7A}@m z<2w(aFEd5wnw#StT3E@+!rb%NVY+SA@N85Mh=goJ+1RbFO7nh_zMC!2?Pai7_*07$v?GrfHO_ zH)2oVG0qmM{Y;Gh4skm~!lLjVNTdLglQU+|mBcKr^dq<-IeS-h6GYqJ>tof{;97!A z_5fUV{V25e>RqGS1Q6j5tBQO`$7ML5l-v>W|8hZJu-qes6FW~yY8X<~=@;Gi`MpoY zvAP4m8?wL~CVH3^bSKPyxR6ftvk+5a5Cyxrp9yRQP843-`!4Vj%!X>bW(OH`0VsWU zmE2>jgDy}kGD=19LYVAuxPWb@-Ky&PNBOSUGDf|?{s;Jy*;hrvgP{5w17tFa1xMJB zG<56xepD&|xAN}E=EJeRq+6&7CLtCM)Fo0_Z4==nO*bO5Fhn}+)3@5Ij7Fo&HdtSg zy}QR@ig|)oVkERJnW*wW5c7Kdeu7jHLCVM`E{wrDBmo?#0;$5tgJWoeNm2-JAFl9` z%}SKS4jq7iIkG7+* zjyPt%Ok|~Sc(Zs{2sMAR9*wiGq!2WKCtz$H1Iy)LB`mPrkCErHj}$W5;a)0ekuv4V z?W*{0|N5Ll^;&0$cA@FWa!*M&WFRtIbV!KP9V;0ioaLK9DA{{hQk&;I8MHiIZpAXwf*UGzI_mvP^;}y(~ zb~I`znF*Q|GurbYzgop>uD)%MT|P8`u!lWD{}8U6)md%rw-@*~VJYy#O~3k_&!_4hLUSRo9YY;;C1cdk0L6=|&OiDtMLgJBoXfH>h$-RbH%cvlO0nL%V%Cp^eS96ary| z$(p4q%3fd*5mZ#_&Iitq^sheK@7fVs5LMEu!Y$}448Q0@hf^OvTsIspgqUj$rZ?RA zEc`R+J`!CndFTANOhaqPzJj4Tg${?}ALdtvoSQf2#)JjPQ4h@|2fZ2|7cM9UUyZKQ zS^uCvFL+KJ2VdeI5$APG{xZrPqxRSe55fJ%k`~YtpoI?ZL#x~uktUFt+?l)<#|2Go8qAGm*>NWJ)> zzK@HvZih#?A_LUU_=iT8)1N-a!D10}Vc-M2I>^RKsCp1MlYKEo33x4{Ebl>?-s++F-zTvE9v17~)5|4~41U%ghIQ=|PzVT_sF1Ta_&1(d-y>DHcR8bLB7ReQ{3 zT^)yySY$Er8oN(aqXJ$xIpqjsF@$#9QiA*;QB38j1)wftdkg? z%Xa6aJ&~4jMG5M57{*udNjpr0!JDYlR-dmYDKUYN8)p8a3eEB866pBXsen!tOCUiT z_vzqA_{51$S!C61*rlmQWI&=IvZ{lfFW0ADr#s@X5}i_+18t7C-bWAh#C#G_wS$$$ z_0Ks7tRs^Urvw0}Fd@rbsi6@fC#}q8=mU3E1q%T#2`&kZ2Oq;{lHLFkPKe-vjWGkQ zh6-;iB_@D^iV8@=UFdl5Co@9VRvC`_fo~xKC<~EtnypJnjths2w?>)vBR`5(cjEQW zE40I)>65vlN1(MPREM)h-Y}br##g0_An4{K?ih6;Gz`D${d1g^lH}-=haeZL2v(18 zBMXuiT5J&^&Ltt{=}txY1p|(F&!uVQx9sLBds4!(MuH0s6h5yKq9tQKi)Js8{nb>v`X=amzH1`5tn zIn?v{Y<-Tude|`(cP{YWl6k2nuICTGwGg3BlYs!J$putySv!?L7CCqMa zD=K32#0=eG&I3S;XFmdiShg2(enPbVTfsJ@apb0oQiWX?_z=dbB)7sz610nj7WkKgu~Cx-wrmZkrUV_R{hlBSa`>ye zP3T$B*n4#4Ku<>B-VIE@tDrVri$^@K{OtOZg4A0O;W2eL4PWFXp>-AnuH6`}g^z!c z-C%4j=P+@+TPr2539j@rC4-IVmUyi{uQ0mNb-6`n@MjR`qt##L5^2E|Fl5&h-4)1UV#Pu0Ni(LT_Ait;MX8MYq)ubrTkW z!a4OE0M?wX?i+tpJ^Um_(}efnK(VI6EmWoJoc?Ld%HG(r8ffT=1n72X)UK_2dtfYS zOWOvqy8~EapM?27U^o}AYO{3v;F|DeJ;WJs^>aRFR=he3&JgZbN9RB2!EB6Uu1Ft5 z=jUObfAhWi7jTQkRruby7m&;Rvkv&o(T1=!$hVKXGbHwKsFw>+s)N3w!rsYlRYwN?5WP+wq>h8hXP#RDi)Vi z9oM`IU};@GJ~E&nJG;q-GwlAfm6pB3|L}WD%smB6dm$_lt}Kjy%fdiAwxM1z1`(QD zc{}XsuSWCtF+B(?smtOZ!%99xnrR92zrF8Jh1qH1y8sE`6;|$Ovs^0Z37L^^l5c{* zOh|YHHbPon5g(S-9-Bsp_Ao+Ks)}oOaENzn%s@0!qWH(E0wBq>_p<`E^9ok;SgqlK zQ7VrUEoNDBKIq#~$!l{YEO8qA-^*5(>jING8!D*mn#3?>%ZC<+qLMZM#7Azc>Rmm_ zW8`)pHxq66H&lY;Q?%Raq0kSxf)CoaBq1oR39}u# zbWl;d@6EwYyQic&4WydNg_NerDZ@PV#P*ldp>Ox{eLG8;joTD*e)9+4#yo&5NfSF< zn}vx#;77fv4{_Yxm&iTvI0oOKy6e#d*0G1@0qwz%e2$?Jx*9`Y@ljVW3^rK6q(1HAef6`a}zC& zuE-#}bgsj9J=4Rk!5cZOgbjx<6z5IK3dsy<8^<-{E(S<^jnPrwsw68OvJd~azAQYA1N1~i zNZXbOUTMxJ<^9^v{#-Nt04fKxv=7;PS#O_|O!_m_n&k&+-}J{r#rKmJ(uXZlVMFF% z0^DRu@^6J(aJNEgm*PkA1;x6xH!iE#o*=IAx`w?TAt-2wvqu^V4{>D1oPozSg&__C z%rl@r9>EPSY;iDnGdjhM6^48Q{hNUJ6FtPlK^=y?eDl}gG!je^ecTqfp2jIi z$796o8^bE+jdRW6r9!}Yu((}_{iG?!+z??GlE8V^B{-f=+BIFZ1P*L_t~Z*ZML@LG zA;JZO@|)MZ@0w!a2NO;??%sonNMOzVitqT0VgB6yNgoU|SP1h!usP>?emr2BgPdn2 z)ajUCI)fm(pGT^?q;9b9dxC(_R5`(Lkd2#Zu;ZdIrd%6`lEMDIJmPn@v3wcw*`zj z6ro9%xRnzwq0_wgoZKtY8p*FTm?lY@d-vI;)8*jJRj5?9u7WNLKOHv173}oOg|+=v zCZHWMtv}RXI#u%iF9=JkEW#&_L!I1W8N9@fy;%pxS*7g{(y+Y*hOMAX_+F+oK>tJ7 z)|&Z#30LgxVE9U+>Ihssnbm0b$XC2A?j!#LOyi^FoVubCRD&~F(!W7vf+!bUv?lj3 zg27tYEy#A_5q#wI#~<6KYfmncMo9s5)6h&8UneBXU4_JziCc%`(pB}AyNS!6bKqJP zDH%zB*(W9Jl=kZ@C7?NO?_M&s4_pt$Zrz8hD)$LNxL{_#0<;)2GtIP%aQ{aAz+Hk= zwZu~p?vbM&jSpDqA_XPG`ycs=@#u1PHJx3*=lz@fdO`Y6a)MXyE@^H)UA$%K6ffVp z0BBo=nre8-d7@Q)n#;ETyw$F)^SGq)%D0WwW*y003_;S>!PYnU>Izb(U%if-Q`Mj% z4AOv1>A0g>tTM-DzcYwpa$F^4@<1krAc`VVP@c?zuV6vx14fX#O129O<@_xslX!|7p)N zxz$3XQbZPlTg8AogZR|(I>t?x4^xyc(D(LNmln8F!2lI{&yvBb9mAP=BH24K{AiO%@d#f==Ix}2pq)PW~i38#=d7e9KN(?a1o=h&qH=IW7~ zz|V@zK_+_lHg`+q^V2LTi=BA|Zp+FlijtS_oNN2PKJ2Nn~(qbeyCa6vqe2BXqJiv0J zMj8zG^@O#CT|1TWzB-Lrf|08d%STuIF?uE^$*QoNH^lk9NEO{ zrGVn#18r^|%zKE;E$J|G9cH9}flXPokId-&W(jF#)JQSrGI5biVurBX&F^#xg{#CG zjs*>*jXpA~YMN2Dv9cAvs?h7%^lZ-~*Oidtc{ZsCaMTgflvD2ClJjxdw5>iNn{@%A z%}S}`PB0CvYeN1J-EV_;S3o&UR0#AcsvAy@-XFvPilBV-$O;BUoF>?`b19k8@GPM{ zB}eV2&Cp)$IZ!nD)UA5@ZuAwfFcb0DGMGF8Vh+-CTD9z?e4D5v#DQNZW(&?k-@{sr z%)-L(1KZtrJ+3O>PGM&q$DD7Yb5~=8IvE!p&;b zzcltO3xOjt?_c=H7o8-Adkob=|KA&{6oZ8_OcJuP66QR}ki8Sc!S6>szM7SyEWOd& z_EEpuk3(S*(%X4YTwSFD zqh4<9*G5$nY$_{9{hBYmmL44)Bzwz?4(~aCYF-=8$gf{Ogw()lNMuWR4(qp)83RLs zqe(^u(~PbzlJlm-(Uwv{eujczIH;VT$@cn2d~^G(q)c*vQ=0p%K)t!gomlr@xH=qv zNooV-p|Wj4SA_P`-iGHQKW^@yhSHM`I6iE#D3`N@e~O5luo?YWoAwXqRcuyuPxN7& zFYl8-mn;W`2!wzX^hIcYce8QTl_zg|-;_h(>D4Gdvc6a<15g2qe>S^7p(d8+MYEE4-A1_mLPP}b! zt@#>nmTArOG1w&cLfY)ZuFp2R!8x|n9v#+>&$#H>cL^_<%#zUg!OUQiEh_kD?R9;( zgTM8B)EB~bJ$OAks?a^vjk}L%9|v3K6yRdrzw2o zSb*GZWTXjNuRtE37ruH{1Z80suaTfZ+;Pc3$Ak7SgOg{^W`(3Lrggh&D0;N4uGP5U zhh!Z*NS5pR=Y=^`-vv0G2p(@BM!RxkFsJiI^9DSPo%qR*&pU{Ul-Na#CMww4JnGWl zH$Psc?x@?hm_3tA)3-C1j;$KnWz!!tcyd(V1}59xi%SHtlV@RIpvc&WjgVUfUq=_M z*1viV8&OJWt>jXe0J(f{V6@H{FOYjVnfJkbkyflWO&%zGJ)-?xDf$jfB|Tss@)72v za*^0TNTlgRee4>f>BW$^=ICE0(TN^ge_RCO7v($|_7v3YuiB$Ot8EhV7&lDX#!`|T zxL7>I_EK_S41Lp8|OaFISBq5g?N*RGwM z1D)98A01uq%D#$U(I=*sM+e7;dC0K;yLHF|4X01GEUHE2(3U|y zu4Qv{h*V*yQ_TEFA~5iuVA4Z}i`uvNI9MMjw#;QEpjJr&DGw@!U<6O1$e{D=LIP>! zjtg45A<77m=y36sNWZ5%<+k-N1DBVyGWl_u@=D^nO?6f*3>fWu1CTK$Wv4NkIgGSI zI^lTGG91|ATjF=+2mDlmXNuP0GETl7h9kX|Yu-ThVEn7^MH^%NoJ z&l~!`A`}cX{5z$r7(e}fIkGP%AtL`8tMeo`K$rW(_X(9G&PXZz5~*sSQdPn zAH?H7P;!cp!ax5U9lz`b`FQ8U;BT%iUeFu{f=nLQJ2*{@g^>#L+)%hSO_e&w!+QkL z!R^K?reVUAf-vzqwYcW3aY0IqDzouCRvCn5pF%?LrTa{ws8 z6BxXs!dS*iH~=2bZ0d6|xQj&38}Q!B+0f{qOT`%k(iMHa9exs%OJrY13h=`nyi#T+xAT#!B!ar)!Ag1@BI-$)g9VkYVPOYbe` zL;3ndE1(5s{JVt`(ig$rb-W(&=8p~z*%%IO2$MQ*I$ZeAI`0!G$!?;i+CEF6iN!Dy zyt05LP<#lq(QR4XOS%3PvZ~pM8`jEJMF*E(pG-udIrCV86Ob>^xWM1Iph;ab4F6X= zU9<{ofHy#$&ZR)DCCJ}o(3A$upF!?MkwXoz)$I5_uxChE95 z#Wh10@85MY{#VNw_8rSD)%{+-$bQO(B~TDs9Eq)}t`U|Z1UU{3{VYVkk)chRbSE=| zO2z2(@N`f2C5_&bz+v3*egl?Lo?498yk$ye;`bMQw10)W+iY;Vr6uRX$0zNPC#O~v zgm;dxY!5ao4+7~snGvFW)bQWfMZ9RCJd@=r;yb4_{+QE}a=ohh=n^m@+COUlorv19 zFq*X7DJ%I-&z6{qwM?lX>6qlp{T=ss`57_5Cw!Su>|x3Sj+}t$0`W7Wbj+oy3ByIq z7krccF(yv}#-kg8u?<}-YiJ-FZy+ldnh6<=UkcdI>p2Ke)fA%Jf{k|=?$FY(Z_~ji zF-T{J8Lr@}g4F8Ce%vejv9&Me-(axl)A>U2z8vpYA?+^;Ps#*pO&vUe3Veg@F5BOs z7;3zOhs=N;MdhDuF+SZGPpI(6ZjV)uez*MgrNOH(Y|1O2R}>Bb7j{^j-@+HPtrm*Ta=VFh}`j;EdS4~l+&ky*IN_Vj9djaC6Q40?rfP={N@qSBQ8L>V*2RuBd zH+gy!P+{2_TM*W)UAL#j>9SqJ?^YkZi2NRyga02qTIWDj-A+rH{ZrVYYa_S8Xiaj` z;7(tXMrPGY9;#ihc3w*EJR4_0&XfhyUU6gvqKwiJ>f*sVKN@8O9CkS!t5=#@87 z8vxrJ>My-2CL!-AYlj-UEsU3FXKa|llQ8pLmg^37hoXYNx%lE_`5K2gzk+N!V4LlV z(u@n-MlYuyc3JYJcnUHB;3IWP_=v#zI|?I`icL6!zwS@)PfCs5vLDH$0@+(Bb3>ijv?Q3xOqFuZv6sX zIMWMd;wvp+IjBmB>zw+3x=ra`rY*JPb=jU)sLR%{O7>$;kLW+5zA9k3LbQEfJV15Q z6$A+yrRppo|7LbRj zrC@$#h~YY0x$S45z}!1Ymi5FY{S#^c@w{ft{TMD^%>hwg4P90=J7&)8p7dP z61<+kO7P$YNT3-90=FY`sTXHTcq+P2{uXo6M@G=B^(h&&5d7Eoff`@&%~QXyP_8}u7>CHraq|1*)U_89;jwM zJrU4&lyFUyMpzFy$ce~f%xS_WBad89b|NtLAToRz^-~IyiY{bfdgYo`+qJmKSF$9M zdw8Kn@SAw{S~~G=k_Rs1y$!GD9H;{_B`yKRdCu z=f1brVamWrcNDy-GWjvXYwY%y@b>j5iJQOG9{qio{(*y7`~AK*+1=^Yo53k|&Q3xE zUHuvkBnR)$C?k)Ev!`!bQ1%ypl9qwx9+2IILxFACXyzm&SSJg@%;hpzNHJPt-j1V0 ztJsnq6PcC2TU}pn5;P!j>UP#Ub<~c>7fk)52z3Q4a!t*HjKEmoT!XgLzh6UGhVBH` zL-IK1AVTov*N3K55FNE+!hR4aY{HXENIu0mbOn>|ikRy(iMnhLk1YC3f zYmkXgM46HuN2^cr8hq}Rslzju#u!eKJX;(E@Cin#dyYUa+(>JIeJS+o{3hK*fBhGx!~2Z; z>>WLPN%lNCjF8qk=-&EG)`|b>hJ4;$8Ewx47gM2dGx0eirxYu(A;f`H1r{oUcKgi& z>S`DL#M`!9ok~?@=knulAiAAPY41D5XT;R#)~o}kYoVL@H;TQ?1Z$``4HP?^Q7)^RH6}v?Vzy| z(yo91`H>Iqi`^2W-6l7NMnFVT%5iuLT2(;T7N%abfhhnB^kvp;WMR%EgP8(bCoK$b zB#5h5L=1K2Z+v%tiUxGJe~n>mE#X-i1oHRzB;x{O=dTZbyG+U^=JD%|+NNNjUqH}P z*=xF!?GOcaTZ7*{Ze0FqTk4;35A&m~hNUZFbxepGTB1sWJGSxky`~5FN%V-lm!) zKDj>-kV(d6w~mas4H)oT8|^V}x%s=3R6kAAI!MU_b{y^h8uf7f6c{9wrpXWHKWi{511#YruXcf;*39Y&uYQL3)c&8C`^%qU?oXnP9;Up0{cBIb89KIOgz&T8Z~^LrtBN*xRmY$xZpimmSYu?F|~$e36rliUu!~> zC4+b~ick)7RR4ktd<+?vzGAs)a@V|vS8z`)kUfObYuFD`?t2p=1Y%kEmcRad{MX=4 zcA2zTX1VOS?|uH3)zlIRE$AF{JM)=RE?bThBta%zSBXz6OrZRWRY0L4sNUsQhBmcK z{SJl`ugYJ!cQAiLb;}4pUR3XV*LgmQtlU`ZiU+Ddxbx`@6G&M z!nWMJ*I}_snLckX{_M(B`U$H>NfeBd+7Xr<7wr;<=MhVG$nE_K^WJ|_2M4ld5ICF9 zdf(#{7yD`Z?ab5eOLg?h@Fm~jwJ2|$6%q9dAJrkVx69*0eNg!aJi4<$mdqQH(Yi_nvV-1o#) zreU&v-~j%V5_s6>JklZWjqQ8KwUtKzoLtL&ld-8|yyAhPx#+;N~>xNPf2(D~V z%;$gCRLjl6cq}zd)H}97?sA0#MPRv_$RV8x@IbiEBD0QT>pt%oO5J9#Rs1;NwZ)c> z5iKrK5#(tmqoo9QnEFk2aN<`}yEN2VIDEKp+A00f&g^wm3!Zkm`cR-y zU0gvrP=*5n&Kf!;Km1|D~!#wNt&Yw*WwPuf6xSxm^Tn?UdY>L0INHj$V!%hLn z>-G8ZdtOI7UlcR-;S|74nomBvlv)00{qQWFS3hhTZy2HU1x9`1FjpVu0Zk8ns@weH z4tUpkjcT8l%zB?Sh^))R*Nz-a?4r%rCPK61%^KnG4~=$`YfSgGeunseyuM|p%u4v` zlaTW=r2GZi*3oGi(BLVc6-=FKlCydsHE}LsMf!!46q;kk$ZH4&#%hRL;3|6)*|zN2 zEJYf};FIzvFAOcN=6yw{9seje6KyRsxXJ->QCxCOc;?zkZ4|P!*RubxiNPURC(6L* zxM6MWXTy3m2hUC)P=IN{tT_)&U(RQ^TEOimb)`3PF2ew2*b;WB|9?w zFXp`b5YrPCbY;rCV3w%z2-7$24fZA{;bb49dwKltd@TAJPkIux zj+5sj-WeXeFilC-FGf<18N1evWUj~~{@_zK)Sq(`*UXzO0{y?p#NB~64mdYuX^CCu zXwK>=!8Hf=9@RcLjcu_;WEwEamQ*}zUHY2L3igK#+mYol?aCLgNMv|Mytl8FmxB(4-hzJ~3@0bn^H(b&A%eT76q84e>=^qJo zd5?c+fApP!SKj{et%i{lfB9}8|NrOD7-_MezgQ-dPyahQGxnJNH*g<<$wd?UGyjc* zI+T9?{ZF9w@8@R-gmMSZxEU%QJR|tO_6N@s o*`+9OlwY$_#{})VK&Y(J?dhoT$6;~_vtqPn)rOV#XqLzS55d=-K>z>% delta 101900 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

_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 aa69e82ef5ce9fc046ca4067e78cf99274cd4302 Mon Sep 17 00:00:00 2001 From: "Jonathan S. Katz" Date: Tue, 20 Apr 2021 10:26:14 -0400 Subject: [PATCH 77/77] 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/metrics/Chart.yaml | 2 +- installers/helm/postgres-operator/Chart.yaml | 2 +- 8 files changed, 152 insertions(+), 5 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 4781fb0fb2..3e3a4c5c4b 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) @@ -299,3 +299,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 43a8521b61..096fc13b55 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/)! @@ -170,3 +170,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 1498e1afeb..e94a083ebc 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.4.3 diff --git a/installers/helm/metrics/Chart.yaml b/installers/helm/metrics/Chart.yaml index f0324b1373..ca63681a3f 100644 --- a/installers/helm/metrics/Chart.yaml +++ b/installers/helm/metrics/Chart.yaml @@ -5,4 +5,4 @@ type: application version: 0.1.0 appVersion: 4.4.3 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 diff --git a/installers/helm/postgres-operator/Chart.yaml b/installers/helm/postgres-operator/Chart.yaml index 3e8c477fbc..138c8da4b3 100644 --- a/installers/helm/postgres-operator/Chart.yaml +++ b/installers/helm/postgres-operator/Chart.yaml @@ -5,7 +5,7 @@ type: application version: 0.1.0 appVersion: 4.4.3 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