Merge branch 'master' into default-db-roles
This commit is contained in:
		
						commit
						4268d97190
					
				
							
								
								
									
										2
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										2
									
								
								Makefile
								
								
								
								
							|  | @ -97,4 +97,4 @@ test: | ||||||
| 	GO111MODULE=on go test ./... | 	GO111MODULE=on go test ./... | ||||||
| 
 | 
 | ||||||
| e2e: docker # build operator image to be tested
 | e2e: docker # build operator image to be tested
 | ||||||
| 	cd e2e; make tools test clean | 	cd e2e; make tools e2etest clean | ||||||
|  |  | ||||||
|  | @ -11,6 +11,9 @@ spec: | ||||||
|   ports: |   ports: | ||||||
|     - port: {{ .Values.service.port }} |     - port: {{ .Values.service.port }} | ||||||
|       targetPort: 8081 |       targetPort: 8081 | ||||||
|  |       {{- if and (eq .Values.service.type "NodePort") .Values.service.nodePort }} | ||||||
|  |       nodePort: {{ .Values.service.nodePort }} | ||||||
|  |       {{- end }} | ||||||
|       protocol: TCP |       protocol: TCP | ||||||
|   selector: |   selector: | ||||||
|     app.kubernetes.io/instance: {{ .Release.Name }} |     app.kubernetes.io/instance: {{ .Release.Name }} | ||||||
|  |  | ||||||
|  | @ -42,6 +42,9 @@ envs: | ||||||
| service: | service: | ||||||
|   type: "ClusterIP" |   type: "ClusterIP" | ||||||
|   port: "8080" |   port: "8080" | ||||||
|  |   # If the type of the service is NodePort a port can be specified using the nodePort field | ||||||
|  |   # If the nodePort field is not specified, or if it has no value, then a random port is used | ||||||
|  |   # notePort: 32521 | ||||||
| 
 | 
 | ||||||
| # configure UI ingress. If needed: "enabled: true" | # configure UI ingress. If needed: "enabled: true" | ||||||
| ingress: | ingress: | ||||||
|  |  | ||||||
|  | @ -62,6 +62,8 @@ spec: | ||||||
|               type: string |               type: string | ||||||
|             enable_crd_validation: |             enable_crd_validation: | ||||||
|               type: boolean |               type: boolean | ||||||
|  |             enable_lazy_spilo_upgrade: | ||||||
|  |               type: boolean | ||||||
|             enable_shm_volume: |             enable_shm_volume: | ||||||
|               type: boolean |               type: boolean | ||||||
|             etcd_host: |             etcd_host: | ||||||
|  | @ -305,7 +307,7 @@ spec: | ||||||
|                   type: integer |                   type: integer | ||||||
|                 ring_log_lines: |                 ring_log_lines: | ||||||
|                   type: integer |                   type: integer | ||||||
|             scalyr: |             scalyr:  # deprecated | ||||||
|               type: object |               type: object | ||||||
|               properties: |               properties: | ||||||
|                 scalyr_api_key: |                 scalyr_api_key: | ||||||
|  |  | ||||||
|  | @ -32,8 +32,6 @@ configuration: | ||||||
| {{ toYaml .Values.configTeamsApi | indent 4 }} | {{ toYaml .Values.configTeamsApi | indent 4 }} | ||||||
|   logging_rest_api: |   logging_rest_api: | ||||||
| {{ toYaml .Values.configLoggingRestApi | indent 4 }} | {{ toYaml .Values.configLoggingRestApi | indent 4 }} | ||||||
|   scalyr: |  | ||||||
| {{ toYaml .Values.configScalyr | indent 4 }} |  | ||||||
|   connection_pooler: |   connection_pooler: | ||||||
| {{ toYaml .Values.configConnectionPooler | indent 4 }} | {{ toYaml .Values.configConnectionPooler | indent 4 }} | ||||||
| {{- end }} | {{- end }} | ||||||
|  |  | ||||||
|  | @ -19,6 +19,8 @@ configTarget: "OperatorConfigurationCRD" | ||||||
| configGeneral: | configGeneral: | ||||||
|   # choose if deployment creates/updates CRDs with OpenAPIV3Validation |   # choose if deployment creates/updates CRDs with OpenAPIV3Validation | ||||||
|   enable_crd_validation: true |   enable_crd_validation: true | ||||||
|  |   # update only the statefulsets without immediately doing the rolling update | ||||||
|  |   enable_lazy_spilo_upgrade: false | ||||||
|   # start any new database pod without limitations on shm memory |   # start any new database pod without limitations on shm memory | ||||||
|   enable_shm_volume: true |   enable_shm_volume: true | ||||||
|   # etcd connection string for Patroni. Empty uses K8s-native DCS. |   # etcd connection string for Patroni. Empty uses K8s-native DCS. | ||||||
|  | @ -26,7 +28,7 @@ configGeneral: | ||||||
|   # Select if setup uses endpoints (default), or configmaps to manage leader (DCS=k8s) |   # Select if setup uses endpoints (default), or configmaps to manage leader (DCS=k8s) | ||||||
|   # kubernetes_use_configmaps: false |   # kubernetes_use_configmaps: false | ||||||
|   # Spilo docker image |   # Spilo docker image | ||||||
|   docker_image: registry.opensource.zalan.do/acid/spilo-12:1.6-p2 |   docker_image: registry.opensource.zalan.do/acid/spilo-cdp-12:1.6-p115 | ||||||
|   # max number of instances in Postgres cluster. -1 = no limit |   # max number of instances in Postgres cluster. -1 = no limit | ||||||
|   min_instances: -1 |   min_instances: -1 | ||||||
|   # min number of instances in Postgres cluster. -1 = no limit |   # min number of instances in Postgres cluster. -1 = no limit | ||||||
|  | @ -252,23 +254,6 @@ configTeamsApi: | ||||||
|   # URL of the Teams API service |   # URL of the Teams API service | ||||||
|   # teams_api_url: http://fake-teams-api.default.svc.cluster.local |   # teams_api_url: http://fake-teams-api.default.svc.cluster.local | ||||||
| 
 | 
 | ||||||
| # Scalyr is a log management tool that Zalando uses as a sidecar |  | ||||||
| configScalyr: |  | ||||||
|   # API key for the Scalyr sidecar |  | ||||||
|   # scalyr_api_key: "" |  | ||||||
| 
 |  | ||||||
|   # Docker image for the Scalyr sidecar |  | ||||||
|   # scalyr_image: "" |  | ||||||
| 
 |  | ||||||
|   # CPU limit value for the Scalyr sidecar |  | ||||||
|   scalyr_cpu_limit: "1" |  | ||||||
|   # CPU rquest value for the Scalyr sidecar |  | ||||||
|   scalyr_cpu_request: 100m |  | ||||||
|   # Memory limit value for the Scalyr sidecar |  | ||||||
|   scalyr_memory_limit: 500Mi |  | ||||||
|   # Memory request value for the Scalyr sidecar |  | ||||||
|   scalyr_memory_request: 50Mi |  | ||||||
| 
 |  | ||||||
