Skip to content

Commit

Permalink
Add support for filtering agents based on agent's name and state
Browse files Browse the repository at this point in the history
Pull out the repetitive agent filtering code a re-usable function

Fix filtering env vars from environments
  • Loading branch information
nikhilsbhat committed Aug 9, 2023
1 parent 968aee7 commit 4ab710f
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 77 deletions.
131 changes: 61 additions & 70 deletions cmd/agents.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
)

var (
agentsDisabled bool
agentName, agentID string
agentEnvironments, agentResources, agentOS []string
)
Expand Down Expand Up @@ -62,35 +63,7 @@ func getAgentsCommand() *cobra.Command {
return err
}

if len(agentResources) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
for _, resource := range agentResources {
return funk.Contains(agent.Resources, resource)
}

return false
}).([]gocd.Agent)
}

if len(agentEnvironments) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
for _, environment := range agentEnvironments {
return funk.Contains(getEnvironmentNames(agent.Environments), environment)
}

return false
}).([]gocd.Agent)
}

if len(agentOS) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
for _, os := range agentOS {
return funk.Contains(agent.OS, os)
}

return false
}).([]gocd.Agent)
}
response = filterAgentsResponse(response)

if len(jsonQuery) != 0 {
cliLogger.Debugf(queryEnabledMessage, jsonQuery)
Expand All @@ -109,12 +82,7 @@ func getAgentsCommand() *cobra.Command {
},
}

getAgentsCmd.PersistentFlags().StringSliceVarP(&agentResources, "resource", "", nil,
"list of resource names to filter the agents from")
getAgentsCmd.PersistentFlags().StringSliceVarP(&agentEnvironments, "environment", "", nil,
"list of environment names to filter the agents from")
getAgentsCmd.PersistentFlags().StringSliceVarP(&agentOS, "os", "", nil,
"list of operating system names to filter the agents from")
registerAgentsFilterFlags(getAgentsCmd)

return getAgentsCmd
}
Expand Down Expand Up @@ -272,35 +240,7 @@ func listAgentsCommand() *cobra.Command {
return err
}

if len(agentResources) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
for _, resource := range agentResources {
return funk.Contains(agent.Resources, resource)
}

return false
}).([]gocd.Agent)
}

if len(agentEnvironments) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
for _, environment := range agentEnvironments {
return funk.Contains(getEnvironmentNames(agent.Environments), environment)
}

return false
}).([]gocd.Agent)
}

if len(agentOS) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
for _, os := range agentOS {
return funk.Contains(agent.OS, os)
}

return false
}).([]gocd.Agent)
}
response = filterAgentsResponse(response)

agents := make([]map[string]string, 0)

Expand All @@ -317,12 +257,7 @@ func listAgentsCommand() *cobra.Command {
},
}

listAgentsCmd.PersistentFlags().StringSliceVarP(&agentResources, "resource", "", nil,
"list of resource names to filter the agents from")
listAgentsCmd.PersistentFlags().StringSliceVarP(&agentEnvironments, "environment", "", nil,
"list of environment names to filter the agents from")
listAgentsCmd.PersistentFlags().StringSliceVarP(&agentOS, "os", "", nil,
"list of operating system names to filter the agents from")
registerAgentsFilterFlags(listAgentsCmd)

return listAgentsCmd
}
Expand Down Expand Up @@ -424,3 +359,59 @@ func getEnvironmentNames(environments any) []string {

return envNames
}

func filterAgentsResponse(response []gocd.Agent) []gocd.Agent {
if agentsDisabled {
response = funk.Filter(response, func(agent gocd.Agent) bool {
return agent.ConfigState == "Disabled"
}).([]gocd.Agent)
}

if len(agentName) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
return funk.Contains(agent.Name, agentName)
}).([]gocd.Agent)
}

if len(agentOS) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
for _, os := range agentOS {
return funk.Contains(agent.OS, os)
}

return false
}).([]gocd.Agent)
}

if len(agentResources) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
for _, resource := range agentResources {
return funk.Contains(agent.Resources, resource)
}

return false
}).([]gocd.Agent)
}

if len(agentEnvironments) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
for _, environment := range agentEnvironments {
return funk.Contains(getEnvironmentNames(agent.Environments), environment)
}

return false
}).([]gocd.Agent)
}

if len(agentOS) != 0 {
response = funk.Filter(response, func(agent gocd.Agent) bool {
for _, os := range agentOS {
return funk.Contains(agent.OS, os)
}

return false
}).([]gocd.Agent)
}

return response
}
18 changes: 11 additions & 7 deletions cmd/environments.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,10 @@ func getEnvironmentsCommand() *cobra.Command {
envVars := make([]gocd.EnvVars, 0)
for _, environment := range response {
for _, envVar := range environment.EnvVars {
if funk.Contains(environmentVariables, envVar.Name) {
envVars = append(envVars, envVar)
for _, environmentVariable := range environmentVariables {
if funk.Contains(envVar.Name, environmentVariable) {
envVars = append(envVars, envVar)
}
}
}
}
Expand Down Expand Up @@ -136,8 +138,10 @@ func getEnvironmentCommand() *cobra.Command {
if len(environmentVariables) != 0 {
envVars := make([]gocd.EnvVars, 0)
for _, envVar := range response.EnvVars {
if funk.Contains(environmentVariables, envVar.Name) {
envVars = append(envVars, envVar)
for _, environmentVariable := range environmentVariables {
if funk.Contains(envVar.Name, environmentVariable) {
envVars = append(envVars, envVar)
}
}
}

Expand Down Expand Up @@ -322,13 +326,13 @@ func listEnvironmentsCommand() *cobra.Command {
return err
}

var environments []string
var goCdEnvironments []string

for _, environment := range response {
environments = append(environments, environment.Name)
goCdEnvironments = append(goCdEnvironments, environment.Name)
}

return cliRenderer.Render(strings.Join(environments, "\n"))
return cliRenderer.Render(strings.Join(goCdEnvironments, "\n"))
},
}

Expand Down
13 changes: 13 additions & 0 deletions cmd/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,19 @@ func registerAgentsFlags(cmd *cobra.Command) {
"name of the agent on whom the action is to be performed")
}

func registerAgentsFilterFlags(cmd *cobra.Command) {
cmd.PersistentFlags().StringSliceVarP(&agentResources, "resource", "", nil,
"list of resource names to filter the agents from")
cmd.PersistentFlags().StringSliceVarP(&agentEnvironments, "environment", "", nil,
"list of environment names to filter the agents from")
cmd.PersistentFlags().StringSliceVarP(&agentOS, "os", "", nil,
"list of operating system names to filter the agents from")
cmd.PersistentFlags().BoolVarP(&agentsDisabled, "disabled", "", false,
"when enabled, it fetches only the disabled agents")
cmd.PersistentFlags().StringVarP(&agentName, "name", "", "",
"agent's name or pattern to match while filtering the results")
}

func registerJobsNStageFlags(cmd *cobra.Command) {
cmd.PersistentFlags().StringVarP(&stageConfig.Pipeline, "pipeline", "", "",
"pipeline name from which the jobs/stage to be triggered")
Expand Down

0 comments on commit 4ab710f

Please sign in to comment.