#
#
# 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.
#
#
class hdp-nagios::server::packages(
  $service_state = $hdp::params::cluster_service_state
)
{
  if ($service_state == 'no_op') {
  } elsif ($service_state in ['uninstalled']) {
     hdp-nagios::server::package { ['nagios-server','nagios-fping','nagios-plugins','nagios-addons']:
      ensure => 'uninstalled'
    }
  } elsif ($service_state in ['running','stopped','installed_and_configured']) {
  

  
  hdp::package { 'nagios-server':
    ensure      => present,
    java_needed => false
  }
  
  hdp::package { 'nagios-fping': 
    ensure      => present,
    java_needed => false
  }
  
  hdp::package { 'nagios-addons': 
    ensure      => present,
    java_needed => false
  }
	
  hdp::package { 'nagios-plugins': 
    ensure      => present,
    java_needed => false
  }
  
  hdp::package { 'nagios-php-pecl-json': 
    ensure      => present,
    java_needed => false
  }
  
  
debug("## state: $service_state")
  if ($service_state == 'installed_and_configured') {

    hdp::package::remove_pkg { 'hdp_mon_nagios_addons':
      package_type => 'hdp_mon_nagios_addons'
    }

    hdp::package::remove_pkg { 'nagios-plugins':
      package_type => 'nagios-plugins'
    }

    hdp::package::remove_pkg { 'nagios':
      package_type => 'nagios'
    }

    debug("##Adding removing dep")
    # Removing conflicting packages. Names of packages being removed are hardcoded and not resolved via hdp::params
    Hdp::Package::Remove_pkg['hdp_mon_nagios_addons'] -> Hdp::Package::Remove_pkg['nagios-plugins'] -> Hdp::Package::Remove_pkg['nagios'] -> Hdp::Package['nagios-plugins']
  }

  Hdp::Package['nagios-plugins'] -> Hdp::Package['nagios-server'] -> Hdp::Package['nagios-fping'] -> Hdp::Package['nagios-addons'] -> Hdp::Package['nagios-php-pecl-json']

    

} 

}


define hdp-nagios::server::package(
  $ensure = present
)
{
  hdp::package { $name: 
    ensure      => $ensure,
    java_needed => false
  }
}
