Skip to content

Commit

Permalink
Merge branch 'main' into dependabot/go_modules/github.com/cert-manage…
Browse files Browse the repository at this point in the history
…r/cert-manager-1.16.2
  • Loading branch information
Pavan-SAP authored Nov 25, 2024
2 parents ec08d12 + f8b8e47 commit c031005
Show file tree
Hide file tree
Showing 12 changed files with 85 additions and 178 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/publish-website.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
- name: Setup Hugo
uses: peaceiris/actions-hugo@v3
with:
hugo-version: "0.134.0"
hugo-version: "0.134.3"
extended: true
- name: Setup Node
uses: actions/setup-node@v4
Expand Down
18 changes: 9 additions & 9 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ require (
github.com/golang-jwt/jwt/v5 v5.2.1
github.com/google/go-cmp v0.6.0
github.com/google/uuid v1.6.0
github.com/lestrrat-go/jwx/v2 v2.1.2
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.78.1
github.com/prometheus-operator/prometheus-operator/pkg/client v0.78.1
github.com/lestrrat-go/jwx/v2 v2.1.3
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.78.2
github.com/prometheus-operator/prometheus-operator/pkg/client v0.78.2
github.com/prometheus/client_golang v1.20.5
github.com/prometheus/common v0.60.1
go.uber.org/zap v1.27.0
Expand All @@ -23,10 +23,10 @@ require (
google.golang.org/protobuf v1.35.2
istio.io/api v1.24.0
istio.io/client-go v1.24.0
k8s.io/api v0.31.2
k8s.io/apimachinery v0.31.2
k8s.io/client-go v0.31.2
k8s.io/code-generator v0.31.2
k8s.io/api v0.31.3
k8s.io/apimachinery v0.31.3
k8s.io/client-go v0.31.3
k8s.io/code-generator v0.31.3
k8s.io/klog/v2 v2.130.1
sigs.k8s.io/structured-merge-diff/v4 v4.4.3
)
Expand Down Expand Up @@ -81,11 +81,11 @@ require (
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/apiextensions-apiserver v0.31.2 // indirect
k8s.io/apiextensions-apiserver v0.31.3 // indirect
k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7 // indirect
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 // indirect
sigs.k8s.io/controller-runtime v0.19.1 // indirect
sigs.k8s.io/controller-runtime v0.19.2 // indirect
sigs.k8s.io/gateway-api v1.2.0 // indirect
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/yaml v1.4.0 // indirect
Expand Down
36 changes: 18 additions & 18 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ github.com/lestrrat-go/httprc v1.0.6 h1:qgmgIRhpvBqexMJjA/PmwSvhNk679oqD1RbovdCG
github.com/lestrrat-go/httprc v1.0.6/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo=
github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI=
github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4=
github.com/lestrrat-go/jwx/v2 v2.1.2 h1:6poete4MPsO8+LAEVhpdrNI4Xp2xdiafgl2RD89moBc=
github.com/lestrrat-go/jwx/v2 v2.1.2/go.mod h1:pO+Gz9whn7MPdbsqSJzG8TlEpMZCwQDXnFJ+zsUVh8Y=
github.com/lestrrat-go/jwx/v2 v2.1.3 h1:Ud4lb2QuxRClYAmRleF50KrbKIoM1TddXgBrneT5/Jo=
github.com/lestrrat-go/jwx/v2 v2.1.3/go.mod h1:q6uFgbgZfEmQrfJfrCo90QcQOcXFMfbI/fO0NqRtvZo=
github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU=
github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
Expand All @@ -104,10 +104,10 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.78.1 h1:Fm9Z+FabnB+6EoGq15j+pyLmaK6hYrYOpBlTzOLTQ+E=
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.78.1/go.mod h1:SvsRXw4m1F2vk7HquU5h475bFpke27mIUswfyw9u3ug=
github.com/prometheus-operator/prometheus-operator/pkg/client v0.78.1 h1:Wn7xwtLvf4xEahQ8/VgtbhMLnu4JD5gcd3bbPPxVKEE=
github.com/prometheus-operator/prometheus-operator/pkg/client v0.78.1/go.mod h1:JnLIE/lPIVgHiUNaY5y7MVf+J/V7vS0dicM5KsgGp3I=
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.78.2 h1:SyoVBXD/r0PntR1rprb90ClI32FSUNOCWqqTatnipHM=
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.78.2/go.mod h1:SvsRXw4m1F2vk7HquU5h475bFpke27mIUswfyw9u3ug=
github.com/prometheus-operator/prometheus-operator/pkg/client v0.78.2 h1:kiCXsZol0PCuSKA/ShGOzwSqEkAXSeQFLKLrra/vOSk=
github.com/prometheus-operator/prometheus-operator/pkg/client v0.78.2/go.mod h1:gw/WDyY7l0PLuPHdQRuAaibYBBKlwZSQkO9MU6M2MPw=
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
Expand Down Expand Up @@ -205,16 +205,16 @@ istio.io/api v1.24.0 h1:KH1Xxha9HAFekQILzdHpRF9AB4RY13/Sdi3rmHQWoQI=
istio.io/api v1.24.0/go.mod h1:MQnRok7RZ20/PE56v0LxmoWH0xVxnCQPNuf9O7PAN1I=
istio.io/client-go v1.24.0 h1:30Qmx12lJCB5xeJuyodPSWh848b2PvgCubdPTazG1eU=
istio.io/client-go v1.24.0/go.mod h1:sCDBDJWQGJQz/1t3CHwUTDE5V7Nk6pFFkqBwhIg+LrI=
k8s.io/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0=
k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk=
k8s.io/apiextensions-apiserver v0.31.2 h1:W8EwUb8+WXBLu56ser5IudT2cOho0gAKeTOnywBLxd0=
k8s.io/apiextensions-apiserver v0.31.2/go.mod h1:i+Geh+nGCJEGiCGR3MlBDkS7koHIIKWVfWeRFiOsUcM=
k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw=
k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc=
k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs=
k8s.io/code-generator v0.31.2 h1:xLWxG0HEpMSHfcM//3u3Ro2Hmc6AyyLINQS//Z2GEOI=
k8s.io/code-generator v0.31.2/go.mod h1:eEQHXgBU/m7LDaToDoiz3t97dUUVyOblQdwOr8rivqc=
k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8=
k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE=
k8s.io/apiextensions-apiserver v0.31.3 h1:+GFGj2qFiU7rGCsA5o+p/rul1OQIq6oYpQw4+u+nciE=
k8s.io/apiextensions-apiserver v0.31.3/go.mod h1:2DSpFhUZZJmn/cr/RweH1cEVVbzFw9YBu4T+U3mf1e4=
k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4=
k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4=
k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs=
k8s.io/code-generator v0.31.3 h1:Pj0fYOBms+ZrsulLi4DMsCEx1jG8fWKRLy44onHsLBI=
k8s.io/code-generator v0.31.3/go.mod h1:/umCIlT84g1+Yu5ZXtP1KGSRTnGiIzzX5AzUAxsNlts=
k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7 h1:cErOOTkQ3JW19o4lo91fFurouhP8NcoBvb7CkvhZZpk=
k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
Expand All @@ -223,8 +223,8 @@ k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJ
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4=
k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno=
k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
sigs.k8s.io/controller-runtime v0.19.1 h1:Son+Q40+Be3QWb+niBXAg2vFiYWolDjjRfO8hn/cxOk=
sigs.k8s.io/controller-runtime v0.19.1/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4=
sigs.k8s.io/controller-runtime v0.19.2 h1:3sPrF58XQEPzbE8T81TN6selQIMGbtYwuaJ6eDssDF8=
sigs.k8s.io/controller-runtime v0.19.2/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4=
sigs.k8s.io/gateway-api v1.2.0 h1:LrToiFwtqKTKZcZtoQPTuo3FxhrrhTgzQG0Te+YGSo8=
sigs.k8s.io/gateway-api v1.2.0/go.mod h1:EpNfEXNjiYfUJypf0eZ0P5iXA9ekSGWaS1WgPaM42X0=
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
Expand Down
4 changes: 2 additions & 2 deletions website/content/en/docs/installation/helm/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ description: >

To install CAP operator components, we recommend using the [Helm chart](https://github.com/sap/cap-operator-lifecycle/tree/main/chart) that is published as an OCI package at `oci://ghcr.io/sap/cap-operator-lifecycle/helm/cap-operator`.

## Installation
### Installation

Create a namespace and install the Helm chart in that namespace by specifying the `domain` and the `dnsTarget` for your subscription server, either

Expand All @@ -32,7 +32,7 @@ Create a namespace and install the Helm chart in that namespace by specifying th
domain: cap-operator.<CLUSTER-DOMAIN>
```
## Optional steps
### Optional steps
- #### Enable Service Monitors for metrics emitted by controller and subscription server
Expand Down
6 changes: 3 additions & 3 deletions website/content/en/docs/installation/prerequisites.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,22 @@ description: >
We recommend that you use a "[Gardener](https://gardener.cloud/)" managed cluster to deploy CAP applications that are managed with CAP Operator.

The Kubernetes cluster must be set up with the following prerequisites before you install CAP Operator:
##### [Istio](https://istio.io/latest/docs/concepts/traffic-management/) (version >= 1.22)
### [Istio](https://istio.io/latest/docs/concepts/traffic-management/) (version >= 1.22)

Istio service mesh is used for HTTP traffic management. CAP Operator creates Istio resources to manage incoming HTTP requests to the application as well as to route requests on specific (tenant) subdomains.

> It's required that you determine the public ingress Gateway subdomain and the overall shoot domain for the system and specify them in the [chart values](../../installation/helm-install/#values)
> Note: Istio promoted many of its [APIs to v1 in 1.22 release](https://istio.io/latest/blog/2024/v1-apis/). Hence as of CAP Operator release v0.11.0 istio version >= 1.22 is a prerequisite.
##### [sap-btp-service-operator](https://github.com/SAP/sap-btp-service-operator) or [cf-service-operator](https://sap.github.io/cf-service-operator/docs/)
### [sap-btp-service-operator](https://github.com/SAP/sap-btp-service-operator) or [cf-service-operator](https://sap.github.io/cf-service-operator/docs/)

These operators can be used for managing SAP BTP service instances and service bindings from within the Kubernetes cluster.

> If some SAP BTP services are not available for Kubernetes platforms, you may use [cf-service-operator](https://sap.github.io/cf-service-operator/), which creates the services for a Cloud Foundry space and inserts the required access credentials as Secrets into the Kubernetes cluster.
> Please note that service credentials added as Kubernetes Secrets to a namespace by these operators, support additional metadata. If you don't use this feature of these operators, use `secretKey: credentials` in the spec of these operators to ensure that the service credentials retain any JSON data as it is. **We recommend that you use `secretKey`, even when credential metadata is available to reduce the overhead of interpreting parsing multiple JSON attributes.**
##### ["Gardener" certificate management](https://github.com/gardener/cert-management)
### ["Gardener" certificate management](https://github.com/gardener/cert-management)

This component is available in clusters managed by "Gardener" and will be used to manage TLS certificates and issuers. "Gardener" manages encryption, issuing, and signing of certificates. Alternatively, you can use [cert-manager.io cert-manager](https://github.com/cert-manager/cert-manager).
4 changes: 2 additions & 2 deletions website/content/en/docs/support/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ description: >
How to get support and how to reach out
---

## Bugs
### Bugs

To report a bug, create an [issue](https://github.com/sap/cap-operator/issues).

Anything missing? Please let us know or [raise a PR](https://github.com/sap/cap-operator/pulls).

## Communication Channels
### Communication Channels

Reach out to the project team and the project community via the following communication channels:
- Issues: [GitHub](https://github.com/sap/cap-operator/issues)
Expand Down
12 changes: 6 additions & 6 deletions website/content/en/docs/troubleshoot/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ description: >
Common issues and how to solve them
---

**Usage of @sap/cds-mtxs library for multitenancy**
### Usage of @sap/cds-mtxs library for multitenancy

> The CAP Operator utilizes the `@sap/cds-mtxs` library. Prior to version 0.7.0 one could disable this by setting the IS_MTXS_ENABLED environment variable to "false" in the TenantOperation workload, in which case the old `@sap/cds-mtx` library-based wrapper job was used instead. However, this is no longer supported and is removed as support for older CDS version (v6) has ended.
Expand Down Expand Up @@ -35,7 +35,7 @@ As of now, for the usage of this new library, you (depending on your k8s cluster
runAsUser: 1000
```
**Secret/credential handling for different workloads of the CAP Operator**
### Secret/credential handling for different workloads of the CAP Operator
Libraries like `xsenv`/`cds`(CAP) handle credentials differently in different environments (CF, K8s) and on K8s when using credential data directly from secrets, any JSON data type information related to the data values may get lost and lead to inconsistencies.

Expand All @@ -57,21 +57,21 @@ spec:

> We recommend that you use `secretKey`, even when credential metadata is available to reduce the overhead of interpreting parsing multiple JSON attributes.

**HTTP requests reaching the AppRouter are not getting forwarded to the application server (pods)**
### HTTP requests reaching the AppRouter are not getting forwarded to the application server (pods)

The Approuter component maps incoming requests to destinations (applications or services) that have been configured. If you're using an `xs-app.json` file with your Approuter to specify route mapping to various destinations, ensure that the `destinationName` property for the
SAP Cloud Application Programming Model back end is specified in the corresponding CAPApplicationVersion configuration. CAP Operator will inject this destination to the Approuter pods (via environment variables).


**HTTP Requests Timing Out in the Approuter for Long-Running Operations in Back End Workload**
### HTTP Requests Timing Out in the Approuter for Long-Running Operations in Back End Workload

If your back-end service is known to take a long time, configure the `destinations` environment variable on the Approuter component to set the desired timeout configuration for that destination (`destinationName`). CAP Operator will overwrite the URL part of that destination to point to the right workload, the remaining settings are taken over exactly as configured.

**Supported Approuter Version**
### Supported Approuter Version

Use `@sap/approuter` version `14.x.x` (or higher).

**CAP Operator Resources Can't Be Deleted in the K8S Cluster/Namespace**
### CAP Operator Resources Can't Be Deleted in the K8S Cluster/Namespace

All custom resource objects (CROs) created by CAP Operator are protected with `finalizers` to ensure a proper cleanup takes place.
For instance, when deleting a `CAPApplication` CRO, any existing tenants would be deprovisioned automatically to avoid inconsistenties. Once the deprovisioning is successful, the corresponding CROs would be removed automatically.
Expand Down
4 changes: 2 additions & 2 deletions website/content/en/docs/usage/tenant-provisioning.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ spec:
versionUpgradeStrategy: always # <-- always / never
```
## Tenant Provisioning
### Tenant Provisioning
The process of tenant provisioning starts when a consumer subaccount subscribes to the application, either via the SAP BTP cockpit or using the APIs provided by the SaaS provisioning service. This, in turn, initiates the asynchronous callback from the SaaS provisioning service instance into the cluster, and the request is handled by the [subscription server](docs/concepts/operator-components/subscription-server). The subscription server validates the request and creates an instance of `CAPTenant` for the identified `CAPApplication`.

Expand Down Expand Up @@ -58,7 +58,7 @@ The `CAPTenant` reaches a `Ready` state, only after

![tenant-provisioning](/cap-operator/img/activity-tenantprovisioning.drawio.svg)

## Tenant Deprovisioning
### Tenant Deprovisioning

Similar to the tenant provisioning process, when a tenant unsubscribes from the application, the request is received by the subscription server. It validates the existence and status of the `CAPTenant` and submits a request for deletion to the Kubernetes API server.

Expand Down
4 changes: 2 additions & 2 deletions website/content/en/docs/whats-new.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ description: >
Discover new features added to CAP Operator
---

#### New updates
### New updates

{{% cardpane %}}
{{% card header="Q4 2024" %}}
Expand All @@ -21,7 +21,7 @@ description: >
{{% /cardpane %}}


#### Previous updates
### Previous updates

{{% cardpane %}}
{{% card header="Q2 2024" %}}
Expand Down
4 changes: 2 additions & 2 deletions website/go.mod
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module github.com/sap/cap-operator/website

go 1.23.1
go 1.23.3

require github.com/google/docsy v0.10.0 // indirect
require github.com/google/docsy v0.11.0 // indirect
6 changes: 3 additions & 3 deletions website/go.sum
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
github.com/FortAwesome/Font-Awesome v0.0.0-20240402185447-c0f460dca7f7/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo=
github.com/google/docsy v0.10.0 h1:6tMDacPwAyRWNCfvsn/9qGOZDQ8b0aRzjRZvnZPY5dg=
github.com/google/docsy v0.10.0/go.mod h1:c0nIAqmRTOuJ01F85U/wJPQtc3Zj9N58Kea9bOT2AJc=
github.com/FortAwesome/Font-Awesome v0.0.0-20240716171331-37eff7fa00de/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo=
github.com/google/docsy v0.11.0 h1:QnV40cc28QwS++kP9qINtrIv4hlASruhC/K3FqkHAmM=
github.com/google/docsy v0.11.0/go.mod h1:hGGW0OjNuG5ZbH5JRtALY3yvN8ybbEP/v2iaK4bwOUI=
github.com/twbs/bootstrap v5.3.3+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0=
Loading

0 comments on commit c031005

Please sign in to comment.