| configConnectionPooler: | configConnectionPooler: | ||||||
|   # db schema to install lookup function into |   # db schema to install lookup function into | ||||||
|   connection_pooler_schema: "pooler" |   connection_pooler_schema: "pooler" | ||||||
|  |  | ||||||
|  | @ -19,6 +19,8 @@ configTarget: "ConfigMap" | ||||||
| configGeneral: | configGeneral: | ||||||
|   # choose if deployment creates/updates CRDs with OpenAPIV3Validation |   # choose if deployment creates/updates CRDs with OpenAPIV3Validation | ||||||
|   enable_crd_validation: "true" |   enable_crd_validation: "true" | ||||||
|  |   # update only the statefulsets without immediately doing the rolling update | ||||||
|  |   enable_lazy_spilo_upgrade: "false" | ||||||
|   # start any new database pod without limitations on shm memory |   # start any new database pod without limitations on shm memory | ||||||
|   enable_shm_volume: "true" |   enable_shm_volume: "true" | ||||||
|   # etcd connection string for Patroni. Empty uses K8s-native DCS. |   # etcd connection string for Patroni. Empty uses K8s-native DCS. | ||||||
|  | @ -26,7 +28,7 @@ configGeneral: | ||||||
|   # Select if setup uses endpoints (default), or configmaps to manage leader (DCS=k8s) |   # Select if setup uses endpoints (default), or configmaps to manage leader (DCS=k8s) | ||||||
|   # kubernetes_use_configmaps: "false" |   # kubernetes_use_configmaps: "false" | ||||||
|   # Spilo docker image |   # Spilo docker image | ||||||
|   docker_image: registry.opensource.zalan.do/acid/spilo-12:1.6-p2 |   docker_image: registry.opensource.zalan.do/acid/spilo-cdp-12:1.6-p115 | ||||||
|   # max number of instances in Postgres cluster. -1 = no limit |   # max number of instances in Postgres cluster. -1 = no limit | ||||||
|   min_instances: "-1" |   min_instances: "-1" | ||||||
|   # min number of instances in Postgres cluster. -1 = no limit |   # min number of instances in Postgres cluster. -1 = no limit | ||||||
|  |  | ||||||
|  | @ -458,6 +458,17 @@ from numerous escape characters in the latter log entry, view it in CLI with | ||||||
| `PodTemplate` used by the operator is yet to be updated with the default values | `PodTemplate` used by the operator is yet to be updated with the default values | ||||||
| used internally in K8s. | used internally in K8s. | ||||||
| 
 | 
 | ||||||
|  | The operator also support lazy updates of the Spilo image. That means the pod | ||||||
|  | template of a PG cluster's stateful set is updated immediately with the new | ||||||
|  | image, but no rolling update follows. This feature saves you a switchover - and | ||||||
|  | hence downtime - when you know pods are re-started later anyway, for instance | ||||||
|  | due to the node rotation. To force a rolling update, disable this mode by | ||||||
|  | setting the `enable_lazy_spilo_upgrade` to `false` in the operator configuration | ||||||
|  | and restart the operator pod. With the standard eager rolling updates the | ||||||
|  | operator checks during Sync all pods run images specified in their respective | ||||||
|  | statefulsets. The operator triggers a rolling upgrade for PG clusters that | ||||||
|  | violate this condition. | ||||||
|  | 
 | ||||||
| ## Logical backups | ## Logical backups | ||||||
| 
 | 
 | ||||||
| The operator can manage K8s cron jobs to run logical backups of Postgres | The operator can manage K8s cron jobs to run logical backups of Postgres | ||||||
|  | @ -509,9 +520,8 @@ A secret can be pre-provisioned in different ways: | ||||||
| 
 | 
 | ||||||
| ## Sidecars for Postgres clusters | ## Sidecars for Postgres clusters | ||||||
| 
 | 
 | ||||||
| A list of sidecars is added to each cluster created by the | A list of sidecars is added to each cluster created by the operator. The default | ||||||
| operator. The default is empty list. | is empty. | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| ```yaml | ```yaml | ||||||
| kind: OperatorConfiguration | kind: OperatorConfiguration | ||||||
|  | @ -527,7 +537,8 @@ configuration: | ||||||
|   - ... |   - ... | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| In addition to any environment variables you specify, the following environment variables are always passed to sidecars: | In addition to any environment variables you specify, the following environment | ||||||
|  | variables are always passed to sidecars: | ||||||
| 
 | 
 | ||||||
|   - `POD_NAME` - field reference to `metadata.name` |   - `POD_NAME` - field reference to `metadata.name` | ||||||
|   - `POD_NAMESPACE` - field reference to `metadata.namespace` |   - `POD_NAMESPACE` - field reference to `metadata.namespace` | ||||||
|  |  | ||||||
|  | @ -45,7 +45,7 @@ The following environment variables are accepted by the operator: | ||||||
|   all namespaces. Empty value defaults to the operator namespace. Overrides the |   all namespaces. Empty value defaults to the operator namespace. Overrides the | ||||||
|   `watched_namespace` operator parameter. |   `watched_namespace` operator parameter. | ||||||
| 
 | 
 | ||||||
