#!/usr/bin/python
#

# Copyright (C) 2014 Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


# pylint: disable=C0103

"""Hook to be run after upgrading to this version.

"""

import sys

from ganeti import utils
from ganeti import cli


def main():
  """Main program.

  """
  if len(sys.argv) != 2:
    cli.ToStderr("Expecting precisely one argument, the version upgrading from")
    return 1
  versionstring = sys.argv[1]

  version = utils.version.ParseVersion(versionstring)

  error_code = 0

  if utils.version.IsBefore(version, 2, 12, 5):
    result = utils.RunCmd(["gnt-cluster", "renew-crypto",
                           "--new-node-certificates", "-f", "-d"])
    if result.failed:
      cli.ToStderr("Failed to create node certificates: %s; Output %s" %
                   (result.fail_reason, result.output))
      error_code = 1

  if utils.version.IsBefore(version, 2, 13, 0):
    result = utils.RunCmd(["gnt-cluster", "renew-crypto",
                           "--new-ssh-keys", "--no-ssh-key-check",
                           "--verbose", "-f", "-d"])

    if result.failed:
      cli.ToStderr("Failed to create SSH keys: %s; Output %s" %
                   (result.fail_reason, result.output))
      error_code = 1

  return error_code

if __name__ == "__main__":
  exit(main())
