Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
851f19eefd | |||
f42d9d921c |
@ -9,4 +9,3 @@ otc-sphinx-directives>=0.1.0
|
|||||||
sphinx-minify>=0.0.1 # Apache-2.0
|
sphinx-minify>=0.0.1 # Apache-2.0
|
||||||
git+https://gitea.eco.tsi-dev.otc-service.com/infra/otc-metadata.git#egg=otc_metadata
|
git+https://gitea.eco.tsi-dev.otc-service.com/infra/otc-metadata.git#egg=otc_metadata
|
||||||
setuptools
|
setuptools
|
||||||
gitpython
|
|
@ -5,7 +5,7 @@ ApiMon Flow Process
|
|||||||
|
|
||||||
|
|
||||||
.. image:: training_images/apimon_data_flow.svg
|
.. image:: training_images/apimon_data_flow.svg
|
||||||
:target: /_images/apimon_data_flow.svg
|
:target: training_images/apimon_data_flow.svg
|
||||||
:alt: apimon_data_flow
|
:alt: apimon_data_flow
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from git import Repo
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
extensions = [
|
extensions = [
|
||||||
'otcdocstheme',
|
'otcdocstheme',
|
||||||
@ -113,9 +111,3 @@ html_copy_source = False
|
|||||||
|
|
||||||
# -- Options for PDF output --------------------------------------------------
|
# -- Options for PDF output --------------------------------------------------
|
||||||
latex_documents = []
|
latex_documents = []
|
||||||
|
|
||||||
# Get the Git commit values for last updated timestamp on each page
|
|
||||||
repo = Repo(search_parent_directories=True)
|
|
||||||
commit = repo.head.commit
|
|
||||||
current_commit_hash = commit.hexsha
|
|
||||||
current_commit_time = commit.committed_datetime.strftime('%Y-%m-%d %H:%M')
|
|
@ -10,5 +10,5 @@ You can update the Backend by following those steps:
|
|||||||
1. Merge the Pull-Request
|
1. Merge the Pull-Request
|
||||||
2. Wait until the gate job has been passed
|
2. Wait until the gate job has been passed
|
||||||
3. Look at the Zuul-logs from the gate job. Find the line with `Successfully tagged quay.io` and remember the `:change_xx_latest` value
|
3. Look at the Zuul-logs from the gate job. Find the line with `Successfully tagged quay.io` and remember the `:change_xx_latest` value
|
||||||
4. Open a Pull-Request to adjust the kustomization config to the new tag from step 3. https://github.com/opentelekomcloud-infra/system-config/blob/main/kubernetes/circle-partner-navigator/overlays/prod/kustomization.yaml#L20
|
4. Open a Pull-Request to adjust the kustomization config to the new tag from step 3. https://github.com/opentelekomcloud-infra/system-config/blob/main/kubernetes/circle-partner-navigator/overlays/prod/kustomization.yaml#L14
|
||||||
5. Merge this Pull-Request and wait 10 minutes.
|
5. Merge this Pull-Request and wait 10 minutes.
|
||||||
|
@ -8,9 +8,10 @@ Updating the Frontend
|
|||||||
You can update the Frontend by following those steps:
|
You can update the Frontend by following those steps:
|
||||||
|
|
||||||
1. Merge the Pull-Request
|
1. Merge the Pull-Request
|
||||||
2. Wait at least 10 minutes
|
2. Tag the desired commit and push the tag to Github. It should be visible afterwards on this page: https://github.com/opentelekomcloud-infra/circle-partner-navigator-frontend/tags
|
||||||
3. Check whether your tag has been successfully published to the container repository: https://quay.io/repository/opentelekomcloud/circle-partner-navigator-frontend?tab=tags
|
3. Wait at least 10 minutes
|
||||||
4. Open a Pull-Request to adjust the kustomization config to the new tag. https://github.com/opentelekomcloud-infra/system-config/blob/main/kubernetes/circle-partner-navigator/overlays/prod/kustomization.yaml#L22
|
4. Check whether your tag has been successfully published to the container repository: https://quay.io/repository/opentelekomcloud/circle-partner-navigator-frontend?tab=tags
|
||||||
5. Merge this Pull-Request and wait 10 minutes.
|
5. Open a Pull-Request to adjust the kustomization config to the new tag. https://github.com/opentelekomcloud-infra/system-config/blob/main/kubernetes/circle-partner-navigator/overlays/prod/kustomization.yaml#L16
|
||||||
|
6. Merge this Pull-Request and wait 10 minutes.
|
||||||
|
|
||||||
Be aware that updating the Frontend will also pull the data from the Backend again and as a result will also update the partner data on the website.
|
Be aware that updating the Frontend will also pull the data from the Backend again and as a result will also update the partner data on the website.
|
||||||
|
@ -6,4 +6,3 @@ Helpcenter Operations
|
|||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
backstage_add_repo
|
backstage_add_repo
|
||||||
service_based_view
|
|
||||||
|
@ -1,87 +0,0 @@
|
|||||||
============================
|
|
||||||
Service Based View knowledge
|
|
||||||
============================
|
|
||||||
|
|
||||||
This document describe necessary knowledge about our Service Based View (SVB)
|
|
||||||
which is the landing page for the specific service. There you have a short
|
|
||||||
description of the service and you get all the links for the service
|
|
||||||
documents.
|
|
||||||
|
|
||||||
Service Based View Code Snippets
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
The following Code Snippets represents the necessary information which is
|
|
||||||
needed that SVB can run properly.
|
|
||||||
|
|
||||||
Internal SVB Code Snippet
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. code::
|
|
||||||
|
|
||||||
Cloud Container Engine
|
|
||||||
======================
|
|
||||||
|
|
||||||
CCE provides highly scalable, high-performance, enterprise-class Kubernetes clusters. It supports native Kubernetes applications, tools and easy setup of container runtime environment.
|
|
||||||
|
|
||||||
.. directive_wrapper::
|
|
||||||
:class: container-sbv
|
|
||||||
|
|
||||||
.. service_card::
|
|
||||||
:service_type: cce
|
|
||||||
:environment: internal
|
|
||||||
:umn: Describes the basic concepts, functions, key terms, best practices, FAQs and steps for quickly creating clusters and containerized applications.
|
|
||||||
:api-ref: Describes the APIs provided by CCE including the functions, parameters, and examples of each API.
|
|
||||||
:best-practice: To use Cloud Container Engine more securely, reliably, flexibly, and efficiently, you are advised to follow the following best practices.
|
|
||||||
|
|
||||||
Documents registration under: `otc_metadata/data/documents <https://gitea.eco.tsi-dev.otc-service.com/infra/otc-metadata/src/branch/main/otc_metadata/data/documents>`_
|
|
||||||
|
|
||||||
|
|
||||||
Public SVB Code Snippet
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. code::
|
|
||||||
|
|
||||||
Cloud Container Engine
|
|
||||||
======================
|
|
||||||
|
|
||||||
CCE provides highly scalable, high-performance, enterprise-class Kubernetes clusters. It supports native Kubernetes applications, tools and easy setup of container runtime environment.
|
|
||||||
|
|
||||||
.. directive_wrapper::
|
|
||||||
:class: container-sbv
|
|
||||||
|
|
||||||
.. service_card::
|
|
||||||
:service_type: cce
|
|
||||||
:umn: Describes the basic concepts, functions, key terms, best practices, FAQs and steps for quickly creating clusters and containerized applications.
|
|
||||||
:api-ref: Describes the APIs provided by CCE including the functions, parameters, and examples of each API.
|
|
||||||
:best-practice: To use Cloud Container Engine more securely, reliably, flexibly, and efficiently, you are advised to follow the following best practices.
|
|
||||||
|
|
||||||
Documents registration under: `otc_metadata/data/documents <https://gitea.eco.tsi-dev.otc-service.com/infra/otc-metadata/src/branch/main/otc_metadata/data/documents>`_
|
|
||||||
|
|
||||||
Possible Document Names
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
The following document short names can be used to reference specific document types which are listed in the `Helpcenter Metadata <https://gitea.eco.tsi-dev.otc-service.com/infra/otc-metadata>`_ .
|
|
||||||
New document types can be requested by creating an issue under https://github.com/opentelekomcloud-docs/docsportal/issues or get in contact
|
|
||||||
with Ecosystem Squad.
|
|
||||||
|
|
||||||
* api-ref
|
|
||||||
* blueprints
|
|
||||||
* caf
|
|
||||||
* dev
|
|
||||||
* image-creation-guide
|
|
||||||
* tool-guide
|
|
||||||
* mycredential
|
|
||||||
* public-images
|
|
||||||
* sdk-ref
|
|
||||||
* operation-guide
|
|
||||||
* operation-guide-lts
|
|
||||||
* parallel-file-system
|
|
||||||
* permissions-configuration-guide
|
|
||||||
* permissions
|
|
||||||
* swiftapi
|
|
||||||
* s3api
|
|
||||||
* umn
|
|
||||||
* umn2
|
|
||||||
* best-practice
|
|
||||||
* sqlreference
|
|
||||||
* guidelines
|
|
Before Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 170 KiB |
Before Width: | Height: | Size: 122 KiB |
Before Width: | Height: | Size: 122 KiB |
Before Width: | Height: | Size: 138 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 160 KiB |
Before Width: | Height: | Size: 128 KiB |
Before Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 97 KiB |
Before Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 52 KiB |
@ -1,94 +0,0 @@
|
|||||||
============================
|
|
||||||
How to update component page
|
|
||||||
============================
|
|
||||||
|
|
||||||
**Goal**
|
|
||||||
|
|
||||||
Mark service as depricated
|
|
||||||
|
|
||||||
.. image:: faq_images/storage_component_overview2.png
|
|
||||||
:target: faq_images/storage_component_overview2.png
|
|
||||||
:alt: storage_component_overview
|
|
||||||
|
|
||||||
|
|
||||||
1)**Create fork on github**
|
|
||||||
|
|
||||||
You need to create fork only in case you don’t have existing already
|
|
||||||
|
|
||||||
.. image:: faq_images/create_github_fork_1.png
|
|
||||||
:target: faq_images/create_github_fork_1.png
|
|
||||||
:alt: create_fork_1
|
|
||||||
|
|
||||||
Choose your name as owner
|
|
||||||
|
|
||||||
.. image:: faq_images/create_github_fork_2.png
|
|
||||||
:target: faq_images/create_github_fork_2.png
|
|
||||||
:alt: create_fork_2
|
|
||||||
|
|
||||||
2)**In case you have existing fork**
|
|
||||||
|
|
||||||
You need to sync your fork with main. Then go to branches.
|
|
||||||
|
|
||||||
.. image:: faq_images/github_sync_fork.png
|
|
||||||
:target: faq_images/github_sync_fork.png
|
|
||||||
:alt: sync_fork
|
|
||||||
|
|
||||||
3)**Create new branch**
|
|
||||||
|
|
||||||
.. image:: faq_images/github_new_branch.png
|
|
||||||
:target: faq_images/github_new_branch.png
|
|
||||||
:alt: new_branch
|
|
||||||
|
|
||||||
Add new branch name:
|
|
||||||
|
|
||||||
.. image:: faq_images/github_new_branch2.png
|
|
||||||
:target: faq_images/github_new_branch2.png
|
|
||||||
:alt: new_branch2
|
|
||||||
|
|
||||||
4)**Edit index.rst**
|
|
||||||
|
|
||||||
.. image:: faq_images/edit_index_rst.png
|
|
||||||
:target: faq_images/edit_index_rst.png
|
|
||||||
:alt: edit_index.rst
|
|
||||||
|
|
||||||
5)**Edit conf.py **
|
|
||||||
|
|
||||||
.. image:: faq_images/edit_conf_py.png
|
|
||||||
:target: faq_images/edit_conf_py.png
|
|
||||||
:alt: edit_conf_py
|
|
||||||
|
|
||||||
6)**Commit changes**
|
|
||||||
|
|
||||||
Once you finish with editing of pages click commit changes.
|
|
||||||
|
|
||||||
.. image:: faq_images/commit_changes.png
|
|
||||||
:target: faq_images/commit_changes.png
|
|
||||||
:alt: commit_changes
|
|
||||||
|
|
||||||
7)**Compare & pull request**
|
|
||||||
|
|
||||||
.. image:: faq_images/compare_pull_request.png
|
|
||||||
:target: faq_images/compare_pull_request.png
|
|
||||||
:alt: compare_changes
|
|
||||||
|
|
||||||
8)**Comparing changes**
|
|
||||||
|
|
||||||
Check correct source and target pull request and branch. Then create pull request.
|
|
||||||
|
|
||||||
.. image:: faq_images/compare_changes.png
|
|
||||||
:target: faq_images/compare_changes.png
|
|
||||||
:alt: compare_changes2
|
|
||||||
|
|
||||||
9)**Wait for checks, approve and gate**
|
|
||||||
|
|
||||||
.. image:: faq_images/check_approve_gate.png
|
|
||||||
:target: faq_images/check_approve_gate.png
|
|
||||||
:alt: check_approve_gate
|
|
||||||
|
|
||||||
10)**Delete branch**
|
|
||||||
|
|
||||||
After successful merge delete branch.
|
|
||||||
|
|
||||||
.. image:: faq_images/delete_branch.png
|
|
||||||
:target: faq_images/delete_branch.png
|
|
||||||
:alt: delete_branch
|
|
@ -1,89 +0,0 @@
|
|||||||
=============================
|
|
||||||
How to update landing page
|
|
||||||
=============================
|
|
||||||
|
|
||||||
**Goal**
|
|
||||||
|
|
||||||
Mark service as depricated
|
|
||||||
|
|
||||||
.. image:: faq_images/storage_component_overview.png
|
|
||||||
:target: faq_images/storage_component_overview.png
|
|
||||||
:alt: storage_component_overview
|
|
||||||
|
|
||||||
1)**Create fork on gitea**
|
|
||||||
|
|
||||||
You need to create fork only in case you don’t have existing already
|
|
||||||
|
|
||||||
.. image:: faq_images/infra_otc_metadata.png
|
|
||||||
:target: faq_images/infra_otc_metadata.png
|
|
||||||
:alt: infra_otc_metadata
|
|
||||||
|
|
||||||
https://gitea.eco.tsi-dev.otc-service.com/marmulle/otc-metadata/src/branch/main/otc_metadata/data/documents
|
|
||||||
|
|
||||||
2)**Sync fork**
|
|
||||||
|
|
||||||
Sync work with main currently do not support sync in console and you need to do it manually.
|
|
||||||
|
|
||||||
- you need to configure .ssh/config.ssh/config
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
Host gitea.eco.tsi-dev.otc-service.com
|
|
||||||
User git
|
|
||||||
Port 2222
|
|
||||||
HostName gitea.eco.tsi-dev.otc-service.com
|
|
||||||
IdentityFile ~/.ssh/id_rsa
|
|
||||||
|
|
||||||
You should be able to ssh gitea and get You've successfully authenticated message.
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
ssh gitea.eco.tsi-dev.otc-service.com
|
|
||||||
|
|
||||||
Clone your branch, not main:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
git clone ssh://git@gitea.eco.tsi-dev.otc-service.com:2222/marmulle/otc-metadata.git
|
|
||||||
|
|
||||||
Then follow instructions to recover fork: https://gitea.eco.tsi-dev.otc-service.com/docs/doc-exports/wiki/Recovering-Fork
|
|
||||||
|
|
||||||
3)**Update necessary file**
|
|
||||||
|
|
||||||
In this case I was updating obs-swiftapi.yaml located in https://gitea.eco.tsi-dev.otc-service.com/marmulle/otc-metadata/src/branch/main/otc_metadata/data/documents
|
|
||||||
|
|
||||||
4)**Propose file changes**
|
|
||||||
|
|
||||||
After update file propose file changes. Name of branch or pull request should be as short as possible,but meaningful.
|
|
||||||
|
|
||||||
.. image:: faq_images/propose_file_change.png
|
|
||||||
:target: faq_images/propose_file_change.png
|
|
||||||
:alt: faq_file_change
|
|
||||||
|
|
||||||
5)**Create new pull request**
|
|
||||||
|
|
||||||
Change destination branch into infra:main and click New Pull Request.
|
|
||||||
|
|
||||||
.. image:: faq_images/gitea_new_pull_request.png
|
|
||||||
:target: faq_images/gitea_new_pull_request.png
|
|
||||||
:alt: gitea_new_pull_request
|
|
||||||
|
|
||||||
Change destination branch into infra:main and click New Pull Request
|
|
||||||
|
|
||||||
.. image:: faq_images/gitea_new_pull_request2.png
|
|
||||||
:target: faq_images/gitea_new_pull_request2.png
|
|
||||||
:alt: gitea_new_pull_request2
|
|
||||||
|
|
||||||
Once again - New Pull Request
|
|
||||||
|
|
||||||
.. image:: faq_images/gitea_new_pull_request3.png
|
|
||||||
:target: faq_images/gitea_new_pull_request3.png
|
|
||||||
:alt: gitea_new_pull_request3
|
|
||||||
|
|
||||||
6)**New pull request approve, gate**
|
|
||||||
|
|
||||||
.. image:: faq_images/gitea_new_pull_request_approve_gate.png
|
|
||||||
:target: faq_images/gitea_new_pull_request_approve_gate.png
|
|
||||||
:alt: gitea_new_pull_request_approve_gate
|
|
||||||
|
|
||||||
7)**Delete branch**
|
|
@ -28,5 +28,3 @@ Frequently Asked Questions
|
|||||||
how_and_where_should_we_submit_bugs_when_the_documentation_url_is_wrong_the_link_is_not_working
|
how_and_where_should_we_submit_bugs_when_the_documentation_url_is_wrong_the_link_is_not_working
|
||||||
where_should_we_check_whether_a_document_related_bug_exists_or_not_for_our_components_if_a_customer_opens_it_or_it_is_coming_from_another_squad
|
where_should_we_check_whether_a_document_related_bug_exists_or_not_for_our_components_if_a_customer_opens_it_or_it_is_coming_from_another_squad
|
||||||
how_to_create_a_gitea_account
|
how_to_create_a_gitea_account
|
||||||
how_to_update_a_component_page
|
|
||||||
how_to_update_a_landing_page
|
|
||||||
|
@ -2,37 +2,36 @@
|
|||||||
Introduction
|
Introduction
|
||||||
============
|
============
|
||||||
|
|
||||||
The Helpcenter 3 (HC3) is an Open Telekom Cloud product developed by the Ecosystem Squad introducing
|
The HelpCenter3.0 is Open Telekom Cloud product developed by Ecosystem squad introducing new approach in the documentation management.
|
||||||
a new approach in documentation management. It improves the documentation exchange between
|
In order to improve documentation exchange between delivery partners and the TSI a new documentation platform and processes
|
||||||
delivery partners and the service squads of the Open Telekom Cloud. The documentation
|
based on GitOps are introduced with following benefits:
|
||||||
platform comes with processes based on GitOps and introduces the following features and benefits:
|
|
||||||
|
|
||||||
- Openness,
|
- Openness
|
||||||
- Transparency,
|
- Transparency
|
||||||
- Comprehensive review capabilities,
|
- Comprehensive review capabilities
|
||||||
- Full control during the documentation lifecycle, and
|
- Full control during the documentation lifecycle
|
||||||
- Documentation as source code.
|
- Documentation as a source code
|
||||||
|
|
||||||
The target of the platform is to store and maintain all documents in Git. This provides benefits of precise identification of changes
|
The target of the new platform is to store and maintain all documents in Git. This provides benefits of precise identification of changes
|
||||||
and preventing undesired versions to be published. The process is heavily streamlined. Once, those changes are approved and merged,
|
and preventing undesired versions to be published. The process is heavily streamlined. Once, those changes are approved and merged,
|
||||||
the connected pipelines ensure that the documentation is published fully automated which eases the document auditing and enables users
|
the connected pipelines ensure that the documentation is published fully automated which eases the document auditing and enables users
|
||||||
to see the complete history of changes tracked by git itself.
|
to see the complete history of changes tracked by git itself.
|
||||||
|
|
||||||
.. figure:: /_static/images/helpcenter_gitops.png
|
.. figure:: /_static/images/helpcenter_gitops.png
|
||||||
|
|
||||||
Solution is based on open source components. Its HLD is described at https://docs.otc-service.com/system-config/docsportal.html
|
Solution is completely open source based and HLD is described at https://docs.otc-service.com/system-config/docsportal.html
|
||||||
The implementation is based on these building blocks:
|
Implementation is based on:
|
||||||
|
|
||||||
- Restructured Text (RST) as source documentation format,
|
- Restructured Text (RST) as source documentation format
|
||||||
- Gitea/Github as a repository,
|
- Gitea/Github as a repository
|
||||||
- Zuul as a CI/CD engine for workflows,
|
- Zuul as a CI/CD engine for workflows
|
||||||
- Sphinx as a documentation rendering framework creating for example HTML or PDF documents,
|
- Sphinx as a documentation rendering framework (HTML/PDF/...
|
||||||
- OpenSearch as a search engine,
|
- OpenSearch as a search engine
|
||||||
- Swift object storage as a storage for documentation,
|
- Swift object storage as a storage for documentation
|
||||||
- Pandoc as a documentation converter, and
|
- Pandoc as a documentation converter
|
||||||
- a lot of OTC Infrastructure (ECS, CCE, ELB, ...)
|
- OTC Infrastructure (ECS, CCE, ELB, ...)
|
||||||
|
|
||||||
HC3 comes with following features:
|
HC3.0 comes with the following features:
|
||||||
|
|
||||||
- Support of UMN, API, DEV and other public facing documents
|
- Support of UMN, API, DEV and other public facing documents
|
||||||
- PROD and PREPROD documentation portal:
|
- PROD and PREPROD documentation portal:
|
||||||
|
@ -11,4 +11,3 @@ Internal Documentation
|
|||||||
Helpcenter <helpcenter/index>
|
Helpcenter <helpcenter/index>
|
||||||
Circle Partner Navigator <cpn/index>
|
Circle Partner Navigator <cpn/index>
|
||||||
otcdocstheme <otcdocstheme/index>
|
otcdocstheme <otcdocstheme/index>
|
||||||
OTC Terraform Provider <terraform/index>
|
|
||||||
|
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 668 B |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 616 B |