| * **SCALYR_API_KEY** | * **SCALYR_API_KEY** (*deprecated*) | ||||||
|   the value of the Scalyr API key to supply to the pods. Overrides the |   the value of the Scalyr API key to supply to the pods. Overrides the | ||||||
|   `scalyr_api_key` operator parameter. |   `scalyr_api_key` operator parameter. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -75,6 +75,10 @@ Those are top-level keys, containing both leaf keys and groups. | ||||||
|   [OpenAPI v3 schema validation](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#validation) |   [OpenAPI v3 schema validation](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#validation) | ||||||
|   The default is `true`. |   The default is `true`. | ||||||
| 
 | 
 | ||||||
|  | * **enable_lazy_spilo_upgrade** | ||||||
|  |   Instruct operator to update only the statefulsets with the new image without immediately doing the rolling update. The assumption is pods will be re-started later with the new image, for example due to the node rotation. | ||||||
|  |   The default is `false`. | ||||||
|  | 
 | ||||||
| * **etcd_host** | * **etcd_host** | ||||||
|   Etcd connection string for Patroni defined as `host:port`. Not required when |   Etcd connection string for Patroni defined as `host:port`. Not required when | ||||||
|   Patroni native Kubernetes support is used. The default is empty (use |   Patroni native Kubernetes support is used. The default is empty (use | ||||||
|  | @ -93,17 +97,18 @@ Those are top-level keys, containing both leaf keys and groups. | ||||||
|   repository](https://github.com/zalando/spilo). |   repository](https://github.com/zalando/spilo). | ||||||
| 
 | 
 | ||||||
| * **sidecar_docker_images** | * **sidecar_docker_images** | ||||||
|   *deprecated*: use **sidecars** instead. A map of sidecar names to Docker images to  |   *deprecated*: use **sidecars** instead. A map of sidecar names to Docker | ||||||
|   run with Spilo. In case of the name conflict with the definition in the cluster  |   images to run with Spilo. In case of the name conflict with the definition in | ||||||
|   manifest the cluster-specific one is preferred. |   the cluster manifest the cluster-specific one is preferred. | ||||||
| 
 | 
 | ||||||
| * **sidecars** | * **sidecars** | ||||||
|   a list of sidecars to run with Spilo, for any cluster (i.e. globally defined sidecars).  |   a list of sidecars to run with Spilo, for any cluster (i.e. globally defined | ||||||
|   Each item in the list is of type  |   sidecars). Each item in the list is of type | ||||||
|   [Container](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#container-v1-core). |   [Container](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#container-v1-core). | ||||||
|   Globally defined sidecars can be overwritten by specifying a sidecar in the custom resource with  |   Globally defined sidecars can be overwritten by specifying a sidecar in the | ||||||
|   the same name. Note: This field is not part of the schema validation. If the container specification  |   Postgres manifest with the same name. | ||||||
|   is invalid, then the operator fails to create the statefulset. |   Note: This field is not part of the schema validation. If the container | ||||||
|  |   specification is invalid, then the operator fails to create the statefulset. | ||||||
| 
 | 
 | ||||||
| * **enable_shm_volume** | * **enable_shm_volume** | ||||||
|   Instruct operator to start any new database pod without limitations on shm |   Instruct operator to start any new database pod without limitations on shm | ||||||
|  | @ -220,7 +225,8 @@ configuration they are grouped under the `kubernetes` key. | ||||||
| 
 | 
 | ||||||
| * **enable_sidecars** | * **enable_sidecars** | ||||||
|   global option to allow for creating sidecar containers in the cluster manifest |   global option to allow for creating sidecar containers in the cluster manifest | ||||||
|   to run alongside Spilo on the same pod. Globally defined sidecars are always enabled. Default is true. |   to run alongside Spilo on the same pod. Globally defined sidecars are always | ||||||
|  |   enabled. Default is true. | ||||||
| 
 | 
 | ||||||
| * **secret_name_template** | * **secret_name_template** | ||||||
|   a template for the name of the database user secrets generated by the |   a template for the name of the database user secrets generated by the | ||||||
|  | @ -585,11 +591,12 @@ configuration they are grouped under the `logging_rest_api` key. | ||||||
| * **cluster_history_entries** | * **cluster_history_entries** | ||||||
|   number of entries in the cluster history ring buffer. The default is `1000`. |   number of entries in the cluster history ring buffer. The default is `1000`. | ||||||
| 
 | 
 | ||||||
| ## Scalyr options | ## Scalyr options (*deprecated*) | ||||||
| 
 | 
 | ||||||
| Those parameters define the resource requests/limits and properties of the | Those parameters define the resource requests/limits and properties of the | ||||||
| scalyr sidecar. In the CRD-based configuration they are grouped under the | scalyr sidecar. In the CRD-based configuration they are grouped under the | ||||||
| `scalyr` key. | `scalyr` key. Note, that this section is deprecated. Instead, define Scalyr as | ||||||
|  | a global sidecar under the `sidecars` key in the configuration. | ||||||
| 
 | 
 | ||||||
| * **scalyr_api_key** | * **scalyr_api_key** | ||||||
|   API key for the Scalyr sidecar. The default is empty. |   API key for the Scalyr sidecar. The default is empty. | ||||||
|  |  | ||||||
|  | @ -44,5 +44,5 @@ tools: docker | ||||||
| 	# install pinned version of 'kind' | 	# install pinned version of 'kind' | ||||||
| 	GO111MODULE=on go get sigs.k8s.io/kind@v0.5.1 | 	GO111MODULE=on go get sigs.k8s.io/kind@v0.5.1 | ||||||
| 
 | 
 | ||||||
| test: | e2etest: | ||||||
| 	./run.sh | 	./run.sh | ||||||
|  |  | ||||||
|  | @ -142,15 +142,6 @@ class EndToEndTestCase(unittest.TestCase): | ||||||
|                 }) |                 }) | ||||||
|             k8s.wait_for_pods_to_stop(pod_selector) |             k8s.wait_for_pods_to_stop(pod_selector) | ||||||
| 
 | 
 | ||||||
|             k8s.api.custom_objects_api.patch_namespaced_custom_object( |  | ||||||
|                 'acid.zalan.do', 'v1', 'default', |  | ||||||
|                 'postgresqls', 'acid-minimal-cluster', |  | ||||||
|                 { |  | ||||||
|                     'spec': { |  | ||||||
|                         'enableConnectionPooler': True, |  | ||||||
|                     } |  | ||||||
|                 }) |  | ||||||
|             k8s.wait_for_pod_start(pod_selector) |  | ||||||
|         except timeout_decorator.TimeoutError: |         except timeout_decorator.TimeoutError: | ||||||
|             print('Operator log: {}'.format(k8s.get_operator_log())) |             print('Operator log: {}'.format(k8s.get_operator_log())) | ||||||
|             raise |             raise | ||||||
|  | @ -204,6 +195,66 @@ class EndToEndTestCase(unittest.TestCase): | ||||||
|         self.assertEqual(repl_svc_type, 'ClusterIP', |         self.assertEqual(repl_svc_type, 'ClusterIP', | ||||||
|                          "Expected ClusterIP service type for replica, found {}".format(repl_svc_type)) |                          "Expected ClusterIP service type for replica, found {}".format(repl_svc_type)) | ||||||
| 
 | 
 | ||||||
|  |     @timeout_decorator.timeout(TEST_TIMEOUT_SEC) | ||||||
|  |     def test_lazy_spilo_upgrade(self): | ||||||
|  |         ''' | ||||||
|  |         Test lazy upgrade for the Spilo image: operator changes a stateful set but lets pods run with the old image | ||||||
|  |         until they are recreated for reasons other than operator's activity. That works because the operator configures | ||||||
|  |         stateful sets to use "onDelete" pod update policy. | ||||||
|  | 
 | ||||||
|  |         The test covers: | ||||||
|  |         1) enabling lazy upgrade in existing operator deployment | ||||||
|  |         2) forcing the normal rolling upgrade by changing the operator configmap and restarting its pod | ||||||
|  |         ''' | ||||||
|  | 
 | ||||||
|  |         k8s = self.k8s | ||||||
|  | 
 | ||||||
