Compare commits

...
5 Commits
Author SHA1 Message Date
lukaszraczylo 1a3472290d Fix CVEs. 2024-01-05 11:49:29 +00:00
lukaszraczylo dc2799ad57 Update TOC. 2024-01-05 11:42:05 +00:00
lukaszraczylo 2bccb0e8b8 Fix chart 2024-01-05 11:40:27 +00:00
lukaszraczylo 249ccb1dac Add missing ImagePullPolicy to the newly created jobs. 2024-01-02 10:06:09 +00:00
lukaszraczyloandGitHub 4217f7ed25 Create dependabot.yml 2023-10-20 10:42:02 +01:00
11 changed files with 110 additions and 65 deletions
+11
View File
@@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "gomod" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"
+1 -1
View File
@@ -163,7 +163,7 @@ $(ENVTEST): $(LOCALBIN)
test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
helmify: helmify:
$(call go-get-tool,$(HELMIFY),github.com/arttor/helmify/cmd/helmify@v0.3.7) $(call go-get-tool,$(HELMIFY),github.com/arttor/helmify/cmd/helmify@v0.4.10)
helm: manifests kustomize helmify helm: manifests kustomize helmify
$(KUSTOMIZE) build config/default | $(HELMIFY) $(KUSTOMIZE) build config/default | $(HELMIFY)
+18
View File
@@ -1,5 +1,23 @@
# Kubernetes Jobs Manager Operator # Kubernetes Jobs Manager Operator
- [Kubernetes Jobs Manager Operator](#kubernetes-jobs-manager-operator)
- [Description](#description)
- [Getting Started](#getting-started)
- [Installation with helm](#installation-with-helm)
- [Prerequisites for local runs](#prerequisites-for-local-runs)
- [Jobs configuration](#jobs-configuration)
- [How does it look in practice?](#how-does-it-look-in-practice)
- [Things to remember](#things-to-remember)
- [Available params](#available-params)
- [Kustomization and references](#kustomization-and-references)
- [Running on the cluster](#running-on-the-cluster)
- [Manual installation](#manual-installation)
- [Manually uninstall CRDs](#manually-uninstall-crds)
- [Manually undeploy controller](#manually-undeploy-controller)
- [How it works](#how-it-works)
- [License](#license)
## Description ## Description
This operator is responsible for managing the lifecycle of complicated workflows which consist of multiple jobs and making their management easy, without need for dozens of yaml files and doing magic with ordering. This operator is responsible for managing the lifecycle of complicated workflows which consist of multiple jobs and making their management easy, without need for dozens of yaml files and doing magic with ordering.
+2 -2
View File
@@ -13,12 +13,12 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.0.24 version: 0.0.33
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using. # follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes. # It is recommended to use it with quotes.
appVersion: "0.0.24" appVersion: "0.0.33"
keywords: keywords:
- operator - operator
- jobs - jobs
@@ -1,13 +1,3 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "chart.fullname" . }}-controller-manager
labels:
app.kubernetes.io/component: rbac
app.kubernetes.io/created-by: jobs-manager-operator
app.kubernetes.io/part-of: jobs-manager-operator
{{- include "chart.labels" . | nindent 4 }}
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@@ -49,16 +39,11 @@ spec:
values: values:
- linux - linux
containers: containers:
- args: - args: {{- toYaml .Values.controllerManager.kubeRbacProxy.args | nindent 8 }}
- --secure-listen-address=0.0.0.0:8443
- --upstream=http://127.0.0.1:8080/
- --logtostderr=true
- --v=0
env: env:
- name: KUBERNETES_CLUSTER_DOMAIN - name: KUBERNETES_CLUSTER_DOMAIN
value: {{ .Values.kubernetesClusterDomain }} value: {{ quote .Values.kubernetesClusterDomain }}
image: {{ .Values.controllerManager.kubeRbacProxy.image.repository }}:{{ .Values.controllerManager.kubeRbacProxy.image.tag image: {{ .Values.controllerManager.kubeRbacProxy.image.repository }}:{{ .Values.controllerManager.kubeRbacProxy.image.tag | default .Chart.AppVersion }}
| default .Chart.AppVersion }}
name: kube-rbac-proxy name: kube-rbac-proxy
ports: ports:
- containerPort: 8443 - containerPort: 8443
@@ -66,22 +51,15 @@ spec:
protocol: TCP protocol: TCP
resources: {{- toYaml .Values.controllerManager.kubeRbacProxy.resources | nindent resources: {{- toYaml .Values.controllerManager.kubeRbacProxy.resources | nindent
10 }} 10 }}
securityContext: securityContext: {{- toYaml .Values.controllerManager.kubeRbacProxy.containerSecurityContext
allowPrivilegeEscalation: false | nindent 10 }}
capabilities: - args: {{- toYaml .Values.controllerManager.manager.args | nindent 8 }}
drop:
- ALL
- args:
- --health-probe-bind-address=:8081
- --metrics-bind-address=127.0.0.1:8080
- --leader-elect
command: command:
- /manager - /manager
env: env:
- name: KUBERNETES_CLUSTER_DOMAIN - name: KUBERNETES_CLUSTER_DOMAIN
value: {{ .Values.kubernetesClusterDomain }} value: {{ quote .Values.kubernetesClusterDomain }}
image: {{ .Values.controllerManager.manager.image.repository }}:{{ .Values.controllerManager.manager.image.tag image: {{ .Values.controllerManager.manager.image.repository }}:{{ .Values.controllerManager.manager.image.tag | default .Chart.AppVersion }}
| default .Chart.AppVersion }}
livenessProbe: livenessProbe:
httpGet: httpGet:
path: /healthz path: /healthz
@@ -95,13 +73,8 @@ spec:
port: 8081 port: 8081
initialDelaySeconds: 5 initialDelaySeconds: 5
periodSeconds: 10 periodSeconds: 10
resources: {{- toYaml .Values.controllerManager.manager.resources | nindent 10 resources: {{- toYaml .Values.controllerManager.manager.resources | nindent 10 }}
}} securityContext: {{- toYaml .Values.controllerManager.manager.containerSecurityContext | nindent 10 }}
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
securityContext: securityContext:
runAsNonRoot: true runAsNonRoot: true
serviceAccountName: {{ include "chart.fullname" . }}-controller-manager serviceAccountName: {{ include "chart.fullname" . }}-controller-manager
@@ -747,7 +747,7 @@ spec:
and the sum of memory limits of all containers and the sum of memory limits of all containers
in a pod. The default is nil which means in a pod. The default is nil which means
that the limit is undefined. More info: that the limit is undefined. More info:
http://kubernetes.io/docs/user-guide/volumes#emptydir' https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
type: object type: object
@@ -962,7 +962,8 @@ spec:
\n This is an alpha field and \n This is an alpha field and
requires enabling the DynamicResourceAllocation requires enabling the DynamicResourceAllocation
feature gate. \n This field feature gate. \n This field
is immutable." is immutable. It can only be
set for containers."
items: items:
description: ResourceClaim references description: ResourceClaim references
one entry in PodSpec.ResourceClaims. one entry in PodSpec.ResourceClaims.
@@ -1009,7 +1010,8 @@ spec:
it defaults to Limits if that it defaults to Limits if that
is explicitly specified, otherwise is explicitly specified, otherwise
to an implementation-defined to an implementation-defined
value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' value. Requests cannot exceed
Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object type: object
type: object type: object
selector: selector:
@@ -2827,7 +2829,7 @@ spec:
and the sum of memory limits of all containers and the sum of memory limits of all containers
in a pod. The default is nil which means in a pod. The default is nil which means
that the limit is undefined. More info: that the limit is undefined. More info:
http://kubernetes.io/docs/user-guide/volumes#emptydir' https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
type: object type: object
@@ -3042,7 +3044,8 @@ spec:
\n This is an alpha field and \n This is an alpha field and
requires enabling the DynamicResourceAllocation requires enabling the DynamicResourceAllocation
feature gate. \n This field feature gate. \n This field
is immutable." is immutable. It can only be
set for containers."
items: items:
description: ResourceClaim references description: ResourceClaim references
one entry in PodSpec.ResourceClaims. one entry in PodSpec.ResourceClaims.
@@ -3089,7 +3092,8 @@ spec:
it defaults to Limits if that it defaults to Limits if that
is explicitly specified, otherwise is explicitly specified, otherwise
to an implementation-defined to an implementation-defined
value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' value. Requests cannot exceed
Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object type: object
type: object type: object
selector: selector:
@@ -4856,7 +4860,7 @@ spec:
be the minimum value between the SizeLimit specified be the minimum value between the SizeLimit specified
here and the sum of memory limits of all containers here and the sum of memory limits of all containers
in a pod. The default is nil which means that in a pod. The default is nil which means that
the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' the limit is undefined. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
type: object type: object
@@ -5051,7 +5055,8 @@ spec:
that are used by this container. \n that are used by this container. \n
This is an alpha field and requires This is an alpha field and requires
enabling the DynamicResourceAllocation enabling the DynamicResourceAllocation
feature gate. \n This field is immutable." feature gate. \n This field is immutable.
It can only be set for containers."
items: items:
description: ResourceClaim references description: ResourceClaim references
one entry in PodSpec.ResourceClaims. one entry in PodSpec.ResourceClaims.
@@ -5094,7 +5099,8 @@ spec:
a container, it defaults to Limits a container, it defaults to Limits
if that is explicitly specified, otherwise if that is explicitly specified, otherwise
to an implementation-defined value. to an implementation-defined value.
More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' Requests cannot exceed Limits. More
info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object type: object
type: object type: object
selector: selector:
@@ -6747,7 +6753,7 @@ spec:
between the SizeLimit specified here and the sum of between the SizeLimit specified here and the sum of
memory limits of all containers in a pod. The default memory limits of all containers in a pod. The default
is nil which means that the limit is undefined. More is nil which means that the limit is undefined. More
info: http://kubernetes.io/docs/user-guide/volumes#emptydir' info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true x-kubernetes-int-or-string: true
type: object type: object
@@ -6925,7 +6931,8 @@ spec:
defined in spec.resourceClaims, that are defined in spec.resourceClaims, that are
used by this container. \n This is an alpha used by this container. \n This is an alpha
field and requires enabling the DynamicResourceAllocation field and requires enabling the DynamicResourceAllocation
feature gate. \n This field is immutable." feature gate. \n This field is immutable.
It can only be set for containers."
items: items:
description: ResourceClaim references one description: ResourceClaim references one
entry in PodSpec.ResourceClaims. entry in PodSpec.ResourceClaims.
@@ -6967,7 +6974,8 @@ spec:
Requests is omitted for a container, it Requests is omitted for a container, it
defaults to Limits if that is explicitly defaults to Limits if that is explicitly
specified, otherwise to an implementation-defined specified, otherwise to an implementation-defined
value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' value. Requests cannot exceed Limits. More
info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object type: object
type: object type: object
selector: selector:
@@ -0,0 +1,11 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "chart.fullname" . }}-controller-manager
labels:
app.kubernetes.io/component: rbac
app.kubernetes.io/created-by: jobs-manager-operator
app.kubernetes.io/part-of: jobs-manager-operator
{{- include "chart.labels" . | nindent 4 }}
annotations:
{{- toYaml .Values.controllerManager.serviceAccount.annotations | nindent 4 }}
+22 -1
View File
@@ -1,5 +1,15 @@
controllerManager: controllerManager:
kubeRbacProxy: kubeRbacProxy:
args:
- --secure-listen-address=0.0.0.0:8443
- --upstream=http://127.0.0.1:8080/
- --logtostderr=true
- --v=0
containerSecurityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
image: image:
repository: gcr.io/kubebuilder/kube-rbac-proxy repository: gcr.io/kubebuilder/kube-rbac-proxy
tag: v0.13.1 tag: v0.13.1
@@ -11,9 +21,18 @@ controllerManager:
cpu: 5m cpu: 5m
memory: 64Mi memory: 64Mi
manager: manager:
args:
- --health-probe-bind-address=:8081
- --metrics-bind-address=127.0.0.1:8080
- --leader-elect
containerSecurityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
image: image:
repository: ghcr.io/lukaszraczylo/jobs-manager-operator repository: ghcr.io/lukaszraczylo/jobs-manager-operator
tag: latest tag: 0.0.33
resources: resources:
limits: limits:
cpu: 500m cpu: 500m
@@ -22,6 +41,8 @@ controllerManager:
cpu: 10m cpu: 10m
memory: 64Mi memory: 64Mi
replicas: 1 replicas: 1
serviceAccount:
annotations: {}
kubernetesClusterDomain: cluster.local kubernetesClusterDomain: cluster.local
metricsService: metricsService:
ports: ports:
+3
View File
@@ -52,6 +52,9 @@ func (cp *connPackage) compileParameters(params ...jobsmanagerv1beta1.ManagedJob
if params.ImagePullSecrets != nil { if params.ImagePullSecrets != nil {
cparams.ImagePullSecrets = append(cparams.ImagePullSecrets, params.ImagePullSecrets...) cparams.ImagePullSecrets = append(cparams.ImagePullSecrets, params.ImagePullSecrets...)
} }
if params.ImagePullPolicy != "" {
cparams.ImagePullPolicy = params.ImagePullPolicy
}
if params.Labels != nil { if params.Labels != nil {
cparams.Labels = make(map[string]string) cparams.Labels = make(map[string]string)
for k, v := range params.Labels { for k, v := range params.Labels {
+4 -4
View File
@@ -54,11 +54,11 @@ require (
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.25.0 // indirect go.uber.org/zap v1.25.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/net v0.15.0 // indirect golang.org/x/net v0.19.0 // indirect
golang.org/x/oauth2 v0.12.0 // indirect golang.org/x/oauth2 v0.12.0 // indirect
golang.org/x/sys v0.12.0 // indirect golang.org/x/sys v0.15.0 // indirect
golang.org/x/term v0.12.0 // indirect golang.org/x/term v0.15.0 // indirect
golang.org/x/text v0.13.0 // indirect golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.3.0 // indirect golang.org/x/time v0.3.0 // indirect
golang.org/x/tools v0.13.0 // indirect golang.org/x/tools v0.13.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
+8 -8
View File
@@ -162,8 +162,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4=
golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -187,18 +187,18 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=