# Copyright 2014 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""cros deploy: Deploy the packages onto the target device."""

import logging

from chromite.cli import command
from chromite.cli import deploy
from chromite.lib import commandline
from chromite.utils import timer


@command.command_decorator("deploy")
class DeployCommand(command.CliCommand):
    """Deploy the requested packages to the target device.

    This command assumes the requested packages are already built in the
    chroot. This command needs to run inside the chroot for inspecting
    the installed packages.

    Note: If the rootfs on your device is read-only, this command
    remounts it as read-write. If the rootfs verification is enabled on
    your device, this command disables it.
    """

    EPILOG = """
To deploy packages:
  cros deploy device power_manager cherrypy
  cros deploy device /path/to/package

To uninstall packages:
  cros deploy --unmerge cherrypy

For more information of cros build usage:
  cros build -h
"""

    use_dryrun_options = True

    @classmethod
    def AddParser(cls, parser):
        """Add a parser."""
        super(cls, DeployCommand).AddParser(parser)
        cls.AddDeviceArgument(parser, positional=True)
        parser.add_argument(
            "packages",
            help="Packages to install. You can specify "
            "[category/]package[:slot] or the path to the binary package. "
            "Use @installed to update all installed packages (requires "
            "--update).",
            nargs="+",
        )
        parser.add_argument(
            "--board",
            help="The board to use. By default it is automatically detected. "
            "You can override the detected board with this option.",
        )
        parser.add_argument(
            "--no-strip",
            dest="strip",
            action="store_false",
            default=True,
            help="Do not run strip_package to filter out preset paths in the "
            "package. Stripping removes debug symbol files and reduces the "
            "size of the package significantly. Defaults to always strip.",
        )
        parser.add_argument(
            "--unmerge",
            dest="emerge",
            action="store_false",
            default=True,
            help="Unmerge requested packages.",
        )
        parser.add_argument(
            "--root",
            default="/",
            help="Package installation root, e.g. '/' or '/usr/local'"
            " (default: '%(default)s').",
        )
        parser.add_argument(
            "--no-clean-binpkg",
            dest="clean_binpkg",
            action="store_false",
            default=True,
            help="Do not clean outdated binary packages. "
            " Defaults to always clean.",
        )
        parser.add_argument(
            "--emerge-args",
            default=None,
            help="Extra arguments to pass to emerge.",
        )
        parser.add_argument(
            "--private-key",
            type="path",
            default=None,
            help="SSH identify file (private key).",
        )
        parser.add_argument(
            "--no-ping",
            dest="ping",
            action="store_false",
            default=True,
            help="Do not ping the device before attempting to connect to it.",
        )

        advanced = parser.add_argument_group("Advanced options")
        advanced.add_argument(
            "--force",
            action="store_true",
            help="Ignore confidence checks, just do it.",
        )
        # TODO(garnold) Make deep and check installed the default behavior.
        advanced.add_argument(
            "--update",
            action="store_true",
            help="Check installed versions on target (emerge only).",
        )
        advanced.add_argument(
            "--deep",
            action="store_true",
            help="Install dependencies. Implies --update.",
        )
        advanced.add_argument(
            "--deep-rev",
            action="store_true",
            help="Install reverse dependencies. Implies --deep.",
        )

    def Run(self):
        """Run cros deploy."""
        commandline.RunInsideChroot(self)
        with timer.Timer() as t:
            deploy.Deploy(
                self.options.device,
                self.options.packages,
                board=self.options.board,
                emerge=self.options.emerge,
                update=self.options.update,
                deep=self.options.deep,
                deep_rev=self.options.deep_rev,
                clean_binpkg=self.options.clean_binpkg,
                root=self.options.root,
                strip=self.options.strip,
                emerge_args=self.options.emerge_args,
                ssh_private_key=self.options.private_key,
                ping=self.options.ping,
                force=self.options.force,
                dry_run=self.options.dryrun,
            )
        logging.notice("cros deploy completed successfully in %s", t)
