Skip to content

Commit

Permalink
pongasoft#66: implemented /agents/* REST API
Browse files Browse the repository at this point in the history
  • Loading branch information
ypujante committed Jul 29, 2011
1 parent b893c7a commit cf2fb5f
Show file tree
Hide file tree
Showing 3 changed files with 179 additions and 3 deletions.
Expand Up @@ -256,6 +256,29 @@ class UrlMappings
]
}

/**
* agents
*/
"/rest/v1/$fabric/agents"(controller: 'agents') {
action = [
HEAD: 'rest_count_agents',
GET: 'rest_list_agents'
]
}

name restViewAgent: "/rest/v1/$fabric/agent/$id"(controller: 'agents') {
action = [
GET: 'rest_view_agent'
]
}

"/rest/v1/$fabric/agents/versions"(controller: 'agents') {
action = [
GET: 'rest_list_agents_versions',
POST: 'rest_upgrade_agents_versions'
]
}

/**
* DEPRECATED: kept for backward compatibility only
*/
Expand Down
Expand Up @@ -27,13 +27,18 @@ import org.linkedin.glu.provisioner.plan.api.IStep.Type
import org.linkedin.glu.provisioner.core.model.SystemModel
import org.linkedin.glu.orchestration.engine.planner.PlannerService
import org.linkedin.glu.orchestration.engine.delta.DeltaService
import javax.servlet.http.HttpServletResponse
import org.linkedin.glu.agent.tracker.AgentInfo
import org.linkedin.glu.orchestration.engine.action.descriptor.NoOpActionDescriptor
import org.linkedin.glu.orchestration.engine.deployment.DeploymentService

/**
* @author ypujante@linkedin.com
*/
class AgentsController extends ControllerBase
{
AgentsService agentsService
DeploymentService deploymentService
PlannerService plannerService
DeltaService deltaService

Expand Down Expand Up @@ -375,6 +380,152 @@ class AgentsController extends ControllerBase
}
}

/**
* Retuns the count of agents (HEAD /agents)
*/
def rest_count_agents = {
Collection<AgentInfo> agents = agentsService.getAgentInfos(request.fabric)?.values()

if(agents)
{
response.addHeader("X-glu-count", agents.size().toString())
render ''
}
else
{
response.sendError(HttpServletResponse.SC_NO_CONTENT,
'no agents')
render ''
}
}

/**
* Retuns the list of agents (GET /agents)
*/
def rest_list_agents = {
Collection<AgentInfo> agents = agentsService.getAgentInfos(request.fabric)?.values()

if(agents)
{
def map = [:]
agents.each { AgentInfo agent ->
def agentMap = agent.agentProperties.findAll { !it.key.startsWith('java.') }
agentMap.viewURL = g.createLink(absolute: true,
mapping: 'restViewAgent',
id: agent.agentName,
params: [fabric: request.fabric.name]).toString()
map[agent.agentName] = agentMap
}
response.setContentType('text/json')
response.addHeader("X-glu-count", map.size().toString())
render prettyPrintJsonWhenRequested(map)
}
else
{
response.sendError(HttpServletResponse.SC_NO_CONTENT,
'no agents')
render ''
}
}

/**
* Retuns the agent view (GET /agent/<agentName>)
*/
def rest_view_agent = {
AgentInfo agent = agentsService.getAgentInfo(request.fabric, params.id)

if(agent)
{
def map = [:]
map['details'] = agent.agentProperties.findAll { !it.key.startsWith('java.') }
response.setContentType('text/json')
render prettyPrintJsonWhenRequested(map)
}
else
{
response.sendError(HttpServletResponse.SC_NOT_FOUND,
'no such agent')
render ''
}
}

/**
* Retuns the list of agents versions (GET /agents/versions)
*/
def rest_list_agents_versions = {
Collection<AgentInfo> agents = agentsService.getAgentInfos(request.fabric)?.values()

if(agents)
{
def map = [:]
agents.each { AgentInfo agent ->
map[agent.agentName] = agent.version
}
response.setContentType('text/json')
response.addHeader("X-glu-count", map.size().toString())
render prettyPrintJsonWhenRequested(map)
}
else
{
response.sendError(HttpServletResponse.SC_NO_CONTENT,
'no agents')
render ''
}
}

/**
* Creates a plan for upgrading the agent (POST /agents/versions)
*/
def rest_upgrade_agents_versions = {
if(!params.version || !params.coordinates)
{
response.sendError(HttpServletResponse.SC_BAD_REQUEST)
return
}

if(params.agents instanceof String)
{
params.agents = [params.agents]
}

def availableAgents = agentsService.getAgentInfos(request.fabric).keySet()

params.agents = params.agents?.findAll { availableAgents.contains(it) }

params.fabric = request.fabric
params.type = Type.valueOf(params.type ?: 'PARALLEL')

def plan =
plannerService.computeAgentsUpgradePlan(params,
[origin: 'rest', action: 'upgradeAgents', version: params.version])


if(plan?.hasLeafSteps())
{
if(plan.leafSteps.findAll { it.action instanceof NoOpActionDescriptor }.size() == plan.leafStepsCount)
{
response.sendError(HttpServletResponse.SC_NO_CONTENT,
'no plan created (already upgrading all agents)')
render ''
}
else
{
deploymentService.savePlan(plan)
response.addHeader('Location', g.createLink(absolute: true,
mapping: 'restPlan',
id: plan.id,
params: [fabric: request.fabric]).toString())
response.setStatus(HttpServletResponse.SC_CREATED)
render plan.id
}
}
else
{
response.sendError(HttpServletResponse.SC_NO_CONTENT, 'no plan created (nothing to upgrade)')
render ''
}
}

private def handleNoAgent(Closure closure)
{
try
Expand Down
Expand Up @@ -506,11 +506,12 @@ public class PlanController extends ControllerBase
planId: params.id,
fabric: request.fabric.name]).toString()
}
response.addHeader("X-glu-count", map.size().toString())
render prettyPrintJsonWhenRequested(map)
}
else
{
response.setStatus(HttpServletResponse.SC_NO_CONTENT,
response.sendError(HttpServletResponse.SC_NO_CONTENT,
'no execution for this plan')
render ''
}
Expand All @@ -533,11 +534,12 @@ public class PlanController extends ControllerBase
params: [fabric: request.fabric.name]).toString()
map[deployment.id] = deploymentMap
}
response.addHeader("X-glu-count", map.size().toString())
render prettyPrintJsonWhenRequested(map)
}
else
{
response.setStatus(HttpServletResponse.SC_NO_CONTENT,
response.sendError(HttpServletResponse.SC_NO_CONTENT,
'no current deployments')
render ''
}
Expand Down Expand Up @@ -616,7 +618,7 @@ public class PlanController extends ControllerBase
}
else
{
response.setStatus(HttpServletResponse.SC_NO_CONTENT,
response.sendError(HttpServletResponse.SC_NO_CONTENT,
'no current deployments')
render ''
}
Expand Down

0 comments on commit cf2fb5f

Please sign in to comment.