You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@openwhisk.apache.org by GitBox <gi...@apache.org> on 2018/10/09 21:18:36 UTC

[GitHub] dgrove-oss closed pull request #306: ingress instructions for deploying on AWS EKS

dgrove-oss closed pull request #306: ingress instructions for deploying on AWS EKS
URL: https://github.com/apache/incubator-openwhisk-deploy-kube/pull/306
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/docs/ingress.md b/docs/ingress.md
index c7ec209..c358651 100644
--- a/docs/ingress.md
+++ b/docs/ingress.md
@@ -247,3 +247,62 @@ whisk:
 
 Please submit Pull Requests with instructions for configuing the
 `standard` ingress for other cloud providers.
+
+# LoadBalancer
+
+AWS's Elastic Kubernetes Service (EKS) does not support the standard
+ingress type.  Instead, it relies on provisioning Elastic Load
+Balancers (ELBs) outside of the EKS cluster to direct traffic to
+exposed services running in the cluster.  Because the `wsk` cli
+expects be able to use TLS to communicate securely with the OpenWhisk
+server, you will first need to ensure that you have a certificate
+available for your ELB instance to use in AWS's IAM service. For
+development and testing purposes, you can use a self-signed
+certificate (for example the `openwhisk-server-cert.pem` and
+`openwhisk-server-key.pem` that are generated when you build OpenWhisk
+from source and can be found in the
+`$OPENWHISK_HOME/ansible/roles/nginx/files` directory. Upload these to
+IAM using the aws cli:
+```shell
+aws iam upload-server-certificate --server-certificate-name ow-self-signed --certificate-body file://openwhisk-server-cert.pem --private-key file://openwhisk-server-key.pem
+```
+Verify that the upload was successful by using the command:
+```shell
+aws iam list-server-certificates
+```
+A typical output would be as shown below
+```
+{
+    "ServerCertificateMetadataList": [
+        {
+            "ServerCertificateId": "ASCAJ4HPCCVA65ZHD5TFQ",
+            "ServerCertificateName": "ow-self-signed",
+            "Expiration": "2019-10-01T20:50:02Z",
+            "Path": "/",
+            "Arn": "arn:aws:iam::12345678901:server-certificate/ow-self-signed",
+            "UploadDate": "2018-10-01T21:27:47Z"
+        }
+    ]
+}
+```
+Add the following to your mycluster.yaml, using your certificate's Arn
+instead of the example one:
+```yaml
+whisk:
+  ingress:
+    type: LoadBalancer
+    annotations:
+      service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
+      service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:iam::12345678901:server-certificate/ow-self-signed
+```
+
+Shortly after you deploy your helm chart, an ELB should be
+automatically created. You will can determine its hostname by issuing
+the command `kubectl get services  -o wide`. Use the value in the
+the EXTERNAL-IP column for the nginx service and port 443 to define
+your wsk apihost.
+
+NOTE: It may take several minutes after the ELB is reported as being
+available before the hostname is actually properly registered in DNS.
+Be patient and keep trying until you stop getting `no such host`
+errors from `wsk` when attempting to access it.
diff --git a/helm/openwhisk/templates/NOTES.txt b/helm/openwhisk/templates/NOTES.txt
index 95007e4..724589c 100644
--- a/helm/openwhisk/templates/NOTES.txt
+++ b/helm/openwhisk/templates/NOTES.txt
@@ -7,8 +7,15 @@ This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
 
 To configure your wsk cli to connect to it, set the apihost property
+{{- if eq .Values.whisk.ingress.type "LoadBalancer" }}
+by running the command `kubectl get services  -o wide` and
+use the hostname of the `EXTERNAL-IP` of the {{ .Values.nginx.name }} service
+and port 443 in the command below:
+$ wsk property set --apihost NGINX_SERVICE_EXTERNAL_IP:443
+{{- else }}
 using the command below:
   $ wsk property set --apihost {{ .Values.whisk.ingress.api_host_name -}}:{{- .Values.whisk.ingress.api_host_port }}
+{{- end }}
 
 Your release is named {{ .Release.Name }}.
 
diff --git a/helm/openwhisk/templates/clusterConfigMaps.yaml b/helm/openwhisk/templates/clusterConfigMaps.yaml
index 1957479..49a5457 100644
--- a/helm/openwhisk/templates/clusterConfigMaps.yaml
+++ b/helm/openwhisk/templates/clusterConfigMaps.yaml
@@ -4,9 +4,11 @@
 # There are some variables that a user must define for their deployment.
 # Check for those values here and attempt to give helpful error messages.
 #
+{{- if ne .Values.whisk.ingress.type "LoadBalancer" }}
 # whisk.ingress.type is {{ required "You must provide a value for whisk.ingress.type (See docs/ingress.md)" .Values.whisk.ingress.type }}
 # whisk.ingress.api_host_name is {{ required "You must provide a value for whisk.ingress.api_host_name (See docs/ingress.md)" .Values.whisk.ingress.api_host_name }}
 # whisk.ingress.api_host_port is {{ required "You must provide a value for whisk.ingress.api_host_port (See docs/ingress.md)" .Values.whisk.ingress.api_host_port }}
+{{- end }}
 
 ---
 apiVersion: v1
@@ -19,11 +21,19 @@ data:
   whisk_info_buildNo: {{ .Values.whisk.versions.tag | quote }}
   whisk_cli_version_tag: {{ .Values.whisk.versions.cli | quote }}
   whisk_system_namespace: {{ .Values.whisk.systemNameSpace | quote }}
+{{- if eq .Values.whisk.ingress.type "LoadBalancer" }}
+  whisk_api_host_proto: "https"
+  whisk_api_host_port: {{ .Values.nginx.httpsPort | quote }}
+  whisk_api_host_name: "{{ .Values.nginx.name }}.{{ .Release.Namespace }}.svc.{{ .Values.k8s.domain }}"
+  whisk_api_host_nameAndPort: "{{ .Values.nginx.name }}.{{ .Release.Namespace }}.svc.{{ .Values.k8s.domain }}:{{ .Values.nginx.httpsPort }}"
+  whisk_api_host_url: "https://{{ .Values.nginx.name }}.{{ .Release.Namespace }}.svc.{{ .Values.k8s.domain }}:{{ .Values.nginx.httpsPort }}"
+{{- else }}
   whisk_api_host_proto: {{ .Values.whisk.ingress.api_host_proto | quote }}
   whisk_api_host_port: {{ .Values.whisk.ingress.api_host_port | quote }}
   whisk_api_host_name: {{ .Values.whisk.ingress.api_host_name | quote }}
   whisk_api_host_nameAndPort: "{{ .Values.whisk.ingress.api_host_name }}:{{ .Values.whisk.ingress.api_host_port }}"
   whisk_api_host_url: "{{ .Values.whisk.ingress.api_host_proto }}://{{ .Values.whisk.ingress.api_host_name }}:{{ .Values.whisk.ingress.api_host_port }}"
+{{- end }}
 
 ---
 apiVersion: v1
diff --git a/helm/openwhisk/templates/nginx.yaml b/helm/openwhisk/templates/nginx.yaml
index 562ef7e..ef93432 100644
--- a/helm/openwhisk/templates/nginx.yaml
+++ b/helm/openwhisk/templates/nginx.yaml
@@ -9,7 +9,9 @@ metadata:
   labels:
     name: {{ .Values.nginx.name | quote }}
 spec:
-  {{- if .Values.nginx.httpsNodePort }}
+  {{- if eq .Values.whisk.ingress.type "LoadBalancer" }}
+  type: LoadBalancer
+  {{- else if .Values.nginx.httpsNodePort }}
   type: NodePort
   {{- end }}
   selector:
diff --git a/helm/openwhisk/templates/nginxConfigMap.yaml b/helm/openwhisk/templates/nginxConfigMap.yaml
index 5246a8a..b25140a 100644
--- a/helm/openwhisk/templates/nginxConfigMap.yaml
+++ b/helm/openwhisk/templates/nginxConfigMap.yaml
@@ -29,6 +29,9 @@ data:
       proxy_set_header Connection "";
 
       server {
+{{- if eq .Values.whisk.ingress.type "LoadBalancer" }}
+        listen 80;
+{{- end }}
         listen 443 default ssl;
 
         # match namespace, note while OpenWhisk allows a richer character set for a
@@ -50,11 +53,11 @@ data:
         # Hack to convince nginx to dynamically resolve the dns entries.
         resolver kube-dns.kube-system;
         set $controllers {{ include "controller_host" . }};
-{{- if eq .Values.whisk.ingress.type "NodePort" }}
+{{- if or (eq .Values.whisk.ingress.type "NodePort") (eq .Values.whisk.ingress.type "LoadBalancer") }}
         set $apigw {{ include "apigw_host" . }};
 {{- end }}
 
-{{- if eq .Values.whisk.ingress.type "NodePort" }}
+{{- if or (eq .Values.whisk.ingress.type "NodePort") (eq .Values.whisk.ingress.type "LoadBalancer") }}
         location /api/v1/web {
             if ($namespace) {
                 rewrite    /(.*) /api/v1/web/${namespace}/$1 break;
diff --git a/helm/openwhisk/templates/nginxSecret.yaml b/helm/openwhisk/templates/nginxSecret.yaml
index 48f563a..20b0c26 100644
--- a/helm/openwhisk/templates/nginxSecret.yaml
+++ b/helm/openwhisk/templates/nginxSecret.yaml
@@ -8,5 +8,5 @@ metadata:
   namespace: {{ .Release.Namespace | quote }}
 type: tls
 data:
-  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMrekNDQWVPZ0F3SUJBZ0lKQU1IQ0FaQk1LRmxxTUEwR0NTcUdTSWIzRFFFQkN3VUFNQlF4RWpBUUJnTlYKQkFNTUNXeHZZMkZzYUc5emREQWVGdzB4TnpBNE1UWXdOek0yTXpKYUZ3MHhPREE0TVRZd056TTJNekphTUJReApFakFRQmdOVkJBTU1DV3h2WTJGc2FHOXpkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCmdnRUJBUHVrZndBbjZXb0xBTWNqSnpQemR2NGlPQ1g5bHR4cVpGeEFjUHhBS1BQcE16dWJnOG1ObjhZWllzQ3oKbjRTUjdRYndZK0RTRHVsczZaekRxaGdpa1hDOUs1L2doRm9zS1FaY0gzVERSSUNsS2ZDeFdlb04xc0tEQ1RCdQpia2YzRkNqL0dBUmJ4TE0yM3QvMS9kby9nMU4rUXYxeDRXL2VpNWZva1gwNXRNcWJLcnM2OHU3U3lGaEZhTTYyCnZQclhlc1JEWDVuRlZ5ekpqaDdBbHpralZHTWltOU5sMmhuM0dIK1Y1RWt2dVR6ODJnVjBEWXc4OEFXb29PTjgKYXVLamlROTVRWUJkR2tUR1U3Z0pqTmRxeGk4Q3dadnlPTnhoRU9rOURvV1RjWVU2T1orZXc3QUVlbENMTnRheApWcGlWd0lLc1o3UnlPUGZSQzRFNVBpWEZ4ZThDQXdFQUFhTlFNRTR3SFFZRFZSME9CQllFRk5kajlvT2grZ1ZtCndiTkhnM1BiUVlvYUhlODlNQjhHQTFVZEl3UVlNQmFBRk5kajlvT2grZ1Ztd2JOSGczUGJRWW9hSGU4OU1Bd0cKQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFBdW1UTzRMYmh0WFZWa0lsclhJc09vawpzSG13UEoyWTJQN1hjZ3BrQ3VYNjVRYUN2Q3JNMlNUSXFrb0RabE9MbFRXUmRqSU8zc3JISlh6UFhLRXowR2dJCmV4bm5oZTIrbm1PNWdnSmVIR2lReVZnZTEvVUFMcWpYSGRNR2JqMFdodnlkQjUwcTVpSDV2eHRGZy95ODBFWFUKa0ZQa0E4NkZmQlhmSHdUNVIyYzB0VFRzSUNWdzk5MkhJMHNxOUZSMnA1bE5xYTBHOTVSOG5UUEhFZUIzMTF0MAozM3oyb3lScTNpam05RHNlOGNPTTAxcVZUcTJzQU9COTR2eE56WXAxZTVLUUl2bnJJQ3ptTDg2YzJxMEY3cVhnClFqWkltRHE2WXNXTE5vVTMrc1V1U2Npc09KbUQxSGFvRmEzKzRIcUp3dWpPamYwdkpuUmJGSHRNcDVFQms1az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
-  tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRRDdwSDhBSitscUN3REgKSXljejgzYitJamdsL1piY2FtUmNRSEQ4UUNqejZUTTdtNFBKalovR0dXTEFzNStFa2UwRzhHUGcwZzdwYk9tYwp3Nm9ZSXBGd3ZTdWY0SVJhTENrR1hCOTB3MFNBcFNud3NWbnFEZGJDZ3drd2JtNUg5eFFvL3hnRVc4U3pOdDdmCjlmM2FQNE5UZmtMOWNlRnYzb3VYNkpGOU9iVEtteXE3T3ZMdTBzaFlSV2pPdHJ6NjEzckVRMStaeFZjc3lZNGUKd0pjNUkxUmpJcHZUWmRvWjl4aC9sZVJKTDdrOC9Ob0ZkQTJNUFBBRnFLRGpmR3JpbzRrUGVVR0FYUnBFeGxPNApDWXpYYXNZdkFzR2I4ampjWVJEcFBRNkZrM0dGT2ptZm5zT3dCSHBRaXpiV3NWYVlsY0NDckdlMGNqajMwUXVCCk9UNGx4Y1h2QWdNQkFBRUNnZ0VBT0JjaWQ5WnRvTVZ6RnZBdS9OVjM0STJnRmxmQUdNRmVQWEhmdlZwUHhvNWsKYlJUcyt6QW1QUEhMb1Vob2RoUlEwUXNrT0NpYVNrMk1oUFRZSlNrUFlpSElaNHFUOWNXQ0gzakpTaTE4UjNDSgpPSzFQYld4SVFuTVN5VWpVTEJaVzJBeUVQZlIyazd2WFVmUnk4UUxYTXZVaDJYeFkwNmEzVnRUd0dRbVQwdFR5Ck9renArUVcyY0JKcjZuYzRQdzJ4dWN1bFBnTjRlY04rdkl5QllSNWZVa1VDcTREbTI2aU1LSXZ1SlFSeXFmK0oKRk1HU0x1K1FkTG9vSmoyZTUrSjgxdHcyLzlxWENuN2poeWpka08vVjJNTVhtejRHTHVFZmdYUlpvUFVNcjN2VApNZXRPV3o0Q0F1cXIxTUNuODlXSEdsbDF2VEVpM0ZRSFlyb1lZN2txQVFLQmdRRC92RDk4ZHpMOFNrcVpzZ3BnCk1PeEFILzczNzFzRjBtWGxtNTdmem84Y1BHTVVZWWc1dUlMdFI4Z1BkS0F1dmd0YjFiNzcxbkY3cnMyVy9OM28KK296bEdQT1JqdmROU24vcytTRld3MTVKTGZmUnZ1ZDkzYWhUbnlGekY2aUFuMndVQ2VCVExBd2dyR0YzVGxXNwpFR1pyWVdkVHRXM3k4YUhxNHlMYTM2OEtud0tCZ1FENzV5bnU3c3diM1ppOXlEZzdUOWZlUXJ4dU9kTVNVQlhYCkRwSXczbUxjdTBmK21uWFcxbU45RXU0OVpwbkg3ZkRnejFocTNkeEo3SzQ2OW9BaWVkNTZsTWxNd0pUSlBrNlIKUW5tbkw1S3RwRnNmajBZbUtPN2lRYURoYjFmR2VvdWxlL2xSUnVocWN0OHZhNG51SzJzbEwwZVpvSzhJWWNDVwpROFpIMVZmU3NRS0JnUUNsNVdhQnhZbXJwRDMwcWt5VXplZlVTVzFMUlZpVTFFSUp5d1FyUjRJSzNSbWhGUXdiCjlaZnBlVkZNeFdsTUtUaVJJSDIrUFFSdEtaNXd2aVR1aCtweWk5Y2xxOHE5dHdCNXA3dDYzMDRBeHZNbWUyTU0KZ1lnNmh0WmFKUlRJSzZNZTlMRXpBelh5MUNCK0ZyRUNvc2J1RGNmTHc3eEpoM3AwTjFoYkNCUXpIUUtCZ0NaRwplNktvZWk4SnZybW5nSlBTai9SZm80NEVEMFJMRXVaNGVsSWVtRnI5d2ZTM3Q0d0xTMWFuMTdkUXJiRXBRRjZJCll1RHFFUnpTYjY3WjRhSmJiaWltRHVnd291cnBJcnNEcE1SNGdBc09YQ0l4ZlBFemF3akovQTRGQXd0UGQ0U1AKajlSL3Q3VGsrM0NUSUlRbDZNUGZxVHQ0cE4vYktvNHFnaWhNREdvaEFvR0FNcXRXbTVLMERJN0pWQnB4SndWSwpKZmpSKzljT2J1T1M0N2E3bGxwZG55d2RYbTZkOGR4eW9mTEVNQVl3ODUyNEM5OUF2UlBmdWoyOUVEM0JlcHpuCklIWkhpWTlmaHE1YldnYTVRd2Z1dXBubGhlMzJXU2JzRHk2MEZrL05SbUI0MWhacm9GTEp3Ri9Ub2hlQlpBZ3kKRVBLbkpBc00wdCswbUJyWG9IM1ArcU09Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K
+  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLakNDQWhJQ0NRQ3JWVW52eWpMdHpEQU5CZ2txaGtpRzl3MEJBUVVGQURCWE1Rc3dDUVlEVlFRR0V3SlYKVXpFTE1Ba0dBMVVFQ0F3Q1Rsa3hFVEFQQmdOVkJBY01DRmx2Y210MGIzZHVNUkl3RUFZRFZRUUtEQWxQY0dWdQpWMmhwYzJzeEZEQVNCZ05WQkFNTUN5b3ViRzlqWVd4b2IzTjBNQjRYRFRFNE1UQXdNVEl3TlRBd01sb1hEVEU1Ck1UQXdNVEl3TlRBd01sb3dWekVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnTUFrNVpNUkV3RHdZRFZRUUgKREFoWmIzSnJkRzkzYmpFU01CQUdBMVVFQ2d3SlQzQmxibGRvYVhOck1SUXdFZ1lEVlFRRERBc3FMbXh2WTJGcwphRzl6ZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTlY1TmVuR3FnSFhIOXpTCkUxWEJiS2x4M0hrSDlkSlQ0NVNrK1E0UG0yeVQ4RXZ2YWFnTEdEcHRMeXorQmU5a3Uvd1BTSDRETEpNbEcwYkwKcGlaY1VzMGVTWHVLR3pGVUVBZ1FlWDgvZEVjeW5XcWlMSzJYY0lacUFYNi9WWFZLamlZM0ZEM3RFenRoVnUwQgp6dEtUOVZzQ0VBWDc5dlo5WXJaSWk1VEdUaVlEVWxuSmhXT3g0SS8rMWd6UHNEUDExc1BaU2doZHlmUnJGN1BaCndPOUFKWC8vbTc1V3ozMGxZQ3QwK0xDSEFXWmRXL2pyeXJQdCtNNjlzUm8xdTJXNzlVdmpGcFJ2OStObXhKUmEKRTZ2amRTb0VTeDlhMHozUjJYMlA2b2Q0V0hnVGVOZXNRYUVPOThGZStpWnZsUHBOUTMxYmVPRWF2QlAwVmNDNAoyWWdjc3BVQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBSFVLQXZYR0JKVzNJS3NZT0RNUzY1cEJoClVkTmpIS1p6c0J4Slh1YzkvUnFwVDNxRWJORW5jUnNOYjlHZWk1aEhodEd1c3YwdHN1c2xpV2t3aVgrMGhnQW4KWTZFUXJqck0zMm9lc1pvWHJWRmlGeWVvRVgvV0ZGVThDL2JZVnlYS2FFVENQcU9wcHFhRGl0TGlPc3FuYlZldwpRcVIySitXdSs3WEhpYm85MWg4VTRHL0MzTU5ZZFVNaFh4RTkrbmtRQ0J5Q2Ftd3AzR1RsV1FkM1gwdFdMYXlGCitBdWF0RCtxb21XRXpLcnRFWjFoaWswQnBzQ2VibU0vTXR1RmR1M0hMVk83c3VnM0hMeUNCdHB4OVNyRjV0ZnMKTlpOM3BGK2s3bklycGJZZ29uakVmVE5SRk5kM0tGZ2RMYm1jUisrVU5DekZOU1lrbVh0dTB1Mm16VVQ1ekE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
+  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBMVhrMTZjYXFBZGNmM05JVFZjRnNxWEhjZVFmMTBsUGpsS1Q1RGcrYmJKUHdTKzlwCnFBc1lPbTB2TFA0RjcyUzcvQTlJZmdNc2t5VWJSc3VtSmx4U3pSNUplNG9iTVZRUUNCQjVmejkwUnpLZGFxSXMKclpkd2htb0JmcjlWZFVxT0pqY1VQZTBUTzJGVzdRSE8wcFAxV3dJUUJmdjI5bjFpdGtpTGxNWk9KZ05TV2NtRgpZN0hnai83V0RNK3dNL1hXdzlsS0NGM0o5R3NYczluQTcwQWxmLytidmxiUGZTVmdLM1Q0c0ljQlpsMWIrT3ZLCnMrMzR6cjJ4R2pXN1pidjFTK01XbEcvMzQyYkVsRm9UcStOMUtnUkxIMXJUUGRIWmZZL3FoM2hZZUJONDE2eEIKb1E3M3dWNzZKbStVK2sxRGZWdDQ0UnE4RS9SVndMalppQnl5bFFJREFRQUJBb0lCQVFDYlp3TE5iWGREb2JTcgpUeThPSmFJUjlEYVkwU2V0OXEzYy92L2pzWTdteXdlS2IvNU5lODRtY21kK2JHb3JyUHlBY1N2SHVFM1J6SmgvCndDN3pEQkNuQzk1WWxlQlgxNmRZQjQ0N0NSbC8zeVBqaGEzYXJUMFlUTUZMNE1PNGdBN2RXUWxlVDJESndJSEUKUmFXbmZGaUg2UWQ3SThMVUM5RTVlN1JKR05lNUtTcGhKNGJxNThXSHpFUVhjOWlxWUx6YzNBY1MzVFJFTnY4ZAp1NUdBV3M3T1VPYzVtbWt0bE5McHRVSXh3WkJBa1c1S0hWV014aThsck1ES3FhdEwyWi95ZENjRGV6dzdJWlBkCjdlelFGdDgwazFJMy9JanhsNWtuUHRuOTNOOWlPazlBOUxGbWhZbm5hQkREMnVGRmZaR2FjOUE1VTZmNEx6NW0KaW5XQnd3bzlBb0dCQVAycnVJQjNIU1YxY2lVY3NOUEFTbzRQbEFHcG5kYVZHdUtzVEQxL1QvR01SNDJqVmJXUAppc1AySGJEdDNXOW5kM2xrM3dTRlZtdElxK3ZWSHpwVzlRNUYvYVJCc2RVL29mdldHWnJsa085Vm8rK2VVQUJXCjNNQjBncUpHYXBGK2VETGRlNklFMklzRUNja0xFQitwZUxVNUsyeFNlQWtCRC84NWQxblhDcG9iQW9HQkFOZHYKQUlJUjR0bWpSZHRqaW1YVk5TUjUzU0d5N0RFSGVtTHMyVHc0MENnNkdXVHpBN1IwVHY5RkpIb1NGdFhZcVp4dwpMUDRhdlY4eUVwMnE1YmZKYUZIR3h1OExRSUdCbURMK3l5ZG11eTZ2Z1RWWEpENEg3WUJINFhsYjBja2F6K2p1CmlucHpVSGFJVnZUT1J5Nnk4TXUzVTM5b1NVN1lmbjJpeTFJYzQ3RVBBb0dBSEg3bjBQYVFmWjY5M2RGbFE4UTgKRzgxQU1SZWV0WFkyZVBRbDlGcVMzbTJGdERGKzlWQlVwRUxIZnhLWloyUldGWHJ4V282bjhKRlBUc1M0SjFPUgpYN01aRlJTVUo0Sm9iZVBWS0lOVlRxMXVKd0svdGVvTURrcUlTalppemtsSXMxNFIvMWRRQS8zR0k2RnNoRUlEClgwZzJ5b3BSRmFIYTdDN0dhMzh1bjdVQ2dZQjJ3Y0wyOEtNcnRCeUxMdGtZLzZvVzNIS3c0Ky9kcXpDbEhjazIKc0Y3Vy9nZ0hwUXJTekJiTUV6SmpkRnRRTU9wMnlVT1VJK3RtY2JUZlkxalVzbHNtVVR4U2c5SmdVYTh6MVU3cAovbkNLOE1aNlAvcERrNTB4ek80WE55MXkvYXZFek5KYlkvdmtDNDVienVaZ2NOWGFoc21wZnpTQ0dVZkpQQmQyCndXUW1zd0tCZ1FDYmZqQ0ZxME0xcVVoZXNXRGdKbm14MHRhdjFHbi9La1dXZTdHWVZpYmowbnVXNlFZUjhleFEKemlpTVcwNkRKREQybjJoOW1ySjZSaW4xZE1EUlM0bmxtek9DcUR3Uk50aHRPcHIxVkRhL1UvUVJNRXIwWWl3SQozT3NwZFZSNUJqSXc5bGJGck0ySWRtK2ZkUXREbmo3bEhabnRONkVudjJuTnIzRHNJQWtQWkE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services