Skip to content

Commit

Permalink
Merge pull request #52 from nicholasjackson/f-readyiness
Browse files Browse the repository at this point in the history
Updates
  • Loading branch information
nicholasjackson authored Dec 26, 2021
2 parents 1d39195 + 8f474fe commit 55fe6c8
Show file tree
Hide file tree
Showing 37 changed files with 897 additions and 600 deletions.
88 changes: 80 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,84 @@
# Fake Service
Fake Service for testing upstream service communications and testing service mesh and other scenarios, can operate as a HTTP or a gRPC service.

[![CircleCI](https://circleci.com/gh/nicholasjackson/fake-service.svg?style=svg)](https://circleci.com/gh/nicholasjackson/fake-service)
Fake service that can handle both HTTP and gRPC traffic, for testing upstream service communications and testing service mesh and other scenarios.

Binaries: [https://github.com/nicholasjackson/fake-service/releases/](https://github.com/nicholasjackson/fake-service/releases/)
Docker Images: [https://hub.docker.com/r/nicholasjackson/fake-service](https://hub.docker.com/r/nicholasjackson/fake-service)

## Basic usage
To run fake service, first download the correct version for your platform from the releases page. Then run the following command to start the service and bind it to
all ip addresses on port 19090:

```shell
LISTEN_ADDR=0.0.0.0:19090 fake-service
```

You will see the following output:

```
2021-12-26T14:57:19.222Z [INFO] Using seed: seed=1640530639
2021-12-26T14:57:19.222Z [INFO] Adding handler for UI static files
2021-12-26T14:57:19.223Z [INFO] Settings CORS options: allow_creds=false allow_headers=Accept,Accept-Language,Content-Language,Origin,Content-Type allow_origins=*
2021-12-26T14:57:19.223Z [INFO] Started service: name=Code upstreamURIs= upstreamWorkers=1 listenAddress=0.0.0.0:19090
```

Next let's try to connect to the service using the curl:

```shell
curl localhost:19090
```

Fake service will respond with a json payload similar to the following:

```shell
{
"name": "Code",
"uri": "/",
"type": "HTTP",
"ip_addresses": [
"172.21.166.161"
],
"start_time": "2021-12-26T14:58:47.248837",
"end_time": "2021-12-26T14:58:47.249039",
"duration": "202.008µs",
"body": "Hello World",
"code": 200
}
```

You could have also made this request using the browser based ui that is available at the following url: http://localhost:19090/ui

Let's now see how you can make a gRPC request to fake service using [gRPCurl](https://github.com/fullstorydev/grpcurl)

```shell
grpcurl -plaintext localhost:19090 FakeService.Handle
{
"Message": "{\n \"name\": \"Code\",\n \"type\": \"gRPC\",\n \"ip_addresses\": [\n \"172.21.166.161\"\n ],\n \"start_time\": \"2021-12-26T15:03:27.384751\",\n \"end_time\": \"2021-12-26T15:03:27.384805\",\n \"duration\": \"53.961µs\",\n \"body\": \"Hello World\",\n \"code\": 0\n}\n"
}
```

The gRPC endpoint returns a message with a single parameter that contains the same json payload that was returned by the HTTP endpoint. You can use `jq` to extract this message using the folowing command:

```shell
➜ grpcurl -plaintext localhost:19090 FakeService.Handle | jq -r .Message
{
"name": "Code",
"type": "gRPC",
"ip_addresses": [
"172.21.166.161"
],
"start_time": "2021-12-26T15:05:30.281199",
"end_time": "2021-12-26T15:05:30.281257",
"duration": "57.889µs",
"body": "Hello World",
"code": 0
}
```

There are a many more advance use cases from linking multiple services together or controlling the response duration or error threshold. These options
can be set using environment variables.

## Configuration
Configuration values are set using environment variables, for info please see the following list:
Configuration values for fake service are set using environment variables, the following is a full list of permissable options:

```
Configuration values are set using environment variables, for info please see the following list:
Expand All @@ -16,15 +87,13 @@ Environment variables:
UPSTREAM_URIS default: no default
Comma separated URIs of the upstream services to call
UPSTREAM_WORKERS default: '1'
Number of parallel workers for calling upstreams, defualt is 1 which is sequential operation
Number of parallel workers for calling upstream services, default is 1 which is sequential operation
UPSTREAM_REQUEST_BODY default: no default
Request body to send to send with upstream requests, NOTE: UPSTREAM_REQUEST_SIZE and UPSTREAM_REQUEST_VARIANCE are ignored if this is set
UPSTREAM_REQUEST_SIZE default: '0'
Size of the randomly generated request body to send with upstream requests
UPSTREAM_REQUEST_VARIANCE default: '0'
Percentage variance of the randomly generated request body
SERVER_TYPE default: 'http'
Service type: [http or grpc], default:http. Determines the type of service HTTP or gRPC
MESSAGE default: 'Hello World'
Message to be returned from service, can either be a string or valid JSON
NAME default: 'Service'
Expand Down Expand Up @@ -110,6 +179,8 @@ Environment variables:
Response code returned from the HTTP readiness handler `/ready` after the response delay has elapsed
READY_CHECK_RESPONSE_FAILURE_CODE default: '503'
Response code returned from the HTTP readiness handler `/ready` before the response delay has elapsed, this simulates the response code a service would return while starting
READY_CHECK_ROOT_PATH_WAIT_TILL_READY default: 'false'
Should the main handler at path `/` or the gRPC method `FakeService` wait for the readiness check to pass before returning a response?
READY_CHECK_RESPONSE_DELAY default: '0s'
Delay before the readyness check returns the READY_CHECK_RESPONSE_CODE
RAND_SEED default: '1637512822'
Expand Down Expand Up @@ -150,7 +221,7 @@ payments_1 | 2019-08-16T12:15:01.362Z [INFO] Starting service: name=payments m
cache_1 | 2019-08-16T12:15:01.439Z [INFO] Starting service: name=cache message="Cache response" upstreamURIs= upstreamWorkers=1 listenAddress=0.0.0.0:9090 http_client_keep_alives=false zipkin_endpoint=http://jaeger:9411
```

Then curl the web endpoint:
Then curl the HTTP endpoint:
```
➜ curl -s localhost:9090 | jq
{
Expand Down Expand Up @@ -195,6 +266,7 @@ Then curl the web endpoint:
}
```


Tracing data can be seen using Jaeger which is running at `http://localhost:16686`.

## Error Injection
Expand Down
62 changes: 31 additions & 31 deletions certs/1_root/certs/ca.cert.pem
Original file line number Diff line number Diff line change
@@ -1,33 +1,33 @@
-----BEGIN CERTIFICATE-----
MIIFpTCCA42gAwIBAgIUXUv8ofpf9kT4Y7BjzLsTOdZTyFUwDQYJKoZIhvcNAQEL
BQAwWjELMAkGA1UEBhMCVVMxDzANBgNVBAgMBkRlbmlhbDEUMBIGA1UEBwwLU3By
aW5nZmllbGQxDDAKBgNVBAoMA0RpczEWMBQGA1UEAwwNdGVzdC50ZXN0LmNvbTAe
Fw0yMDA3MTAxNjM1MDdaFw00MDA3MDUxNjM1MDdaMFoxCzAJBgNVBAYTAlVTMQ8w
DQYDVQQIDAZEZW5pYWwxFDASBgNVBAcMC1NwcmluZ2ZpZWxkMQwwCgYDVQQKDANE
aXMxFjAUBgNVBAMMDXRlc3QudGVzdC5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDkPoRkFT4HEd77SU1uVfeTRviBRqPMUrp0ZTtlMzNdtDW35Iz1
gE2vJVRWoGY/uXjl8bxCyKy8ea/qTSS8UT2hxNYUJyVt/dnI1iQ8t5lCLHlIySa1
ODfOarMQ63oir6zf85yE7R/9F8jjVDjkFRqPuR1eCs7SCaAa7lBKVTyB9tA+r95a
OfPaUCGbwrO2prASGsR7ebSRy7QrCMm2UNLV3/86/wYHTeiZm6awBk4LKbsXHAQ9
SEuoBFubjGE66eXUSr8WLZgnjs/hRkSgSkQRQAvsSh1jF/f371lMoAznq8M324qz
0+1ipziyZF4ONJQz/dEyG+krzStdAJ4yidkkwf4npIpBO07Q595yJQHLAfV/0hzY
lMcA5I3xiHXBLXvozo6Q+rBEJV0+jJvl0FlyXhUS5gUi36StvAH06N3wWlvlrMwn
6OZqmJ8DMRo6YQ/EtU74kQ4JgHkcZcKbEfYdtMykryLBpwzKp0L1jmYBg3M8mlg/
AYphhUR7pznnp1JFkwjdcoNSaczqAlTTtdj1TgZ+pxqovRj0qFk75rUE6D4JhjqP
w0n2FkL/aO6nsMEtirGHvA4dDmtl67wfttlnrTxP34bcTHYbPt4OKXOI7vax6M/W
QjZrAwTTpkDo4PzItkn4yG+dsHIbatiAViUOP7x0h/skL6OAFk0JRnlhrQIDAQAB
o2MwYTAdBgNVHQ4EFgQUfAX3f369EXBj222LXjm4TSNs3ygwHwYDVR0jBBgwFoAU
fAX3f369EXBj222LXjm4TSNs3ygwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
BAMCAYYwDQYJKoZIhvcNAQELBQADggIBAKvO+oml2cASvTaOlSS4kmHLUiF5f1uo
PpSbE1mprqiQfie5lfZj9nrGGsewseBouN7D8jNfUmgaS7LLwg6K/KqZ9L5IbnXM
6hHUe5JqHDVlYbJzUlit9HVK9HCUr623rnWUg2mNsLurUfCbirT77bUeyI3Yjk6D
QUF17iDfSt60yX9MoiwiniHM65NtT/CaAXtq7uEaLfcPtS08RcnsYycD5SPwGrGI
UPC2nL/hT2k782h/ApOo4Wd2CntURgccWs/H2GNKyTO9SLzr7qlTaO7u7tNr+DY/
QlMpYqjWFeDu1uPh+c//Qjf485KPi20DBpXLPwnQjo3Qi1sHdTBjr+2g7MPSAHTu
O2s69pX1qzLVnhDZr94wkaD01qvL2xMciby3Rcr/WxqjpY2aJfoRVZtuS5ccsz3e
7IM7Itz3rys8ZIWiLAQLxYSoB4Yg8aiWhptjKKwF32qsO4CQ/lEQnjzrCrv3q2TE
DhXRHb9EPDNpyk3y46DwK3s+WQ/xZEqDF0lKY1Qx67lMKxllUBnFps/RiADt3ppm
vjP2qwNLl82uqToUOyT4Ye9pz6snA+IU7e4Jt6YXJQcp9TxkoqFMlJCUmyJDpMFP
2iP/V9gTrbTjn4QO8gt5+5S+/fIiy7LjRMc3FjgLITkU4+nu4dd4p9pnWNG72YxW
OQ+WKoBpox+Q
MIIFnTCCA4WgAwIBAgIUZWRBd/B4k0lw70ODrogD9oLM5xkwDQYJKoZIhvcNAQEL
BQAwVjELMAkGA1UEBhMCVVMxDzANBgNVBAgMBkRlbmlhbDEUMBIGA1UEBwwLU3By
aW5nZmllbGQxDDAKBgNVBAoMA0RpczESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIx
MTIyNjExMzI1NFoXDTQxMTIyMTExMzI1NFowVjELMAkGA1UEBhMCVVMxDzANBgNV
BAgMBkRlbmlhbDEUMBIGA1UEBwwLU3ByaW5nZmllbGQxDDAKBgNVBAoMA0RpczES
MBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
AgEAli+WtqFIM+sDja8THfKxjOajYU+YJE5gjtzjilhsHgEOtDWFz3O+dBvprQ6X
cr+jiPlETz5Gq9XnOivpFs4Vh1yqFjoCH2Br+SVDyGxUav5LblMIMYvUpdgCNWSN
vxasZMPARLZEzESyfv2vk6Jlota4t4utkMCCr9ECtmYmiD7KL0WR52As8SnHaxOm
pR3WJvPb8f7dal+J2eZYMzuaqjLEgc/rnDW2ZLSZxv1gX1uyGmnB0jr69aBx+Wxk
5p25JbWf9Phy6u+GX8f86V6tmgWIHow+irIXz2yvxF1pDPBtg5YtdAC9U5Qi3zcX
sklA3hfhXI2n8mLTjXo2z6vMnFJ2Swa+UL9rBqoJhrHQDYd3AHOIBQYR/Nu4qPrE
B8+aLiIXdsjRjEvcDZX5yc4AdmkYnFjEbPwLUJazcSKN4JIDmC8JLjW7wyYlVK+g
Y79er8ytVfhKZxMbVRlK+RF8gnXfe4CRYHZ4Rmcluf+ma6T1frNH6xQPUp44zHdf
NHTqEWfu+gjvImOMhuSQ6C81qeyMHldq9wT/HSGpeDY7uPnGQnkmOkXazhTRNiSw
ENw/16RHZ9RFep0Au3ngKFC6T7cpaHRh9Arb8K5u/azrTtwnJPTfVZUX7xQdOI/0
urSHYhwAvoIJcLq5p46u7eEPms1vX6k0YOafv+Je4Rb3SUMCAwEAAaNjMGEwHQYD
VR0OBBYEFKpCo/8rbmeO1Kv054tzAd+m3NsIMB8GA1UdIwQYMBaAFKpCo/8rbmeO
1Kv054tzAd+m3NsIMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0G
CSqGSIb3DQEBCwUAA4ICAQAj6MaUW4tOihORu+QacFkQZd1eJaFOxoZDQg0Fo+Ev
7+W8GO4gIHA5Hd80ajgohhMXIEaPO27WAgkuHwIOAPgumFx62kdsxDvK/yAWmBOs
Wz6yJkLOE6a1aJVh9eEB5CORQ5ITpOoK1JgjGnEeuoaijqGv/3d8IfxeL2AbXdNA
velUU8HwtAlYYAxCOQAwEKCLpSS/cjqkKeoye0+hcj3jm2P6tCbyo1oOKD7l+aTv
b831jyspP/h/Q7uqmw/AtVjANJjByRj/ijMqYbPJvYtd6HgxU7O8zMrmY1vi1qQ0
P/v7YLhXPs92PJ73WBsDA1WcpjAv4Lc7cFr5BLnhOVk5KtOljK1AS28HHIHbvbmd
SZ8eRxfTEa6RoBG77JSWlyrtK6HmCe9GvNVDj9IEJiSjq1J88npBPEkAh8M6iif/
Byz55+WF7ieeBlatCz119y/jWX2cnDVTO4aFumAAr10hvM+UW6EK+bvCrBi1ou9B
r+W3It4N2oK+nHVMXscAahgwiFKgcD1wAEZvIImvN3RLDTyKk5Nr9EuukESrIKef
4SHnWYl3pI4zCcIxh2BrPq8WrVWHGZVE8/W+goU+dYuB1gV9vzgO+r/2NmEB+vf1
xHmsAk1fTrJPYXLKOZhCS1kGTJ54NZpMJdeF9TL9yI94uSi1CNxxwNj2prdcgm3d
7w==
-----END CERTIFICATE-----
2 changes: 1 addition & 1 deletion certs/1_root/index.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
V 300708163508Z 100212 unknown /C=US/ST=Denial/O=Dis/CN=test.test.com
V 311224113255Z 100212 unknown /C=US/ST=Denial/O=Dis/CN=localhost
58 changes: 29 additions & 29 deletions certs/1_root/newcerts/100212.pem
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
-----BEGIN CERTIFICATE-----
MIIFgTCCA2mgAwIBAgIDEAISMA0GCSqGSIb3DQEBCwUAMFoxCzAJBgNVBAYTAlVT
MIIFeTCCA2GgAwIBAgIDEAISMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNVBAYTAlVT
MQ8wDQYDVQQIDAZEZW5pYWwxFDASBgNVBAcMC1NwcmluZ2ZpZWxkMQwwCgYDVQQK
DANEaXMxFjAUBgNVBAMMDXRlc3QudGVzdC5jb20wHhcNMjAwNzEwMTYzNTA4WhcN
MzAwNzA4MTYzNTA4WjBEMQswCQYDVQQGEwJVUzEPMA0GA1UECAwGRGVuaWFsMQww
CgYDVQQKDANEaXMxFjAUBgNVBAMMDXRlc3QudGVzdC5jb20wggIiMA0GCSqGSIb3
DQEBAQUAA4ICDwAwggIKAoICAQDDK60BFfKT6B3bJgJ/HfMkj8SON72YTxQb7SPI
hRb+gR6jk8NsvyKLqSv4k3MfATZY3m49JqsHtrDMFIOsNDiHlhDjloBECm9wqf3y
69s9ThYhXkAWNFfqOQ4/dYMZItNZmfB1FbW3V6pN4smsLRku78K7oLz9QYuIdRS3
P39blj4Hb10tNltMG7XjdcsWuvX/YCxmhjV+IiRWywfx5OIW4P1oCWEaGOrsNt7I
eEcQPuHdqNtje9nIK51QqOWXfB7kgjrzAKvB0yPvzpEKslD303Pazq7wpKKsYGXQ
dMXQi2m259FTq2Y8fCMirae7JVHoF02lp98/gqSA1pxT/kFN7y05LrtAqgbSE7vE
TuToTgP67q8zUjoQD52MZJyfCsfpZ/LL+UTxMmkqOfzBUkCKWYTPo7XZIsKVPV2O
+Et4zMnRDP3SYPYYvsO6laVwcuiMWsJeIkZLKCMA3omMIKo4C10N3L30/ly+yrpv
PyyFF1cK3gJfkIVZOJ9Rbv7opDnCMzKJJHg/oufPNLEi+5wVP0+kCx4IDICSgRXb
G6KgAqrT8D4IywYh63PYaLOOQgY7VvSMlAjkqQYkM1xJt86rlAQP7ET+GKn+PmMx
Af/NhWhnB5TMRc0Llv14vBMETgbbiwBK1MT+daGVBKeGYboBaoW/I98SbY/W2arC
wHQghwIDAQABo2YwZDAdBgNVHQ4EFgQUE/By8Wh/BvXaSEOnLdKxF73D14gwHwYD
VR0jBBgwFoAUfAX3f369EXBj222LXjm4TSNs3ygwEgYDVR0TAQH/BAgwBgEB/wIB
ADAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAMaIeoMCOL+di91t
i/swtWoXOWp0FfaeI8/OBMtkcJKMuL74MuhSO88dPObmys2CQrAsXTSKPqQkBt8l
s3cT8sHTAKuy6Bn+jsg7E8QoFEIAlPzUh5cSJtbaOwljhz1vW2wge1uMsmp8vLxQ
mz+Qlg4KUC51n4U+IyO3VDtgMqjHGrGIQce0vHr0uxPAZUiTFDbqEpOb1/sC9ll8
gyJKUNMsvyXRALJJbiOIjZHLS6jk7s10/RLadC3V22GFs8YSWyx4/4d60CWx/WpO
1n0s7iWOlnLs57ubOQ/KSUNL8sVj6zR9zNVPArbdT7zHFsXNM9QUC4ec11LBTGHK
TF3QUXMUJlfgmJ6YhNx+zByYUF9XdMa0TTFZHR25w5CASLb+we1FsNu/M36h7QD+
07NQ0u68G9I9G/v5exQE+EHTIA207j5wbNB7m1dqhlW5oSs4mhOBMz2QAo5nGnIw
9lkptmo/7KjqfzARO+m6Lb6c0Tj0QpJ5amVDCUkAncbQAk6REU8fplgPwiB9kCQS
lQbMv+TPMH2RVH3c4gH20QjDIUYEYdDJzUlMN1OHrPij9/BiqfPNFhLYcAQ5c5qS
0ApLULBrUtZzeTpNm4mvU0x6C7B+6udEsJhxnFrbg/CKrqTo3JtCA00bJutYVcL/
jY81lRiMOeoOjOcQ26NIskEXV6R9
DANEaXMxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yMTEyMjYxMTMyNTVaFw0zMTEy
MjQxMTMyNTVaMEAxCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZEZW5pYWwxDDAKBgNV
BAoMA0RpczESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOC
Ag8AMIICCgKCAgEAwpo2WtlB2BzUF5tPMmHcPY64BszByRzwP198o3MeNTid8nVq
1atm1QPw8W6yReZMMdezhQ9j6zcNE3giuzQWPPwX4MoI/WgAaREZJyTcfEydBOBS
C1Xx99tRUfvV0i3iOkr6F4tg0z9BcOtxTPnT5TOtjkDP7M088pgjUn65Oil0Gx1J
mrJThqWp1KFXj5VwoDfy7dyVaS2TfpD4sTiO0kpPd3oyVIgdNlL1Ra+vA75zpK+G
EzCG6JP5rsg1FAFwiOvlJdTY2OxPLaHnPb80PQJKEs/7qbLM12SUxiocizwLhqpS
z3c3xCrdU9ACt8imY2BB6+GgxSjUnFhwljVF0HbaEOED8qzTHCNrzrMVwPPUN0uE
50POZYd3YQ/SK+6ZYXpb1VBZdJeHb+lt8I5EWh7/v21N6z8kZa7N5nHlCVqT+USe
5EYPC5rO4uuDmogNhSLu9/NKmly8z6664fmT/jWlwmQ9EiOvlTTvkoYjNt9LDy2H
h6exYqz/amf+BXpSKqzEr3/xSKs6n/3IS785L2MHw9AhSSCuLgaXBDJjJpCJ8UXz
d0VVQrered4pDFjt4tq19UhMm2fhTkNxSQhK/NF95WNu5R3bi/0SAYaydKbmHTaC
p3jaem19jOoglReNERVA2K8BETWyZ3ySP8aDhrgsdIt3GbCYhsRlo+yOuPMCAwEA
AaNmMGQwHQYDVR0OBBYEFC3rdpWp+NJaVEsHzuKfUbGpEtf2MB8GA1UdIwQYMBaA
FKpCo/8rbmeO1Kv054tzAd+m3NsIMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0P
AQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBynCSdZKzE/m4J1Uk30s0jpYO2
2M2ExqfcuJ+ExPm5kY6Um1TlSJbH+2kJSv0H1/3+uDhALjhPvBYmTWFlu844mEzq
tlb74Ej24IQ4DTRcNtI6cTChgbuVPSDT+1lOlrG3p5Gp2RnnyPsjfpGvcZLnaL4a
rP6MP+isoYdpnFoqrzoOP3nuqpBl2OxmTSG6rKV+oSdqwoM/ziwuFoFUgYnfnrsp
e1FFXjC8OA2EtZI+46mzxsbDGKAEt6DpZJGiImCsii4aiq73ymow2FsIB65Di/k2
cWaKzdSlyFS6D7exJDjvtv7wrGqtnkXw2z/HaUGftasl3fKFaGKrVHT1Nyi3KxQI
KaIFBu6UWcytqALO1J6ygAGHJadTSpMk+JOCfoRWLMM6jbe86kjuAlVnWRKLWRjI
RN0ooD6dquIusagBzR2muplfrPt3pSJy0fdj21rnBJoujHiayRBriW1stIB3Aw3f
fI+KgNGsAwjuiEi/+/4S1lQoDM+/7Rj5/BJiQByfVVKxIgTmO5F76Qwc/akD+hnn
kWsNDiB7EkqbCYcLWFH1h1pW+nN/caoQ2Mc0k29ZVzvuPaCF/XWvt1HW9E9KJA3v
FfcbGm47WJ6pcC5eWHlusR6sWIFjd7k8/UEM9K0JufSFQK5ZMgsB6BtJN3s3r8tT
wY/oX14Quw3Z49e5iw==
-----END CERTIFICATE-----
Loading

0 comments on commit 55fe6c8

Please sign in to comment.