.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information#
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
   http://www.apache.org/licenses/LICENSE-2.0
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
   

TroubleShooting
===============

Working with Server Logs
------------------------

The CloudStack Management Server logs all web site, middle tier, and
database activities for diagnostics purposes in
`/var/log/cloudstack/management/`. The CloudStack logs a variety of error
messages. We recommend this command to find the problematic output in
the Management Server log:.

.. note:: 
   When copying and pasting a command, be sure the command has pasted as a
   single line before executing. Some document viewers may introduce
   unwanted line breaks in copied text.

.. code:: bash

   grep -i -E 'exception|unable|fail|invalid|leak|warn|error' /var/log/cloudstack/management/management-server.log

The CloudStack processes requests with a Job ID. If you find an error in
the logs and you are interested in debugging the issue you can grep for
this job ID in the management server log. For example, suppose that you
find the following ERROR message:

.. code:: bash

   2010-10-04 13:49:32,595 ERROR [cloud.vm.UserVmManagerImpl] (Job-Executor-11:job-1076) Unable to find any host for [User|i-8-42-VM-untagged]

Note that the job ID is 1076. You can track back the events relating to
job 1076 with the following grep:

.. code:: bash

   grep "job-1076)" management-server.log

The CloudStack Agent Server logs its activities in `/var/log/cloudstack/agent/`.


Data Loss on Exported Primary Storage
-------------------------------------

Symptom
~~~~~~~

Loss of existing data on primary storage which has been exposed as a
Linux NFS server export on an iSCSI volume.


Cause
~~~~~

It is possible that a client from outside the intended pool has mounted
the storage. When this occurs, the LVM is wiped and all data in the
volume is lost


Solution
~~~~~~~~

When setting up LUN exports, restrict the range of IP addresses that are
allowed access by specifying a subnet mask. For example:

.. code:: bash

   echo “/export 192.168.1.0/24(rw,async,no_root_squash,no_subtree_check)” > /etc/exports

Adjust the above command to suit your deployment needs.


More Information
~~~~~~~~~~~~~~~~

See the export procedure in the "Secondary Storage" section of the
CloudStack Installation Guide


Recovering a Lost Virtual Router
--------------------------------

Symptom
~~~~~~~

A virtual router is running, but the host is disconnected. A virtual
router no longer functions as expected.


Cause
~~~~~

The Virtual router is lost or down.


Solution
~~~~~~~~

If you are sure that a virtual router is down forever, or no longer
functions as expected, destroy it. You must create one afresh while
keeping the backup router up and running (it is assumed this is in a
redundant router setup):

-  Force stop the router. Use the stopRouter API with forced=true
   parameter to do so.

-  Before you continue with destroying this router, ensure that the
   backup router is running. Otherwise the network connection will be
   lost.

-  Destroy the router by using the destroyRouter API.

Recreate the missing router by using the restartNetwork API with
cleanup=false parameter. For more information about redundant router
setup, see Creating a New Network Offering.

For more information about the API syntax, see the API Reference at
`http://cloudstack.apache.org/docs/api/ <http://cloudstack.apache.org/docs/api/>`_.


Maintenance mode not working on vCenter
---------------------------------------

Symptom
~~~~~~~

Host was placed in maintenance mode, but still appears live in vCenter.


Cause
~~~~~~

The CloudStack administrator UI was used to place the host in scheduled
maintenance mode. This mode is separate from vCenter's maintenance mode.


Solution
~~~~~~~~

Use vCenter to place the host in maintenance mode.


Unable to deploy VMs from uploaded vSphere template
---------------------------------------------------

Symptom
~~~~~~~~

When attempting to create a VM, the VM will not deploy.


Cause
~~~~~

If the template was created by uploading an OVA file that was created
using vSphere Client, it is possible the OVA contained an ISO image. If
it does, the deployment of VMs from the template will fail.


Solution
~~~~~~~~

Remove the ISO and re-upload the template.


Unable to power on virtual machine on VMware
--------------------------------------------

Symptom
~~~~~~~

Virtual machine does not power on. You might see errors like:

-  Unable to open Swap File

-  Unable to access a file since it is locked

-  Unable to access Virtual machine configuration


Cause
~~~~~

A known issue on VMware machines. ESX hosts lock certain critical
virtual machine files and file systems to prevent concurrent changes.
Sometimes the files are not unlocked when the virtual machine is powered
off. When a virtual machine attempts to power on, it can not access
these critical files, and the virtual machine is unable to power on.


Solution
~~~~~~~~

See the following:

`VMware Knowledge Base Article 
<http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=10051/>`_


Load balancer rules fail after changing network offering
--------------------------------------------------------

Symptom
~~~~~~~

After changing the network offering on a network, load balancer rules
stop working.


Cause
~~~~~

