Update Quantum demo examples

Change-Id: I2a1a38d2b325fb92d0fc93ba422bb304b250b9e0
This commit is contained in:
Gary Kotton 2012-09-24 10:08:04 +00:00
parent 60630ed879
commit 22dc011e91
3 changed files with 434 additions and 90 deletions
doc/src/docbkx/openstack-network-connectivity-admin

@ -34,171 +34,515 @@ format="PNG" />
</imageobject> </imageobject>
</inlinemediaobject>'> </inlinemediaobject>'>
]> ]>
<appendix xmlns="http://docbook.org/ns/docbook" <appendix xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="app_demo">
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="app_demo">
<title>Demo Setup</title> <title>Demo Setup</title>
<para>This section describes how to install the Quantum service <para>This section describes how to install the Quantum service
and its components. The demo assumes the following:</para> and its components for the "<link
<para>OpenStack Service Node:</para> linkend="use_cases_single_router">Use Case: Provider
Router with Private Networks</link>". The demo assumes the
following:</para>
<para><emphasis role="bold">OpenStack Service Node</emphasis></para>
<orderedlist> <orderedlist>
<listitem> <listitem>
<para>Relevant Nova services are installed and <para>Relevant Nova services are installed, configured and
configured</para> running.</para>
</listitem> </listitem>
<listitem> <listitem>
<para>Glance is installed and the image <para>Glance is installed, configured and running. In
cirros-0.3.0-x86_64-uec exists. This will be used in addition to this there should be an image.</para>
the examples.</para>
</listitem> </listitem>
<listitem> <listitem>
<para>Keystone installed and running</para> <para>Keystone is installed, configured and running. A
quantum user <emphasis role="bold">quantum</emphasis>
should be created on tenant <emphasis role="bold"
>servicetenant</emphasis> with password <emphasis
role="bold">servicepassword</emphasis>.</para>
</listitem> </listitem>
<listitem> <listitem>
<para>Additional services <itemizedlist> <para>Additional services <itemizedlist>
<listitem> <listitem>
<para>RabbitMQ (password is <emphasis
<para>RabbitMQ (password is rpwd)</para> role="bold"
>openstack</emphasis>)</para>
</listitem> </listitem>
<listitem> <listitem>
<para>MySql server (user is muser and password <para>MySQL server (user is <emphasis
is mpwd)</para> role="bold">quantum</emphasis> and
password is <emphasis role="bold"
>openstack</emphasis>)</para>
</listitem> </listitem>
</itemizedlist> </itemizedlist></para>
</para>
</listitem> </listitem>
</orderedlist> </orderedlist>
<para>Compute Nodes</para> <para><emphasis role="bold">Compute Nodes</emphasis></para>
<orderedlist> <orderedlist>
<listitem> <listitem>
<para>Nova compute is installed and configured</para> <para>Nova compute is installed and configured</para>
</listitem> </listitem>
</orderedlist> </orderedlist>
<para>The diagram (<link <para>The diagram below shows the setup. For simplicity all of the
xlink:href="https://docs.google.com/drawings/d/1E_UTCAS22EDHecL5LunLKCzlcqyk-tsWLrAEZTKyz1I/edit" nodes should have one interface for management traffic and one
>https://docs.google.com/drawings/d/1E_UTCAS22EDHecL5LunLKCzlcqyk-tsWLrAEZTKyz1I/edit</link>) or more interfaces for traffic to and from VMs. The management
below shows the setup. The example uses the OpenvSwitch plugin network is 100.1.1.0/24. The example uses the Open vSwitch
and agents (you can tweak the configurationsto use the Linux plugin and agents.</para>
Bridge plugin and agents).</para> <para><emphasis role="bold">Note</emphasis> the setup can be tweaked to make use of another
supported plugin and its agents.</para>
<mediaobject> <mediaobject>
<imageobject role="fo"> <imageobject role="fo">
<imagedata <imagedata fileref="figures/demo_install.png"
fileref="figures/0clip_image002_-1344673767.gif" scale="80" role="html"/>
contentwidth="4in"/>
</imageobject> </imageobject>
</mediaobject> </mediaobject>
<para>There will be three components to the setup.<table <para>There will be three nodes in the setup.<table rules="all">
rules="all"> <caption>Nodes for Demo</caption>
<caption>Components for Demo</caption>
<thead> <thead>
<tr> <tr>
<th>Component</th> <th>Node</th>
<th>Description</th> <th>Description</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>OpenStack Services </td> <td>OpenStack Controller Node</td>
<td>Runs the Quantum service, Keystone and all of <td>Runs the Quantum service, Keystone and all of
the Nova service that are required to deploy a the Nova services that are required to deploy
VM. The service must have at least one network a VM. The service must have at least one
interface. This will be used to communicate network interface, this should be connected to
with the compute nodes. </td> the "Management Network". The IP address of
</tr> the interface should be configured as
100.1.1.10/24. This will be used to
<tr> communicate with the compute and network
<td>Compute Node </td> nodes. <emphasis role="bold">Note</emphasis>
<td>Runs Nova compute, Quantum L2 agent and the nova-network should not be running. This is
DHCP agent. This node will not have access the replaced by Quantum.</td>
public network. The DHCP agent will allocate
IP addresses to the VMs on the network. The
node must have at least one network interface.
</td>
</tr> </tr>
<tr> <tr>
<td>Compute Node </td> <td>Compute Node</td>
<td>Runs Nova compute, Quantum L2 agent and the L3 <td>Runs Nova compute and the Quantum L2 agent.
agent. This node will have access the public This node will not have access the public
network. The L3 agent will perform NAT and network. The node must have at least two
enable the VMs to access the public network. network interfaces. The first is used to
The node must have at least two network communicate with the controller node, via the
interfaces. </td> management network. The IP address of this
interface should be configured to
100.1.1.11/24. The second interface will be
used for the VM traffic, this is via the Data
network. The VM will be able to receive its IP
address from the DHCP agent on this
network.</td>
</tr>
<tr>
<td>Network Node</td>
<td>Runs Quantum L2 agent, the DHCP agent and the
L3 agent. This node will have access the
public network. The DHCP agent will allocate
IP addresses to the VMs on the network. The L3
agent will perform NAT and enable the VMs to
access the public network. The node must have
at least three network interfaces. The first
is used to communicate with the controller
node, this is via the management network. The
IP address of this interface should be
configured to 100.1.1.12/24. The second
interface will be used for the VM traffic,
this is on the data network. The third
interface will be used to connect to the
external gateway on the network. This
interface will be bridged to the Open vSwitch
bridge "br-ex" interface.</td>
</tr> </tr>
</tbody> </tbody>
</table></para> </table></para>
<section xml:id="demo_install"> <section xml:id="demo_installions">
<title>Installations</title> <title>Installations</title>
<para><itemizedlist> <para>
<itemizedlist>
<listitem> <listitem>
<para>Quantum Service <orderedlist> <para><emphasis role="bold">Quantum Service</emphasis><orderedlist>
<listitem> <listitem>
<para>Install the Quantum <para>Install the Quantum service.</para>
service.</para>
</listitem> </listitem>
<listitem> <listitem>
<para>Create plugin database <para>Create plugin database <emphasis
<filename>ovs_quantum</filename>. role="bold">ovs_quantum</emphasis>.
See the section on the Quantum See the section on the <link
service for the exact details. linkend="core_plugins">Core
Create user Plugins</link> for the exact
<literal>muser</literal> with details. Create user <emphasis
password role="bold">quantum</emphasis> with
<literal>mpwd</literal>.</para> password <emphasis role="bold"
>openstack</emphasis>.</para>
</listitem> </listitem>
<listitem> <listitem>
<para>Update the Quantum configuration <para>Update the Quantum configuration
file, file, <emphasis role="bold"
<filename>/etc/quantum/quantum.conf</filename>:</para> >/etc/quantum/quantum.conf</emphasis>:</para>
<screen><computeroutput>core_plugin=quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2 <screen><computeroutput>[DEFAULT]
rabbit_password = openstack core_plugin=quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2
rabbit_host = localhost</computeroutput></screen> rabbit_password = openstack</computeroutput></screen>
</listitem> </listitem>
<listitem> <listitem>
<para>Update the plugin configuration <para>Update the plugin configuration
file, file, <emphasis role="bold"
<filename>/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini</filename>:</para> >/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini</emphasis>:</para>
<screen><computeroutput>sql_connection=mysql://muser:mpwd@localhost/ovs_quantum?charset=utf8 <screen><computeroutput>[DATABASE]
[TBD provider nets]</computeroutput></screen> sql_connection=mysql://quantum:openstack@localhost/ovs_quantum?charset=utf8
[OVS]
tenant_network_type=vlan
network_vlan_ranges = physnet1:1:4094</computeroutput></screen>
</listitem>
<listitem>
<para>Update the api-paste
configuration file to include the
keystone user, <emphasis
role="bold"
>/etc/quantum/api-paste.ini</emphasis>:</para>
<screen><computeroutput>[filter:authtoken]
admin_tenant_name=servicetenant
admin_user=quantum
admin_password=servicepassword</computeroutput></screen>
</listitem> </listitem>
<listitem> <listitem>
<para>Start the Quantum service</para> <para>Start the Quantum service</para>
</listitem> </listitem>
</orderedlist></para> </orderedlist></para>
</listitem> </listitem>
<listitem> <listitem>
<para>Compute Nodes - L2 Agent <orderedlist> <para><emphasis role="bold">Compute Nodes - L2 Agent</emphasis><orderedlist>
<listitem> <listitem>
<para>Install the the L2 agent.</para> <para>Install the L2 agent.</para>
</listitem>
<listitem>
<para>Add the integration bridge to the Open vSwitch:</para>
<screen><computeroutput>sudo ovs-vsctl add-br br-int</computeroutput></screen>
</listitem> </listitem>
<listitem> <listitem>
<para>Update the Quantum configuration <para>Update the Quantum configuration
file, file, <emphasis role="bold"
<filename>/etc/quantum/quantum.conf</filename>:</para> >/etc/quantum/quantum.conf</emphasis>:</para>
<screen><computeroutput>rabbit_password = openstack <screen><computeroutput>rabbit_password = openstack
rabbit_host = 100.1.1.10</computeroutput></screen> rabbit_host = 100.1.1.10</computeroutput></screen>
</listitem> </listitem>
<listitem> <listitem>
<para>Update the plugin configuration <para>Update the plugin configuration
file. </para> file, <emphasis role="bold"
<para>[TBD provider nets]</para> >/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini</emphasis>:</para>
<screen><computeroutput>[OVS]
tenant_network_type=vlan
network_vlan_ranges = physnet1:1:4094
bridge_mappings = physnet1:br-eth1</computeroutput></screen>
</listitem> </listitem>
<listitem> <listitem>
<para>Start the Quantum L2 <para>Create the network bridge
agent</para> <emphasis role="bold"
>br-eth1</emphasis> (All VM
communication between the nodes
will be done via eth1):</para>
<screen><computeroutput>sudo ovs-vsctl add-br br-eth1
sudo ovs-vsctl add-port br-eth1 eth1</computeroutput></screen>
</listitem>
<listitem>
<para>Update the nova configuration
file, <emphasis role="bold"
>/etc/nova/nova.conf</emphasis>:</para>
<screen><computeroutput>[DEFAULT]
network_api_class=nova.network.quantumv2.api.API
quantum_admin_username=quantum
quantum_admin_password=servicepassword
quantum_admin_auth_url=http://100.1.1.10:35357/v2.0/
quantum_auth_strategy=keystone
quantum_admin_tenant_name=servicetenant
quantum_url=http://100.1.1.10:9696/
libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver</computeroutput></screen>
</listitem>
<listitem>
<para>Restart the nova service</para>
</listitem>
<listitem>
<para>Start the Quantum L2 agent</para>
</listitem> </listitem>
</orderedlist></para> </orderedlist></para>
</listitem>
<listitem>
<para><emphasis role="bold">Compute Node A - DHCP Agent</emphasis><orderedlist>
<listitem>
<para>Install the DHCP agent.</para>
</listitem>
<listitem>
<para>Update the Quantum configuration
file, <emphasis role="bold"
>/etc/quantum/quantum.conf</emphasis>:</para>
<screen><computeroutput>rabbit_password = openstack
rabbit_host = 100.1.1.10</computeroutput></screen>
</listitem>
<listitem>
<para>Update the DHCP configuration
file, , <emphasis role="bold"
>/etc/quantum/dhcp_agent.ini</emphasis>:</para>
<screen><computeroutput>interface_driver = quantum.agent.linux.interface.OVSInterfaceDriver</computeroutput></screen>
</listitem>
<listitem>
<para>Start the DHCP agent</para>
</listitem>
</orderedlist></para>
</listitem>
<listitem>
<para><emphasis role="bold">Compute Node B - L3 Agent</emphasis><orderedlist>
<listitem>
<para>Install the L3 agent.</para>
</listitem>
<listitem>
<para>Add the external network bridge to the Open vSwitch:</para>
<screen><computeroutput>sudo ovs-vsctl add-br br-ex</computeroutput></screen>
</listitem>
<listitem>
<para>Add the physical interface, for example eth2, that is
connected to the outside network to this bridge:</para>
<screen><computeroutput>sudo ovs-vsctl add-port br-ex eth2</computeroutput></screen>
</listitem>
<listitem>
<para>Update the L3 configuration
file, <emphasis role="bold"
>/etc/quantum/l3_agent.ini</emphasis>:</para>
<screen><computeroutput>[DEFAULT]
auth_url=http://100.1.1.10:35357/v2.0/
admin_user=quantum
admin_password=servicepassword
admin_tenant_name=servicetenant
interface_driver=quantum.agent.linux.interface.OVSInterfaceDriver</computeroutput></screen>
</listitem>
<listitem>
<para>Start the L3 agent</para>
</listitem>
</orderedlist></para>
</listitem>
</itemizedlist>
</para>
</section>
<section xml:id="demo_logical_network_config">
<title>Logical Network Configuration</title>
<para>All of the commands below can be done on the service node.</para>
<para><emphasis role="bold">Note</emphasis> please ensure that
the following environment variables are set. These are
used by the various clients to access Keystone.</para>
<para>
<screen><computeroutput>export OS_USERNAME=admin
export OS_PASSWORD=adminpassword
export OS_TENANT_NAME=admin
export OS_AUTH_URL=http://127.0.0.1:5000/v2.0/</computeroutput></screen>
</para>
<para>
<itemizedlist>
<listitem>
<para><emphasis role="bold">Internal Networking Configuration</emphasis><orderedlist>
<listitem>
<para>Get the tenant ID (Used as
$TENANT_ID later).</para>
<screen><computeroutput>keystone tenant-list</computeroutput></screen>
<screen><computeroutput>+----------------------------------+--------------------+---------+
| id | name | enabled |
+----------------------------------+--------------------+---------+
| 48fb81ab2f6b409bafac8961a594980f | admin | True |
| cbb574ac1e654a0a992bfc0554237abf | service | True |
| e371436fe2854ed89cca6c33ae7a83cd | invisible_to_admin | True |
| e40fa60181524f9f9ee7aa1038748f08 | demo | True |
+----------------------------------+--------------------+---------+</computeroutput></screen>
</listitem>
<listitem>
<para>Create a internal network on the
demo tenant ($TENANT_ID will be
e40fa60181524f9f9ee7aa1038748f08):</para>
<screen><computeroutput>quantum net-create --tenant-id $TENANT_ID net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 1024</computeroutput></screen>
<screen><computeroutput>+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | True |
| id | e99a361c-0af8-4163-9feb-8554d4c37e4f |
| name | net1 |
| provider:network_type | vlan |
| provider:physical_network | physnet1 |
| provider:segmentation_id | 1024 |
| router:external | False |
| shared | False |
| status | ACTIVE |
| subnets | |
| tenant_id | e40fa60181524f9f9ee7aa1038748f08 |
+---------------------------+--------------------------------------+</computeroutput></screen>
</listitem>
<listitem>
<para>Create a subnet on the network (Used as $SUBNET_ID
later):</para>
<screen><computeroutput>quantum subnet-create --tenant-id $TENANT_ID net1 10.0.0.0/24</computeroutput></screen>
<screen><computeroutput>+------------------+--------------------------------------------+
| Field | Value |
+------------------+--------------------------------------------+
| allocation_pools | {"start": "10.0.0.2", "end": "10.0.0.254"} |
| cidr | 10.0.0.0/24 |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 10.0.0.1 |
| host_routes | |
| id | c395cb5d-ba03-41ee-8a12-7e792d51a167 |
| ip_version | 4 |
| name | |
| network_id | e99a361c-0af8-4163-9feb-8554d4c37e4f |
| tenant_id | e40fa60181524f9f9ee7aa1038748f08 |
+------------------+--------------------------------------------+</computeroutput></screen>
</listitem>
</orderedlist></para>
</listitem> </listitem>
<listitem> <listitem>
<para>DHCP Agent</para> <para><emphasis role="bold">External Networking Configuration</emphasis><orderedlist>
<listitem>
<para>Create a router (Used as $ROUTER_ID later):</para>
<screen><computeroutput>quantum router-create --tenant_id $TENANT_ID router1</computeroutput></screen>
<screen><computeroutput>+-----------------------+--------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------+
| admin_state_up | True |
| external_gateway_info | |
| id | 685f64e7-a020-4fdf-a8ad-e41194ae124b |
| name | router1 |
| status | ACTIVE |
| tenant_id | e40fa60181524f9f9ee7aa1038748f08 |
+-----------------------+--------------------------------------+</computeroutput></screen>
</listitem>
<listitem>
<para>Add the router to the subnet:</para>
<screen><computeroutput>quantum router-interface-add $ROUTER_ID $SUBNET_ID</computeroutput></screen>
<screen><computeroutput>Added interface to router 685f64e7-a020-4fdf-a8ad-e41194ae124b</computeroutput></screen>
</listitem>
<listitem>
<para>Create the external network (Used as $EXTERNAL_NETWORK_ID).
<emphasis role="bold">Note</emphasis> this is on a different
tenant to $TENANT_ID:</para>
<screen><computeroutput>quantum net-create ext_net -- --router:external=True</computeroutput></screen>
<screen><computeroutput>+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | True |
| id | 8858732b-0400-41f6-8e5c-25590e67ffeb |
| name | ext_net |
| provider:network_type | vlan |
| provider:physical_network | physnet1 |
| provider:segmentation_id | 1 |
| router:external | True |
| shared | False |
| status | ACTIVE |
| subnets | |
| tenant_id | cbb574ac1e654a0a992bfc0554237abf |
+---------------------------+--------------------------------------+
</computeroutput></screen>
</listitem>
<listitem>
<para>Create the subnet for floating
IPs. <emphasis role="bold"
>Note</emphasis> the DHCP service
is disabled for this subnet:</para>
<screen><computeroutput>quantum subnet-create ext_net 172.24.4.224/28 -- --enable_dhcp=False</computeroutput></screen>
<screen><computeroutput>+------------------+--------------------------------------------------+
| Field | Value |
+------------------+--------------------------------------------------+
| allocation_pools | {"start": "172.24.4.226", "end": "172.24.4.238"} |
| cidr | 172.24.4.224/28 |
| dns_nameservers | |
| enable_dhcp | False |
| gateway_ip | 172.24.4.225 |
| host_routes | |
| id | aef60b55-cbff-405d-a81d-406283ac6cff |
| ip_version | 4 |
| name | |
| network_id | 8858732b-0400-41f6-8e5c-25590e67ffeb |
| tenant_id | cbb574ac1e654a0a992bfc0554237abf |
+------------------+--------------------------------------------------+</computeroutput></screen>
</listitem>
<listitem>
<para>Set the router for the external network:</para>
<screen><computeroutput>quantum router-gateway-set $ROUTER_ID $EXTERNAL_NETWORK_ID</computeroutput></screen>
<screen><computeroutput>Set gateway for router 685f64e7-a020-4fdf-a8ad-e41194ae124b</computeroutput></screen>
</listitem>
</orderedlist></para>
</listitem> </listitem>
<listitem> <listitem>
<para>Compute Node + L3 Agent</para> <para><emphasis role="bold">Floating IP Allocation</emphasis><orderedlist>
<listitem>
<para>After a VM is deployed a
floating IP address can be
associated to the VM. A VM that is
created will be allocated a Quantum
port ($PORT_ID). The port ID for
the VM can be retrieved as
follows:</para>
<screen><computeroutput>nova list
+--------------------------------------+--------+--------+---------------+
| ID | Name | Status | Networks |
+--------------------------------------+--------+--------+---------------+
| 1cdc671d-a296-4476-9a75-f9ca1d92fd26 | testvm | ACTIVE | net1=10.0.0.3 |
+--------------------------------------+--------+--------+---------------+
quantum port-list -- --device_id 1cdc671d-a296-4476-9a75-f9ca1d92fd26
+--------------------------------------+------+-------------------+---------------------------------------------------------------------------------+
| id | name | mac_address | fixed_ips |
+--------------------------------------+------+-------------------+---------------------------------------------------------------------------------+
| 9aa47099-b87b-488c-8c1d-32f993626a30 | | fa:16:3e:b4:d6:6c | {"subnet_id": "c395cb5d-ba03-41ee-8a12-7e792d51a167", "ip_address": "10.0.0.3"} |
+--------------------------------------+------+-------------------+---------------------------------------------------------------------------------+</computeroutput></screen>
</listitem>
<listitem>
<para>Allocate a floating IP (Used as $FLOATING_ID):</para>
<screen><computeroutput>quantum floatingip-create ext_net
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| fixed_ip_address | |
| floating_ip_address | 172.24.4.227 |
| floating_network_id | 8858732b-0400-41f6-8e5c-25590e67ffeb |
| id | 40952c83-2541-4d0c-b58e-812c835079a5 |
| port_id | |
| router_id | |
| tenant_id | e40fa60181524f9f9ee7aa1038748f08 |
+---------------------+--------------------------------------+</computeroutput></screen>
</listitem>
<listitem>
<para>Associate a floating IP to a VM
(in the case of the example it is
9aa47099-b87b-488c-8c1d-32f993626a30):</para>
<screen><computeroutput>quantum floatingip-associate $FLOATING_ID $PORT_ID
Associated floatingip 40952c83-2541-4d0c-b58e-812c835079a5</computeroutput></screen>
<para>Show the floating IP:</para>
<screen><computeroutput>quantum floatingip-show $FLOATING_ID
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| fixed_ip_address | 10.0.0.3 |
| floating_ip_address | 172.24.4.227 |
| floating_network_id | 8858732b-0400-41f6-8e5c-25590e67ffeb |
| id | 40952c83-2541-4d0c-b58e-812c835079a5 |
| port_id | 9aa47099-b87b-488c-8c1d-32f993626a30 |
| router_id | 685f64e7-a020-4fdf-a8ad-e41194ae124b |
| tenant_id | e40fa60181524f9f9ee7aa1038748f08 |
+---------------------+--------------------------------------+
ping 172.24.4.227
PING 172.24.4.227 (172.24.4.227) 56(84) bytes of data.
64 bytes from 172.24.4.227: icmp_req=2 ttl=64 time=0.152 ms
64 bytes from 172.24.4.227: icmp_req=3 ttl=64 time=0.049 ms
</computeroutput></screen>
</listitem>
</orderedlist></para>
</listitem> </listitem>
</itemizedlist></para> </itemizedlist>
</para>
</section> </section>
</appendix> </appendix>

Binary file not shown.

After

(image error) Size: 25 KiB