[Anthill-pro] Select a list of agents from an environment

emerson cargnin echofloripa.yell at gmail.com
Thu Jun 5 10:00:58 CDT 2008


Yes, thank you too!!! When I hear we would have to do it, this thread
came jumping to my memory : )

I saw there is a ExceptionService class in the anthill api. I was
wondering if that was the right way to make a workflow to fail.

ExceptionService.getInstance().handleSystemException(Exception)

regards
emerson


On 05/06/2008, Peter Steele <psteele at maxiscale.com> wrote:
> Hey, cool. Glad you are able to put my filter to good use, and I'll add
> your exception to my version. Thanks!
>
> Peter
>
> -----Original Message-----
> From: anthill-pro-bounces at lists.urbancode.com
> [mailto:anthill-pro-bounces at lists.urbancode.com] On Behalf Of emerson
> cargnin
> Sent: Thursday, June 05, 2008 4:01 AM
> To: AnthillPro user and support list.
> Subject: Re: [Anthill-pro] Select a list of agents from an environment
>
> Hi Peter
>
> It seems I will use your solution also. Our server support department
> asked the possibility to deploy to one server or sub-group of servers
> only.
>
> I changedyour script to take in account an already used very simple
> agent selection script that selects only server on a given tier
> (frontend/backend), which is defined at the project level.
>
> What I did to solve your problem was to throw an exception if the
> resulting list was empty.
>
> Here is the entire script:
>
> ------------------------------------------------------------------------
> import com.urbancode.anthill3.domain.agent.Agent;
> import com.urbancode.anthill3.runtime.scripting.helpers.*;
>
> Where anyWhere = new Where()
> {
>    public Agent[] filter(Agent[] agents)
>    {
>
>       String agentNames =
> BuildRequestLookup.getCurrent().getProperty("agentNames");
>
>       List agentList = new ArrayList();
>       System.out.println("agentNames:"+agentNames);
>       for (int c = 0; c < agents.length; c++)
> System.out.println("agents:"+agents[c]);
>       StringTokenizer tokens = new StringTokenizer(agentNames);
>       while (tokens.hasMoreTokens())
>       {
>            String agentName = tokens.nextToken();
>            for (int i = 0; i < agents.length; i++)
>            {
>                if (agents[i].getName().equals(agentName))
>                {
>                  String projectTier=PropertyLookup.getValue("tier");
>                  if
> (projectTier.equals(AgentVarHelper.getAgentVar(agents[i],"yellahp/agentT
> ype")))
>                  {
>                     agentList.add(agents[i]);
>                     break;
>                  }
>                }
>            }
>        }
>        if (agentList.size()==0) throw new Exception("No Agents
> matched environment and agent list");
>        Agent[] selectedAgents = new Agent[agentList.size()];
>        for (int i = 0; i < selectedAgents.length; i++)
>        {
>            selectedAgents[i] = (Agent)agentList.get(i);
>        }
>        return selectedAgents;
>    }
> };
> String agentNames = PropertyLookup.getValue("agentNames");
> if (agentNames==null||agentNames.length()==0||agentNames.equals("all"))
> return
> Where.is(Variable.matches("yellahp/agentType",PropertyLookup.getValue("t
> ier")));
> return Where.is(anyWhere);
> ------------------------------------------------------------------------
> -------------
>
>
>
>
> Also is it possible to get the error message of the script parser to
> show the right column and line?
>
> On 04/06/2008, Peter Steele <psteele at maxiscale.com> wrote:
> > I've tried out this change and it does indeed solve the problem. One
> > related issue though is the behavior of the filter when no agents
> match
> > the input parameters. For example, if a user tells the deploy workflow
> > to use the environment "Rack 3" but then mistakenly enters a list of
> > agents that are from environment "Rack 4", my agent filter ends up
> > returning an empty list of agents. The secondary workflow though still
> > runs. It doesn't do anything, just sits there with its status showing
> > "Running", and no agents are assigned to the workflow. It stays like
> > this forever and has to be explicitly abort. What is the proper way to
> > code the agent filter in a case like this so that the job will fail
> > immediately? I've included my filter below. I've tried returning
> "null"
> > from the filter method if the agent array's length is zero, but that
> > doesn't seem to be the right solution (the job fails with a
> > nullPointerException). Is there a better way?
> >
> > import com.urbancode.anthill3.domain.agent.Agent;
> > import com.urbancode.anthill3.runtime.scripting.helpers.*;
> >
> > Where myWhere = new Where()
> > {
> >    public Agent[] filter(Agent[] agents)
> >    {
> >        String agentNames =
> > BuildRequestLookup.getCurrent().getProperty("agentNames");
> >        if (agentNames.equals("all")) return agents;
> >
> >        List agentList = new ArrayList();
> >          StringTokenizer tokens = new StringTokenizer(agentNames);
> >        while (tokens.hasMoreTokens())
> >        {
> >            String agentName = tokens.nextToken();
> >            for (int i = 0; i < agents.length; i++)
> >            {
> >                if (agents[i].name.equals(agentName))
> >                {
> >                    agentList.add(agents[i]);
> >                    break;
> >                }
> >            }
> >        }
> >
> >        Agent[] selectedAgents = new Agent[agentList.size()];
> >          for (int i = 0; i < selectedAgents.length; i++)
> >          {
> >              selectedAgents[i] = (Agent)agentList.get(i);
> >        }
> >
> >        return selectedAgents;
> >    }
> > };
> >
> > return Where.is(myWhere);
> >
> > -----Original Message-----
> > From: anthill-pro-bounces at lists.urbancode.com
> > [mailto:anthill-pro-bounces at lists.urbancode.com] On Behalf Of Varban
> > Sent: Tuesday, May 27, 2008 11:15 AM
> > To: AnthillPro user and support list.
> > Subject: Re: [Anthill-pro] Select a list of agents from an environment
> >
> > Peter,
> >
> > we already have a fix for this in place, it will be available in the
> > next release. Let Steve know if you need a build right away. The only
> > change as far as you are concerned is that we'll pass all the agents
> > that are configured (online or otherwise) to the script and after the
> > script run we'll verify that whatever is returned is online otherwise
> > fail.
> >
> > Regards,
> > Varban
> >
> > Peter Steele wrote:
> > > As I have pointed out in my thread "Is this a feature, a bug, or
> user
> > > error?", the problem with this approach (as we have recently
> > discovered)
> > > is even if one agent is the environment is down, the secondary
> > workflow
> > > will not run. It doesn't matter if the user doesn't include this
> agent
> >
> > > in his list; if the filter specifies -1 as the agent count for the
> > > filter, Anthill seems to require all agents to be up in the selected
> > > environment before the workflow will run. This is a big issue for
> us;
> > > not sure what to do for a workaround...
> > >
> > >
> > >
> > > *From:* anthill-pro-bounces at lists.urbancode.com
> > > [mailto:anthill-pro-bounces at lists.urbancode.com] *On Behalf Of
> *Steve
> > Boone
> > > *Sent:* Tuesday, May 27, 2008 9:07 AM
> > > *To:* AnthillPro user and support list.
> > > *Subject:* Re: [Anthill-pro] Select a list of agents from an
> > environment
> > >
> > >
> > >
> > > To make it truly dynamic, the way you have it set up is the best
> > solution.
> > >
> > > It is a bit tedious to have to type the names of the agents in, but
> > this
> > > does have some benefits.  It will ensure that only those agents are
> > > used, and that an agent that should not get a job delegated to it,
> > won't.
> > >
> > > On Fri, May 9, 2008 at 7:38 PM, Peter Steele <psteele at maxiscale.com
> > > <mailto:psteele at maxiscale.com>> wrote:
> > >
> > > I am writing a deploy job that will be run as a non-originating
> > > workflow. We have set of machines that a build can potentially be
> > > deployed to, and I have these machines grouped in their own
> > environment.
> > > On a given run of the deploy workflow I want to be able to filter
> the
> > > list of agents that will be selected from this environment, for
> > example
> > > as a comma separated list that the user fills in when the secondary
> > > process is run:
> > >
> > >
> > >
> > >     Workflow:                  deploy server artifacts
> > >
> > >     Environment:             qa test servers
> > >
> > >     Servers to Populate:   qa-dataserv1,qa-dataserv2,qa-dataserv3
> > >
> > >     ...
> > >
> > >
> > >
> > > and so on. The "Servers to Populate" field is a simple text field
> > which
> > > the user fills in with the list of servers (agents) that he wants to
> > > deploy the build to. So, although the "qa test servers" environment
> > > might have 50 servers in it, on a given run the use can select the
> > > specific systems he's interested in.
> > >
> > >
> > >
> > > I created the agent filter below to accomplish this, and it seems to
> > > work well. My only issue is that requiring the user to enter the
> agent
> >
> > > names is a bit tedious, especially if they have to enter more than
> > three
> > > or four. Is there a better way I could accomplish what I'm trying to
> > do
> > > here? Being able to present the user with a full list of agents that
> > > they could select multiple entries from would be better for example.
> > As
> > > for the script itself, are there any improvements I could make?
> > >
> > >
> > >
> > > import com.urbancode.anthill3.domain.agent.Agent;
> > >
> > > import com.urbancode.anthill3.runtime.scripting.helpers.*;
> > >
> > >
> > >
> > > Where anyWhere = new Where()
> > >
> > > {
> > >
> > >     public Agent[] filter(Agent[] agents)
> > >
> > >     {
> > >
> > >         String agentNames =
> > BuildRequestLookup.getCurrent().getProperty("agentNames");
> > >
> > >         List agentList = new ArrayList();
> > >
> > >
> > >
> > >         for (String agentName : (agentNames +",").split(","))
> > >
> > >         {
> > >
> > >             for (int i = 0; i < agents.length; i++)
> > >
> > >             {
> > >
> > >                 if (agents[i].equals(agentName))
> > >
> > >                 {
> > >
> > >                     agentList.add(agents[i]);
> > >
> > >                     break;
> > >
> > >                 }
> > >
> > >             }
> > >
> > >         }
> > >
> > >         Agent[] selectedAgents = new Agent[agentList.size()];
> > >
> > >         for (int i = 0; i < selectedAgents.length; i++)
> > >
> > >         {
> > >
> > >             selectedAgents[i] = (Agent)agentList.get(i);
> > >
> > >         }
> > >
> > >
> > >
> > >         return selectedAgents;
> > >
> > >     }
> > >
> > > };
> > >
> > >
> > >
> > > return Where.is(anyWhere);
> > >
> > >
> > > _______________________________________________
> > > Anthill-pro mailing list
> > > Anthill-pro at lists.urbancode.com
> > <mailto:Anthill-pro at lists.urbancode.com>
> > > http://lists.urbancode.com/mailman/listinfo/anthill-pro
> > >
> > >
> > >
> > >
> > >
> >
> ------------------------------------------------------------------------
> > >
> > > _______________________________________________
> > > Anthill-pro mailing list
> > > Anthill-pro at lists.urbancode.com
> > > http://lists.urbancode.com/mailman/listinfo/anthill-pro
> > _______________________________________________
> > Anthill-pro mailing list
> > Anthill-pro at lists.urbancode.com
> > http://lists.urbancode.com/mailman/listinfo/anthill-pro
> > _______________________________________________
> > Anthill-pro mailing list
> > Anthill-pro at lists.urbancode.com
> > http://lists.urbancode.com/mailman/listinfo/anthill-pro
> >
> _______________________________________________
> Anthill-pro mailing list
> Anthill-pro at lists.urbancode.com
> http://lists.urbancode.com/mailman/listinfo/anthill-pro
> _______________________________________________
> Anthill-pro mailing list
> Anthill-pro at lists.urbancode.com
> http://lists.urbancode.com/mailman/listinfo/anthill-pro
>


More information about the Anthill-pro mailing list