Load balancing rules were created while using a network service offering
that includes an external load balancer device such as NetScaler, and
later the network service offering changed to one that uses the
CloudStack virtual router.


Solution
~~~~~~~~

Create a firewall rule on the virtual router for each of your existing
load balancing rules so that they continue to function.


Troubleshooting Internet Traffic
--------------------------------

Below are a few troubleshooting steps to check whats going wrong with your
network...


Trouble Shooting Steps
~~~~~~~~~~~~~~~~~~~~~~

#. The switches have to be configured correctly to pass VLAN traffic. You can
   verify if VLAN traffic is working by bringing up a tagged interface on the
   hosts and pinging between them as below...

   On *host1 (kvm1)*

   ::

      kvm1 ~$ vconfig add eth0 64
      kvm1 ~$ ifconfig eth0.64 1.2.3.4 netmask 255.255.255.0 up
      kvm1 ~$ ping 1.2.3.5

   On *host2 (kvm2)*

   ::

      kvm2 ~$ vconfig add eth0 64
      kvm2 ~$ ifconfig eth0.64 1.2.3.5 netmask 255.255.255.0 up
      kvm2 ~$ ping 1.2.3.4

   If the pings dont work, run *tcpdump(8)* all over the place to check
   who is gobbling up the packets. Ultimately, if the switches are not
   configured correctly, CloudStack networking wont work so fix the
   physical networking issues before you proceed to the next steps

#. Ensure `Traffic Labels <http://cloudstack.apache.org/docs/en-US/Apache_CloudStack/4.2.0/html/Installation_Guide/about-physical-networks.html>`_ are set for the Zone.

   Traffic labels need to be set for all hypervisors including
   XenServer, KVM and VMware types. You can configure traffic labels when
   you creating a new zone from the *Add Zone Wizard*.

   .. image:: /_static/images/networking-zone-traffic-labels.png

   On an existing zone, you can modify the traffic labels by going to
   *Infrastructure, Zones, Physical Network* tab.

   .. image:: /_static/images/networking-infra-traffic-labels.png

   List labels using *CloudMonkey* 

   ::

      acs-manager ~$ cloudmonkey list traffictypes physicalnetworkid=41cb7ff6-8eb2-4630-b577-1da25e0e1145
      count = 4
      traffictype:
      id = cd0915fe-a660-4a82-9df7-34aebf90003e
      kvmnetworklabel = cloudbr0
      physicalnetworkid = 41cb7ff6-8eb2-4630-b577-1da25e0e1145
      traffictype = Guest
      xennetworklabel = MGMT
      ========================================================
      id = f5524b8f-6605-41e4-a982-81a356b2a196
      kvmnetworklabel = cloudbr0
      physicalnetworkid = 41cb7ff6-8eb2-4630-b577-1da25e0e1145
      traffictype = Management
      xennetworklabel = MGMT
      ========================================================
      id = 266bad0e-7b68-4242-b3ad-f59739346cfd
      kvmnetworklabel = cloudbr0
      physicalnetworkid = 41cb7ff6-8eb2-4630-b577-1da25e0e1145
      traffictype = Public
      xennetworklabel = MGMT
      ========================================================
      id = a2baad4f-7ce7-45a8-9caf-a0b9240adf04
      kvmnetworklabel = cloudbr0
      physicalnetworkid = 41cb7ff6-8eb2-4630-b577-1da25e0e1145
      traffictype = Storage
      xennetworklabel = MGMT
      =========================================================
  
#. KVM traffic labels require to be named as *"cloudbr0"*, *"cloudbr2"*,
   *"cloudbrN"* etc and the corresponding bridge must exist on the KVM
   hosts. If you create labels/bridges with any other names, CloudStack
   (atleast earlier versions did) seems to ignore them. CloudStack does not
   create the physical bridges on the KVM hosts, you need to create them
   **before** before adding the host to Cloudstack.

   ::

      kvm1 ~$ ifconfig cloudbr0
      cloudbr0  Link encap:Ethernet  HWaddr 00:0C:29:EF:7D:78  
         inet addr:192.168.44.22  Bcast:192.168.44.255  Mask:255.255.255.0
         inet6 addr: fe80::20c:29ff:feef:7d78/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:92435 errors:0 dropped:0 overruns:0 frame:0
         TX packets:50596 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0 
         RX bytes:94985932 (90.5 MiB)  TX bytes:61635793 (58.7 MiB)

