Skip to content

Instantly share code, notes, and snippets.

@webcoyote
Created July 7, 2014 22:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save webcoyote/3804a219e743275a0d22 to your computer and use it in GitHub Desktop.
Save webcoyote/3804a219e743275a0d22 to your computer and use it in GitHub Desktop.
Rollbar provisioning - create teams and projects for Rollbar.com
#!/usr/bin/env ruby
# by Patrick Wyatt
require 'json'
require 'net/http'
require 'openssl'
require 'uri'
class Rollbar
def initialize (read_token, write_token)
@read_token = read_token
@write_token = write_token
end
##############################################################################
# Users
##############################################################################
def get_user (user_id)
raise Error, "Invalid type '#{user_id.class}'" unless user_id.is_a?(Numeric)
parse_response get("#{URL}/user/#{user_id}?access_token=#{@read_token}")
end
##############################################################################
# Invites
##############################################################################
def invite_user (team_name_or_id, email)
team_id = get_team_id(team_name_or_id)
parse_response post(
"#{URL}/team/#{team_id}/invites?access_token=#{@write_token}",
{ email: email.to_s }
)
end
##############################################################################
# Teams
##############################################################################
def list_teams
parse_response get("#{URL}/teams?access_token=#{@read_token}")
end
def get_team (team_name_or_id)
case
when team_name_or_id.is_a?(Numeric)
parse_response get("#{URL}/team/#{team_name_or_id.to_i}?access_token=#{@read_token}")
when team_name_or_id.is_a?(String)
team = list_teams.find { |t| t['name'] == team_name_or_id }
raise Error, "Team '#{team_name_or_id}' not found" if team.nil?
team
when team_name_or_id.is_a?(Symbol)
get_team(team_name_or_id.to_s)
else
raise Error, "Invalid type '#{team_name_or_id.class}'"
end
end
def create_team (name, access_level = :standard)
raise Error, "Unknown access level '#{access_level}'" unless TEAM_ACCESS_LEVELS.include?(access_level)
parse_response post(
"#{URL}/teams?access_token=#{@write_token}",
{ name: name.to_s, access_level: access_level.to_s }
)
# ROLLBAR BUG: If team already exists it returns a 422 error
end
def team_members (team_name_or_id)
team_id = get_team_id(team_name_or_id)
parse_response get("#{URL}/team/#{team_id}/users?access_token=#{@read_token}")
end
def team_members_info (team_name_or_id)
users = []
team_members(team_name_or_id).each do |member|
users << get_user(member['user_id'])
end
users
end
def team_projects (team_name_or_id)
id = get_team_id(team_name_or_id)
parse_response get("#{URL}/team/#{id}/projects?access_token=#{@read_token}")
end
def team_projects_info (team_name_or_id)
projects = []
team_projects(team_name_or_id).each do |project|
projects << get_project(project['project_id'])
end
projects
end
def add_project_to_team (project_name_or_id, team_name_or_id)
project_id = get_project_id(project_name_or_id)
team_id = get_team_id(team_name_or_id)
parse_response put("#{URL}/team/#{team_id}/project/#{project_id}?access_token=#{@write_token}")
end
##############################################################################
# Projects
##############################################################################
def list_projects
parse_response get("#{URL}/projects?access_token=#{@read_token}")
end
def get_project (project_name_or_id)
case
when project_name_or_id.is_a?(Numeric)
parse_response get("#{URL}/project/#{project_name_or_id.to_i}?access_token=#{@read_token}")
when project_name_or_id.is_a?(String)
project = list_projects.find { |t| t['name'] == project_name_or_id }
raise Error, "Project '#{project_name_or_id}' not found" if project.nil?
project
when project_name_or_id.is_a?(Symbol)
get_project(project_name_or_id.to_s)
else
raise Error, "Invalid type '#{project_name_or_id.class}'"
end
end
def create_project (name)
parse_response post(
"#{URL}/projects?access_token=#{@write_token}",
{ name: name.to_s }
)
# ROLLBAR BUG: If project already exists it returns a 422 error
end
private
URL = "https://api.rollbar.com/api/1".freeze
TEAM_ACCESS_LEVELS = [ :standard, :light ].freeze
INIT_HEADER = {'Content-Type' => 'application/json'}.freeze
def get_team_id (team_name_or_id)
return team_name_or_id if team_name_or_id.is_a?(Numeric)
get_team(team_name_or_id)['id']
end
def get_project_id (project_name_or_id)
return project_name_or_id if project_name_or_id.is_a?(Numeric)
get_project(project_name_or_id)['id']
end
def parse_response (response)
raise Error, "HTTP request failed #{response.code} #{response.message}" unless response.code == "200"
json = JSON.parse(response.body)
raise Error, "Service error #{json['err']}" unless json['err'] == 0
json['result']
end
def init_request (uri)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true if uri.scheme == "https"
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http
end
def get (url)
uri = URI.parse(url)
http = init_request(uri)
http.get(uri, initheader = INIT_HEADER)
end
def post (url, body)
uri = URI.parse(url)
http = init_request(uri)
http.post(uri, body.to_json, initheader = INIT_HEADER)
end
def put (url, body = {})
uri = URI.parse(url)
http = init_request(uri)
http.put(uri, body.to_json, initheader = INIT_HEADER)
end
class Error < StandardError ; end
end
if __FILE__ == $0
$stderr.puts "ERROR: This is a library file which doesn't do anything by itself."
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment