#   Copyright 2013 OpenStack, LLC.
#
#   Licensed 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.
#

"""Hypervisor action implementations"""

import logging
import six

from cliff import lister
from cliff import show

from openstackclient.common import utils


class ListHypervisor(lister.Lister):
    """List hypervisors"""

    log = logging.getLogger(__name__ + ".ListHypervisor")

    def get_parser(self, prog_name):
        parser = super(ListHypervisor, self).get_parser(prog_name)
        parser.add_argument(
            "--matching",
            metavar="<hostname>",
            help="Filter hypervisors using <hostname> substring",
        )
        return parser

    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)", parsed_args)
        compute_client = self.app.client_manager.compute
        columns = (
            "ID",
            "Hypervisor Hostname"
        )

        if parsed_args.matching:
            data = compute_client.hypervisors.search(parsed_args.matching)
        else:
            data = compute_client.hypervisors.list()

        return (columns,
                (utils.get_item_properties(
                    s, columns,
                ) for s in data))


class ShowHypervisor(show.ShowOne):
    """Display hypervisor details"""

    log = logging.getLogger(__name__ + ".ShowHypervisor")

    def get_parser(self, prog_name):
        parser = super(ShowHypervisor, self).get_parser(prog_name)
        parser.add_argument(
            "hypervisor",
            metavar="<hypervisor>",
            help="Hypervisor to display (name or ID)")
        return parser

    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)", parsed_args)
        compute_client = self.app.client_manager.compute
        hypervisor = utils.find_resource(compute_client.hypervisors,
                                         parsed_args.hypervisor)._info.copy()

        hypervisor["service_id"] = hypervisor["service"]["id"]
        hypervisor["service_host"] = hypervisor["service"]["host"]
        del hypervisor["service"]

        return zip(*sorted(six.iteritems(hypervisor)))

@@ -652,16 +652,26 @@
 logging%0A
+import re%0A
 import s
@@ -2432,24 +2432,603 @@
 nfo.copy()%0A%0A
+        uptime = compute_client.hypervisors.uptime(hypervisor%5B'id'%5D)._info%0A        # Extract data from uptime value%0A        # format: 0 up 0,  0 users,  load average: 0, 0, 0%0A        # example: 17:37:14 up  2:33,  3 users,  load average: 0.33, 0.36, 0.34%0A        m = re.match(%22(.+)%5Csup%5Cs+(.+),%5Cs+(.+)%5Csusers,%5Cs+load average:%5Cs(.+)%22,%0A                     uptime%5B'uptime'%5D)%0A        if m:%0A            hypervisor%5B%22host_time%22%5D = m.group(1)%0A            hypervisor%5B%22uptime%22%5D = m.group(2)%0A            hypervisor%5B%22users%22%5D = m.group(3)%0A            hypervisor%5B%22load_average%22%5D = m.group(4)%0A%0A
         hype

Add 'uptime' in 'hypervisor show'