From a678290191ba6adb3fd5f219669461eae10653ac Mon Sep 17 00:00:00 2001 From: Nitish Tiwari Date: Mon, 8 Apr 2024 22:07:52 +0530 Subject: [PATCH 1/2] add distributed option to helm-chart --- helm/templates/_helpers.tpl | 25 +- helm/templates/ingestor-service.yaml | 15 + helm/templates/ingestor-statefulset.yaml | 81 ++ ...onfigmap.yaml => logstream-configmap.yaml} | 0 helm/templates/logstream-job.yaml | 2 +- helm/templates/querier-deployment.yaml | 85 +++ helm/templates/service-monitor.yaml | 4 +- ...oyment.yaml => standalone-deployment.yaml} | 8 +- .../{service.yaml => standalone-service.yaml} | 4 +- helm/values.yaml | 21 +- temp.yaml | 713 ++++++++++++++++++ 11 files changed, 947 insertions(+), 11 deletions(-) create mode 100644 helm/templates/ingestor-service.yaml create mode 100644 helm/templates/ingestor-statefulset.yaml rename helm/templates/{configmap.yaml => logstream-configmap.yaml} (100%) create mode 100644 helm/templates/querier-deployment.yaml rename helm/templates/{deployment.yaml => standalone-deployment.yaml} (94%) rename helm/templates/{service.yaml => standalone-service.yaml} (68%) create mode 100644 temp.yaml diff --git a/helm/templates/_helpers.tpl b/helm/templates/_helpers.tpl index 8733d07db..4d80a71f4 100644 --- a/helm/templates/_helpers.tpl +++ b/helm/templates/_helpers.tpl @@ -35,7 +35,19 @@ Common labels */}} {{- define "parseable.labels" -}} helm.sh/chart: {{ include "parseable.chart" . }} -{{ include "parseable.selectorLabels" . }} +{{ include "parseable.labelsSelector" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Ingestor Labels +*/}} +{{- define "parseable.ingestorLabels" -}} +helm.sh/chart: {{ include "parseable.chart" . }} +{{ include "parseable.ingestorLabelsSelector" . }} {{- if .Chart.AppVersion }} app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} {{- end }} @@ -45,9 +57,18 @@ app.kubernetes.io/managed-by: {{ .Release.Service }} {{/* Selector labels */}} -{{- define "parseable.selectorLabels" -}} +{{- define "parseable.labelsSelector" -}} +app.kubernetes.io/name: {{ include "parseable.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Ingestor Labels Selector for ingestor statefulset +*/}} +{{- define "parseable.ingestorLabelsSelector" -}} app.kubernetes.io/name: {{ include "parseable.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} +app.parseable.com/type: ingestor {{- end }} {{/* diff --git a/helm/templates/ingestor-service.yaml b/helm/templates/ingestor-service.yaml new file mode 100644 index 000000000..9791c8743 --- /dev/null +++ b/helm/templates/ingestor-service.yaml @@ -0,0 +1,15 @@ +{{- if eq .Values.parseable.highAvailability.enabled true }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "parseable.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + type: {{ $.Values.parseable.service.type }} + ports: + - port: {{ $.Values.parseable.service.port }} + targetPort: 8000 + protocol: TCP + selector: + {{- include "parseable.ingestorLabelsSelector" . | nindent 4 }} +{{- end }} diff --git a/helm/templates/ingestor-statefulset.yaml b/helm/templates/ingestor-statefulset.yaml new file mode 100644 index 000000000..eb9a17755 --- /dev/null +++ b/helm/templates/ingestor-statefulset.yaml @@ -0,0 +1,81 @@ +{{- if eq .Values.parseable.highAvailability.enabled true }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "parseable.fullname" . }}-headless + namespace: {{ .Release.Namespace }} +spec: + ports: + - port: 8000 + name: "parseable-port" + clusterIP: None + selector: + {{- include "parseable.ingestorLabelsSelector" . | nindent 4 }} +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ include "parseable.fullname" . }}-ingestor + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.ingestorLabels" . | nindent 4 }} +spec: + selector: + matchLabels: + {{- include "parseable.ingestorLabelsSelector" . | nindent 6 }} + serviceName: {{ include "parseable.fullname" . }}-headless + replicas: {{ .Values.parseable.highAvailability.ingestor.count }} + minReadySeconds: 10 + template: + metadata: + labels: + {{- include "parseable.ingestorLabelsSelector" . | nindent 8 }} + spec: + terminationGracePeriodSeconds: 10 + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.parseable.securityContext | nindent 8 }} + image: {{ .Values.parseable.image.repository }}:{{ .Values.parseable.image.tag | default .Chart.AppVersion }} + imagePullPolicy: {{ .Values.parseable.image.pullPolicy }} + # Uncomment to debug + # command: [ "/bin/sh", "-c", "sleep 1000000" ] + args: ["parseable", "s3-store"] + env: + {{- range $key, $value := .Values.parseable.highAvailability.ingestor.env }} + - name: {{ $key }} + value: {{ tpl $value $ | quote }} + {{- end }} + {{- range $secret := .Values.parseable.s3ModeSecret }} + {{- range $key := $secret.keys }} + {{- $envPrefix := $secret.prefix | default "" | upper }} + {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} + - name: {{ $envPrefix }}{{ $envKey }} + valueFrom: + secretKeyRef: + name: {{ $secret.name }} + key: {{ $key }} + {{- end }} + {{- end }} + - name: P_MODE + value: "ingest" + - name: P_INGESTOR_URL + value: "$HOSTNAME:$PORT" + ports: + - containerPort: 8000 + resources: + {{- toYaml .Values.parseable.highAvailability.ingestor.resources | nindent 12 }} + volumeMounts: + ## No data volume for ingestor + - mountPath: "/parseable/staging" + name: stage-volume + volumeClaimTemplates: + - metadata: + name: stage-volume + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "do-block-storage" + resources: + requests: + storage: 10Gi +{{- end }} diff --git a/helm/templates/configmap.yaml b/helm/templates/logstream-configmap.yaml similarity index 100% rename from helm/templates/configmap.yaml rename to helm/templates/logstream-configmap.yaml diff --git a/helm/templates/logstream-job.yaml b/helm/templates/logstream-job.yaml index 0f2362d66..6525cdd23 100644 --- a/helm/templates/logstream-job.yaml +++ b/helm/templates/logstream-job.yaml @@ -15,7 +15,7 @@ spec: {{- toYaml . | nindent 8 }} {{- end }} labels: - {{- include "parseable.selectorLabels" . | nindent 8 }} + {{- include "parseable.labelsSelector" . | nindent 8 }} spec: restartPolicy: OnFailure securityContext: diff --git a/helm/templates/querier-deployment.yaml b/helm/templates/querier-deployment.yaml new file mode 100644 index 000000000..eb44ffc92 --- /dev/null +++ b/helm/templates/querier-deployment.yaml @@ -0,0 +1,85 @@ +{{- if eq .Values.parseable.highAvailability.enabled true }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "parseable.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "parseable.labels" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + {{- include "parseable.labelsSelector" . | nindent 6 }} + template: + metadata: + {{- with .Values.parseable.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "parseable.labelsSelector" . | nindent 8 }} + spec: + {{- with .Values.parseable.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "parseable.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.parseable.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.parseable.securityContext | nindent 12 }} + image: "{{ .Values.parseable.image.repository }}:{{ .Values.parseable.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.parseable.image.pullPolicy }} + # Uncomment to debug + # command: [ "/bin/sh", "-c", "sleep 1000000" ] + args: ["parseable", "s3-store"] + env: + - name: P_MODE + value: "query" + {{- range $key, $value := .Values.parseable.env }} + - name: {{ $key }} + value: {{ tpl $value $ | quote }} + {{- end }} + {{- range $secret := .Values.parseable.s3ModeSecret }} + {{- range $key := $secret.keys }} + {{- $envPrefix := $secret.prefix | default "" | upper }} + {{- $envKey := $key | upper | replace "." "_" | replace "-" "_" }} + - name: {{ $envPrefix }}{{ $envKey }} + valueFrom: + secretKeyRef: + name: {{ $secret.name }} + key: {{ $key }} + {{- end }} + {{- end }} + ports: + - containerPort: 8000 + resources: + {{- toYaml .Values.parseable.resources | nindent 12 }} + volumeMounts: + - mountPath: "/parseable/staging" + name: stage-volume + volumes: + {{- if .Values.parseable.persistence.staging.enabled }} + - name: stage-volume + persistentVolumeClaim: + claimName: {{ include "parseable.fullname" . }}-staging-pvc + {{- else }} + - name: stage-volume + emptyDir: {} + {{- end }} + {{- with .Values.parseable.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.parseable.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.parseable.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} diff --git a/helm/templates/service-monitor.yaml b/helm/templates/service-monitor.yaml index 5a5d2ba14..5505040f2 100644 --- a/helm/templates/service-monitor.yaml +++ b/helm/templates/service-monitor.yaml @@ -4,7 +4,7 @@ kind: ServiceMonitor metadata: name: {{ include "parseable.fullname" . }} namespace: {{ default .Release.Namespace .Values.parseable.metrics.serviceMonitor.namespace | quote }} - labels: {{- include "parseable.selectorLabels" . | nindent 4 }} + labels: {{- include "parseable.labelsSelector" . | nindent 4 }} {{- if .Values.parseable.metrics.serviceMonitor.additionalLabels }} {{- include (dict "value" .Values.parseable.metrics.serviceMonitor.additionalLabels "context" $) | nindent 4 }} {{- end }} @@ -33,5 +33,5 @@ spec: matchNames: - {{ .Release.Namespace }} selector: - matchLabels: {{- include "parseable.selectorLabels" . | nindent 6 }} + matchLabels: {{- include "parseable.labelsSelector" . | nindent 6 }} {{- end }} diff --git a/helm/templates/deployment.yaml b/helm/templates/standalone-deployment.yaml similarity index 94% rename from helm/templates/deployment.yaml rename to helm/templates/standalone-deployment.yaml index 2d669724d..a8a987950 100644 --- a/helm/templates/deployment.yaml +++ b/helm/templates/standalone-deployment.yaml @@ -1,3 +1,4 @@ +{{- if eq .Values.parseable.highAvailability.enabled false }} apiVersion: apps/v1 kind: Deployment metadata: @@ -6,10 +7,10 @@ metadata: labels: {{- include "parseable.labels" . | nindent 4 }} spec: - replicas: {{ .Values.parseable.replicaCount }} + replicas: 1 selector: matchLabels: - {{- include "parseable.selectorLabels" . | nindent 6 }} + {{- include "parseable.labelsSelector" . | nindent 6 }} template: metadata: {{- with .Values.parseable.podAnnotations }} @@ -17,7 +18,7 @@ spec: {{- toYaml . | nindent 8 }} {{- end }} labels: - {{- include "parseable.selectorLabels" . | nindent 8 }} + {{- include "parseable.labelsSelector" . | nindent 8 }} spec: {{- with .Values.parseable.imagePullSecrets }} imagePullSecrets: @@ -107,3 +108,4 @@ spec: tolerations: {{- toYaml . | nindent 8 }} {{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/templates/service.yaml b/helm/templates/standalone-service.yaml similarity index 68% rename from helm/templates/service.yaml rename to helm/templates/standalone-service.yaml index 8fdb259ed..65bbcd8d3 100644 --- a/helm/templates/service.yaml +++ b/helm/templates/standalone-service.yaml @@ -1,3 +1,4 @@ +{{- if eq .Values.parseable.highAvailability.enabled false }} apiVersion: v1 kind: Service metadata: @@ -10,4 +11,5 @@ spec: targetPort: 8000 protocol: TCP selector: - {{- include "parseable.selectorLabels" . | nindent 4 }} + {{- include "parseable.labelsSelector" . | nindent 4 }} +{{- end }} diff --git a/helm/values.yaml b/helm/values.yaml index 5d64b3d9f..8cd8a1fb2 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -1,12 +1,29 @@ parseable: image: repository: parseable/parseable - tag: v0.9.0 + tag: edge-debug pullPolicy: Always - replicaCount: 1 ## Set to true if you want to deploy Parseable in local mode (store logs ## on local mount point instead of S3 bucket) local: false + ## Set to true if you want to deploy Parseable in a HA mode (multiple ingestors) + ## Please note that highAvailability is not supported in local mode + highAvailability: + enabled: true + ingestor: + count: 3 + env: + RUST_LOG: warn + service: + type: ClusterIP + port: 80 + resources: + limits: + cpu: 500m + memory: 4Gi + requests: + cpu: 250m + memory: 1Gi ## Add environment variables to the Parseable Deployment env: RUST_LOG: warn diff --git a/temp.yaml b/temp.yaml new file mode 100644 index 000000000..2facbcca8 --- /dev/null +++ b/temp.yaml @@ -0,0 +1,713 @@ +NAME: myparse +LAST DEPLOYED: Tue Apr 9 17:31:14 2024 +NAMESPACE: default +STATUS: pending-install +REVISION: 1 +TEST SUITE: None +USER-SUPPLIED VALUES: +{} + +COMPUTED VALUES: +fluent-bit: + affinity: {} + annotations: {} + args: [] + autoscaling: + behavior: {} + customRules: [] + enabled: false + maxReplicas: 3 + minReplicas: 1 + targetCPUUtilizationPercentage: 75 + vpa: + annotations: {} + controlledResources: [] + enabled: false + maxAllowed: {} + minAllowed: {} + updatePolicy: + updateMode: Auto + command: [] + config: + customParsers: | + [PARSER] + Name docker_no_time + Format json + Time_Keep Off + Time_Key time + Time_Format %Y-%m-%dT%H:%M:%S.%L + extraFiles: {} + filters: | + [FILTER] + Name kubernetes + Match kube.* + Merge_Log On + Keep_Log Off + K8S-Logging.Parser On + K8S-Logging.Exclude On + inputs: | + [INPUT] + Name tail + Path /var/log/containers/*.log + multiline.parser docker, cri + Tag kube.* + Mem_Buf_Limit 5MB + Skip_Long_Lines On + outputs: | + [OUTPUT] + Name http + Match kube.* + host parseable.parseable.svc.cluster.local + http_User admin + http_Passwd admin + format json + port 80 + header Content-Type application/json + header X-P-META-meta1 value1 + header X-P-TAG-tag1 value1 + header X-P-Stream fluentbitdemo + uri /api/v1/ingest + json_date_key timestamp + json_date_format iso8601 + service: | + [SERVICE] + Daemon Off + Flush {{ .Values.flush }} + Log_Level {{ .Values.logLevel }} + Parsers_File parsers.conf + Parsers_File custom_parsers.conf + HTTP_Server On + HTTP_Listen 0.0.0.0 + HTTP_Port {{ .Values.metricsPort }} + Health_Check On + upstream: {} + daemonSetVolumeMounts: + - mountPath: /var/log + name: varlog + - mountPath: /var/lib/docker/containers + name: varlibdockercontainers + readOnly: true + - mountPath: /etc/machine-id + name: etcmachineid + readOnly: true + daemonSetVolumes: + - hostPath: + path: /var/log + name: varlog + - hostPath: + path: /var/lib/docker/containers + name: varlibdockercontainers + - hostPath: + path: /etc/machine-id + type: File + name: etcmachineid + dashboards: + annotations: {} + enabled: false + labelKey: grafana_dashboard + namespace: "" + dnsConfig: {} + dnsPolicy: ClusterFirst + enabled: false + env: [] + envFrom: [] + envWithTpl: [] + existingConfigMap: "" + extraContainers: [] + extraPorts: [] + extraVolumeMounts: [] + extraVolumes: [] + flush: 1 + fullnameOverride: "" + global: {} + hostAliases: [] + hostNetwork: false + image: + pullPolicy: Always + repository: cr.fluentbit.io/fluent/fluent-bit + tag: "" + imagePullSecrets: [] + ingress: + annotations: {} + className: "" + enabled: false + extraHosts: [] + hosts: [] + tls: [] + initContainers: [] + kind: DaemonSet + labels: {} + lifecycle: {} + livenessProbe: + httpGet: + path: / + port: http + logLevel: info + luaScripts: {} + metricsPort: 2020 + minReadySeconds: null + nameOverride: "" + networkPolicy: + enabled: false + nodeSelector: {} + openShift: + enabled: false + securityContextConstraints: + annotations: {} + create: true + podAnnotations: {} + podDisruptionBudget: + annotations: {} + enabled: false + maxUnavailable: 30% + podLabels: {} + podSecurityContext: {} + podSecurityPolicy: + annotations: {} + create: false + priorityClassName: "" + prometheusRule: + enabled: false + rbac: + create: true + nodeAccess: false + readinessProbe: + httpGet: + path: /api/v1/health + port: http + replicaCount: 1 + resources: {} + securityContext: {} + service: + annotations: {} + labels: {} + loadBalancerSourceRanges: [] + port: 2020 + type: ClusterIP + serviceAccount: + annotations: {} + create: true + serviceMonitor: + additionalEndpoints: [] + enabled: false + terminationGracePeriodSeconds: null + testFramework: + enabled: true + image: + pullPolicy: Always + repository: busybox + tag: latest + tolerations: [] + updateStrategy: {} + volumeMounts: + - mountPath: /fluent-bit/etc/fluent-bit.conf + name: config + subPath: fluent-bit.conf + - mountPath: /fluent-bit/etc/custom_parsers.conf + name: config + subPath: custom_parsers.conf +parseable: + affinity: {} + env: + RUST_LOG: warn + fullnameOverride: "" + highAvailability: + enabled: true + ingestor: + count: 3 + env: + RUST_LOG: warn + resources: + limits: + cpu: 500m + memory: 4Gi + requests: + cpu: 250m + memory: 1Gi + service: + port: 80 + type: ClusterIP + image: + pullPolicy: Always + repository: parseable/parseable + tag: v0.9.0 + local: false + localModeSecret: + - keys: + - addr + - username + - password + - staging.dir + - fs.dir + name: parseable-env-secret + prefix: P_ + type: env + metrics: + serviceMonitor: + additionalLabels: {} + enabled: false + honorLabels: false + interval: 30s + metricRelabelings: [] + namespace: "" + podTargetLabels: [] + relabellings: [] + scrapeTimeout: "" + nameOverride: "" + nodeSelector: {} + persistence: + data: + accessMode: ReadWriteOnce + enabled: false + size: 1Gi + storageClass: "" + staging: + accessMode: ReadWriteOnce + enabled: false + size: 1Gi + storageClass: "" + podAnnotations: + prometheus.io/path: /api/v1/metrics + prometheus.io/port: "80" + prometheus.io/scrape: "true" + podSecurityContext: + fsGroup: 1000 + fsGroupChangePolicy: Always + runAsGroup: 1000 + runAsUser: 1000 + resources: + limits: + cpu: 500m + memory: 4Gi + requests: + cpu: 250m + memory: 1Gi + s3ModeSecret: + - keys: + - addr + - username + - password + - staging.dir + - fs.dir + - s3.url + - s3.access.key + - s3.secret.key + - s3.bucket + - s3.region + name: parseable-env-secret + prefix: P_ + type: env + securityContext: + allowPrivilegeEscalation: false + service: + port: 80 + type: ClusterIP + serviceAccount: + annotations: {} + create: true + name: parseable + tolerations: [] +vector: + affinity: {} + args: + - --config-dir + - /etc/vector/ + autoscaling: + behavior: {} + customMetric: {} + enabled: false + maxReplicas: 10 + minReplicas: 1 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: null + command: [] + commonLabels: {} + containerPorts: [] + customConfig: + api: + address: 127.0.0.1:8686 + enabled: true + playground: false + data_dir: /vector-data-dir + sinks: + parseable: + auth: + password: admin + strategy: basic + user: admin + batch: + max_bytes: 10485760 + max_events: 1000 + timeout_secs: 10 + compression: gzip + encoding: + codec: json + healthcheck: + enabled: true + path: http://parseable.parseable.svc.cluster.local/api/v1/liveness + port: 80 + inputs: + - kubernetes_logs + method: post + request: + headers: + X-P-Stream: vectordemo + type: http + uri: http://parseable.parseable.svc.cluster.local/api/v1/ingest + sources: + kubernetes_logs: + type: kubernetes_logs + dataDir: "" + dnsConfig: {} + dnsPolicy: ClusterFirst + enabled: false + env: [] + envFrom: [] + existingConfigMaps: [] + extraContainers: [] + extraVolumeMounts: [] + extraVolumes: [] + fullnameOverride: "" + global: {} + haproxy: + affinity: {} + autoscaling: + customMetric: {} + enabled: false + maxReplicas: 10 + minReplicas: 1 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: null + containerPorts: [] + customConfig: "" + enabled: false + existingConfigMap: "" + extraContainers: [] + extraVolumeMounts: [] + extraVolumes: [] + image: + pullPolicy: IfNotPresent + pullSecrets: [] + repository: haproxytech/haproxy-alpine + tag: 2.4.17 + initContainers: [] + livenessProbe: + tcpSocket: + port: 1024 + nodeSelector: {} + podAnnotations: {} + podLabels: {} + podPriorityClassName: "" + podSecurityContext: {} + readinessProbe: + tcpSocket: + port: 1024 + replicas: 1 + resources: {} + rollWorkload: true + securityContext: {} + service: + annotations: {} + externalTrafficPolicy: "" + ipFamilies: [] + ipFamilyPolicy: "" + loadBalancerIP: "" + ports: [] + topologyKeys: [] + type: ClusterIP + serviceAccount: + annotations: {} + automountToken: true + create: true + name: null + strategy: {} + terminationGracePeriodSeconds: 60 + tolerations: [] + image: + pullPolicy: IfNotPresent + pullSecrets: [] + repository: timberio/vector + sha: "" + tag: "" + ingress: + annotations: {} + className: "" + enabled: false + hosts: [] + tls: [] + initContainers: [] + lifecycle: {} + livenessProbe: {} + nameOverride: "" + nodeSelector: {} + persistence: + accessModes: + - ReadWriteOnce + enabled: false + existingClaim: "" + finalizers: + - kubernetes.io/pvc-protection + hostPath: + path: /var/lib/vector + selectors: {} + size: 10Gi + podAnnotations: {} + podDisruptionBudget: + enabled: false + minAvailable: 1 + podHostNetwork: false + podLabels: + vector.dev/exclude: "true" + podManagementPolicy: OrderedReady + podMonitor: + additionalLabels: {} + enabled: false + honorLabels: false + honorTimestamps: true + jobLabel: app.kubernetes.io/name + metricRelabelings: [] + path: /metrics + port: prom-exporter + relabelings: [] + podPriorityClassName: "" + podSecurityContext: {} + psp: + create: false + rbac: + create: true + readinessProbe: {} + replicas: 1 + resources: {} + role: Agent + rollWorkload: true + secrets: + generic: {} + securityContext: {} + service: + annotations: {} + enabled: true + externalTrafficPolicy: "" + ipFamilies: [] + ipFamilyPolicy: "" + loadBalancerIP: "" + ports: [] + topologyKeys: [] + type: ClusterIP + serviceAccount: + annotations: {} + automountToken: true + create: true + serviceHeadless: + enabled: true + terminationGracePeriodSeconds: 60 + tolerations: [] + topologySpreadConstraints: [] + updateStrategy: {} + workloadResourceAnnotations: {} + +HOOKS: +MANIFEST: +--- +# Source: parseable/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: parseable + labels: + helm.sh/chart: parseable-0.9.0 + app.kubernetes.io/name: parseable + app.kubernetes.io/instance: myparse + app.kubernetes.io/version: "v0.9.0" + app.kubernetes.io/managed-by: Helm +--- +# Source: parseable/templates/ingestor-configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: myparse-parseable-ingestor-config + namespace: default + labels: + helm.sh/chart: parseable-0.9.0 + app.kubernetes.io/name: parseable + app.kubernetes.io/instance: myparse + app.kubernetes.io/version: "v0.9.0" + app.kubernetes.io/managed-by: Helm +data: + config-env: |- + #!/bin/sh + set -e ; # Have script exit in the event of a failed command. + IFS=$' \t\r\n' + + setIngestorURL() { + echo; + echo \"Reading the value $HOSTNAME\"; + + if [ -z "$HOSTNAME" ]; then + echo "HOSTNAME is not set. Exiting..."; + exit 1; + fi + + echo "Setting the ingestor URL to $HOSTNAME:8000"; + export P_INGESTOR_URL="$HOSTNAME:8000"; + } + + setIngestorURL +--- +# Source: parseable/templates/ingestor-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: myparse-parseable + namespace: default +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 8000 + protocol: TCP + selector: + app.kubernetes.io/name: parseable + app.kubernetes.io/instance: myparse + app.parseable.com/type: ingestor +--- +# Source: parseable/templates/ingestor-statefulset.yaml +apiVersion: v1 +kind: Service +metadata: + name: myparse-parseable-headless + namespace: default +spec: + ports: + - port: 8000 + name: "parseable-port" + clusterIP: None + selector: + app.kubernetes.io/name: parseable + app.kubernetes.io/instance: myparse + app.parseable.com/type: ingestor +--- +# Source: parseable/templates/ingestor-statefulset.yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: myparse-parseable-ingestor + namespace: default + labels: + helm.sh/chart: parseable-0.9.0 + app.kubernetes.io/name: parseable + app.kubernetes.io/instance: myparse + app.parseable.com/type: ingestor + app.kubernetes.io/version: "v0.9.0" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: parseable + app.kubernetes.io/instance: myparse + app.parseable.com/type: ingestor + serviceName: myparse-parseable-headless + replicas: 3 + minReadySeconds: 10 + template: + metadata: + labels: + app.kubernetes.io/name: parseable + app.kubernetes.io/instance: myparse + app.parseable.com/type: ingestor + spec: + terminationGracePeriodSeconds: 10 + volumes: + - name: parseable-ingestor-config + projected: + sources: + - configMap: + name: myparse-parseable-ingestor-config + containers: + - name: parseable + securityContext: + allowPrivilegeEscalation: false + image: parseable/parseable:v0.9.0 + imagePullPolicy: Always + ## Uncomment to debug + command: [ "/bin/sh", "/config/config-logstream", "/bin/sh", "-c", "sleep 1000000" ] + ## args: ["/bin/sh", "/config/config-logstream", "parseable", "s3-store"] + env: + - name: RUST_LOG + value: "warn" + - name: P_ADDR + valueFrom: + secretKeyRef: + name: parseable-env-secret + key: addr + - name: P_USERNAME + valueFrom: + secretKeyRef: + name: parseable-env-secret + key: username + - name: P_PASSWORD + valueFrom: + secretKeyRef: + name: parseable-env-secret + key: password + - name: P_STAGING_DIR + valueFrom: + secretKeyRef: + name: parseable-env-secret + key: staging.dir + - name: P_FS_DIR + valueFrom: + secretKeyRef: + name: parseable-env-secret + key: fs.dir + - name: P_S3_URL + valueFrom: + secretKeyRef: + name: parseable-env-secret + key: s3.url + - name: P_S3_ACCESS_KEY + valueFrom: + secretKeyRef: + name: parseable-env-secret + key: s3.access.key + - name: P_S3_SECRET_KEY + valueFrom: + secretKeyRef: + name: parseable-env-secret + key: s3.secret.key + - name: P_S3_BUCKET + valueFrom: + secretKeyRef: + name: parseable-env-secret + key: s3.bucket + - name: P_S3_REGION + valueFrom: + secretKeyRef: + name: parseable-env-secret + key: s3.region + - name: P_MODE + value: "ingest" + ports: + - containerPort: 8000 + resources: + limits: + cpu: 500m + memory: 4Gi + requests: + cpu: 250m + memory: 1Gi + volumeMounts: + ## No data volume for ingestor + - mountPath: "/parseable/staging" + name: stage-volume + - name: parseable-ingestor-config + mountPath: /config + volumeClaimTemplates: + - metadata: + name: stage-volume + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: "my-storage-class" + resources: + requests: + storage: 10Gi + From 48689fe21a3f78bd510a8f6b03021f6ddcb8d110 Mon Sep 17 00:00:00 2001 From: Nitish Tiwari Date: Sat, 20 Apr 2024 12:35:03 +0530 Subject: [PATCH 2/2] update Parseable helm chart for distributed mode --- helm-releases/operator-0.0.3.tgz | Bin 29031 -> 29031 bytes helm-releases/parseable-1.0.0.tgz | Bin 0 -> 47747 bytes helm/Chart.yaml | 4 +- helm/templates/ingestor-service.yaml | 8 +- helm/templates/ingestor-statefulset.yaml | 15 +- helm/templates/querier-service.yaml | 15 + helm/values.yaml | 9 +- index.yaml | 95 +-- server/Cargo.toml | 4 +- temp.yaml | 713 ----------------------- 10 files changed, 94 insertions(+), 769 deletions(-) create mode 100644 helm-releases/parseable-1.0.0.tgz create mode 100644 helm/templates/querier-service.yaml delete mode 100644 temp.yaml diff --git a/helm-releases/operator-0.0.3.tgz b/helm-releases/operator-0.0.3.tgz index dd4f746b94b580535ede7518195d7159bfd056fd..703ad0f61c84ace7dd3b637f10342e0802db9f12 100644 GIT binary patch literal 29031 zcmV)KK)SyliwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POvHcjGpeD2mVD{uKBrImdQdlI>KblJV*8EVu2-_$1}>uUx6D zxk)AslaPcl2`~g`m%7vUv)_fi0T84f1ZBBWJ#F+_ow6iu;<2&c4_UC1YFQqf&SXD8%8SeBE- zAPbqul3dYJF?y3R^4en3j-WX^CJwQ7^t@olgce1{6KbIB+_^X43x4k{_?I63{@>B8 zV(L){K*#-mw&ebQ{^ilr{r?byiM!(+LOvmHSRzHjGY)r@q%5QJ9YWrmpT534z4-3@ zmmf|p-X4>|(V-f^1D7;ss-OuYT9SLJlNpgEVR@nFMCp=?Y5fJwG9ujX)sVb(U*uJ$ zd6BW;TSC*63<(!nS~z2J{{EQ!aPs!_KYqD9d3An$b#i)sOa?+74TbuADAY4ErNti% zc6Lezbmvr7LLZZ(ogJRjDKkqhSs@kIvYa22!cnmUPqqjtsw}&b8BgZNu zeaFg@r%Vw&V+6nvO{e63CKV$oo6suLgyYvpC~K-Z-XZ44I5&9qs>-r!mXu7ZWAfwA zKt0_n;AfL6%N9P|$@m=;OsT6<-oSEZS{L6iZT?9}LG|pI9LyNa^z3i=ku3Ew`Reei zqa8xH;F{Cy%pCHyIrvl^lcO)pqFKph>OcGZ&}<=1dFQ*#uja9@TJol&!<`+)$~&I0 zlO%!Tg6%#LLTbQCW$?)$hnBFn_Sb~s&vyu+^>1-*x77_xbT&5sEd|p|jk!FqXEaKr z(3A^S9+R93I%Ori@$C%Jk;uui_n6mLijCp77ZW0+CW>i7MM{#AQO)4+%Zd#NML=AU zDH8^9naX5ovVaq6j}d-X3ESk zp#{C+8P}ZIT~13`;J*kNk(2MfGdQDURVMh0jOSe2-zG(MOujfg%;B$`<#7LwKL6?! zhdcRe#Z=?BN3EZ}c>ap->f5cK*I7nNl?h*5BW< z`7vo?A}y0y<5$GXO~>Ryw7x-gqQKoX9xfI$IjpXJ~FZm7i<}G8k@%kWK{nUgrG4R6^x`v#_v$U z2t^t4n_)yEAupc6KY4y#O(y(38H@(R!eSyd|J;Fzo+5vx{tbqO&dIM8&G>|~)JR&e zgz?S~3}M6XwRwYCjv_ZKp_O7p$()gIJyFAjPdLj`MQF*8X)!Boa7FfR=CCPem)GXE zhKH+yCHv!@iwP-N#;CHpXT=I-g+G)4G`Z(lMsApq9a2ISp)h$n+n7Ce;zGU8eB!sY zEhW0`Tlsy=)@RDY`4pCM{HOS{t>@@B1c8j-;BMiwZk~+~drqz>xzH0b_+M)Dzto@w z3tt+KY0LlFz`x*N&AqYq40EV(xE53JR~fxwS=<4`1NG^)R~2qJ{@W@Qyg0*=Yw|4z6_vMOD>%rQ=6?N61JwZ5}2 z8wXfr_u$0qR^~fe6fI%j8=LsSAiAbx&yl6UNEr#7(@YBpdG(Ak6$;I$bTs-GC9wg*p@q>L;id5?DNlC z^52W2FTQw^|31VRjYd164}cbhI=DO9x#c1~CTAWMc5U%TR=f|hzDCo7+@HkMJ5QNfPM zqRGWuXgY{*Ky`4f-oCj=anXqSkALhKdD2=YGoDa|KeZGmG-M)3$1Ct0!20lAa4_9R zv&dcRBYNSEC~i|6^{{gZaK%mJp6i)kOw(*tziPpN=bqN`KWUydX82Y8SU_v>gRHR+ z58H|0J#l+Mh&#xoYY%NmHRy&x>mf^Dc%QR_1-sm^gl+3RfdQ`mRcMvl>f743^ZKU? zR`rLx*PDnNmOffe7p!}u5m-~%DC0^qF`{W&GNt}>IEMcnfA#$NvxP^hLg|vx{7*Bj zi{pcXqtCyDpC286b@l$GV5z=YfW!QGz@gU`^{L8eJ*h@T;aHxHqWLR7pNPNROx%T37vJC+uX(KfwKX%t_qxa&&`(1RuRV#zO>e&C z>h&3T5|_Q>WhwK;a{$xP8#Y<|#(sANelo`zL1hSjn#eq-B5j}CLC98c*h@VKWCQqU zTst($KmKvN@U^B>@>|<{)6kv=?YCS79?%7NwR^O=i3_B<;i_!@cEO7of>}nZk3L^~ z*}^g65iaiB!pxeU%_fjVujf|gwt||4tjSN#{&LML*3z9NFk8Q00eL0VB@h>#jmtUf zqQ2i>hBia9GUo#5=Qkxy*wum;`S;eS{<+2y{okqq4@gPe;hyMThmtVB} zKc62S9e(+w|9^~}B+n3;VzTfhcdenSA_ zQjAKOu}IawtTJQ?BSH)QO)0BF)gcvw!Ol|N0Rs1gPjhOe={r{51m8}X_Ww3&iT?wF zuWBH$eg4m?NW(vi#&1)WG5B)nL=!2?)RJe5H>+k2oA7bWdiD0QJ0|qfNw(gOuiNl4 z{e_E^i|Nyyio8=dcE2L8mdu!y%iYmuX29iU5Y=BV~6ct<8>L8Ksh#&Qff0D8~T%Q`gp_)la{ z0j$Aru=LgY-iv5W42wYi@sCXjb%R2;Zd`5VM;nB_P9696Q+#X_YX51Q+FKc7fyG${ z*J5ui*&$$W4dxc`&X6|;oH^vR4L0l;cJzciw_QD%&iD6xWnnNtX(sfY%&MFv8RhxM zvLA&^KbEOj_5H(7hZcaI3lplH)F02Bl%|?Zs!XxpVN#w_pb)c&OzwNl1pPgBt?vX6 z%yw1_^Q>pHWC|-{w>BX6r&*;mD;KCfY!jE_EzgcsIqKBNzqDKC?Q(T$& zzIbu8VE=vg`IG(kLyRq|#vg`pEQ?6|czK8oqbtE96nc4u6mP7s`~92m0>|QkeFi>Q z;u+oY`LDYFu(=;5|Ksy#NA3DAFOHr+)qnXQ!=vX<^#4PQF7oe$ zwY@8Ra$#*b#3&7x;j4S=^vTwh0!A?b1l{8zN z3Vf-!m{u7r7rr*SS0W2`Tvty|F_y_!40ej%-O&xx6e}~RWX5t|O-B|?oLpVJdv@LU zn2<)NhStPgL2`TsS~r+K+tVi}R~H^$Q5x#dE=3VwOYmvy?Ym}zwy*$Jfy39^m9o^X z2`kBQMM_qbOfi9o(*R7&kEkFLER182Oj&8TkF2uPVAmZhH7Qvlr-J{@!&a_PIH)zc z1(OTIVrYgn9e_QNoX$zf%v(q$0(iDJ0(oVaBNr2CRq5k{gDKbUmLxLIE5Y^r01%$v zR9cqmAZ2$fJ5YQ&qGdAUnkBj_*#Ry12&OLJri}CS6K{auZOj!LXkaP);0wUsH78*3 z*PJ?a)%dX@hTmvch5XI=^;>WIhr?*^KJ0t_psJ6+Y#0|4R^lN}N|^&pCelK3p|K8T z#+hhuzp8F>u9YvpLbM!{Qy?8sBo#vU(lNOZo)@|%nAbRn{@%aoOi)k?T#`I2JY zEB7G$l9nZ%x4tvn#N4w*kgF$2Jl28Cx9sb#$H~$i@AteJi^tm@Yxkw~vxft6b?aAy z8o`{`d~M#d^6M4I8#{p!Z2Ho#)*wO`9W4WjYS<`x94HtxxQ&)Fu{6KUE*<&r1HWqRj6oXwh z|1o)0DMQfLf+S`Izg(Q1U%tI~d2#+`^&&|8eZz84@k`l#=k~m06IL>jFhxGydw22% zqNw+wC^&;c=^(SM8+D71qGWeQW6b83n5RqkNfF+bc@~yEV|95okXERe`wF~Efv(?2 zLM|qR)~J?v=4*t3?2e^Fc&XnGgKB!#b(CBbm3AVBuX!$#85L8*(9dLL-uCIIu%RVO ztE6*3wKP%;7gO`#klfEW_7sx$3M5&k5?Z(|56-LuteOi=-yah`W@9q=G^)byEyA^jEQyeMOwKSL0VL(YV7$Avi?_T+S~wb)?;3?qrkN4mouIyH?p} zmS)_tdCbpRGkiN^FgGo&%dmS|Bpy-R=;k>~C$}3iAA7TOs3JsxBwmqd^@x&*GHOJ^ z3at+0ouRYr{@`Agw_Hp|_gv3LD0V0)$F2@Of&WCl^zG}j*T>`}O^JjnTq!oGGTVP* z9O&3X(DR0oU@M+}z5Wur(esQXZ2B@Oe%WZEdBGAsnK!7F$8#dP=${)#Sv0tqqd?)< zX^+L;NSQI(#b;wgY&W1aQs=KaMe1<8AJup`%4spOnw6G0UoKbIV_gZ#=4f7|nh*g5 zcc%)O9(!AV#6CAlTMnClf~jjr{^~zOzu=F%yMO%l{6GJ^yZiHBV{p8FJ}@#ifPnr1 zHI@x|h=B*l9Q_oXWx8;<@TXUlju|YV6@2@7+*e^MtM`E>r&;rIL7cXk)hV_Lw+y?~#Yci-Qo z*AbV1c#GXJcr2!!`eO5$=*ce?+PJkn%Ss!iej>}9YJ2Y@x1YT)qyp8~-nkZUI2uF& zvJnBt~4tx4j?P`OlF+_V>U3G-`Sc%E*Nt$#R5SZ(FT)gK!(P$$fd_cthaFaop?? zP`wW;aufP^IFW+35Zlt&5t|UEFvw9(0a>apM8@bs@4OJW4Mmcrl(V2M>BpjN`G@)1voVR(p|g_}=}i zA6|o$?UoiR;5605y2%B8e!~p;FYqHHQu4_GgiC5k3XD-&K4{>*fthT&jCB;R`{AW+ zrdl&iQ;rw*DuVe$(1OmBFJ$^^X(&bTlZdG-?H=~f^+m2RYMo?BYqF1Pei82frTt6l z(YQV?QqT&hP?;^bNT|N&MWtD{pjZYlR*4cZSc293*2a8@O z7c}RIJDig&lgYBMyXKfMs;iQbDb;N3-;3`u6Ug&QqtE|BlY|PewXB7BV`NQGD}z33 z<8=yQN00?sg@3Tsq5D+|Mwrm$+?>jlOpTl|Zv48#dmb;B$4RJ*VHF^*K=^#4@2;PD zg#5yVA+6&jSm#9FE14SEs$3fQw`}9lgK(G7ZNXubxANd8lsvZEFiDlviVwM>YU{wSe#Byi`DFCX&b$8^k+vAwyi!k ztsb_lkJL=`0P|2&YyA%G)lCkX)Au~DazbJpFj^^o?_-v@n&62VttC=3{a(A^sg)5t(zX zt$!e3B?AUrQJkXYf4j9dsH z1~SE3n?9<$*!dIdNsm$wY>u&wbq_IxYK-4^k_9#L#_H>b3Bg9J1CuP)FL{V2i6Sxk zPSW%*G@~M6<)uv7)ne1zHOpHI#RvEE3GpAU#RC^iNh>XLs(C`QZ0=uz$nQ#WV^ZbX zNN+R3nT?4H2Q;`pF!z061-!Wv)wLu8Xj;48Ys0N)77GlKOwx38V_!p3$uJbJWRUJz zuYOF(#bmt{W}wn6V`c5HwO2E#;gG!>cVp*Wl$hdW+&5~NRICQ;cDrN-l5R#{t|tOE zr3pmkai}Jlodgebp!ozv)K?FGnvD|!70=Bx$rvp$;L+?-=g}J#6Jv6bR?V$3**v&T z0FSeX+M~a?ioPtn{t=g|c5y{)=i%Bj;i{;t9#mNMq{8c=6rUQJTT+qAJevdWFsiZz z%~eg@*8gx<(Iwm&B19r({M_YmwugG(vcV2ClyF=FQ4V6ZsUh0Zwhg9NNlt`gqG)zCAMj`I>} zi+5gxM882)aCLYcJDHJ{h~Uy1gbk5$Sl{W^C0=j0gBdxpa?cAlCAho>1M1h>9cjFF zy)~w%&gi(^NHA^Pq3*MTPb~h7c%epAq^@Wdlo{mhtk~v=(!4x}>1F+O&tNWX#uX?o z^-VID(=wSZq68RXSA`kJX!c#ns=DN%6?|+xuUZRnH6M%NRoxq~jE}A5RqJtk1t06? zRh?qyA|H$5RWa7ckdIkj1tfhruj;`*7x>s}UezJ$tmb2Dc-2~%0U!GbSj|r@PDb{A z8vL}tuhyf#<7ErX%)P=|rz!c#^Q`sgkC^vUH$w}V)>@D~8JfLjQC96IhPHi%_S53Z z4M7PmKtTAQ{0YtY-#SR2FN{ztIaWJdv(M{K467-~BWp9x(W?A%K$h*ze`ExEW-L&HfJ2c=V% zDJ%EQ*)wGnKU~)O^~=(z=2CbC$x;~0LwNC$<{Ykt-Ri%{j)3@j=aApk5X^O*$~z<0 zSP!j#!5qUwx-qu5ef=S_(gU5Sy#fmQd%L0{lU(75KH^&N%o=fRB1_WEtc6S=FS}vN zf{PEr08Pv(5na;BgeNw2wS#gw%OnX9-Jq5sFle&{?E1Dw3i#z(n3ZBBfdV?_GAMqN zF&pZxsuEcut*1%LlHYadcbZUGy)`?T`+spYCgcSAl1V|>dzu#+LmN5n_*#e!1E8t{ z9?ZH6TDp+(VBuB{T}P@vEE=0a%!KvzniDZwBr(;6N+2u7ky*zn!4rP?ebbm}PWi69fe%BG+atBodY@{&8 z0B7=^l^}Y)d3icII{N$>nMtJ~m|@QmK`mvb#+>QNSeDa+na;C=a*~)|uTN`fgt+|G z9OGZDJUs{*{@U!bC>(Kz_7<g|DHu&l5=JD#!OK$p|Lhc%`HTiEa>LxMCi1XMZwbXKBOU7 zhpa2g=FBgH_1ju0>o!!Hij@P!gJD^%T}m^bVG|S4d@e>YU^< zMeWCkf3lF7oMKKMx=n0!To?LZO3j)a*>9rocgsjCvTWR}^>^wD6%2C#%jK1OI#*=M zbiJWOv78FclMal%skB!$6cef2NUv9}dUdCPK``svFgMNZh7GLdLW6__VFIAr6+F4^ z);0|uKA70g7|rzTbjFffx5#KxzvNl3&>@QAFB0>MPVp1>*BXVq@CXW-4E25tK#%bF zS<<`UL|o3H@PRIy9+2^|D<))1t%T}wZGm)l#Eyk8wJ~D6p?OV99k*|Ni0gbz>br-6 zr$Wi7hg7={F|U;~vK8j&v?M9htjxJ!&@-4!`5jvyW(%a$DA_6?mQJSgyvG&rapr>v zgUMtaPunk}Fs~yXb^oM zqahV3sRHHn9|U z5ZJqq({I_iy0w_rL~SuX!wyzyuYVeJ1{c8(U;H!xE27^z z+42}&yO2TaqFGNamwA>J>;U))Y>9c%`jvyX&N=6P8u);?)j|Xa3hNcZNKa7HztO3( zEcJaX^=~*L)e(Wb-~h3PVNc`0yR+cxh;g*aNz>tE*ElpR&65vwiUdE3z4viW5lg?e znbBn#!#pgWYl8*t7klP*bk~&wu3&Kt5X0s)fpGD@C|x{TeJeW?z%Q=clei%i0i&eq z*bO9O)w|eXFZdW7G0iiLmr$=7sL(pE`mT&bms7sxT(Ycd0l7p;Pbe>(tOhRI?mJ=x z(mS5oI=3QZv5wqWefb(n&t99^u0JkMON}mg!^j|bazOTc5nE5~_lIO~1)hMjie~t` zwQtxn6epB|qzLx1HlBK~uj;xAi<2@i@iPb2g2Ld8fz9T9v>6X0MFt}kpwqZPmO_uW zJy1nbRxl&muD`?Hjl3p^dvjK#HVjILA_7^!e@`>2;)U&nC!MP*fj=xGF~3@`MmU2~ zGwG#qNy!Z}YCLv(xR}JoI;=PrU(thNR{conxe;YkCbWUtA;yBenu@wY7@@sJk|NC+*|yuss=;IwV@A)RJptw^n0HrC>fl4^d85 zsUytm=@!^mP_;rS-1dV3i4z5UG52d|&N{|N1)2<3)>e_aJfwA-(Pe(Ux6ROCcGrzm z9qK!!;k6r+lX~`@X2_MNW36P3T~+&btJY5!TfzBR!t#M1E+>n9GX9&^M_I0u*ZUyw zYiq=Vqcam~hJrrCELl@;BPUv;q4j-<)+8fyXnGLzK6y0lh(NcYZ{eklAioalmDwv> z^a0r?@b0h_QzcSXW^=?^S*4?>n_Kq}^f_9d#ndZy``*Cst{Y}MgDyR3#OSonPK%zf zSMKf1Q8B=+8Iv<3*@7S8xbfN!!z1k7s5Z%icBK``85P*B3A9R@l+v)|#=VYkGvf^i zCtV9&V{!s~J&3otI~srfywl5CBJ*M*kyS};6m+FnJJHqWdyVF0fDs#BedjOvLj^Da?{`_LaV z=|l$>`xYOKL+)mFW{~y>(1ZLlKmCZvfs3o<_M1n#gM-M}N=?Rj@ZO_83v9pY)*~V>^2%<%CW4Y(8v%?C8yt>H!`9q}xNY`LC=Cy6t}|vKRWc(~k$j%Wyr5zZnq@v8CD3Md zZpQ?i!f{>q%iVNWYG^_RYv&-vWzB~EL`FCS-l4X`QS;#c34-o+x zpw8%>5li{6l|_&-`2n;I31y~ACu_zF?3@>zK?M3;_xnBE1lVR^p#;wQHLHzLDgYSZI5ZJ`4b1!XNM-^dbJ_c4mvuNAaI6hove}-c z%suAD?4_(-vHRN<$jp33=4KjX=`IKz8x>{e-J_L3(VxV43Ip=3JH?@poJWsD5y!kL2RjnH0_Hd>Y8J<0`ftk_#mMe15Xv6XpN%xwqry6?^ql0h z*l&k8S!+q8h}x|Ey?{D#&9tOlTFgm6cx1{xsLeoGs80w2m4Y-07dQVVd6SZ;ds$T98n%I1Xm| z5F0$#9VZi5M||XhM6(zbbv|rSN+Vrj*@4bFYC1?pa+Pob6vSrcQe(csd<<1-*6%<} z#hS&cH0ym%fp5v0f||j;TU3%CT+w>dem#mQ#iclz7#T>%M`P|fU5*S+!F_jeH9$2D z%KnYX_cr!5ryPXk4o48of>1k+F*z5IMu4tCqf=rs#KI5Pf^~HR+zbu!UxI-tY*de* zY_WLq?^=|ub)eW8JNj6cK3)5^Y=6``38k}gZJz^+b#Nv2IJ>m(#>(77>lQ;~x7qRZ zK^WPu0iWhMla;=P9FnMpeT^kIA8+LiV`55NzcV?huMm(zw`iq#ayy3?p*+@|I_rj0 z`2T!J{`dbTfBe%|FP`qq}V8(ZL0)#Of#r$i1jU(~PEwRIZtW$=AWvgZa)tC%IT#lWx_eMfqg6&ffO5%+WqqRWy_#_A$a~Yf1&>KUk z_LnVey(HJU=tdxC**nS%)SS)2-d9u#8*;exFMbM6zt2l89`oCOJJ==~1dld_{FEuk@QZeUs!b z^#_GN-4Q}npV+`rc-`oz+v^Y!pNONE4>8U?U`9$cy^icE-#nZ8$soPM#-~7MaE#oK zSQ;icACu3>iD7zNfejlk%(b9}nn~@1oIPbf7~4Y_-+l!r)cpDSqJTJ>ue*A8O7@ms z*L|Bd8slFyx5=nc=&}uYcx|snizqVbn1gSyMzia-=vwU%MVWz6BG`QdM0*2#EefkO zYZlf@X}mEe90KNKL+K2J6EVk4JPQydXb>9b1%E9fJ)Ade zVyh5@A1y$Sfa%{K&Jv4%hoHytJ^dHG$}V}Ccp$x_%k;vGYO`#(i@|T!=0)J>WBnk6 z7W|u1R>cO5-cPPB;8B-*I)y)+SE;i(aC2Z)d|zM{w>Nx4Q%#G6+Ppd6a#1IsI$7Ls znv<&woPCU)!i<+TRnhien(;Cn6|~fIG>s3#nMZ>31>&QA-?N?nEf*0T?n(QEVZ(UP zBq->hj3*YoICrj(vAVeUXtK0rFISCLy&v7`;sO~6L;;vnj`&$;<6IJNF~hN$Uj#>k z{%tPv7~{AYOV{-t52&E*y%C#_Y0TZ{Q7A zRg$n~@4H1&CldV#x@4ImN}8<}O4BT3shgiYQnU)D*h#&g@VJ;5SF$3b31Z2l5(zr9 z<1FZQoeKgxXp9PTO!$P{NIkPAlo&=15eODBhFA-*POoS;iFnzmh!Us|k=)+XGF8y@ zm1=&&%@T(wOND}u*xl8UCC+eg(U$yz<&wQ%Zx$rN7+s=O4W_yLRt-4F-H3{>gLBJ4 z42J9H46i5#fRJJj0B=qt?^=`|muye{XOyst2eN$iffR(3jez*pmsHfVl0o*cEHxFH zq^q=(BC%yGaZ*7kM z$$D!b*=)E(FBLV7Y{6nTyrMxz2V1YE4|KEW8S9wa>=u6J>G;zSTjN>tpLTv;{s_3-m@#2UK_+{K#fvGN$(qhBVO{vu_%AG zim6yRvX-LGhFk8r;Jk zaC-{Wq?cfTBa-ij^NBXP_X%skv046WJ$kHWlXTa5WIX5Vi?!9Ge=1w>Y+Qu{9DVB? zG@t5)W(C!nmExHE*WOQm_-(ZR_1@l(hogW0`44+Pjo}}k?SH-hoBQJr`}=!)KYsh_ zo3~fzKlAsnp%FwYlZ( z(b!%yOKWQP1rco1<7hK04!^y1y?{s7iHP6*jhF9_FEB|0B6QXiZVotjb3bRiz*Yk` zwa%VC=4{D;^fp6Pqrslk^L10f*-OMJ)aBlY4WZ5{iEltx-5$tR6 zYPlQWaDuS5l%!Q@J0R(jYBuEw$yqsNMjTFNeUPjd&A02@1TXuWBQ`Oo+_G5MBY*54 zhxr9Wi0=$>{{YHd?-N{u8Hrk7eRwA3^Z3G>V7CqPuL`jH17|uWPgYd^<`bPL{e3ptO1?K7#KJ zT35wnM)tVU2>X>x`|e=N^=?_Ma_oc6~ z6nK(VDLVE5IJ)q3U$?jFsN3GnxJPxy z`kLRY^(TzrKv#YpG0`p#tz~A*z^~-29pclHQran=%Ucf{c&OGinc3Dr_{~}q2^Di< z*n=(0?Gh}o(LOISM*iqo>5xq(EYW`^mFj4d&9V zc%V^@l-Xq?EG(}UA@QC=LO{-_umu7kraA=W+FC>hgEqsxfx}+PYjcQI#)brY(AJ+s zm@F>k`FoaBx}!*XA`iamJ&i z)2UEl`#&z;BER7xW}-MPhdx1sy(y7QPQ;pHB>U8!jr-pb0R_xC@E;E zc~WJxB!+HGW!aHL6Wd43UxTQEbWP&lezqN7SFn=Hw0n7)=d5)p$sXoMx;r5!jy`&l z(nZYz=gG2y>H9TTs%b;)$(3Ek3hX{ zM=30&2fn>?<^F1tj)Ul#NCnZ^G$-}!JR`B-)@h!oQM!WwuxJyaNrf_fZE^gu0 zZb1xmYELCr3NL-cz;`vcz=2CqAO_KELa6=Kn)UmhUJ=1fTdg70tk^{LENom>H-@0v zH=$y2nqiGQFcX%JZ2?QDekM*q%WmlKJ2aoYBM18hG}Y)>Z9?|;Z}~K zJKV9QMlE)WyR;@8cW<^buaeR9waEI2(XSA3;n5LT?)U_vJcjtueaSV8?nbsZp_yXP z&RclBWWQOv8GaJ8+^)LtgsAG~fw$kr`U5i8m*1mur@OA1D-aTbaLI!K*~4ENaac;- zQNT8~Rvj+?{C&|!REN}sl%=HT+KVn0+uW%&d+`@GqjyXZ#dDs~va|c1mgE}O28jqv z-0@OE+fHbS4WY6@ko2c}?@r!8>!Gexe%tL9*I)U>*KifV%j!eyp6`+)c55)_12oaC z$;=|JbW9&Y_CCof#qYL3A3lhUYirWWRt#9yzSvMop_h~|qav*GX7spq%-2>|f$D!~ z1Eyjg@I3Ata6MG0q4(-Mqe}DSFPThkueB`uFq_?F&o_2Jkdq&-$r)F-9mwYc)Lj@` zX!N7xwz^>%)4RJ0Wq_O}Gu~PF!U_k%cjU7=zuCD>-4MPw; ziF(^ns2fM~Fz_j-)l6y^K~SJ3!fI}@70zKUD{@cKWC7Q8Oy2V1n4Ak$m8=Vq-B>mq zt`=L;!^zs_qEW6_*CqA*JOT#yCsFgq0;? z%MG(2ji?gH89jp^w}oI4uX_9X?Da87+NmV>&?frMFf*ugp&ad~k0SykaOp(mMJaRc z8JWF;TXnvHZK_-0APczfA9Uy+d?4bLEaLKImLUGc#D(q-ZP{4h*KrO#2gabfyaQkL6Dml?Tq!3@2Ipu4*^j8M@pw&7b4dhILaG)CprC_6y*Fb z*LI5gzZ1dUB6W;y3+eXu;f`uT=-;Z68R@NuQ0Sj&3xeizaz-@;d62~9Vc3GgAQ%{7 z?gpyK03i)Txh+Xu2{5$j2B9Cj!K01={fC+JDSi$W!(-46d#Ao(G=-jK_MbnLT*p+; z?ZIfxwb>vv!#(B}c^UK(hHBDjx1>+%1pS*#-nhV}ZLjY8Hy0Z$?)x_vZf)kDw&oO4 z8Ju*)>Kt1gR`9YVg4d$WtLQGxbU~2crW8N!mfyW}9wW-Ek>9s@E^(EfniRu4 zW7JZX=w_J2^^6)KPx30$yvU;Q&7i0kTZrMBI&UWCG7)qImlO#mz7#- zk8K^J&ZNFhduRa`?qQdj4rMxxOte4t`EYTEtzhf6N+&lI5WRf3V2mbv=DPzhbw{-p zd*eVsRe+X|>A$Q+$Ow=PA#;oJV624VxJbm$zJGJEH95x6zrJ#ed1k2`17FxiXdPRK z^2!GlWgd#Q>Aw=%8U-vV+1h4C^=M^tx(A)q;Nzw7t5_464`@g1vSHN3wpl_s%V5p7 z5h)x!$Qw}1P1fz6bIV3H03VaitKDmou|%alimo5Jxo?B8B&?WC`b0XJ2VPz`y#%MM zn30#)4MNeef#?XIQH{&NmUQW^A{n1B%{vwsPe^hpxRzz_LTTyN*$Qqk#m zCQA&WdSEGbS|0I(tqK z@&^&4B-Te|vw}b1&i5-{uwfnK-OzI8D&syE<-k5I;py(sf;-kfMQOtLFH(gbMaBqtXP@e342?S)VWBz&ZlM6hbNk%y8X;L zNL`Fd$Ieiv>0^sT8_Uv+WQihi`CR>)jc^X5BCSvAV-7s=X66_MYjZRr&CC%Hy&*a} zSR?}I5_9y!jLlJ^#fGO(KCnFf@!O6*$Y%GEnjb2=)!f7ORk!7PBE?!;v)|gF%$^ps zq&d^9RK5joB89-D(g=vJ3ns2LO>Vc|JLO5O*7Yo!FInpJUl!Ef%WjqFTW&F z^`9t7S;F&0PypwPqoXnT&y!c**(NP9L=W02;_RToUI<a7$&UguB0C^OJ4zgMbmvJGaCKQs4oxsYK6IkLp7IH;$KApL?S>|qJ zJki+B71;oym5OySQCk$kis-NfLz3}ZMkWdxXAONeUCC5jXshkhj}xk~TQU8+#&t$o z>>IZho@q($L&9h>Be!fm0_2I2O7p{JR zRYjFmny?I4q$K5ZHdpA=_N#Xv+u8^hlit1Ip}Z?gp-#lQ+4pI?YHpW89IeCxeA{^5 z@{`C?htw6&s2kQ{W}Z#Qx6s^q`XlQZNUfNz3Y;dko2*2}l(KpMIW2FaHo)JEcRb!j@+C{6G%YQqF`su6tY`;WGaZx`3X3!vl>Ro@5e+j&M5zUkXs}U&3Wy;+XSz*sC79}h0U|No&d_o(X*K8URqNQ2rBF6gpzyW*d1FI+T?Nf+1 zwg~SCb|Qv(_b)~o6LJz~X6t8S`|!rIM=+el8O?fNkT(wW+imxlPyM@}F&m@9dZ`w& zB!>EdAngQ7+vj78mhNaY-P9nMDBi~cr8wC;^$GPZ-10(bR!(Tb_5;gQ$1bp9#&TAg zldw=+2K$VPG(-JAVI`0__Fl76baMaG>kE>W{En3hJGQ$vgdOga9>y(z-Zw!89$Hcu zIGAvhzCpF!92MH_#s+TA>40bt%daJY$7ju1G;uT?8RUJ61|294w9X0b2zbLZl{ii31!IHZv& z<2sWXg_0`eBCdkd0Z(0CWDH9N!dI8|S~?4-xnX2$^W68M2%jVg%`!D^6}@uID29O= zz^=pz;wLw#>-LDZ`fJ5u>e3BXB$rsELO{Px{LzrmEJpjXAcN9Bv}E=QZM(_RlT-7_ zscFYUGk2Ut04bHLv({*;)`Oio#{AGUw*EB*PP8uhO{HTl(5B5kdSSql67}^QLH1+H z65)|Ogs!tD4MI`((r)nSfVg`BDFQA?Px#obBB@L&-^LG4w~nWZZSEC)1)|dcy9LI` zcc$`Q+|x2Wx$4OIZi=(@Q=uc;eN4>f^hQ=)+pT@&dhfOVNd3~wOuSke(i?b{W97Hd z?;Hf~EqOj$=Utn?0#}~Kfbg30-fDqBhCihi;jXayZcD~!Lyn^qw>*C#_p#x zVarq?CN*9Jx|k#5Ab~!DFA?BIDWW(QyBcE>^M0bB3SrBh~m+3LK&7wj`lnB%i zJ7=n)HJpeP{-FxmncZFwLkqlE5$#IZq+4jM9Bkam(LV3ACzZ@tPT`*~&91I3OS)`u zMT{`485W#lWv+;v3>(qVgS(^XCS_#PR)P~Z{f)Qgs&*7v6a&Vb_3_)0y2wu*S^r4RcCYbZIagE+oLl1DNX@I`?;X z$KzcLGwb2jw{)e_lhId%iA1J|#Ad#w(jZ*+6@r>U5xHxl5eB}&Tw_tDH;Zx=D_=fH zD6B<6Ujfq|r7sp9F9m>1=-?=l@toV{SBAVXr4`x3564MS#W#Jn&*UtZ<$UOY86XYl z_7`1c_3L5e&7>+zCUiFcK$555*SMlN^=KYk?Ro~&f8FnM65VkbhfUob*6{#_moRZh z?r5oEcY8r7sSEQpvUhEsx>RcG5N2(pZ@UMX#eZIy&n%p|NiqI_I?_}KR(<4djB`~ z#~=3h_x67L_SH9Uug-tw`@j7ts{9uJ`fcw=cK&lDkp2CyKkYHehK$UG9?5cq$9D`> zmU~cm+}_RaXw7Ep-ULn$dgP1MUwv^?{CKsOeo=D2XY^YnP;g$K@m?hb+%wI@H_h@w zmb9Fc)EZ+uo7OB;{t8NeJ-BW-%rfQWwyFx`Eag?+yM!1#74B4{opx+}UH5w5D~Kky zsJHsfMrpEF4XeSR)uj=fC=eDUQ)W)Xfy1}=bXH(sgbiKYv!M2kJpBrUBs}5>n2(JF zq-Uuj{x|lWkq0B3x^Z$sU+JKyOwdZYchmQ+BPFKvkd)+L>B4Moyqht{2~Oc(1kakc-*$rT zb3~P}LADFjdig!A6e~y5il>|0(2rR3dyv2v%c)(6ZVy&HsN;GYygKZTRLA&sEc0eg zs0%#xci+Wyy!CN5mWLKn=nro+w8AMNQbA_n$o!wP{Kfh9Z`cGQ<`5#7Lu|%n z$}*-QJ(BtEV;HQL%e(G~xSs_1-nCEWlVd{n!~96D(E1=4OECpAi)nalrchQw4av>E zi;#w^E{t}TIpr7)izPD~9}&x2%A6=c3pJA(ELgOl3D-5Np^N#}y*Jn`LpN_oc>m!f+Q>N#Ec zUM%Q>Jk1?xT?k&7Lfs@c!5# z;L@)x9kxY8DA*1+@K`3rG%T&^DFE;+LAXfy9Z#!H zxdJ$qUFPZa1p?>OnI7FU2(AF(B*<5=6Yiok?FfHJS!T93mUSv1@wumSD8$^^sNAsA zMnsxxA%ZVhh9waM=EQf#H?lbRcMMtpMOaw1L6*2vf=;0BAq*)|)S#SEwbmP8;#H)( z8XMoTyvV5T8{9ScA#m~pp$>+wP?3&kCOi8jnsN2+)aENAwP?hFzIB9O_zt#F>e5nL zf#p4KSPC@X^_ibBBJV|%ozG&;)w|On;bS&-e|cbzX=yoS5&fZw4RES^M8bkY7fA^H zuYW9LjC5+A|MTdNLEE=K|JCr((tv1wifTn9%(^Z1U$10(U9e<~+pGSHRu001HoD?f z)HLsC##6kGu)>o4w+o?yBlnJlglZ-tBL!WN2_ZGU04_I$ecS_6HP%TQ5-lar!l(*y z=C%vM-g5;d;P6!7;Hb_0aRQoovB9U9$=b?-X0@;bp9!fy^H<8nM1!m)3B8j%1}Jv^ zHAG2(*QxFYdow3FSDN0kF}XIPmW@J+0BVIV=xqwk##l-!p?L-~tlwldCSFJ*m`9|l z#IXLNWFr@QY2hr8{hOFvR=a6Ke}QHcEha?@z~SVmz-wP8T*N@GrC%wMT5tu#P-Ail za$x2{5@QNVk=l(ZSi+Q|<$MU8p}BTxD>hXDMB$u@nBK|+ETD-LN|#jvCr!ysDQ}tZ z8EFQq8+kQRFkOg0#B52D%&3^My5>qwQ^2%uy_OZfujZ`i#ON$s!=c?6q0GC6e-gg5 ze~dTKds)ra@~ne(lHLxwoN1a;O*crSc}0DDWg7?w+ZhDN#oE`8^OdzNAX_8=zwZBHgbf=my2-2(BJExe%Ds%L=VBT zK^xH3s}d2`BC>@M7&nCTn0(d{8Lc8>?L0jo+Z@w9XCfNg<8_5Tn}Fk^Sx9SwAR#Ze zX7qr0VO#1tZH|=?Q(0FcfU8x?EbA3nVGhOGnOZTv(BBVz(L=)fY%H)aue1tw@8x8w zuyDEyY>KGL5DpjOy=;zS@`E#Io`^Ya@|j1$9xt)xM=~|jH;S#GHyKNZ!Iju#?k!nD z%K+XRHnFzZ@S{GbXy>!`Eg-V=38DxmGxk{oP8aJ{6x|Jr#SLK1=vcAwCWOTUm#sfK zoNTjzGDv2Ckk>xXw5aCE)dhfXZpkV9(KnXNg^}7|mm6ltP+hPR;*#B)dID}A{;+i; zzvZ3Qxb|@I=B})VEEyyiz}m;qO`nQbzU79rC3JY1jtW}pIa&~h;STo%>8ly^dTztO zwYW~S;b`EIIR@|Aws96cBa7TkZe8}@?T zUC;;mXp2q{P|P=_uD6BIO3R#TowB0a?i5N{C9c0 zi=Ag5TDrJ%gii$)3F69`?lJ$f2iU!|ltp13h57!lwI2|uR^IgjNwYee)u6zX306`K zAriJ+y%9C~oKb6mjY~P+9#UaIi$kJ~EdUmpg#%`GgHMj6s4>>y>_bSuS9nC8pZW~p zEnAw<7i*18W3qRW6*Ibz@9#;eY8vY6N;Hwnt)VB}(^4vR>43Kv?v~R7=#qs$*=U|@ zG*32~kKao1uWh3tHI04X7I;~=LAd)~q{(VRLN29dvBkE+0Xh#|X{x6{z3=IKESR>X zM4jjCjeGkyB^7<&Yt`zYe5|87t}yDx`=lj`2z7KBK-pC`V#$0DMMXBE#(M21<<)%(IlkLsnfyQl$A87+F`c1vuD zRs*?@xp(OJ*fQ(N+Sk5wx8LTgqLCHdTN-nF*r7MU*W6zm@9}2 zG&G24!*Eg8^y!Ub@>3rp5OKy|4oW{Yj3ThpZlL&?0XNcBRy;$~^c%bClgudZ(UlwP z5weQKh*`q(ywZjc^kW=^TxbYt0rP^jfKKZ2MXXd2@v7nI9ic_qNcbj1kf08IPnZOZ zuaF5~aL;85G@$pgY>|!cC64|Y0FFgH0Ej0zQhM6@o09=cWVlC#Ovg*^=teJac_T8l zDIdCLg!kgWDsC5M>9?+IxMx@Nj`GZ0fQ>+Np?J!$7qg`#8^GC6IU*YgV>o)sSU5KF zQIm}VBXKnR+lIM-llzv9~uV+0hAF1neBSA~NS% zGnXpr?^a(OiR(u7ZA*_Jj0bZ=+4~~n3D>=%8HhI$fI$=q!Q11}B)W<1@&U-Vt8BGwDb$P?z~*|j z3Ja}H_$fY)b|sY|KhlMjB7xWoq^qiqggZL+jTW`~;+}>|yDN^J@5Lvpt2WJmXc=M^cc#$Byb4zozs3FS+X7p>U5RP!E zi$R?m8ukzxxUeDc+UMs}bAnW}X>=AubL6a?LaqCxN8$Z?Y{X}AJm?;6ZfJXmA+bL% z8EuN5AJ_m1;^22s-{Qj?4mQSwMTr)dfbv#O3q#@lZp0+Gl>g{$AmF7MlM|x2m}V@5 z@D$#QT|4D9?E(*x;7U2g8TZO#|dY z4C*c{4SMIK+P+GJ$mV1KkOo*vY#U0zhtf{BlbvSW}6m<&U@-r|p zb1y@noRF7wt9@{f8|}tcaTQV%E|RQDdl{&>!0BKZ!{Z;#1FlI8z}*j*-q)wfm|uZh zT6_pH#eBGb&)d>_S9(#dcp+#6r`h?l=(k7yaMDp1s&Sf=q*;pjCBG>dIh|1aE$x&U0xp z2Ykw*{G_G;5HGGJ0TX_&mIMn>>i*%DM463?fQSN#xh@E8OwQkr$$-7r&j&*?ct26* zKSEE`U`#IZ9tL_YCaf&+L~ob{N%(|RB1k@Z`}*wlF`3Ex2#Bd9_Y9);jI0K!P|C@K z!G1uNbRzSjlsS(~yg{)NuxzUh7P2a$C2A8}vPu|KsXIizJSCczQ>G0xBC7m`Mbwyo zy#B@|qv>mrMVJlSL9O^)b9G?{>BJ$`F;%Dk7N)ckf2ZjM1(DIy}lBez@%0B6_!eaut5u%Q8#vc^X@>R*^je zZohkl(I$sp3^ZPCzQ5;b?+t^8nj2+BI@l-@xl=r4LK|{bDzXPK_sKaFF~ezLTgCi_ zi`W24Bj(qKX}FrX+0JaGn8pgHPz5P25nu7V$}|;BRw|oEpzQB^pt0ge#@^#q>?4-= zhnnIEI>!KA|HRT<3JL3fotiawA@$0(qx>YXQ zeuM3iA`aiT!LbF$x5*kelBNE~h*EJLTG!+zm}1HbCQ|73{IbS$+@h_XkL@HJ(HUw( zYvcnOKe;Z)4L%q|^3G(I#+bv{dtFjPymLc@J=6)IB8G_eQ2w?nG^PJyLX%=i$#hf! zsg_;NJ=om8@Z*R@dh3L*!UE5`Bu8t1g`3ZW;*njS!=5Wzl7cGbRaRgk_ExKC7nZFU zh2>oMgb3N1X|wRdMNIn4%H=BT2?8lkQn(+*n9FIF*& zp@~VC0ULEGtYJu4q=_lU0xR!WdB@rPflbIA-E%z~*?JfUAh;iV0{@A8DJt0~X=;=8 zZNYpjS2QNH;O|&zgqtB`QpUPGDxQ8FXA9myh>SF;ZSDk!Gscaq%(NYGRwlPy(p*cH zg(q5eHv6F!WSunHZ46swS3~*|N)`sm?Q1%~+H%E28I-LP*DKN4)~bgPOf^+Z#~GfR zl5qW`p?%>UwqJn&?XiQJC3(w>V{$H3RkAu?u*j?K}URp55#tG`eNd8JchQT z2dI}ZI*jsQ3>F97)5ZZ-zVz)FBS0Rc?CwCN^k@iEbp;@rE2oMKjs|0L&2yg7GK;DM z8Wg~&AsL?SUI}qFhXb-FOY`mskO>teW45}fqi%E5!1g~haV3xH_9@a01h8FvDq#AJ z?tN!{ibZi@xagRCZ&{cX9}qRn?)YEy(#k&2!So;%54IIOl1*pPSN8$>-fz6sF_xuR z9T2g2D>5e6Z&=ZRm@UZ?A8C0rxHcb1#kDNwgzCF)+X1+3|<*fC@!WObkbR84&+U04+Fm66+m%(&? zTvuwz1`BM?X4}A(nlgsEVaj0qLU8t(4zP5p_T=~e{3_pJ0ne;N(nSm z&1lICoB~N)#wQF~W-k*`Z5LqWNc+!So>nN!80@l^h0Nr1{?HBj1be8B=*aB+c2!C}>#t4fncJv(tzIkAvkgVM zk77d}MR4}J6tO3EAJK3E*VOe>t{Vdvtjsy)mc+2_6*Bh+-u`V0)BeJC3Ei|K^eK`E z8ya}kc~zPi;ht%d;G$$B-w<-bJBxbBG7yKXub>go?5w=_t8CscusJ9%=q&5lEFjC~ zb&vEYTNs_f5@l&Ughk2kc*dqi)1GlL4N7fBm+@4#fNs;(^ve8I*S^5pcKP}(5v+UN zGp-(NR58=(L@h!_qY)S!_x{`H8fmsqeqb<1v->48^eEBfekQ>NRH>*ip&A>2IAH9b zg>hiu82KF8JM5bKJ@0h&Qbp?cj;(1e8*>=v8(N0_JpvCLx1vPN^NfqzA>rB)Xj=oC z5%Wb{Raw*+X%=w0Enw1Cd6?e7>j54GbJzdFku4h*7BG*9-5Cr%!X1e=(QJuZaFr4L%{r#r5g+1+iYhUU8;T{yy)~>yoMC{C%s02UywmCH-VZi<3&v&bWfA(|yIY zh3A7jKL*^(de&luSa(ns(&>MkToGECz12LjAa0*PHaGWc%r4$=<@V_ZuiL?S>{UNT z+7xn_9x{2PKR1$#w5QYU&y6vt`MBX|e{P(j7Lkbc=spvmCjZmDyj*b2sg~sizOu%% z-jr4;EpvNcFWfI8)_e&**o(;`*t&%fXr^#37s6d%{abdrhKg1So6+HlbxDOX=iKxU?%E)Nm;li|ofP|9-K+k2msur3 zAr9B}7LWEjpLf|k$wzd+!(HlYAGJ^U6A#yQ1>ceHB8zgp1sM_^;fgR!fiu$X6_F+3 z#V<5X%VYBk+nhH7CjMIaE@D*pq?bKCFR-~Od3$;Vzl^cLef8oHfm~F8nF~Hc53m>=U_!!ysZG-s~%lh&6p|48; z;6JZjgU84s*|eFLO&2P`VW&11;YahJHE$Pn+Fs4X`Xl@Vn;~w^mtvr85|{5EY?ldH zv5ir7<|P|VsB)5m4b$yaPvrML3GzWWh-V-_EZ5_mmL7KqOZE8e>+rGk$z$49=+8`Q zDK^g1T=sY~#ODfraf(^ZS+`BjgTf3H@4hwivg6}YI7hCE5gucbIv+WY@_$U3o$Wiy zwn;9Ew0APLdBmN|#hI1ET^_Zv=o_)t8pGQ-{5wc6>BZSrh=VNky)65e3~N5viutqO z#U(IC-T#l`hF`-CZ?zY1-O)JZ0+r*qiyrA+U!DoQc+o%h3;s}fV4==avx-y1lB4Q8 z1zvy%kPZ1_tNI{bvEDS%J!TD5**v6(6wI9F21hI{(o4N{3g}j_6)IRt^NX&RHVL46 z2Hj!U=`YKSG$}>UQ83D>qlN@q-{rJW*s>s%_u`(GDLJ`X@0;n7P={9|u26h4rLKMw z0-7Nf#Qbr?wZgdRsBlTebZC7!qjY8v8D^xJJM<1XK{2XqsV<2Xe#oJ!66# z9v-4C{P4>!za-F!F=YwQJB-RWTA%>V7e_~9@}DQKz9TdN-3e-q;=3b2!m;86TsJlH zf3II(`tJ0tZzDh&tn&vkCTDfMkE8Q$}@5s4z3c*VULBRdna^ z!VxS<=PPncY_x|K{bB`t56E0RmIF}X6E>Z_JxQ_85qr}Y3Wna&$!3C!eo$KzdO^sY!j&y#Wm4SGDb zL07#7iFri}g`EM7CS_0poDvbKX3M6}1))8xvOEiWJAlfq5Ss2FAP#HFvb}GuoXXya=;-fCXwy$nq zEA+A?hQEM%>r^I8-|eF<_Hm{(pXqgh9^P5k8T?PKE;h1M1bTRxjgSf6+0bR?UNE-N>8{hE)7WA2U4=( zT~TRI?a|~mZyd)a*DNyxzq9`5%Go%kRmk)hn}Smzq=x}nn_5zYBXIq4Nar()vX5@WHM-rBwF_3E;se+afev(J8bf1 zGCTpP+#k<|Do1be9LF{~`2TC8&?YHfEs88QUC*hax`_ndxyA?AVrD?6t$O@c(Ioh4sks=H~fw(Ls$Q6la#@It%>e>E$hKSiPB$cu*1pl&H(L7|${kz#Ji*b)8o^qvDb7}C3~2r> zQ)~X~w=Qi6)m4dCp0hk_`0GJZCujCNix*c{7Z(oy4;GZw(8^4$X3r5}5s%Gg%zG`Q z(yCLRR<0`cS2LztHv-`vP*aQ_RQEW1nV%qxxOl-I2U2zl6{pOP#UT)q^-=*%wYp9b z+lUgn?RVhk>?uD`h*T0y44JDa%`Pp;t1a1b0ZLI*FOF5Iwa)05d>KR=rMcBTLG=jn^-SNF%G>2xyr^z+-F zKF;5Krqi#VShl?}e|?>NB5yteiA<+2{?x0v67bY~U0VLGNzg6AM9K7w7$TSO$N{T+is`kFgoR8(lH>CEO$PK)f&yBWBn_ zpA8f;dpuw`xSeCb@GS=no7Hd`JW-v|!es<-5Z$h5VHW`$M6^3vSZlsPG{d4@Un%aI+q=|6q(39;1cFXkj!)3)?bA3zyNtMxC$43_dS44P50pM1JxyiTZKH8Y;n>Qq^x}!+kCY0% zT^1zbEbebaJ)l$ykJ^zPIGu53h-u6aoY0u6eG!3cwrQ>_=KC~^@!I7q%c(>-O$Eo% zhDfg$;dV+3{Z>GnB-xrWql{_#xdaVDFDr}S%0TAnm!Hxb`5zlt$Ҵ)1%}CSdJ-eP-C{YlZcMD>I&H4YoGwm^aRE^D zV)TaG0E#fo0Fe^a%uKox;$N7{FuJBY!iu>88}Y5q@(M>cgvIDr>DGU|XLxJVD5Zk$ zXubhJBVTQUytM8X1Bd7UxQ%E!; zgO|CkRG6$Zr!bE+cZK?Es$Lqz9T}=m`KO!156~kaWuKT#XaWG?kZyr z?dJA}+ZHagaiMYm=qEi6032^AyN5>rIJ0#w#diG0i5){|=`z9zxqcs@soNS=Wqn~E zdO6EZ%FFe0vHTF@ahF?e%(@55x)-#QOd_u#g`hQ7d!fov^5udvG|>`o55`T+fU zIlo3f8G^%R3=~`$<={2nVhRY7s^@vCRIew04eR8*poT2DTqLm|3oE+L1c{NgG~BDS zY6rsTe|K87z9MTWv3k~N8=X|jpn$G9uB{K-BIXK7!X(wf0bYDwF3N(;d{mZq;EdpV ziGJa0${eraHp*s&Y0^EQqa4~*Mme;xNSVB0c$q+AJ*wNQsEB?{@EQ^Q$K#mF{9m+K z{GxrO8G~zv+DmB9odWsMu()A4iec(KlJ9vn5oK}SH6nd{W%mo9^A{IaS4}|XlAw

(q#l!6U&L?jCzksef53#!; zZkLEt3UmT#=`8^$oAL7a+pK-OC56?gF4Tn#_Z>P$2Wnx|cP7 zOL>|lxHFE*o18`?MTl?Ev|=cCbN{@p7yf0|gWJ~S-D!yQ*oe;Bn!Pndys4ttfQGdh=cWz22E@1O=r$0<8sHENi&Fzdr}1xr0~^|cNdvs9-7mNC5lk7& zPC;sR2$D?bg~kBXm|?MEg0FCd;KD%AV1ncm+vZjb`2$23FwMbJ%bNmEFdx{`Aq5q$ zsR!apBkl^EreRBiqOHIr6f1wg*VLeLiYX^aE2i|pLj=H69;_%DlQ;O%@_*U#8C}h<`ZAzvcyhGG#vJt;u)WRr=$4=F;@ev)J z8lxv}A$nr?`vdpM_a2YF_mWtPJQQ<4c<#(VQ2>-hVm2Mv)*IX9Oqm z3c(conw;#sj8?98axYejY*PhUeWUBWtBkJq#xkITZIf*=o8_EHJKyukf$;TJZA&?q zi{&Ur_|Ud%4hx{q82vpXC8%#9y`0H2scH8fJtJ4uI8?+_V16FYqGvl?jHG5ph;dJR z17W(9Mn|ao%p)dC2ODONLh00kHw539D0rsQ%oi_1v zbiGkT7{ylDn5YF&c1gX1txUxcX66!b{(pBRK)2s<>?PUY9p#zO^kGE5v6Z!qvFBOg zm&x?yy<(Il+~VlX`Ma{ZHg3e+nT%)T4=Pm;qQ!K(#A3HDx9?<{ODcZ{ToSMsG30Yh#$2EatD?PV@Dp4P@7^>mf)-$Xe`6WTSjO@&%6|d?0RR6E^Fc-c5(5C8!S2%l delta 29023 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 literal 0 HcmV?d00001 diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 48783b96d..bee2975d5 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: parseable description: Helm chart for Parseable Server type: application -version: 0.9.0 -appVersion: "v0.9.0" +version: 1.0.0 +appVersion: "v1.0.0" maintainers: - name: Parseable Team email: hi@parseable.com diff --git a/helm/templates/ingestor-service.yaml b/helm/templates/ingestor-service.yaml index 9791c8743..c13008ede 100644 --- a/helm/templates/ingestor-service.yaml +++ b/helm/templates/ingestor-service.yaml @@ -2,13 +2,13 @@ apiVersion: v1 kind: Service metadata: - name: {{ include "parseable.fullname" . }} + name: {{ include "parseable.fullname" . }}-ingestor-service namespace: {{ .Release.Namespace }} spec: - type: {{ $.Values.parseable.service.type }} + type: {{ $.Values.parseable.highAvailability.ingestor.service.type }} ports: - - port: {{ $.Values.parseable.service.port }} - targetPort: 8000 + - port: {{ $.Values.parseable.highAvailability.ingestor.service.port }} + targetPort: {{ .Values.parseable.highAvailability.ingestor.port }} protocol: TCP selector: {{- include "parseable.ingestorLabelsSelector" . | nindent 4 }} diff --git a/helm/templates/ingestor-statefulset.yaml b/helm/templates/ingestor-statefulset.yaml index eb9a17755..7bc6725aa 100644 --- a/helm/templates/ingestor-statefulset.yaml +++ b/helm/templates/ingestor-statefulset.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Service metadata: - name: {{ include "parseable.fullname" . }}-headless + name: {{ include "parseable.fullname" . }}-ingestor-headless namespace: {{ .Release.Namespace }} spec: ports: @@ -25,7 +25,7 @@ spec: {{- include "parseable.ingestorLabelsSelector" . | nindent 6 }} serviceName: {{ include "parseable.fullname" . }}-headless replicas: {{ .Values.parseable.highAvailability.ingestor.count }} - minReadySeconds: 10 + minReadySeconds: 2 template: metadata: labels: @@ -38,9 +38,8 @@ spec: {{- toYaml .Values.parseable.securityContext | nindent 8 }} image: {{ .Values.parseable.image.repository }}:{{ .Values.parseable.image.tag | default .Chart.AppVersion }} imagePullPolicy: {{ .Values.parseable.image.pullPolicy }} - # Uncomment to debug - # command: [ "/bin/sh", "-c", "sleep 1000000" ] - args: ["parseable", "s3-store"] + command: ["/bin/bash", "-c"] + args: ["parseable s3-store --ingestor-endpoint=${HOSTNAME}.{{ include "parseable.fullname" . }}-ingestor-headless.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.parseable.highAvailability.ingestor.port }}"] env: {{- range $key, $value := .Values.parseable.highAvailability.ingestor.env }} - name: {{ $key }} @@ -59,14 +58,12 @@ spec: {{- end }} - name: P_MODE value: "ingest" - - name: P_INGESTOR_URL - value: "$HOSTNAME:$PORT" ports: - - containerPort: 8000 + - containerPort: {{ .Values.parseable.highAvailability.ingestor.port }} resources: {{- toYaml .Values.parseable.highAvailability.ingestor.resources | nindent 12 }} volumeMounts: - ## No data volume for ingestor + ## No data volume for ingestor - mountPath: "/parseable/staging" name: stage-volume volumeClaimTemplates: diff --git a/helm/templates/querier-service.yaml b/helm/templates/querier-service.yaml new file mode 100644 index 000000000..110e6cbe8 --- /dev/null +++ b/helm/templates/querier-service.yaml @@ -0,0 +1,15 @@ +{{- if eq .Values.parseable.highAvailability.enabled true }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "parseable.fullname" . }}-ingestor-service + namespace: {{ .Release.Namespace }} +spec: + type: {{ $.Values.parseable.service.type }} + ports: + - port: {{ $.Values.parseable.service.port }} + targetPort: 8000 + protocol: TCP + selector: + {{- include "parseable.labelsSelector" . | nindent 4 }} +{{- end }} diff --git a/helm/values.yaml b/helm/values.yaml index 8cd8a1fb2..dd0f9bc16 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -1,19 +1,22 @@ parseable: image: repository: parseable/parseable - tag: edge-debug + tag: v1.0.0 pullPolicy: Always ## Set to true if you want to deploy Parseable in local mode (store logs ## on local mount point instead of S3 bucket) - local: false + local: true ## Set to true if you want to deploy Parseable in a HA mode (multiple ingestors) ## Please note that highAvailability is not supported in local mode highAvailability: - enabled: true + enabled: false ingestor: + port: 8000 count: 3 env: RUST_LOG: warn + ## Use this endpoint to send events to ingestors + ## Console (UI) is available on the other service (that points to the query pod) service: type: ClusterIP port: 80 diff --git a/index.yaml b/index.yaml index ad227aea0..86fd37bf8 100644 --- a/index.yaml +++ b/index.yaml @@ -3,9 +3,9 @@ entries: operator: - apiVersion: v2 appVersion: v0.0.3 - created: "2024-03-04T21:18:31.578535938+05:30" + created: "2024-04-20T12:29:53.045669949+05:30" description: A Helm chart for Parseable Operator - digest: 0279d9d34bb8cab5160647eb1bd1d97fcd09aff6dcce315b58a62f5295bd9eb6 + digest: 9b866683a8640ca0018d4b48d7638de2a2c831446c7edc3465fbd1e7e150a3ab name: operator type: application urls: @@ -13,7 +13,7 @@ entries: version: 0.0.3 - apiVersion: v2 appVersion: v0.0.2 - created: "2024-03-04T21:18:31.577441663+05:30" + created: "2024-04-20T12:29:53.043422199+05:30" description: A Helm chart for Parseable Operator digest: 0bf4cd8cc7f1c5ff6d49f91fe91204855a215ae1cb5acaeb3fe84497bc97c566 name: operator @@ -23,7 +23,7 @@ entries: version: 0.0.2 - apiVersion: v2 appVersion: 0.0.1 - created: "2024-03-04T21:18:31.575560481+05:30" + created: "2024-04-20T12:29:53.040740306+05:30" description: A Helm chart for Parseable Operator digest: 344cedd9e3a0f17c6ff09514dabed994bac7bac94ace500857d487c1c9cc1859 name: operator @@ -32,9 +32,32 @@ entries: - https://charts.parseable.com/helm-releases/operator-0.0.1.tgz version: 0.0.1 parseable: + - apiVersion: v2 + appVersion: v1.0.0 + created: "2024-04-20T12:29:53.203524667+05:30" + dependencies: + - condition: vector.enabled + name: vector + repository: https://helm.vector.dev + version: 0.20.1 + - condition: fluent-bit.enabled + name: fluent-bit + repository: https://fluent.github.io/helm-charts + version: 0.25.0 + description: Helm chart for Parseable Server + digest: 664a9ae6ab0dfa93a261df8f7a601487fd5df67f4b5b79c7afceeb6347c81ad3 + maintainers: + - email: hi@parseable.com + name: Parseable Team + url: https://parseable.com + name: parseable + type: application + urls: + - https://charts.parseable.com/helm-releases/parseable-1.0.0.tgz + version: 1.0.0 - apiVersion: v2 appVersion: v0.9.0 - created: "2024-03-04T21:18:31.638535002+05:30" + created: "2024-04-20T12:29:53.19628593+05:30" dependencies: - condition: vector.enabled name: vector @@ -57,7 +80,7 @@ entries: version: 0.9.0 - apiVersion: v2 appVersion: v0.8.1 - created: "2024-03-04T21:18:31.635712616+05:30" + created: "2024-04-20T12:29:53.189182739+05:30" dependencies: - condition: vector.enabled name: vector @@ -80,7 +103,7 @@ entries: version: 0.8.1 - apiVersion: v2 appVersion: v0.8.0 - created: "2024-03-04T21:18:31.633351793+05:30" + created: "2024-04-20T12:29:53.180647087+05:30" dependencies: - condition: vector.enabled name: vector @@ -103,7 +126,7 @@ entries: version: 0.8.0 - apiVersion: v2 appVersion: v0.7.3 - created: "2024-03-04T21:18:31.630982924+05:30" + created: "2024-04-20T12:29:53.17360296+05:30" dependencies: - condition: vector.enabled name: vector @@ -126,7 +149,7 @@ entries: version: 0.7.3 - apiVersion: v2 appVersion: v0.7.2 - created: "2024-03-04T21:18:31.62728704+05:30" + created: "2024-04-20T12:29:53.16642063+05:30" dependencies: - condition: vector.enabled name: vector @@ -149,7 +172,7 @@ entries: version: 0.7.2 - apiVersion: v2 appVersion: v0.7.1 - created: "2024-03-04T21:18:31.624855086+05:30" + created: "2024-04-20T12:29:53.157924405+05:30" dependencies: - condition: vector.enabled name: vector @@ -172,7 +195,7 @@ entries: version: 0.7.1 - apiVersion: v2 appVersion: v0.7.0 - created: "2024-03-04T21:18:31.62215143+05:30" + created: "2024-04-20T12:29:53.150859194+05:30" dependencies: - condition: vector.enabled name: vector @@ -195,7 +218,7 @@ entries: version: 0.7.0 - apiVersion: v2 appVersion: v0.6.2 - created: "2024-03-04T21:18:31.618314254+05:30" + created: "2024-04-20T12:29:53.14373988+05:30" dependencies: - condition: vector.enabled name: vector @@ -218,7 +241,7 @@ entries: version: 0.6.2 - apiVersion: v2 appVersion: v0.6.1 - created: "2024-03-04T21:18:31.616105468+05:30" + created: "2024-04-20T12:29:53.135315624+05:30" dependencies: - condition: vector.enabled name: vector @@ -241,7 +264,7 @@ entries: version: 0.6.1 - apiVersion: v2 appVersion: v0.6.0 - created: "2024-03-04T21:18:31.613451542+05:30" + created: "2024-04-20T12:29:53.128266554+05:30" dependencies: - condition: vector.enabled name: vector @@ -264,7 +287,7 @@ entries: version: 0.6.0 - apiVersion: v2 appVersion: v0.5.1 - created: "2024-03-04T21:18:31.610243878+05:30" + created: "2024-04-20T12:29:53.120985266+05:30" dependencies: - condition: vector.enabled name: vector @@ -287,7 +310,7 @@ entries: version: 0.5.1 - apiVersion: v2 appVersion: v0.5.0 - created: "2024-03-04T21:18:31.608035931+05:30" + created: "2024-04-20T12:29:53.112172364+05:30" dependencies: - condition: vector.enabled name: vector @@ -310,7 +333,7 @@ entries: version: 0.5.0 - apiVersion: v2 appVersion: v0.4.4 - created: "2024-03-04T21:18:31.605745147+05:30" + created: "2024-04-20T12:29:53.105134078+05:30" dependencies: - condition: vector.enabled name: vector @@ -333,7 +356,7 @@ entries: version: 0.4.5 - apiVersion: v2 appVersion: v0.4.3 - created: "2024-03-04T21:18:31.602399707+05:30" + created: "2024-04-20T12:29:53.096176121+05:30" dependencies: - condition: vector.enabled name: vector @@ -356,7 +379,7 @@ entries: version: 0.4.4 - apiVersion: v2 appVersion: v0.4.2 - created: "2024-03-04T21:18:31.598946927+05:30" + created: "2024-04-20T12:29:53.089197168+05:30" dependencies: - condition: vector.enabled name: vector @@ -379,7 +402,7 @@ entries: version: 0.4.3 - apiVersion: v2 appVersion: v0.4.1 - created: "2024-03-04T21:18:31.595295298+05:30" + created: "2024-04-20T12:29:53.082388805+05:30" dependencies: - condition: vector.enabled name: vector @@ -402,7 +425,7 @@ entries: version: 0.4.2 - apiVersion: v2 appVersion: v0.4.0 - created: "2024-03-04T21:18:31.59184319+05:30" + created: "2024-04-20T12:29:53.074361605+05:30" dependencies: - condition: vector.enabled name: vector @@ -425,7 +448,7 @@ entries: version: 0.4.1 - apiVersion: v2 appVersion: v0.4.0 - created: "2024-03-04T21:18:31.588706658+05:30" + created: "2024-04-20T12:29:53.067523699+05:30" dependencies: - condition: vector.enabled name: vector @@ -448,7 +471,7 @@ entries: version: 0.4.0 - apiVersion: v2 appVersion: v0.3.1 - created: "2024-03-04T21:18:31.585056257+05:30" + created: "2024-04-20T12:29:53.060622571+05:30" dependencies: - condition: vector.enabled name: vector @@ -471,7 +494,7 @@ entries: version: 0.3.1 - apiVersion: v2 appVersion: v0.3.0 - created: "2024-03-04T21:18:31.581498864+05:30" + created: "2024-04-20T12:29:53.051932969+05:30" description: Helm chart for Parseable Server digest: ff30739229b727dc637f62fd4481c886a6080ce4556bae10cafe7642ddcfd937 name: parseable @@ -481,7 +504,7 @@ entries: version: 0.3.0 - apiVersion: v2 appVersion: v0.2.2 - created: "2024-03-04T21:18:31.581284341+05:30" + created: "2024-04-20T12:29:53.051347598+05:30" description: Helm chart for Parseable Server digest: 477d0dc2f0c07d4f4c32e105d4bdd70c71113add5c2a75ac5f1cb42aa0276db7 name: parseable @@ -491,7 +514,7 @@ entries: version: 0.2.2 - apiVersion: v2 appVersion: v0.2.1 - created: "2024-03-04T21:18:31.581089413+05:30" + created: "2024-04-20T12:29:53.050804134+05:30" description: Helm chart for Parseable Server digest: 84826fcd1b4c579f301569f43b0309c07e8082bad76f5cdd25f86e86ca2e8192 name: parseable @@ -501,7 +524,7 @@ entries: version: 0.2.1 - apiVersion: v2 appVersion: v0.2.0 - created: "2024-03-04T21:18:31.580835869+05:30" + created: "2024-04-20T12:29:53.050278973+05:30" description: Helm chart for Parseable Server digest: 7a759f7f9809f3935cba685e904c021a0b645f217f4e45b9be185900c467edff name: parseable @@ -511,7 +534,7 @@ entries: version: 0.2.0 - apiVersion: v2 appVersion: v0.1.1 - created: "2024-03-04T21:18:31.580614668+05:30" + created: "2024-04-20T12:29:53.049743773+05:30" description: Helm chart for Parseable Server digest: 37993cf392f662ec7b1fbfc9a2ba00ec906d98723e38f3c91ff1daca97c3d0b3 name: parseable @@ -521,7 +544,7 @@ entries: version: 0.1.1 - apiVersion: v2 appVersion: v0.1.0 - created: "2024-03-04T21:18:31.580397661+05:30" + created: "2024-04-20T12:29:53.049209275+05:30" description: Helm chart for Parseable Server digest: 1d580d072af8d6b1ebcbfee31c2e16c907d08db754780f913b5f0032b403789b name: parseable @@ -531,7 +554,7 @@ entries: version: 0.1.0 - apiVersion: v2 appVersion: v0.0.8 - created: "2024-03-04T21:18:31.580177565+05:30" + created: "2024-04-20T12:29:53.048668325+05:30" description: Helm chart for Parseable Server digest: c805254ffa634f96ecec448bcfff9973339aa9487dd8199b21b17b79a4de9345 name: parseable @@ -541,7 +564,7 @@ entries: version: 0.0.8 - apiVersion: v2 appVersion: v0.0.7 - created: "2024-03-04T21:18:31.579952523+05:30" + created: "2024-04-20T12:29:53.048132716+05:30" description: Helm chart for Parseable Server digest: c591f617ed1fe820bb2c72a4c976a78126f1d1095d552daa07c4700f46c4708a name: parseable @@ -551,7 +574,7 @@ entries: version: 0.0.7 - apiVersion: v2 appVersion: v0.0.6 - created: "2024-03-04T21:18:31.5797268+05:30" + created: "2024-04-20T12:29:53.047659741+05:30" description: Helm chart for Parseable Server digest: f9ae56a6fcd6a59e7bee0436200ddbedeb74ade6073deb435b8fcbaf08dda795 name: parseable @@ -561,7 +584,7 @@ entries: version: 0.0.6 - apiVersion: v2 appVersion: v0.0.5 - created: "2024-03-04T21:18:31.579503422+05:30" + created: "2024-04-20T12:29:53.0471595+05:30" description: Helm chart for Parseable Server digest: 4d6b08a064fba36e16feeb820b77e1e8e60fb6de48dbf7ec8410d03d10c26ad0 name: parseable @@ -571,7 +594,7 @@ entries: version: 0.0.5 - apiVersion: v2 appVersion: v0.0.2 - created: "2024-03-04T21:18:31.579259667+05:30" + created: "2024-04-20T12:29:53.046655187+05:30" description: Helm chart for Parseable Server digest: 38a0a3e4c498afbbcc76ebfcb9cb598fa2ca843a53cc93b3cb4f135b85c10844 name: parseable @@ -581,7 +604,7 @@ entries: version: 0.0.2 - apiVersion: v2 appVersion: v0.0.1 - created: "2024-03-04T21:18:31.57896144+05:30" + created: "2024-04-20T12:29:53.046186056+05:30" description: Helm chart for Parseable Server digest: 1f1142db092b9620ee38bb2294ccbb1c17f807b33bf56da43816af7fe89f301e name: parseable @@ -610,4 +633,4 @@ entries: urls: - https://charts.parseable.io/helm-releases/parseable-operator-0.0.1.tgz version: 0.0.1 -generated: "2024-03-04T21:18:31.573935838+05:30" +generated: "2024-04-20T12:29:53.036907956+05:30" diff --git a/server/Cargo.toml b/server/Cargo.toml index 99eb9722a..8188c0f70 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -122,8 +122,8 @@ maplit = "1.0" rstest = "0.16" [package.metadata.parseable_ui] -assets-url = "https://github.com/parseablehq/console/releases/download/v0.6.1/build.zip" -assets-sha1 = "88035328ca6a045dd939615dc04b0c6ad9c6cb75" +assets-url = "https://github.com/parseablehq/console/releases/download/v0.6.2/build.zip" +assets-sha1 = "e3e6e0bba294601df94ae3cbee5e82df6b593ef1" [features] debug = [] diff --git a/temp.yaml b/temp.yaml deleted file mode 100644 index 2facbcca8..000000000 --- a/temp.yaml +++ /dev/null @@ -1,713 +0,0 @@ -NAME: myparse -LAST DEPLOYED: Tue Apr 9 17:31:14 2024 -NAMESPACE: default -STATUS: pending-install -REVISION: 1 -TEST SUITE: None -USER-SUPPLIED VALUES: -{} - -COMPUTED VALUES: -fluent-bit: - affinity: {} - annotations: {} - args: [] - autoscaling: - behavior: {} - customRules: [] - enabled: false - maxReplicas: 3 - minReplicas: 1 - targetCPUUtilizationPercentage: 75 - vpa: - annotations: {} - controlledResources: [] - enabled: false - maxAllowed: {} - minAllowed: {} - updatePolicy: - updateMode: Auto - command: [] - config: - customParsers: | - [PARSER] - Name docker_no_time - Format json - Time_Keep Off - Time_Key time - Time_Format %Y-%m-%dT%H:%M:%S.%L - extraFiles: {} - filters: | - [FILTER] - Name kubernetes - Match kube.* - Merge_Log On - Keep_Log Off - K8S-Logging.Parser On - K8S-Logging.Exclude On - inputs: | - [INPUT] - Name tail - Path /var/log/containers/*.log - multiline.parser docker, cri - Tag kube.* - Mem_Buf_Limit 5MB - Skip_Long_Lines On - outputs: | - [OUTPUT] - Name http - Match kube.* - host parseable.parseable.svc.cluster.local - http_User admin - http_Passwd admin - format json - port 80 - header Content-Type application/json - header X-P-META-meta1 value1 - header X-P-TAG-tag1 value1 - header X-P-Stream fluentbitdemo - uri /api/v1/ingest - json_date_key timestamp - json_date_format iso8601 - service: | - [SERVICE] - Daemon Off - Flush {{ .Values.flush }} - Log_Level {{ .Values.logLevel }} - Parsers_File parsers.conf - Parsers_File custom_parsers.conf - HTTP_Server On - HTTP_Listen 0.0.0.0 - HTTP_Port {{ .Values.metricsPort }} - Health_Check On - upstream: {} - daemonSetVolumeMounts: - - mountPath: /var/log - name: varlog - - mountPath: /var/lib/docker/containers - name: varlibdockercontainers - readOnly: true - - mountPath: /etc/machine-id - name: etcmachineid - readOnly: true - daemonSetVolumes: - - hostPath: - path: /var/log - name: varlog - - hostPath: - path: /var/lib/docker/containers - name: varlibdockercontainers - - hostPath: - path: /etc/machine-id - type: File - name: etcmachineid - dashboards: - annotations: {} - enabled: false - labelKey: grafana_dashboard - namespace: "" - dnsConfig: {} - dnsPolicy: ClusterFirst - enabled: false - env: [] - envFrom: [] - envWithTpl: [] - existingConfigMap: "" - extraContainers: [] - extraPorts: [] - extraVolumeMounts: [] - extraVolumes: [] - flush: 1 - fullnameOverride: "" - global: {} - hostAliases: [] - hostNetwork: false - image: - pullPolicy: Always - repository: cr.fluentbit.io/fluent/fluent-bit - tag: "" - imagePullSecrets: [] - ingress: - annotations: {} - className: "" - enabled: false - extraHosts: [] - hosts: [] - tls: [] - initContainers: [] - kind: DaemonSet - labels: {} - lifecycle: {} - livenessProbe: - httpGet: - path: / - port: http - logLevel: info - luaScripts: {} - metricsPort: 2020 - minReadySeconds: null - nameOverride: "" - networkPolicy: - enabled: false - nodeSelector: {} - openShift: - enabled: false - securityContextConstraints: - annotations: {} - create: true - podAnnotations: {} - podDisruptionBudget: - annotations: {} - enabled: false - maxUnavailable: 30% - podLabels: {} - podSecurityContext: {} - podSecurityPolicy: - annotations: {} - create: false - priorityClassName: "" - prometheusRule: - enabled: false - rbac: - create: true - nodeAccess: false - readinessProbe: - httpGet: - path: /api/v1/health - port: http - replicaCount: 1 - resources: {} - securityContext: {} - service: - annotations: {} - labels: {} - loadBalancerSourceRanges: [] - port: 2020 - type: ClusterIP - serviceAccount: - annotations: {} - create: true - serviceMonitor: - additionalEndpoints: [] - enabled: false - terminationGracePeriodSeconds: null - testFramework: - enabled: true - image: - pullPolicy: Always - repository: busybox - tag: latest - tolerations: [] - updateStrategy: {} - volumeMounts: - - mountPath: /fluent-bit/etc/fluent-bit.conf - name: config - subPath: fluent-bit.conf - - mountPath: /fluent-bit/etc/custom_parsers.conf - name: config - subPath: custom_parsers.conf -parseable: - affinity: {} - env: - RUST_LOG: warn - fullnameOverride: "" - highAvailability: - enabled: true - ingestor: - count: 3 - env: - RUST_LOG: warn - resources: - limits: - cpu: 500m - memory: 4Gi - requests: - cpu: 250m - memory: 1Gi - service: - port: 80 - type: ClusterIP - image: - pullPolicy: Always - repository: parseable/parseable - tag: v0.9.0 - local: false - localModeSecret: - - keys: - - addr - - username - - password - - staging.dir - - fs.dir - name: parseable-env-secret - prefix: P_ - type: env - metrics: - serviceMonitor: - additionalLabels: {} - enabled: false - honorLabels: false - interval: 30s - metricRelabelings: [] - namespace: "" - podTargetLabels: [] - relabellings: [] - scrapeTimeout: "" - nameOverride: "" - nodeSelector: {} - persistence: - data: - accessMode: ReadWriteOnce - enabled: false - size: 1Gi - storageClass: "" - staging: - accessMode: ReadWriteOnce - enabled: false - size: 1Gi - storageClass: "" - podAnnotations: - prometheus.io/path: /api/v1/metrics - prometheus.io/port: "80" - prometheus.io/scrape: "true" - podSecurityContext: - fsGroup: 1000 - fsGroupChangePolicy: Always - runAsGroup: 1000 - runAsUser: 1000 - resources: - limits: - cpu: 500m - memory: 4Gi - requests: - cpu: 250m - memory: 1Gi - s3ModeSecret: - - keys: - - addr - - username - - password - - staging.dir - - fs.dir - - s3.url - - s3.access.key - - s3.secret.key - - s3.bucket - - s3.region - name: parseable-env-secret - prefix: P_ - type: env - securityContext: - allowPrivilegeEscalation: false - service: - port: 80 - type: ClusterIP - serviceAccount: - annotations: {} - create: true - name: parseable - tolerations: [] -vector: - affinity: {} - args: - - --config-dir - - /etc/vector/ - autoscaling: - behavior: {} - customMetric: {} - enabled: false - maxReplicas: 10 - minReplicas: 1 - targetCPUUtilizationPercentage: 80 - targetMemoryUtilizationPercentage: null - command: [] - commonLabels: {} - containerPorts: [] - customConfig: - api: - address: 127.0.0.1:8686 - enabled: true - playground: false - data_dir: /vector-data-dir - sinks: - parseable: - auth: - password: admin - strategy: basic - user: admin - batch: - max_bytes: 10485760 - max_events: 1000 - timeout_secs: 10 - compression: gzip - encoding: - codec: json - healthcheck: - enabled: true - path: http://parseable.parseable.svc.cluster.local/api/v1/liveness - port: 80 - inputs: - - kubernetes_logs - method: post - request: - headers: - X-P-Stream: vectordemo - type: http - uri: http://parseable.parseable.svc.cluster.local/api/v1/ingest - sources: - kubernetes_logs: - type: kubernetes_logs - dataDir: "" - dnsConfig: {} - dnsPolicy: ClusterFirst - enabled: false - env: [] - envFrom: [] - existingConfigMaps: [] - extraContainers: [] - extraVolumeMounts: [] - extraVolumes: [] - fullnameOverride: "" - global: {} - haproxy: - affinity: {} - autoscaling: - customMetric: {} - enabled: false - maxReplicas: 10 - minReplicas: 1 - targetCPUUtilizationPercentage: 80 - targetMemoryUtilizationPercentage: null - containerPorts: [] - customConfig: "" - enabled: false - existingConfigMap: "" - extraContainers: [] - extraVolumeMounts: [] - extraVolumes: [] - image: - pullPolicy: IfNotPresent - pullSecrets: [] - repository: haproxytech/haproxy-alpine - tag: 2.4.17 - initContainers: [] - livenessProbe: - tcpSocket: - port: 1024 - nodeSelector: {} - podAnnotations: {} - podLabels: {} - podPriorityClassName: "" - podSecurityContext: {} - readinessProbe: - tcpSocket: - port: 1024 - replicas: 1 - resources: {} - rollWorkload: true - securityContext: {} - service: - annotations: {} - externalTrafficPolicy: "" - ipFamilies: [] - ipFamilyPolicy: "" - loadBalancerIP: "" - ports: [] - topologyKeys: [] - type: ClusterIP - serviceAccount: - annotations: {} - automountToken: true - create: true - name: null - strategy: {} - terminationGracePeriodSeconds: 60 - tolerations: [] - image: - pullPolicy: IfNotPresent - pullSecrets: [] - repository: timberio/vector - sha: "" - tag: "" - ingress: - annotations: {} - className: "" - enabled: false - hosts: [] - tls: [] - initContainers: [] - lifecycle: {} - livenessProbe: {} - nameOverride: "" - nodeSelector: {} - persistence: - accessModes: - - ReadWriteOnce - enabled: false - existingClaim: "" - finalizers: - - kubernetes.io/pvc-protection - hostPath: - path: /var/lib/vector - selectors: {} - size: 10Gi - podAnnotations: {} - podDisruptionBudget: - enabled: false - minAvailable: 1 - podHostNetwork: false - podLabels: - vector.dev/exclude: "true" - podManagementPolicy: OrderedReady - podMonitor: - additionalLabels: {} - enabled: false - honorLabels: false - honorTimestamps: true - jobLabel: app.kubernetes.io/name - metricRelabelings: [] - path: /metrics - port: prom-exporter - relabelings: [] - podPriorityClassName: "" - podSecurityContext: {} - psp: - create: false - rbac: - create: true - readinessProbe: {} - replicas: 1 - resources: {} - role: Agent - rollWorkload: true - secrets: - generic: {} - securityContext: {} - service: - annotations: {} - enabled: true - externalTrafficPolicy: "" - ipFamilies: [] - ipFamilyPolicy: "" - loadBalancerIP: "" - ports: [] - topologyKeys: [] - type: ClusterIP - serviceAccount: - annotations: {} - automountToken: true - create: true - serviceHeadless: - enabled: true - terminationGracePeriodSeconds: 60 - tolerations: [] - topologySpreadConstraints: [] - updateStrategy: {} - workloadResourceAnnotations: {} - -HOOKS: -MANIFEST: ---- -# Source: parseable/templates/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: parseable - labels: - helm.sh/chart: parseable-0.9.0 - app.kubernetes.io/name: parseable - app.kubernetes.io/instance: myparse - app.kubernetes.io/version: "v0.9.0" - app.kubernetes.io/managed-by: Helm ---- -# Source: parseable/templates/ingestor-configmap.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: myparse-parseable-ingestor-config - namespace: default - labels: - helm.sh/chart: parseable-0.9.0 - app.kubernetes.io/name: parseable - app.kubernetes.io/instance: myparse - app.kubernetes.io/version: "v0.9.0" - app.kubernetes.io/managed-by: Helm -data: - config-env: |- - #!/bin/sh - set -e ; # Have script exit in the event of a failed command. - IFS=$' \t\r\n' - - setIngestorURL() { - echo; - echo \"Reading the value $HOSTNAME\"; - - if [ -z "$HOSTNAME" ]; then - echo "HOSTNAME is not set. Exiting..."; - exit 1; - fi - - echo "Setting the ingestor URL to $HOSTNAME:8000"; - export P_INGESTOR_URL="$HOSTNAME:8000"; - } - - setIngestorURL ---- -# Source: parseable/templates/ingestor-service.yaml -apiVersion: v1 -kind: Service -metadata: - name: myparse-parseable - namespace: default -spec: - type: ClusterIP - ports: - - port: 80 - targetPort: 8000 - protocol: TCP - selector: - app.kubernetes.io/name: parseable - app.kubernetes.io/instance: myparse - app.parseable.com/type: ingestor ---- -# Source: parseable/templates/ingestor-statefulset.yaml -apiVersion: v1 -kind: Service -metadata: - name: myparse-parseable-headless - namespace: default -spec: - ports: - - port: 8000 - name: "parseable-port" - clusterIP: None - selector: - app.kubernetes.io/name: parseable - app.kubernetes.io/instance: myparse - app.parseable.com/type: ingestor ---- -# Source: parseable/templates/ingestor-statefulset.yaml -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: myparse-parseable-ingestor - namespace: default - labels: - helm.sh/chart: parseable-0.9.0 - app.kubernetes.io/name: parseable - app.kubernetes.io/instance: myparse - app.parseable.com/type: ingestor - app.kubernetes.io/version: "v0.9.0" - app.kubernetes.io/managed-by: Helm -spec: - selector: - matchLabels: - app.kubernetes.io/name: parseable - app.kubernetes.io/instance: myparse - app.parseable.com/type: ingestor - serviceName: myparse-parseable-headless - replicas: 3 - minReadySeconds: 10 - template: - metadata: - labels: - app.kubernetes.io/name: parseable - app.kubernetes.io/instance: myparse - app.parseable.com/type: ingestor - spec: - terminationGracePeriodSeconds: 10 - volumes: - - name: parseable-ingestor-config - projected: - sources: - - configMap: - name: myparse-parseable-ingestor-config - containers: - - name: parseable - securityContext: - allowPrivilegeEscalation: false - image: parseable/parseable:v0.9.0 - imagePullPolicy: Always - ## Uncomment to debug - command: [ "/bin/sh", "/config/config-logstream", "/bin/sh", "-c", "sleep 1000000" ] - ## args: ["/bin/sh", "/config/config-logstream", "parseable", "s3-store"] - env: - - name: RUST_LOG - value: "warn" - - name: P_ADDR - valueFrom: - secretKeyRef: - name: parseable-env-secret - key: addr - - name: P_USERNAME - valueFrom: - secretKeyRef: - name: parseable-env-secret - key: username - - name: P_PASSWORD - valueFrom: - secretKeyRef: - name: parseable-env-secret - key: password - - name: P_STAGING_DIR - valueFrom: - secretKeyRef: - name: parseable-env-secret - key: staging.dir - - name: P_FS_DIR - valueFrom: - secretKeyRef: - name: parseable-env-secret - key: fs.dir - - name: P_S3_URL - valueFrom: - secretKeyRef: - name: parseable-env-secret - key: s3.url - - name: P_S3_ACCESS_KEY - valueFrom: - secretKeyRef: - name: parseable-env-secret - key: s3.access.key - - name: P_S3_SECRET_KEY - valueFrom: - secretKeyRef: - name: parseable-env-secret - key: s3.secret.key - - name: P_S3_BUCKET - valueFrom: - secretKeyRef: - name: parseable-env-secret - key: s3.bucket - - name: P_S3_REGION - valueFrom: - secretKeyRef: - name: parseable-env-secret - key: s3.region - - name: P_MODE - value: "ingest" - ports: - - containerPort: 8000 - resources: - limits: - cpu: 500m - memory: 4Gi - requests: - cpu: 250m - memory: 1Gi - volumeMounts: - ## No data volume for ingestor - - mountPath: "/parseable/staging" - name: stage-volume - - name: parseable-ingestor-config - mountPath: /config - volumeClaimTemplates: - - metadata: - name: stage-volume - spec: - accessModes: [ "ReadWriteOnce" ] - storageClassName: "my-storage-class" - resources: - requests: - storage: 10Gi -