|  |         # update docker image in config and enable the lazy upgrade | ||||||
|  |         conf_image = "registry.opensource.zalan.do/acid/spilo-cdp-12:1.6-p114" | ||||||
|  |         patch_lazy_spilo_upgrade = { | ||||||
|  |             "data": { | ||||||
|  |                 "docker_image": conf_image, | ||||||
|  |                 "enable_lazy_spilo_upgrade": "true" | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         k8s.update_config(patch_lazy_spilo_upgrade) | ||||||
|  | 
 | ||||||
|  |         pod0 = 'acid-minimal-cluster-0' | ||||||
|  |         pod1 = 'acid-minimal-cluster-1' | ||||||
|  | 
 | ||||||
|  |         # restart the pod to get a container with the new image | ||||||
|  |         k8s.api.core_v1.delete_namespaced_pod(pod0, 'default') | ||||||
|  |         time.sleep(60) | ||||||
|  | 
 | ||||||
|  |         # lazy update works if the restarted pod and older pods run different Spilo versions | ||||||
|  |         new_image = k8s.get_effective_pod_image(pod0) | ||||||
|  |         old_image = k8s.get_effective_pod_image(pod1) | ||||||
|  |         self.assertNotEqual(new_image, old_image, "Lazy updated failed: pods have the same image {}".format(new_image)) | ||||||
|  | 
 | ||||||
|  |         # sanity check | ||||||
|  |         assert_msg = "Image {} of a new pod differs from {} in operator conf".format(new_image, conf_image) | ||||||
|  |         self.assertEqual(new_image, conf_image, assert_msg) | ||||||
|  | 
 | ||||||
|  |         # clean up | ||||||
|  |         unpatch_lazy_spilo_upgrade = { | ||||||
|  |             "data": { | ||||||
|  |                 "enable_lazy_spilo_upgrade": "false", | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         k8s.update_config(unpatch_lazy_spilo_upgrade) | ||||||
|  | 
 | ||||||
|  |         # at this point operator will complete the normal rolling upgrade | ||||||
|  |         # so we additonally test if disabling the lazy upgrade - forcing the normal rolling upgrade - works | ||||||
|  | 
 | ||||||
|  |         # XXX there is no easy way to wait until the end of Sync() | ||||||
|  |         time.sleep(60) | ||||||
|  | 
 | ||||||
|  |         image0 = k8s.get_effective_pod_image(pod0) | ||||||
|  |         image1 = k8s.get_effective_pod_image(pod1) | ||||||
|  | 
 | ||||||
|  |         assert_msg = "Disabling lazy upgrade failed: pods still have different images {} and {}".format(image0, image1) | ||||||
|  |         self.assertEqual(image0, image1, assert_msg) | ||||||
|  | 
 | ||||||
|     @timeout_decorator.timeout(TEST_TIMEOUT_SEC) |     @timeout_decorator.timeout(TEST_TIMEOUT_SEC) | ||||||
|     def test_logical_backup_cron_job(self): |     def test_logical_backup_cron_job(self): | ||||||
|         ''' |         ''' | ||||||
|  | @ -594,7 +645,7 @@ class K8s: | ||||||
| 
 | 
 | ||||||
|     def wait_for_operator_pod_start(self): |     def wait_for_operator_pod_start(self): | ||||||
|         self. wait_for_pod_start("name=postgres-operator") |         self. wait_for_pod_start("name=postgres-operator") | ||||||
|         # HACK operator must register CRD / add existing PG clusters after pod start up |         # HACK operator must register CRD and/or Sync existing PG clusters after start up | ||||||
|         # for local execution ~ 10 seconds suffices |         # for local execution ~ 10 seconds suffices | ||||||
|         time.sleep(60) |         time.sleep(60) | ||||||
| 
 | 
 | ||||||
|  | @ -724,6 +775,15 @@ class K8s: | ||||||
|             stdout=subprocess.PIPE, |             stdout=subprocess.PIPE, | ||||||
|             stderr=subprocess.PIPE) |             stderr=subprocess.PIPE) | ||||||
| 
 | 
 | ||||||
|  |     def get_effective_pod_image(self, pod_name, namespace='default'): | ||||||
|  |         ''' | ||||||
|  |         Get the Spilo image pod currently uses. In case of lazy rolling updates | ||||||
|  |         it may differ from the one specified in the stateful set. | ||||||
|  |         ''' | ||||||
|  |         pod = self.api.core_v1.list_namespaced_pod( | ||||||
|  |             namespace, label_selector="statefulset.kubernetes.io/pod-name=" + pod_name) | ||||||
|  |         return pod.items[0].spec.containers[0].image | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     unittest.main() |     unittest.main() | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										16
									
								
								go.mod
								
								
								
								
							|  | @ -4,16 +4,20 @@ go 1.14 | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	github.com/aws/aws-sdk-go v1.29.33 | 	github.com/aws/aws-sdk-go v1.29.33 | ||||||
|  | 	github.com/emicklei/go-restful v2.9.6+incompatible // indirect | ||||||
|  | 	github.com/evanphx/json-patch v4.5.0+incompatible // indirect | ||||||
|  | 	github.com/googleapis/gnostic v0.3.0 // indirect | ||||||
| 	github.com/lib/pq v1.3.0 | 	github.com/lib/pq v1.3.0 | ||||||
| 	github.com/motomux/pretty v0.0.0-20161209205251-b2aad2c9a95d | 	github.com/motomux/pretty v0.0.0-20161209205251-b2aad2c9a95d | ||||||
| 	github.com/r3labs/diff v0.0.0-20191120142937-b4ed99a31f5a | 	github.com/r3labs/diff v0.0.0-20191120142937-b4ed99a31f5a | ||||||
| 	github.com/sirupsen/logrus v1.5.0 | 	github.com/sirupsen/logrus v1.5.0 | ||||||
| 	github.com/stretchr/testify v1.4.0 | 	github.com/stretchr/testify v1.4.0 | ||||||
| 	golang.org/x/tools v0.0.0-20200326210457-5d86d385bf88 // indirect | 	golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b // indirect | ||||||
| 	gopkg.in/yaml.v2 v2.2.8 | 	gopkg.in/yaml.v2 v2.2.8 | ||||||
| 	k8s.io/api v0.18.0 | 	k8s.io/api v0.18.2 | ||||||
| 	k8s.io/apiextensions-apiserver v0.18.0 | 	k8s.io/apiextensions-apiserver v0.18.2 | ||||||
| 	k8s.io/apimachinery v0.18.0 | 	k8s.io/apimachinery v0.18.2 | ||||||
| 	k8s.io/client-go v0.18.0 | 	k8s.io/client-go v11.0.0+incompatible | ||||||
| 	k8s.io/code-generator v0.18.0 | 	k8s.io/code-generator v0.18.2 | ||||||
|  | 	sigs.k8s.io/kind v0.5.1 // indirect | ||||||
| ) | ) | ||||||
|  |  | ||||||
							
								
								
									
										67
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										67
									
								
								go.sum
								
								
								
								
							|  | @ -46,6 +46,7 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc | ||||||