#. The Virtual Router, SSVM, CPVM *public* interface would be bridged to
   a physical interface on the host. In the example below, *cloudbr0* is
   the public interface and CloudStack has correctly created the virtual
   interfaces bridge. This virtual interface to physical interface mapping
   is done automatically by CloudStack using the traffic label settings for
   the Zone. If you have provided correct settings and still dont have a
   working working Internet, check the switching layer before you debug any
   further. You can verify traffic using tcpdump on the virtual, physical
   and bridge interfaces.

   ::

      kvm-host1 ~$ brctl show
      bridge name  bridge id           STP enabled interfaces
      breth0-64    8000.000c29ef7d78   no          eth0.64
                                                   vnet2
      cloud0       8000.fe00a9fe0219   no          vnet0
      cloudbr0     8000.000c29ef7d78   no          eth0
                                                   vnet1
                                                   vnet3
      virbr0       8000.5254008e321a   yes         virbr0-nic

   ::

      xenserver1 ~$ brctl show
      bridge name  bridge id           STP enabled interfaces
      xapi0    0000.e2b76d0a1149       no          vif1.0
      xenbr0   0000.000c299b54dc       no          eth0
                                                  xapi1
                                                  vif1.1
                                                  vif1.2

#. Pre-create labels on the XenServer Hosts. Similar to KVM bridge
   setup, traffic labels must also be pre-created on the XenServer hosts
   before adding them to CloudStack.

   ::

      xenserver1 ~$ xe network-list 
      uuid ( RO)                : aaa-bbb-ccc-ddd
                name-label ( RW): MGMT
          name-description ( RW): 
                    bridge ( RO): xenbr0


#. The Internet would be accessible from both the SSVM and CPVM
   instances by default. Their public IPs will also be directly pingable
   from the Internet. Please note that these test would work only if your
   switches and traffic labels are configured correctly for your
   environment. If your SSVM/CPVM cant reach the Internet, its very
   unlikely that the Virtual Router (VR) can also the reach the Internet
   suggesting that its either a switching issue or incorrectly assigned
   traffic labels. Fix the SSVM/CPVM issues before you debug VR issues.

   ::

      root@s-1-VM:~# ping -c 3 google.com
      PING google.com (74.125.236.164): 56 data bytes
      64 bytes from 74.125.236.164: icmp_seq=0 ttl=55 time=26.932 ms
      64 bytes from 74.125.236.164: icmp_seq=1 ttl=55 time=29.156 ms
      64 bytes from 74.125.236.164: icmp_seq=2 ttl=55 time=25.000 ms
      --- google.com ping statistics ---
      3 packets transmitted, 3 packets received, 0% packet loss
      round-trip min/avg/max/stddev = 25.000/27.029/29.156/1.698 ms

   ::

      root@v-2-VM:~# ping -c 3 google.com
      PING google.com (74.125.236.164): 56 data bytes
      64 bytes from 74.125.236.164: icmp_seq=0 ttl=55 time=32.125 ms
      64 bytes from 74.125.236.164: icmp_seq=1 ttl=55 time=26.324 ms
      64 bytes from 74.125.236.164: icmp_seq=2 ttl=55 time=37.001 ms
      --- google.com ping statistics ---
      3 packets transmitted, 3 packets received, 0% packet loss
      round-trip min/avg/max/stddev = 26.324/31.817/37.001/4.364 ms


#. The Virtual Router (VR) should also be able to reach the Internet
   without having any Egress rules. The Egress rules only control forwarded
   traffic and not traffic that originates on the VR itself.

   ::

      root@r-4-VM:~# ping -c 3 google.com
      PING google.com (74.125.236.164): 56 data bytes
      64 bytes from 74.125.236.164: icmp_seq=0 ttl=55 time=28.098 ms
      64 bytes from 74.125.236.164: icmp_seq=1 ttl=55 time=34.785 ms
      64 bytes from 74.125.236.164: icmp_seq=2 ttl=55 time=69.179 ms
      --- google.com ping statistics ---
      3 packets transmitted, 3 packets received, 0% packet loss
      round-trip min/avg/max/stddev = 28.098/44.021/69.179/17.998 ms

#. However, the Virtual Router's (VR) Source NAT Public IP address
   **WONT** be reachable until appropriate Ingress rules are
   in place. You can add *Ingress* rules under *Network, Guest Network, IP
   Address, Firewall* setting page.

   .. image:: /_static/images/networking-ingress-rule.png

#. The VM Instances by default wont be able to access the Internet. Add
   Egress rules to permit traffic.

   .. image:: /_static/images/networking-egress-rule.png

#. Some users have reported that flushing IPTables rules (or changing
   routes) on the SSVM, CPVM or the Virtual Router makes the Internet work.
   This is not expected behaviour and suggests that your networking
   settings are incorrect. No IPtables/route changes are required on the
   SSVM, CPVM or the VR. Go back and double check all your settings.


In a vast majority of the cases, the problem has turned out to be at the
switching layer where the L3 switches were configured incorrectly.

This section was contibuted by Shanker Balan and was originally published on 
`Shapeblue's blog <http://shankerbalan.net/blog/internet-not-working-on-cloudstack-vms/>`_

