Class: Jackal::CfnTools::CoppereggProbe

Inherits:
Jackal::Cfn::Resource
  • Object
show all
Defined in:
lib/jackal-copperegg/resources/probe.rb

Overview

Add or remove probes from a stack

Expected resource:

{
  "Type": "Custom::CoppereggProbe",
  "Properties": {
    "Parameters": {
      "Probes": [
        {
          ## required
          "ProbeDesc": "A description",
          "Type": "GET", # or POST, TCP, IMCP
          "ProbeDest": "http://localhost",
          ## optional
          "CheckContents": "match", # or nomatch
          "ContentMatch": "StringForComparison",
          "Frequency": 30,
          "Timeout": 10000,
          "Retries": 3,
          "Tags": "comma,delimited,tags",
          "Stations": ["LON"]
        }
      ]
    }
  }
}

Instance Method Summary collapse

Instance Method Details

#create_probes(args = {}) ⇒ TrueClass

Create new probes

Parameters:

  • args (Hash) (defaults to: {})

Options Hash (args):

  • :probes (Array<Hash>)

    probes to create

  • :response (Hash)

    cfn response message

Returns:

  • (TrueClass)


75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/jackal-copperegg/resources/probe.rb', line 75

def create_probes(args={})
  endpoint = generate_endpoint
  results = []
  args[:probes].each do |probe|
    probe_data = MultiJson.dump(rekey_hash(probe))
    debug "Attempting probe creation (#{probe_data.inspect})"
    results.push(
      endpoint.post(
        config.fetch(
          :copperegg,
          :revealuptime_create_path,
          '/v2/revealuptime/probes.json'
        ),
        probe_data,
        'Content-Type' => 'application/json'
      )
    )
  end
  errors = results.find_all do |result|
    result.status != 200
  end
  results -= errors
  results.map! do |result|
    MultiJson.load(result.body)['id']
  end
  if(errors.empty?)
    debug "Probes created: #{results.inspect}"
    args[:response]['PhysicalResourceId'] = Base64.urlsafe_encode64(
      MultiJson.dump(results)
    )
    args[:response]['Status'] = 'SUCCESS'
    args[:response]['Data']['Reason'] = "New copperegg probes added: #{results.size}"
  else
    probe_deletion(*results)
    args[:response]['Status'] = 'FAILED'
    args[:response]['Reason'] = "Probe creation failed: #{errors.map(&:body).map(&:strip).join(', ')}"
  end
  true
end

#delete_probes(args = {}) ⇒ TrueClass

Delete probes

Parameters:

  • args (Hash) (defaults to: {})

Options Hash (args):

  • :physical_resource_id (String)

    probes to delete

  • :response (Hash)

    cfn response message

Returns:

  • (TrueClass)


146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/jackal-copperegg/resources/probe.rb', line 146

def delete_probes(args={})
  begin
    ids = MultiJson.load(
      Base64.urlsafe_decode64(
        args[:physical_resource_id]
      )
    )
    results = probe_deletion(*ids)
    errors = results.find_all do |r|
      r.status != 200 && r.status != 404
    end
    results -= errors
    if(errors.empty?)
      args[:response]['Status'] = 'SUCCESS'
      args[:response]['Data']['Reason'] = "Probes removed (#{ids.count})"
    else
      args[:response]['Status'] = 'FAILED'
      args[:response]['Reason'] = "Probe deletion failed: #{errors.map(&:body).map(&:strip).join(', ')}"
    end
  rescue ArgumentError, MultiJson::ParseError
    args[:response]['Status'] = 'SUCCESS'
    args[:response]['Data']['Reason'] = 'No probes to delete!'
  end
  true
end

#execute(message) ⇒ Object

Process probe related action

Parameters:

  • message (Carnivore::Message)


38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/jackal-copperegg/resources/probe.rb', line 38

def execute(message)
  failure_wrap(message) do |payload|
    cfn_resource = rekey_hash(payload.get(:data, :cfn_resource))
    properties = rekey_hash(cfn_resource[:resource_properties])
    parameters = rekey_hash(properties[:parameters])
    cfn_response = build_response(cfn_resource)
    case cfn_resource[:request_type].to_sym
    when :create
      create_probes(
        :probes => [parameters[:probes]].flatten,
        :response => cfn_response
      )
    when :update
      error 'Update requested but not supported!'
      cfn_response['Status'] = 'FAILED'
      cfn_response['Reason'] = 'Updates are not supported on this resource'
    when :delete
      delete_probes(
        :physical_resource_id => cfn_resource[:physical_resource_id],
        :response => cfn_response
      )
    else
      error "Unknown request type received: #{payload[:request_type]}"
      cfn_response['Status'] = 'FAILED'
      cfn_response['Reason'] = 'Unknown request type received'
    end
    respond_to_stack(cfn_response, cfn_resource[:response_url])
    completed(payload, message)
  end
end

#generate_endpointPatron::Session

Returns:

  • (Patron::Session)


173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/jackal-copperegg/resources/probe.rb', line 173

def generate_endpoint
  url = URI.parse(
    config.fetch(
      :copperegg,
      :revealuptime_url,
      'https://api.copperegg.com'
    )
  )
  endpoint = http_endpoint(url.host, url.scheme)
  endpoint.username = config.get(:copperegg, :revealuptime_username)
  endpoint.password = config.get(:copperegg, :revealuptime_password)
  endpoint
end

#probe_deletion(*ids) ⇒ Array<Patron::Response>

Call API to delete probes

Parameters:

  • ids (String)

    probe id list

Returns:

  • (Array<Patron::Response>)


119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/jackal-copperegg/resources/probe.rb', line 119

def probe_deletion(*ids)
  endpoint = generate_endpoint
  ids.map do |probe_id|
    debug "Copperegg probe deletion ID: #{probe_id}"
    if(probe_id.to_s.strip.empty?)
      error 'Encountered an empty probe ID. Skipping.'
      nil
    else
      delete_path = File.join(
        config.fetch(
          :copperegg,
          :revealuptime_delete_path,
          '/v2/revealuptime/probes'
        ),
        "#{probe_id}.json"
      )
      endpoint.delete(delete_path)
    end
  end.compact
end