| github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | ||||||
| github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= | github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= | ||||||
| github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= | github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= | ||||||
|  | github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | @ -62,10 +63,14 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkg | ||||||
| github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= | github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= | ||||||
| github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= | github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= | ||||||
| github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= | github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= | ||||||
|  | github.com/emicklei/go-restful v2.9.6+incompatible h1:tfrHha8zJ01ywiOEC1miGY8st1/igzWB8OmvPgoYX7w= | ||||||
|  | github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= | ||||||
| github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||||
| github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | ||||||
| github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= | github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= | ||||||
| github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= | github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= | ||||||
|  | github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= | ||||||
|  | github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= | ||||||
| github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= | ||||||
| github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= | github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= | ||||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||||
|  | @ -145,6 +150,7 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ | ||||||
| github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||||
| github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= | github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= | ||||||
| github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||||
|  | github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= | ||||||
| github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= | github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= | ||||||
| github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||||
| github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= | github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= | ||||||
|  | @ -155,10 +161,13 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ | ||||||
| github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= | github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= | ||||||
| github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
| github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= | ||||||
|  | github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= | ||||||
| github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= | github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= | ||||||
| github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= | github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= | ||||||
| github.com/googleapis/gnostic v0.1.0 h1:rVsPeBmXbYv4If/cumu1AzZPwV58q433hvONV1UEZoI= | github.com/googleapis/gnostic v0.1.0 h1:rVsPeBmXbYv4If/cumu1AzZPwV58q433hvONV1UEZoI= | ||||||
| github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= | github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= | ||||||
|  | github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0= | ||||||
|  | github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= | ||||||
| github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= | github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= | ||||||
| github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | ||||||
| github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | ||||||
|  | @ -174,10 +183,12 @@ github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= | ||||||
| github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | ||||||
| github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= | github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= | ||||||
| github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= | github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= | ||||||
|  | github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= | ||||||
| github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= | ||||||
| github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= | github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= | ||||||
| github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= | github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= | ||||||
| github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= | github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= | ||||||
|  | github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||||
| github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||||
| github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= | github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= | ||||||
| github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= | github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= | ||||||
|  | @ -204,6 +215,7 @@ github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN | ||||||
| github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||||
| github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||||
| github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||||
|  | github.com/mailru/easyjson v0.0.0-20190620125010-da37f6c1e481/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||||
| github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||||
| github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= | github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= | ||||||
| github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= | github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= | ||||||
|  | @ -216,6 +228,7 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh | ||||||
| github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||||
| github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= | ||||||
| github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||||
|  | github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | ||||||
| github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | ||||||
| github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= | github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= | ||||||
| github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | ||||||
|  | @ -228,9 +241,11 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+ | ||||||
| github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= | github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= | ||||||
| github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||||
| github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||||
|  | github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||||
| github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= | github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= | ||||||
| github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||||
| github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= | github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= | ||||||
|  | github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||||
| github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= | github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= | ||||||
| github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= | ||||||
| github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= | github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= | ||||||
|  | @ -238,7 +253,9 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 | ||||||
| github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= | github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= | ||||||
| github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||||
|  | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||||
|  | github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
| github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
| github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= | github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= | ||||||
|  | @ -257,6 +274,7 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So | ||||||
| github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= | github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= | ||||||
| github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= | github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= | ||||||
| github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= | ||||||
|  | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= | ||||||
| github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= | ||||||
| github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= | github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= | ||||||
| github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= | github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= | ||||||
|  | @ -264,7 +282,9 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k | ||||||
| github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= | ||||||
| github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= | github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= | ||||||
| github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | ||||||
|  | github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | ||||||
| github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | ||||||
|  | github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= | ||||||
| github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= | github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= | ||||||
| github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= | ||||||
| github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | ||||||
|  | @ -277,6 +297,7 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM | ||||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
| github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
| github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= | ||||||
|  | github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||||
| github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= | github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= | ||||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||||
|  | @ -289,7 +310,7 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb | ||||||
| github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= | github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= | ||||||
| github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= | github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= | ||||||
| github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= | github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= | ||||||
| github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||||
| go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= | go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= | ||||||
| go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= | go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= | ||||||
| go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= | ||||||
|  | @ -361,6 +382,7 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w | ||||||
| golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f h1:25KHgbfyiSm6vwQLbM3zZIe1v9p/3ea4Rz+nnM5K/i4= | golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f h1:25KHgbfyiSm6vwQLbM3zZIe1v9p/3ea4Rz+nnM5K/i4= | ||||||
| golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
|  | golang.org/x/sys v0.0.0-20190621203818-d432491b9138/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7 h1:HmbHVPwrPEKPGLAcHSrMe6+hqSUlvZU0rab6x5EXfGU= | golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7 h1:HmbHVPwrPEKPGLAcHSrMe6+hqSUlvZU0rab6x5EXfGU= | ||||||
| golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
|  | @ -388,8 +410,8 @@ golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgw | ||||||
| golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||||
| golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||||
| golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||||
| golang.org/x/tools v0.0.0-20200326210457-5d86d385bf88 h1:F7fM2kxXfuWw820fa+MMCCLH6hmYe+jtLnZpwoiLK4Q= | golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b h1:zSzQJAznWxAh9fZxiPy2FZo+ZZEYoYFYYDYdOrU7AaM= | ||||||
| golang.org/x/tools v0.0.0-20200326210457-5d86d385bf88/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | ||||||
|  | @ -431,31 +453,46 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
| gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= | gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= | ||||||
| honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||||
| honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||||
|  | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs= | ||||||
| honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||||
| k8s.io/api v0.18.0 h1:lwYk8Vt7rsVTwjRU6pzEsa9YNhThbmbocQlKvNBB4EQ= | k8s.io/api v0.0.0-20190313235455-40a48860b5ab/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= | ||||||
| k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= | k8s.io/api v0.0.0-20190409021203-6e4e0e4f393b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= | ||||||
| k8s.io/apiextensions-apiserver v0.18.0 h1:HN4/P8vpGZFvB5SOMuPPH2Wt9Y/ryX+KRvIyAkchu1Q= | k8s.io/api v0.18.2 h1:wG5g5ZmSVgm5B+eHMIbI9EGATS2L8Z72rda19RIEgY8= | ||||||
| k8s.io/apiextensions-apiserver v0.18.0/go.mod h1:18Cwn1Xws4xnWQNC00FLq1E350b9lUF+aOdIWDOZxgo= | k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= | ||||||
| k8s.io/apimachinery v0.18.0 h1:fuPfYpk3cs1Okp/515pAf0dNhL66+8zk8RLbSX+EgAE= | k8s.io/apiextensions-apiserver v0.18.2 h1:I4v3/jAuQC+89L3Z7dDgAiN4EOjN6sbm6iBqQwHTah8= | ||||||
| k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= | k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= | ||||||
| k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw= | k8s.io/apimachinery v0.0.0-20190313205120-d7deff9243b1/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= | ||||||
| k8s.io/client-go v0.18.0 h1:yqKw4cTUQraZK3fcVCMeSa+lqKwcjZ5wtcOIPnxQno4= | k8s.io/apimachinery v0.0.0-20190404173353-6a84e37a896d/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= | ||||||
| k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8= | k8s.io/apimachinery v0.18.2 h1:44CmtbmkzVDAhCpRVSiP2R5PPrC2RtlIv/MoB8xpdRA= | ||||||
| k8s.io/code-generator v0.18.0 h1:0xIRWzym+qMgVpGmLESDeMfz/orwgxwxFFAo1xfGNtQ= | k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= | ||||||
| k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= | k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= | ||||||
| k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c= | k8s.io/client-go v0.18.2 h1:aLB0iaD4nmwh7arT2wIn+lMnAq7OswjaejkQ8p9bBYE= | ||||||
|  | k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= | ||||||
|  | k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o= | ||||||
|  | k8s.io/client-go v11.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= | ||||||
|  | k8s.io/code-generator v0.18.2 h1:C1Nn2JiMf244CvBDKVPX0W2mZFJkVBg54T8OV7/Imso= | ||||||
|  | k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= | ||||||
|  | k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= | ||||||
| k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= | k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= | ||||||
| k8s.io/gengo v0.0.0-20200114144118-36b2048a9120 h1:RPscN6KhmG54S33L+lr3GS+oD1jmchIU0ll519K6FA4= | k8s.io/gengo v0.0.0-20200114144118-36b2048a9120 h1:RPscN6KhmG54S33L+lr3GS+oD1jmchIU0ll519K6FA4= | ||||||
| k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= | k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= | ||||||
| k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= | k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= | ||||||
| k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= | k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= | ||||||
|  | k8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= | ||||||
| k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= | k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= | ||||||
| k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= | k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= | ||||||
|  | k8s.io/kube-openapi v0.0.0-20190603182131-db7b694dc208/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= | ||||||
| k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c h1:/KUFqjjqAcY4Us6luF5RDNZ16KJtb49HfR3ZHB9qYXM= | k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c h1:/KUFqjjqAcY4Us6luF5RDNZ16KJtb49HfR3ZHB9qYXM= | ||||||
| k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= | k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= | ||||||
| k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= | k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= | ||||||
| k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= | k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= | ||||||
| sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= | sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= | ||||||
|  | sigs.k8s.io/kind v0.5.1 h1:BYnHEJ9DC+0Yjlyyehqd3xnKtEmFdLKU8QxqOqvQzdw= | ||||||
|  | sigs.k8s.io/kind v0.5.1/go.mod h1:L+Kcoo83/D1+ryU5P2VFbvYm0oqbkJn9zTZq0KNxW68= | ||||||
|  | sigs.k8s.io/kustomize/v3 v3.1.1-0.20190821175718-4b67a6de1296 h1:iQaIG5Dq+3qSiaFrJ/l/0MjjxKmdwyVNpKRYJwUe/+0= | ||||||
|  | sigs.k8s.io/kustomize/v3 v3.1.1-0.20190821175718-4b67a6de1296/go.mod h1:ztX4zYc/QIww3gSripwF7TBOarBTm5BvyAMem0kCzOE= | ||||||
|  | sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= | ||||||
|  | sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= | ||||||
| sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= | sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= | ||||||
| sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= | sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= | ||||||
| sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= | sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ metadata: | ||||||
| #  annotations: | #  annotations: | ||||||
| #    "acid.zalan.do/controller": "second-operator" | #    "acid.zalan.do/controller": "second-operator" | ||||||
| spec: | spec: | ||||||
|   dockerImage: registry.opensource.zalan.do/acid/spilo-12:1.6-p2 |   dockerImage: registry.opensource.zalan.do/acid/spilo-cdp-12:1.6-p115 | ||||||
|   teamId: "acid" |   teamId: "acid" | ||||||
|   numberOfInstances: 2 |   numberOfInstances: 2 | ||||||
|   users:  # Application/Robot users |   users:  # Application/Robot users | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ data: | ||||||
|   # connection_pooler_default_cpu_request: "500m" |   # connection_pooler_default_cpu_request: "500m" | ||||||
|   # connection_pooler_default_memory_limit: 100Mi |   # connection_pooler_default_memory_limit: 100Mi | ||||||
|   # connection_pooler_default_memory_request: 100Mi |   # connection_pooler_default_memory_request: 100Mi | ||||||
|   connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-6" |   connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-7" | ||||||
|   # connection_pooler_max_db_connections: 60 |   # connection_pooler_max_db_connections: 60 | ||||||
|   # connection_pooler_mode: "transaction" |   # connection_pooler_mode: "transaction" | ||||||
|   # connection_pooler_number_of_instances: 2 |   # connection_pooler_number_of_instances: 2 | ||||||
|  | @ -29,11 +29,12 @@ data: | ||||||
|   # default_cpu_request: 100m |   # default_cpu_request: 100m | ||||||
|   # default_memory_limit: 500Mi |   # default_memory_limit: 500Mi | ||||||
|   # default_memory_request: 100Mi |   # default_memory_request: 100Mi | ||||||
|   docker_image: registry.opensource.zalan.do/acid/spilo-12:1.6-p2 |   docker_image: registry.opensource.zalan.do/acid/spilo-cdp-12:1.6-p115 | ||||||
|   # enable_admin_role_for_users: "true" |   # enable_admin_role_for_users: "true" | ||||||
|   # enable_crd_validation: "true" |   # enable_crd_validation: "true" | ||||||
|   # enable_database_access: "true" |   # enable_database_access: "true" | ||||||
|   # enable_init_containers: "true" |   # enable_init_containers: "true" | ||||||
|  |   # enable_lazy_spilo_upgrade: "false" | ||||||
|   enable_master_load_balancer: "false" |   enable_master_load_balancer: "false" | ||||||
|   # enable_pod_antiaffinity: "false" |   # enable_pod_antiaffinity: "false" | ||||||
|   # enable_pod_disruption_budget: "true" |   # enable_pod_disruption_budget: "true" | ||||||
|  |  | ||||||
|  | @ -38,6 +38,8 @@ spec: | ||||||
|               type: string |               type: string | ||||||
|             enable_crd_validation: |             enable_crd_validation: | ||||||
|               type: boolean |               type: boolean | ||||||
|  |             enable_lazy_spilo_upgrade: | ||||||
|  |               type: boolean | ||||||
|             enable_shm_volume: |             enable_shm_volume: | ||||||
|               type: boolean |               type: boolean | ||||||
|             etcd_host: |             etcd_host: | ||||||
|  | @ -281,7 +283,7 @@ spec: | ||||||
|                   type: integer |                   type: integer | ||||||
|                 ring_log_lines: |                 ring_log_lines: | ||||||
|                   type: integer |                   type: integer | ||||||
|             scalyr: |             scalyr:  # deprecated | ||||||
|               type: object |               type: object | ||||||
|               properties: |               properties: | ||||||
|                 scalyr_api_key: |                 scalyr_api_key: | ||||||
|  |  | ||||||
|  | @ -3,11 +3,12 @@ kind: OperatorConfiguration | ||||||
| metadata: | metadata: | ||||||
|   name: postgresql-operator-default-configuration |   name: postgresql-operator-default-configuration | ||||||
| configuration: | configuration: | ||||||
|  |   docker_image: registry.opensource.zalan.do/acid/spilo-cdp-12:1.6-p115 | ||||||
|   # enable_crd_validation: true |   # enable_crd_validation: true | ||||||
|  |   # enable_lazy_spilo_upgrade: false | ||||||
|  |   # enable_shm_volume: true | ||||||
|   etcd_host: "" |   etcd_host: "" | ||||||
|   # kubernetes_use_configmaps: false |   # kubernetes_use_configmaps: false | ||||||
|   docker_image: registry.opensource.zalan.do/acid/spilo-12:1.6-p2 |  | ||||||
|   # enable_shm_volume: true |  | ||||||
|   max_instances: -1 |   max_instances: -1 | ||||||
|   min_instances: -1 |   min_instances: -1 | ||||||
|   resync_period: 30m |   resync_period: 30m | ||||||
|  | @ -117,20 +118,12 @@ configuration: | ||||||
|     api_port: 8080 |     api_port: 8080 | ||||||
|     cluster_history_entries: 1000 |     cluster_history_entries: 1000 | ||||||
|     ring_log_lines: 100 |     ring_log_lines: 100 | ||||||
|   scalyr: |  | ||||||
|     # scalyr_api_key: "" |  | ||||||
|     scalyr_cpu_limit: "1" |  | ||||||
|     scalyr_cpu_request: 100m |  | ||||||
|     # scalyr_image: "" |  | ||||||
|     scalyr_memory_limit: 500Mi |  | ||||||
|     scalyr_memory_request: 50Mi |  | ||||||
|     # scalyr_server_url: "" |  | ||||||
|   connection_pooler: |   connection_pooler: | ||||||
|     connection_pooler_default_cpu_limit: "1" |     connection_pooler_default_cpu_limit: "1" | ||||||
|     connection_pooler_default_cpu_request: "500m" |     connection_pooler_default_cpu_request: "500m" | ||||||
|     connection_pooler_default_memory_limit: 100Mi |     connection_pooler_default_memory_limit: 100Mi | ||||||
|     connection_pooler_default_memory_request: 100Mi |     connection_pooler_default_memory_request: 100Mi | ||||||
|     connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-6" |     connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-7" | ||||||
|     # connection_pooler_max_db_connections: 60 |     # connection_pooler_max_db_connections: 60 | ||||||
|     connection_pooler_mode: "transaction" |     connection_pooler_mode: "transaction" | ||||||
|     connection_pooler_number_of_instances: 2 |     connection_pooler_number_of_instances: 2 | ||||||
|  |  | ||||||
|  | @ -798,6 +798,9 @@ var OperatorConfigCRDResourceValidation = apiextv1beta1.CustomResourceValidation | ||||||
| 					"enable_crd_validation": { | 					"enable_crd_validation": { | ||||||
| 						Type: "boolean", | 						Type: "boolean", | ||||||
| 					}, | 					}, | ||||||
|  | 					"enable_lazy_spilo_upgrade": { | ||||||
|  | 						Type: "boolean", | ||||||
|  | 					}, | ||||||
| 					"enable_shm_volume": { | 					"enable_shm_volume": { | ||||||
| 						Type: "boolean", | 						Type: "boolean", | ||||||
| 					}, | 					}, | ||||||
|  |  | ||||||
|  | @ -183,6 +183,7 @@ type OperatorLogicalBackupConfiguration struct { | ||||||
| // OperatorConfigurationData defines the operation config
 | // OperatorConfigurationData defines the operation config
 | ||||||
| type OperatorConfigurationData struct { | type OperatorConfigurationData struct { | ||||||
| 	EnableCRDValidation     *bool    `json:"enable_crd_validation,omitempty"` | 	EnableCRDValidation     *bool    `json:"enable_crd_validation,omitempty"` | ||||||
|  | 	EnableLazySpiloUpgrade  bool     `json:"enable_lazy_spilo_upgrade,omitempty"` | ||||||
| 	EtcdHost                string   `json:"etcd_host,omitempty"` | 	EtcdHost                string   `json:"etcd_host,omitempty"` | ||||||
| 	KubernetesUseConfigMaps bool     `json:"kubernetes_use_configmaps,omitempty"` | 	KubernetesUseConfigMaps bool     `json:"kubernetes_use_configmaps,omitempty"` | ||||||
| 	DockerImage             string   `json:"docker_image,omitempty"` | 	DockerImage             string   `json:"docker_image,omitempty"` | ||||||
|  |  | ||||||
|  | @ -478,6 +478,14 @@ func (c *Cluster) compareStatefulSetWith(statefulSet *appsv1.StatefulSet) *compa | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// lazy Spilo update: modify the image in the statefulset itself but let its pods run with the old image
 | ||||||
|  | 	// until they are re-created for other reasons, for example node rotation
 | ||||||
|  | 	if c.OpConfig.EnableLazySpiloUpgrade && !reflect.DeepEqual(c.Statefulset.Spec.Template.Spec.Containers[0].Image, statefulSet.Spec.Template.Spec.Containers[0].Image) { | ||||||
|  | 		needsReplace = true | ||||||
|  | 		needsRollUpdate = false | ||||||
|  | 		reasons = append(reasons, "lazy Spilo update: new statefulset's pod image doesn't match the current one") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if needsRollUpdate || needsReplace { | 	if needsRollUpdate || needsReplace { | ||||||
| 		match = false | 		match = false | ||||||
| 	} | 	} | ||||||
|  | @ -509,8 +517,6 @@ func (c *Cluster) compareContainers(description string, setA, setB []v1.Containe | ||||||
| 	checks := []containerCheck{ | 	checks := []containerCheck{ | ||||||
| 		newCheck("new statefulset %s's %s (index %d) name doesn't match the current one", | 		newCheck("new statefulset %s's %s (index %d) name doesn't match the current one", | ||||||
| 			func(a, b v1.Container) bool { return a.Name != b.Name }), | 			func(a, b v1.Container) bool { return a.Name != b.Name }), | ||||||
| 		newCheck("new statefulset %s's %s (index %d) image doesn't match the current one", |  | ||||||
| 			func(a, b v1.Container) bool { return a.Image != b.Image }), |  | ||||||
| 		newCheck("new statefulset %s's %s (index %d) ports don't match the current one", | 		newCheck("new statefulset %s's %s (index %d) ports don't match the current one", | ||||||
| 			func(a, b v1.Container) bool { return !reflect.DeepEqual(a.Ports, b.Ports) }), | 			func(a, b v1.Container) bool { return !reflect.DeepEqual(a.Ports, b.Ports) }), | ||||||
| 		newCheck("new statefulset %s's %s (index %d) resources don't match the current ones", | 		newCheck("new statefulset %s's %s (index %d) resources don't match the current ones", | ||||||
|  | @ -521,6 +527,11 @@ func (c *Cluster) compareContainers(description string, setA, setB []v1.Containe | ||||||
| 			func(a, b v1.Container) bool { return !reflect.DeepEqual(a.EnvFrom, b.EnvFrom) }), | 			func(a, b v1.Container) bool { return !reflect.DeepEqual(a.EnvFrom, b.EnvFrom) }), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if !c.OpConfig.EnableLazySpiloUpgrade { | ||||||
|  | 		checks = append(checks, newCheck("new statefulset %s's %s (index %d) image doesn't match the current one", | ||||||
|  | 			func(a, b v1.Container) bool { return a.Image != b.Image })) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for index, containerA := range setA { | 	for index, containerA := range setA { | ||||||
| 		containerB := setB[index] | 		containerB := setB[index] | ||||||
| 		for _, check := range checks { | 		for _, check := range checks { | ||||||
|  |  | ||||||
|  | @ -5,17 +5,17 @@ import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	batchv1beta1 "k8s.io/api/batch/v1beta1" |  | ||||||
| 	v1 "k8s.io/api/core/v1" |  | ||||||
| 	policybeta1 "k8s.io/api/policy/v1beta1" |  | ||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |  | ||||||
| 
 |  | ||||||
| 	acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1" | 	acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/spec" | 	"github.com/zalando/postgres-operator/pkg/spec" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util" | 	"github.com/zalando/postgres-operator/pkg/util" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/constants" | 	"github.com/zalando/postgres-operator/pkg/util/constants" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/k8sutil" | 	"github.com/zalando/postgres-operator/pkg/util/k8sutil" | ||||||
| 	"github.com/zalando/postgres-operator/pkg/util/volumes" | 	"github.com/zalando/postgres-operator/pkg/util/volumes" | ||||||
|  | 	appsv1 "k8s.io/api/apps/v1" | ||||||
|  | 	batchv1beta1 "k8s.io/api/batch/v1beta1" | ||||||
|  | 	v1 "k8s.io/api/core/v1" | ||||||
|  | 	policybeta1 "k8s.io/api/policy/v1beta1" | ||||||
|  | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Sync syncs the cluster, making sure the actual Kubernetes objects correspond to what is defined in the manifest.
 | // Sync syncs the cluster, making sure the actual Kubernetes objects correspond to what is defined in the manifest.
 | ||||||
|  | @ -258,6 +258,28 @@ func (c *Cluster) syncPodDisruptionBudget(isUpdate bool) error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (c *Cluster) mustUpdatePodsAfterLazyUpdate(desiredSset *appsv1.StatefulSet) (bool, error) { | ||||||
|  | 
 | ||||||
|  | 	pods, err := c.listPods() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, fmt.Errorf("could not list pods of the statefulset: %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, pod := range pods { | ||||||
|  | 
 | ||||||
|  | 		effectivePodImage := pod.Spec.Containers[0].Image | ||||||
|  | 		ssImage := desiredSset.Spec.Template.Spec.Containers[0].Image | ||||||
|  | 
 | ||||||
|  | 		if ssImage != effectivePodImage { | ||||||
|  | 			c.logger.Infof("not all pods were re-started when the lazy upgrade was enabled; forcing the rolling upgrade now") | ||||||
|  | 			return true, nil | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return false, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (c *Cluster) syncStatefulSet() error { | func (c *Cluster) syncStatefulSet() error { | ||||||
| 	var ( | 	var ( | ||||||
| 		podsRollingUpdateRequired bool | 		podsRollingUpdateRequired bool | ||||||
|  | @ -336,6 +358,19 @@ func (c *Cluster) syncStatefulSet() error { | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		if !podsRollingUpdateRequired && !c.OpConfig.EnableLazySpiloUpgrade { | ||||||
|  | 			// even if desired and actual statefulsets match
 | ||||||
|  | 			// there still may be not up-to-date pods on condition
 | ||||||
|  | 			//  (a) the lazy update was just disabled
 | ||||||
|  | 			// and
 | ||||||
|  | 			//  (b) some of the pods were not restarted when the lazy update was still in place
 | ||||||
|  | 			podsRollingUpdateRequired, err = c.mustUpdatePodsAfterLazyUpdate(desiredSS) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return fmt.Errorf("could not list pods of the statefulset: %v", err) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Apply special PostgreSQL parameters that can only be set via the Patroni API.
 | 	// Apply special PostgreSQL parameters that can only be set via the Patroni API.
 | ||||||
|  |  | ||||||
|  | @ -34,6 +34,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur | ||||||
| 
 | 
 | ||||||
| 	// general config
 | 	// general config
 | ||||||
| 	result.EnableCRDValidation = fromCRD.EnableCRDValidation | 	result.EnableCRDValidation = fromCRD.EnableCRDValidation | ||||||
|  | 	result.EnableLazySpiloUpgrade = fromCRD.EnableLazySpiloUpgrade | ||||||
| 	result.EtcdHost = fromCRD.EtcdHost | 	result.EtcdHost = fromCRD.EtcdHost | ||||||
| 	result.KubernetesUseConfigMaps = fromCRD.KubernetesUseConfigMaps | 	result.KubernetesUseConfigMaps = fromCRD.KubernetesUseConfigMaps | ||||||
| 	result.DockerImage = fromCRD.DockerImage | 	result.DockerImage = fromCRD.DockerImage | ||||||
|  |  | ||||||
|  | @ -111,7 +111,7 @@ type Config struct { | ||||||
| 	WatchedNamespace        string `name:"watched_namespace"` // special values: "*" means 'watch all namespaces', the empty string "" means 'watch a namespace where operator is deployed to'
 | 	WatchedNamespace        string `name:"watched_namespace"` // special values: "*" means 'watch all namespaces', the empty string "" means 'watch a namespace where operator is deployed to'
 | ||||||
| 	KubernetesUseConfigMaps bool   `name:"kubernetes_use_configmaps" default:"false"` | 	KubernetesUseConfigMaps bool   `name:"kubernetes_use_configmaps" default:"false"` | ||||||
| 	EtcdHost                string `name:"etcd_host" default:""` // special values: the empty string "" means Patroni will use K8s as a DCS
 | 	EtcdHost                string `name:"etcd_host" default:""` // special values: the empty string "" means Patroni will use K8s as a DCS
 | ||||||
| 	DockerImage             string `name:"docker_image" default:"registry.opensource.zalan.do/acid/spilo-12:1.6-p2"` | 	DockerImage             string `name:"docker_image" default:"registry.opensource.zalan.do/acid/spilo-cdp-12:1.6-p115"` | ||||||
| 	// deprecated in favour of SidecarContainers
 | 	// deprecated in favour of SidecarContainers
 | ||||||
| 	SidecarImages         map[string]string `name:"sidecar_docker_images"` | 	SidecarImages         map[string]string `name:"sidecar_docker_images"` | ||||||
| 	SidecarContainers     []v1.Container    `name:"sidecars"` | 	SidecarContainers     []v1.Container    `name:"sidecars"` | ||||||
|  | @ -157,6 +157,7 @@ type Config struct { | ||||||
| 	ProtectedRoles            []string          `name:"protected_role_names" default:"admin"` | 	ProtectedRoles            []string          `name:"protected_role_names" default:"admin"` | ||||||
| 	PostgresSuperuserTeams    []string          `name:"postgres_superuser_teams" default:""` | 	PostgresSuperuserTeams    []string          `name:"postgres_superuser_teams" default:""` | ||||||
| 	SetMemoryRequestToLimit   bool              `name:"set_memory_request_to_limit" default:"false"` | 	SetMemoryRequestToLimit   bool              `name:"set_memory_request_to_limit" default:"false"` | ||||||
|  | 	EnableLazySpiloUpgrade    bool              `name:"enable_lazy_spilo_upgrade" default:"false"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // MustMarshal marshals the config or panics
 | // MustMarshal marshals the config or panics
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue