voxpupuli/puppet_webhook

View on GitHub
lib/puppet_webhook/chatops/slack.rb

Summary

Maintainability
A
35 mins
Test Coverage
# frozen_string_literal: true

require 'slack-notifier'

module PuppetWebhook
  class Chatops
    # Sets up Slack object that will send notifications to Slack via a webhook.
    class Slack
      def initialize(channel, url, user, message, options = {})
        @channel = channel
        @url = url
        @user = user
        @message = message
        @options = options
      end

      def notify
        notifier = ::Slack::Notifier.new @url, http_options: @options[:http_options]

        target = if @message[:branch]
                   @message[:branch]
                 elsif @message[:module]
                   @message[:module]
                 end

        msg = format_message(target)

        notifier.post text: msg[:fallback],
                      channel: @channel,
                      username: @user,
                      icon_emoji: @options[:icon_emoji],
                      attachments: [msg]
      end

      private

      def format_message(target)
        message = {
          author: 'r10k for Puppet',
          title: "r10k deployment of Puppet environment #{target}"
        }

        case @message[:status_code]
        when 202
          message.merge!(
            color: 'good',
            text: "Successfully started deployment of #{target}",
            fallback: "Successfully started deployment of #{target}"
          )
        when 500
          message.merge!(
            color: 'bad',
            text: "Failed to deploy #{target}",
            fallback: "Failed to deploy #{target}"
          )
        end

        message
      end
    end
  end
end