#!/usr/local/sbin/charm-env python3

# 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.

import sys
sys.path.append('lib')

from charmhelpers.core import hookenv, unitdata  # noqa: E402
from charms.layer.apache_bigtop_base import Bigtop, get_package_version  # noqa: E402
from charms.reactive import is_state  # noqa: E402


def fail(msg):
    hookenv.action_set({'outcome': 'failure'})
    hookenv.action_fail(msg)
    sys.exit()


if not is_state('bigtop.version.changed'):
    fail('No Bigtop version changes were found; nothing to reinstall.')

if not unitdata.kv().get('spark.version.repo', False):
    fail('Charm is not prepared to run the reinstall action.')

# Call the base reinstall method with 'spark-*' so all spark related packages
# are removed prior to reinstalling new versions via puppet apply.
bigtop = Bigtop()
result = bigtop.reinstall_repo_packages(remove_pkgs='spark-*')

if bigtop.check_bigtop_repo_package('spark-core'):
    # Ruh roh. We expect this to be None since we just did a reinstall
    # with the current repo. There should be no different version available.
    fail('Unexpected spark-core version found after reinstalling spark')

if result == 'success':
    # Set appropriate status output
    spark_version = get_package_version('spark-core') or 'unknown'
    hookenv.application_version_set(spark_version)
    hookenv.status_set('active', 'reinstall was successful')

    # Remove our spark version unitdata and report success
    unitdata.kv().unset('spark.version.repo')
    hookenv.action_set({'outcome': 'success'})
else:
    fail('Reinstall failed; hiera data and package repos have been restored '
         'to the previous working state.')
