Created
July 7, 2014 22:40
-
-
Save webcoyote/3804a219e743275a0d22 to your computer and use it in GitHub Desktop.
Rollbar provisioning - create teams and projects for Rollbar.com
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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