require 'spec_helper'

class ConvergeNetworkService
  def self.restart(chef_run)
    chef_run.converge_dsl('aws-parallelcluster-environment') do
      network_service 'restart' do
        action :restart
      end
    end
  end

  def self.reload(chef_run)
    chef_run.converge_dsl('aws-parallelcluster-environment') do
      network_service 'reload' do
        action :reload
      end
    end
  end
end

describe 'network_service:restart' do
  for_all_oses do |platform, version|
    context "on #{platform}#{version}" do
      cached(:chef_run) do
        runner = runner(platform: platform, version: version, step_into: ['network_service'])
        ConvergeNetworkService.restart(runner)
      end
      cached(:node) { chef_run.node }
      cached(:network_service_name) do
        {
          'amazon' => 'network',
          'centos' => 'network',
          'redhat' => 'NetworkManager',
          'ubuntu' => 'systemd-resolved',
        }[platform]
      end

      it "restarts network service" do
        is_expected.to restart_network_service('restart')

        is_expected.to write_log("Restarting '#{network_service_name}' service, platform #{platform} '#{node['platform_version']}'")

        is_expected.to restart_service(network_service_name)
          .with(ignore_failure: true)
      end
    end
  end
end

describe 'network_service:reload' do
  for_all_oses do |platform, version|
    context "on #{platform}#{version}" do
      cached(:chef_run) do
        runner = runner(platform: platform, version: version, step_into: ['network_service'])
        ConvergeNetworkService.reload(runner)
      end
      cached(:network_service_name) do
        {
          'amazon' => 'network',
          'centos' => 'network',
          'redhat' => 'NetworkManager',
          'ubuntu' => 'systemd-resolved',
        }[platform]
      end

      it 'reloads network_service' do
        is_expected.to reload_network_service('reload')
      end

      if platform == 'ubuntu'
        it "applies network configuration" do
          is_expected.to run_execute("apply network configuration")
            .with(command: "netplan apply")
            .with(timeout: 60)
        end

        it "doesn't restart network service" do
          is_expected.not_to restart_service(network_service_name)
        end
      else
        it "restarts network service" do
          is_expected.to restart_service(network_service_name)
        end
      end
    end
  end
end