Navigation Menu

Skip to content

Commit

Permalink
Merged revisions 11754-11755,11763-11766,11770,11773-11777,11791-1179…
Browse files Browse the repository at this point in the history
…7,11828-11829,11831-11839,11841-11843,11850,11854,11994,12774,12778-12793,12820-12822,12831-12841,12854-12855,12860-12882,12896-12905,12914-12920,12938-12941,12950,13045-13046,13048,13063-13064,13066,13072-13076,13111,13122-13147,13150,13153-13158,13487-13488,13851-13852,13854-13856,13859,13866-13867,13869,13872-13876,13878-13879,13883-13885,13887-13890,13896-13919 via svnmerge from

https://www.dev.java.net/svn/hudson/branches/multiple-computer-per-node

................
  r11754 | kohsuke | 2008-08-25 17:59:14 -0700 (Mon, 25 Aug 2008) | 3 lines
  
  Adding EphemeralNode for non-persisted dynamically-allocated expandable/shrinkable slave pool.
  
  Tweaked the serialization of Hudson.slaves accordingly.
................
  r11755 | kohsuke | 2008-08-25 18:10:42 -0700 (Mon, 25 Aug 2008) | 1 line
  
  making a small improvements
................
  r11763 | kohsuke | 2008-08-26 13:57:25 -0700 (Tue, 26 Aug 2008) | 1 line
  
  adding more convenience methods
................
  r11764 | kohsuke | 2008-08-26 14:24:20 -0700 (Tue, 26 Aug 2008) | 1 line
  
  ported mask capability from the TFS plugin to the core.
................
  r11765 | kohsuke | 2008-08-26 14:26:25 -0700 (Tue, 26 Aug 2008) | 1 line
  
  making it non-final to allow for subclassing
................
  r11766 | kohsuke | 2008-08-26 14:35:20 -0700 (Tue, 26 Aug 2008) | 1 line
  
  test case for NodeList
................
  r11770 | kohsuke | 2008-08-26 15:15:21 -0700 (Tue, 26 Aug 2008) | 3 lines
  
  Wrote a simple tool that monitors a file system change (in a poor way) and triggers a build.
................
  r11773 | kohsuke | 2008-08-26 17:20:30 -0700 (Tue, 26 Aug 2008) | 1 line
  
  made more structured
................
  r11774 | kohsuke | 2008-08-26 17:47:41 -0700 (Tue, 26 Aug 2008) | 1 line
  
  indentation fix
................
  r11775 | kohsuke | 2008-08-26 17:48:22 -0700 (Tue, 26 Aug 2008) | 1 line
  
  remove the use of a deprecated feature.
................
  r11776 | kohsuke | 2008-08-26 17:51:54 -0700 (Tue, 26 Aug 2008) | 1 line
  
  renamed to 'ALL' to be consistent with recent use of DescriptorList
................
  r11777 | kohsuke | 2008-08-26 18:04:17 -0700 (Tue, 26 Aug 2008) | 1 line
  
  adding NodeFactory list and its configuration mechanism
................
  r11791 | kohsuke | 2008-08-27 09:43:38 -0700 (Wed, 27 Aug 2008) | 1 line
  
  picked up the latest jelly with Iterable support in <j:forEach>
................
  r11792 | kohsuke | 2008-08-27 09:44:08 -0700 (Wed, 27 Aug 2008) | 1 line
  
  Iterable support added in  commons-jelly 1.1-hudson-20080826
................
  r11793 | kohsuke | 2008-08-27 10:15:14 -0700 (Wed, 27 Aug 2008) | 2 lines
  
  - added name to NodeFactory for binding NodeFactory to URL tree.
  - NodeFactory should be access controlled
................
  r11794 | kohsuke | 2008-08-27 10:41:11 -0700 (Wed, 27 Aug 2008) | 1 line
  
  added a method to add one Node at a time
................
  r11795 | kohsuke | 2008-08-27 10:41:37 -0700 (Wed, 27 Aug 2008) | 1 line
  
  added permission constatnt
................
  r11796 | kohsuke | 2008-08-27 10:42:13 -0700 (Wed, 27 Aug 2008) | 1 line
  
  allowing the launch method to throw an exception.
................
  r11797 | kohsuke | 2008-08-27 10:44:13 -0700 (Wed, 27 Aug 2008) | 1 line
  
  improving the handling
................
  r11828 | kohsuke | 2008-08-29 11:07:16 -0700 (Fri, 29 Aug 2008) | 1 line
  
  added executor config to the sidebar.
................
  r11829 | kohsuke | 2008-08-29 11:16:11 -0700 (Fri, 29 Aug 2008) | 1 line
  
  "it" should be assigned to NodeFactory
................
  r11831 | kohsuke | 2008-08-29 11:44:41 -0700 (Fri, 29 Aug 2008) | 1 line
  
  formatting changes
................
  r11832 | kohsuke | 2008-08-29 11:59:21 -0700 (Fri, 29 Aug 2008) | 1 line
  
  added a script to create a flashing image from any picture
................
  r11833 | kohsuke | 2008-08-29 12:07:56 -0700 (Fri, 29 Aug 2008) | 1 line
  
  doc improvement.
................
  r11834 | kohsuke | 2008-08-29 13:37:59 -0700 (Fri, 29 Aug 2008) | 1 line
  
  added new images to indicate that a slave is launching
................
  r11835 | kohsuke | 2008-08-29 13:43:41 -0700 (Fri, 29 Aug 2008) | 1 line
  
  indicate a launching slave accordingly.
................
  r11836 | kohsuke | 2008-08-29 14:02:28 -0700 (Fri, 29 Aug 2008) | 1 line
  
  added a method to remove a Node.
................
  r11837 | kohsuke | 2008-08-29 14:02:38 -0700 (Fri, 29 Aug 2008) | 1 line
  
  disconnect
................
  r11838 | kohsuke | 2008-08-29 14:03:22 -0700 (Fri, 29 Aug 2008) | 1 line
  
  formatting changes
................
  r11839 | kohsuke | 2008-08-29 14:14:04 -0700 (Fri, 29 Aug 2008) | 1 line
  
  allowing subclasses.
................
  r11841 | kohsuke | 2008-08-29 14:28:29 -0700 (Fri, 29 Aug 2008) | 1 line
  
  constructor should be the first in the definition.
................
  r11842 | kohsuke | 2008-08-29 14:31:01 -0700 (Fri, 29 Aug 2008) | 1 line
  
  doc improvement.
................
  r11843 | kohsuke | 2008-08-29 14:32:48 -0700 (Fri, 29 Aug 2008) | 1 line
  
  fixed a problem of using partially constructed object during launch(), because the setNode() method is called from the Computer constructor.
................
  r11850 | kohsuke | 2008-08-29 14:50:36 -0700 (Fri, 29 Aug 2008) | 1 line
  
  serialize NodeFactory first so that references to them from NodeList will become references in XML.
................
  r11854 | kohsuke | 2008-08-29 14:56:56 -0700 (Fri, 29 Aug 2008) | 1 line
  
  cleaning up a bit.
................
  r11994 | kohsuke | 2008-09-03 14:42:11 -0700 (Wed, 03 Sep 2008) | 21 lines
  
  Fixed ArrayIndexOutOfBoundsException during replace(), when the title contains a '$' literal.
  
  The typical stack trace looks like:
  
  Caused by: java.lang.ArrayIndexOutOfBoundsException: 32
          at hudson.MarkupText$SubText.start(MarkupText.java:95)
          at hudson.MarkupText$SubText.group(MarkupText.java:131)
          at hudson.MarkupText$SubText.replace(MarkupText.java:154)
          at hudson.MarkupText$SubText.surroundWith(MarkupText.java:83)
          at 
  hudson.plugins.jira.JiraChangeLogAnnotator.annotate(JiraChangeLogAnnotator.java:37)
          at 
  hudson.scm.ChangeLogSet$Entry.getMsgAnnotated(ChangeLogSet.java:117)
          ... 148 more
  
  Vijayan Jayaraman and I found this problem while we were looking at the server log of Hudson for OpenJFX.
  
  Adding a unit test to verify this behavior, too.  
................
  r12774 | kohsuke | 2008-10-27 15:03:36 -0700 (Mon, 27 Oct 2008) | 3 lines
  
  preparing for heterogenousness in Node, so that different Node can be configured with different UIs, much like how different Jobs can be configured.
  
  Creating a slave works also like creating a new job.
................
  r12778 | kohsuke | 2008-10-27 15:06:51 -0700 (Mon, 27 Oct 2008) | 1 line
  
  We need to be able to create an emtpy Slave initially, so we have to do with the check in the form field validation.
................
  r12779 | kohsuke | 2008-10-27 15:48:04 -0700 (Mon, 27 Oct 2008) | 1 line
  
  making the new slave page a two-step process
................
  r12780 | kohsuke | 2008-10-27 15:48:24 -0700 (Mon, 27 Oct 2008) | 1 line
  
  fixed a compilation problem
................
  r12781 | kohsuke | 2008-10-27 15:53:30 -0700 (Mon, 27 Oct 2008) | 1 line
  
  bug fixes
................
  r12782 | kohsuke | 2008-10-27 15:58:20 -0700 (Mon, 27 Oct 2008) | 1 line
  
  bug fixes
................
  r12783 | kohsuke | 2008-10-27 16:08:56 -0700 (Mon, 27 Oct 2008) | 1 line
  
  making the configuration page work for slaves
................
  r12784 | kohsuke | 2008-10-27 16:35:17 -0700 (Mon, 27 Oct 2008) | 1 line
  
  added new-computer.svg
................
  r12785 | kohsuke | 2008-10-27 16:37:26 -0700 (Mon, 27 Oct 2008) | 1 line
  
  hooking up the config/create pages to the UI
................
  r12786 | kohsuke | 2008-10-27 16:44:40 -0700 (Mon, 27 Oct 2008) | 1 line
  
  fixed a copy method.
................
  r12787 | kohsuke | 2008-10-27 16:47:33 -0700 (Mon, 27 Oct 2008) | 1 line
  
  code was broken when a slave was renamed
................
  r12788 | kohsuke | 2008-10-27 16:58:04 -0700 (Mon, 27 Oct 2008) | 1 line
  
  moving out the commonality into a new tag
................
  r12789 | kohsuke | 2008-10-27 17:01:21 -0700 (Mon, 27 Oct 2008) | 1 line
  
  consistent term usage
................
  r12790 | kohsuke | 2008-10-27 17:03:19 -0700 (Mon, 27 Oct 2008) | 1 line
  
  retiring the configureExecutors. Slave configuration is now moved to individual slave page
................
  r12791 | kohsuke | 2008-10-27 17:10:32 -0700 (Mon, 27 Oct 2008) | 1 line
  
  retired configureExecutors.jelly and completed moved its contents to somewhere else
................
  r12792 | kohsuke | 2008-10-27 17:21:53 -0700 (Mon, 27 Oct 2008) | 1 line
  
  bug fix. request handling of "/descriptor/FQCN/..." was broken.
................
  r12793 | kohsuke | 2008-10-27 17:27:08 -0700 (Mon, 27 Oct 2008) | 1 line
  
  NodeFactory -> Cloud to encourage consistent term usage between the code and the UI.
................
  r12820 | kohsuke | 2008-10-29 10:58:20 -0700 (Wed, 29 Oct 2008) | 1 line
  
  formatting fix
................
  r12821 | kohsuke | 2008-10-29 11:17:49 -0700 (Wed, 29 Oct 2008) | 1 line
  
  added classes for handling a secret and prevent accidental exposure of a secret in the persisted form
................
  r12822 | kohsuke | 2008-10-29 11:32:39 -0700 (Wed, 29 Oct 2008) | 1 line
  
  added a base64 validator
................
  r12831 | kohsuke | 2008-10-29 15:58:45 -0700 (Wed, 29 Oct 2008) | 1 line
  
  secret key needs to be persisted outside config.xml (and it is, already!)
................
  r12832 | kohsuke | 2008-10-29 16:06:28 -0700 (Wed, 29 Oct 2008) | 1 line
  
  started working on Amazon EC2 plugin
................
  r12833 | kohsuke | 2008-10-29 16:09:20 -0700 (Wed, 29 Oct 2008) | 1 line
  
  brought the same enhancement as in <textbox />
................
  r12834 | kohsuke | 2008-10-29 16:15:05 -0700 (Wed, 29 Oct 2008) | 1 line
  
  copy over the onclick handler from the original button element
................
  r12835 | kohsuke | 2008-10-29 17:01:04 -0700 (Wed, 29 Oct 2008) | 1 line
  
  allow OK messages to be sent with some mark up.
................
  r12836 | kohsuke | 2008-10-29 17:06:52 -0700 (Wed, 29 Oct 2008) | 1 line
  
  added connection testing. This pattern needs to be generalized since it happens often
................
  r12837 | kohsuke | 2008-10-29 17:13:11 -0700 (Wed, 29 Oct 2008) | 1 line
  
  this is little better
................
  r12838 | kohsuke | 2008-10-29 17:17:44 -0700 (Wed, 29 Oct 2008) | 1 line
  
  added spinner
................
  r12839 | kohsuke | 2008-10-29 17:31:54 -0700 (Wed, 29 Oct 2008) | 1 line
  
  restructuring the validation button support in a form that can be readily moved to the core.
................
  r12840 | kohsuke | 2008-10-29 18:01:41 -0700 (Wed, 29 Oct 2008) | 1 line
  
  added <f:validateButton/> for multi-field server-side validation
................
  r12841 | kohsuke | 2008-10-29 18:03:12 -0700 (Wed, 29 Oct 2008) | 1 line
  
  logic moved to <f:validateButton/> in the core.
................
  r12854 | kohsuke | 2008-10-30 13:32:58 -0700 (Thu, 30 Oct 2008) | 1 line
  
  @QueryParameter.value won't be necessary any more
................
  r12855 | kohsuke | 2008-10-30 13:42:58 -0700 (Thu, 30 Oct 2008) | 1 line
  
  need a strongly-typed constructor.
................
  r12860 | kohsuke | 2008-10-30 15:24:18 -0700 (Thu, 30 Oct 2008) | 1 line
  
  adding more reflection support, which in turn we use in taglibs to raise the level of abstraction.
................
  r12861 | kohsuke | 2008-10-30 15:33:22 -0700 (Thu, 30 Oct 2008) | 1 line
  
  added a tag to create databinding to a<select> element from an enum property
................
  r12862 | kohsuke | 2008-10-30 15:37:44 -0700 (Thu, 30 Oct 2008) | 1 line
  
  adding a smarter bi-directional binding through <f:repeatable field="..."/>
................
  r12863 | kohsuke | 2008-10-30 15:47:48 -0700 (Thu, 30 Oct 2008) | 1 line
  
  making progress with the EC2 support
................
  r12864 | kohsuke | 2008-10-30 16:12:34 -0700 (Thu, 30 Oct 2008) | 1 line
  
  added form field validation for AMI ID
................
  r12865 | kohsuke | 2008-10-30 16:15:44 -0700 (Thu, 30 Oct 2008) | 1 line
  
  added simpler version
................
  r12866 | kohsuke | 2008-10-30 16:17:15 -0700 (Thu, 30 Oct 2008) | 1 line
  
  doc improvement
................
  r12867 | kohsuke | 2008-10-30 16:17:19 -0700 (Thu, 30 Oct 2008) | 1 line
  
  simplified a bit
................
  r12868 | kohsuke | 2008-10-30 16:40:25 -0700 (Thu, 30 Oct 2008) | 1 line
  
  doc improvement
................
  r12869 | kohsuke | 2008-10-30 17:00:57 -0700 (Thu, 30 Oct 2008) | 1 line
  
  adding the provisioning of the new slave
................
  r12870 | kohsuke | 2008-10-30 17:07:27 -0700 (Thu, 30 Oct 2008) | 1 line
  
  /** {@inheritdoc} */ is the default behavior for javadoc, so there's no point in making that explicit.
................
  r12871 | kohsuke | 2008-10-30 17:11:04 -0700 (Thu, 30 Oct 2008) | 1 line
  
  doc bug fix
................
  r12872 | kohsuke | 2008-10-30 17:17:20 -0700 (Thu, 30 Oct 2008) | 1 line
  
  simplified a bit
................
  r12873 | kohsuke | 2008-10-30 17:19:06 -0700 (Thu, 30 Oct 2008) | 1 line
  
  added RetentionStrategy for EC2 instances
................
  r12874 | kohsuke | 2008-10-30 17:21:17 -0700 (Thu, 30 Oct 2008) | 1 line
  
  allowing subclasses to override the disconnect behavior.
................
  r12875 | kohsuke | 2008-10-30 18:02:35 -0700 (Thu, 30 Oct 2008) | 1 line
  
  added termination
................
  r12876 | kohsuke | 2008-10-30 18:05:30 -0700 (Thu, 30 Oct 2008) | 1 line
  
  forgot to rename when NodeFactory was renamed to Cloud
................
  r12877 | kohsuke | 2008-10-30 18:06:08 -0700 (Thu, 30 Oct 2008) | 1 line
  
  using the console icon
................
  r12878 | kohsuke | 2008-10-30 18:17:20 -0700 (Thu, 30 Oct 2008) | 1 line
  
  adding UI to remove a slave.
................
  r12879 | kohsuke | 2008-10-30 18:48:57 -0700 (Thu, 30 Oct 2008) | 1 line
  
  commons-discovery now needed in stapler
................
  r12880 | kohsuke | 2008-10-30 18:50:27 -0700 (Thu, 30 Oct 2008) | 1 line
  
  needs to use a newer version of stapler
................
  r12881 | kohsuke | 2008-10-30 18:51:02 -0700 (Thu, 30 Oct 2008) | 1 line
  
  Bye bye CVS
................
  r12882 | kohsuke | 2008-10-30 18:51:43 -0700 (Thu, 30 Oct 2008) | 1 line
  
  Bye bye CVS
................
  r12896 | kohsuke | 2008-10-31 14:52:07 -0700 (Fri, 31 Oct 2008) | 1 line
  
  fixed the ordering between field and the mighty get(String) method.
................
  r12897 | kohsuke | 2008-10-31 15:08:41 -0700 (Fri, 31 Oct 2008) | 1 line
  
  fixed test compilation problems
................
  r12898 | kohsuke | 2008-10-31 15:11:25 -0700 (Fri, 31 Oct 2008) | 1 line
  
  marking this as a model object since it's always bound to URL.
................
  r12899 | kohsuke | 2008-10-31 15:13:42 -0700 (Fri, 31 Oct 2008) | 1 line
  
  adding UI hook up to manually provision a new node
................
  r12900 | kohsuke | 2008-10-31 15:14:00 -0700 (Fri, 31 Oct 2008) | 1 line
  
  after merging the trunk the version number is different
................
  r12901 | kohsuke | 2008-10-31 15:21:54 -0700 (Fri, 31 Oct 2008) | 1 line
  
  adding UI hook up for provisioning a new slave
................
  r12902 | kohsuke | 2008-10-31 15:45:10 -0700 (Fri, 31 Oct 2008) | 1 line
  
  adding a hook to decorate ComputerLauncher.
................
  r12903 | kohsuke | 2008-10-31 15:48:21 -0700 (Fri, 31 Oct 2008) | 1 line
  
  added filtering support
................
  r12904 | kohsuke | 2008-10-31 15:52:45 -0700 (Fri, 31 Oct 2008) | 1 line
  
  added view
................
  r12905 | kohsuke | 2008-10-31 15:53:49 -0700 (Fri, 31 Oct 2008) | 1 line
  
  doc improvement
................
  r12914 | kohsuke | 2008-11-01 17:45:57 -0700 (Sat, 01 Nov 2008) | 1 line
  
  adding code for connecting with SSH
................
  r12915 | kohsuke | 2008-11-01 17:49:28 -0700 (Sat, 01 Nov 2008) | 1 line
  
  working on launchers
................
  r12916 | kohsuke | 2008-11-01 18:33:12 -0700 (Sat, 01 Nov 2008) | 1 line
  
  added a method to fully read a stream
................
  r12917 | kohsuke | 2008-11-01 18:33:45 -0700 (Sat, 01 Nov 2008) | 1 line
  
  bumped up stapler
................
  r12918 | kohsuke | 2008-11-01 18:39:41 -0700 (Sat, 01 Nov 2008) | 1 line
  
  doc improvement.
................
  r12919 | kohsuke | 2008-11-01 18:45:24 -0700 (Sat, 01 Nov 2008) | 1 line
  
  added a launcher
................
  r12920 | kohsuke | 2008-11-01 18:55:02 -0700 (Sat, 01 Nov 2008) | 1 line
  
  implementing the actual ComputerLauncher
................
  r12938 | kohsuke | 2008-11-02 08:56:05 -0800 (Sun, 02 Nov 2008) | 1 line
  
  support the field notation
................
  r12939 | kohsuke | 2008-11-02 09:20:21 -0800 (Sun, 02 Nov 2008) | 1 line
  
  added the mechanism to execute the init script
................
  r12940 | kohsuke | 2008-11-02 09:21:38 -0800 (Sun, 02 Nov 2008) | 1 line
  
  simplification
................
  r12941 | kohsuke | 2008-11-02 09:36:21 -0800 (Sun, 02 Nov 2008) | 1 line
  
  adding key handling
................
  r12950 | kohsuke | 2008-11-03 11:00:58 -0800 (Mon, 03 Nov 2008) | 1 line
  
  formatting changes
................
  r13045 | kohsuke | 2008-11-06 15:24:32 -0800 (Thu, 06 Nov 2008) | 1 line
  
  adding time series datatype for retaining load average statistics in memory
................
  r13046 | kohsuke | 2008-11-06 15:59:02 -0800 (Thu, 06 Nov 2008) | 1 line
  
  added a convenience method.
................
  r13048 | kohsuke | 2008-11-06 16:21:54 -0800 (Thu, 06 Nov 2008) | 2 lines
  
  - started monitoring # of executor statistics.
  - exposed label to the remote API
................
  r13063 | kohsuke | 2008-11-07 13:05:15 -0800 (Fri, 07 Nov 2008) | 1 line
  
  added a convenience method.
................
  r13064 | kohsuke | 2008-11-07 13:11:08 -0800 (Fri, 07 Nov 2008) | 1 line
  
  monitor the length of the queue too
................
  r13066 | kohsuke | 2008-11-07 14:15:56 -0800 (Fri, 07 Nov 2008) | 1 line
  
  moved the stats to its own class.
................
  r13072 | kohsuke | 2008-11-07 15:40:29 -0800 (Fri, 07 Nov 2008) | 1 line
  
  adding provisioning logic based on load statistics
................
  r13073 | kohsuke | 2008-11-07 15:46:00 -0800 (Fri, 07 Nov 2008) | 1 line
  
  for effective testing, we need sub-sec precision
................
  r13074 | kohsuke | 2008-11-07 16:24:44 -0800 (Fri, 07 Nov 2008) | 1 line
  
  fixed a lie.
................
  r13075 | kohsuke | 2008-11-07 16:25:12 -0800 (Fri, 07 Nov 2008) | 1 line
  
  bug fix
................
  r13076 | kohsuke | 2008-11-07 16:30:55 -0800 (Fri, 07 Nov 2008) | 1 line
  
  avoid using deprecated methods
................
  r13111 | kohsuke | 2008-11-09 11:54:23 -0800 (Sun, 09 Nov 2008) | 1 line
  
  added the Future<?> return parameter to Computer.launch(). To do this w/o breaking compatibility, renamed launch to connect.
................
  r13122 | kohsuke | 2008-11-10 14:38:03 -0800 (Mon, 10 Nov 2008) | 1 line
  
  allow programmatic update of the assigned label
................
  r13123 | kohsuke | 2008-11-10 14:38:40 -0800 (Mon, 10 Nov 2008) | 1 line
  
  Iterator not needed because CopyOnWriteArrayList doesn't support removal via iterator.
................
  r13124 | kohsuke | 2008-11-10 14:39:24 -0800 (Mon, 10 Nov 2008) | 1 line
  
  added another Builder for tests
................
  r13125 | kohsuke | 2008-11-10 14:39:48 -0800 (Mon, 10 Nov 2008) | 1 line
  
  simplified a bit. This TestEnvironment stuff needs some clearer story.
................
  r13126 | kohsuke | 2008-11-10 14:46:40 -0800 (Mon, 10 Nov 2008) | 1 line
  
  IDEA complains about this.
................
  r13127 | kohsuke | 2008-11-10 14:51:53 -0800 (Mon, 10 Nov 2008) | 1 line
  
  improved the error diagnostics by displaying why a provisioned node failed to launch
................
  r13128 | kohsuke | 2008-11-10 14:52:12 -0800 (Mon, 10 Nov 2008) | 1 line
  
  Started a test case for NodeProvisioner
................
  r13129 | kohsuke | 2008-11-10 14:52:27 -0800 (Mon, 10 Nov 2008) | 1 line
  
  formatting changes
................
  r13130 | kohsuke | 2008-11-10 15:16:02 -0800 (Mon, 10 Nov 2008) | 1 line
  
  report the failure as a failure.
................
  r13131 | kohsuke | 2008-11-10 16:34:23 -0800 (Mon, 10 Nov 2008) | 1 line
  
  adding a parameter to the connect method to support joining to the pending launch activity.
................
  r13132 | kohsuke | 2008-11-10 16:38:31 -0800 (Mon, 10 Nov 2008) | 1 line
  
  making members public so that it can be accessed from other classes (DummyCloudImpl was the first to do this)
................
  r13133 | kohsuke | 2008-11-10 16:38:58 -0800 (Mon, 10 Nov 2008) | 1 line
  
  split the cloud implementation to a separate class to allow reuse.
................
  r13134 | kohsuke | 2008-11-10 16:56:27 -0800 (Mon, 10 Nov 2008) | 1 line
  
  assign unique names to support multiple jobs
................
  r13135 | kohsuke | 2008-11-10 17:11:31 -0800 (Mon, 10 Nov 2008) | 1 line
  
  avoid unnecessary interruption
................
  r13136 | kohsuke | 2008-11-10 17:11:41 -0800 (Mon, 10 Nov 2008) | 1 line
  
  adding another test case
................
  r13137 | kohsuke | 2008-11-10 17:16:28 -0800 (Mon, 10 Nov 2008) | 1 line
  
  cleaned up a test case
................
  r13138 | kohsuke | 2008-11-10 17:36:52 -0800 (Mon, 10 Nov 2008) | 1 line
  
  since the setNode method is called on every Computer just by adding a new node, don't force a new launch attempt.
................
  r13139 | kohsuke | 2008-11-10 17:37:38 -0800 (Mon, 10 Nov 2008) | 1 line
  
  perform orderly shutdown by giving computers enough time to disconnect.
................
  r13140 | kohsuke | 2008-11-10 17:38:08 -0800 (Mon, 10 Nov 2008) | 3 lines
  
  return Future for synchronization.
  
  This breaks binary compatibility, but I checked none of the plugins in Hudson SVN uses this, so I hope this is OK.
................
  r13141 | kohsuke | 2008-11-10 17:38:46 -0800 (Mon, 10 Nov 2008) | 1 line
  
  improved diagnostics
................
  r13142 | kohsuke | 2008-11-10 17:39:55 -0800 (Mon, 10 Nov 2008) | 1 line
  
  removed compiler warning
................
  r13143 | kohsuke | 2008-11-10 18:02:56 -0800 (Mon, 10 Nov 2008) | 1 line
  
  hide the rounding related problem from Cloud by passing int instead of float.
................
  r13144 | kohsuke | 2008-11-10 18:10:10 -0800 (Mon, 10 Nov 2008) | 1 line
  
  bug fix
................
  r13145 | kohsuke | 2008-11-10 18:11:51 -0800 (Mon, 10 Nov 2008) | 1 line
  
  formatting changes
................
  r13146 | kohsuke | 2008-11-10 18:15:08 -0800 (Mon, 10 Nov 2008) | 1 line
  
  moved the slave launch code to HudsonTestCase for reuse
................
  r13147 | kohsuke | 2008-11-10 18:20:19 -0800 (Mon, 10 Nov 2008) | 1 line
  
  adding another test case
................
  r13150 | kohsuke | 2008-11-11 07:28:53 -0800 (Tue, 11 Nov 2008) | 1 line
  
  bug fix
................
  r13153 | kohsuke | 2008-11-11 14:04:21 -0800 (Tue, 11 Nov 2008) | 1 line
  
  cutting down the test size to 5 to increase the test speed
................
  r13154 | kohsuke | 2008-11-11 14:04:37 -0800 (Tue, 11 Nov 2008) | 1 line
  
  improved debuggability
................
  r13155 | kohsuke | 2008-11-11 14:10:04 -0800 (Tue, 11 Nov 2008) | 1 line
  
  added another convenience method
................
  r13156 | kohsuke | 2008-11-11 14:10:21 -0800 (Tue, 11 Nov 2008) | 1 line
  
  further reduce the test turn around time
................
  r13157 | kohsuke | 2008-11-11 14:22:03 -0800 (Tue, 11 Nov 2008) | 1 line
  
  doc improvement and clean up
................
  r13158 | kohsuke | 2008-11-11 14:22:28 -0800 (Tue, 11 Nov 2008) | 1 line
  
  added a new metho
................
  r13487 | kohsuke | 2008-12-09 17:17:30 -0800 (Tue, 09 Dec 2008) | 1 line
  
  SlaveTemplate needs to be able to computer # of executors.
................
  r13488 | kohsuke | 2008-12-09 17:18:05 -0800 (Tue, 09 Dec 2008) | 1 line
  
  fixed a compilation problem with the latest head of the branch
................
  r13851 | kohsuke | 2008-12-24 13:40:43 -0800 (Wed, 24 Dec 2008) | 82 lines
  
  fixed a dead lock reported by Jesse.
  
  Found one Java-level deadlock:
  =============================
  "Executor #0 for master":
     waiting to lock monitor 0x09409bac (object 0x87474ca0, a hudson.util.CopyOnWriteMap$Hash),
     which is held by "main"
  "main":
     waiting to lock monitor 0x09409b48 (object 0x87474d48, a hudson.model.Hudson$MasterComputer),
     which is held by "Executor #0 for master"
  
  Java stack information for the threads listed above:
  ===================================================
  "Executor #0 for master":
  	at hudson.util.CopyOnWriteMap.remove(CopyOnWriteMap.java:78)
  	- waiting to lock <0x87474ca0> (a hudson.util.CopyOnWriteMap$Hash)
  	at hudson.model.Hudson.removeComputer(Hudson.java:717)
  	at hudson.model.Computer.removeExecutor(Computer.java:433)
  	- locked <0x87474d48> (a hudson.model.Hudson$MasterComputer)
  	at hudson.model.Executor.run(Executor.java:65)
  	- locked <0x87474d48> (a hudson.model.Hudson$MasterComputer)
  "main":
  	at hudson.model.Computer.setNumExecutors(Computer.java:338)
  	- waiting to lock <0x87474d48> (a hudson.model.Hudson$MasterComputer)
  	at hudson.model.Computer.setNode(Computer.java:327)
  	at hudson.model.Hudson.updateComputer(Hudson.java:704)
  	at hudson.model.Hudson.updateComputerList(Hudson.java:685)
  	- locked <0x87474ca0> (a hudson.util.CopyOnWriteMap$Hash)
  	at hudson.model.Hudson.setNodes(Hudson.java:1076)
  	at hudson.model.Hudson.addNode(Hudson.java:1060)
  	- locked <0x87474cb0> (a hudson.model.Hudson)
  	at org.jvnet.hudson.test.HudsonTestCase.createSlave(HudsonTestCase.java:247)
  	at hudson.slaves.NodeProvisionerTest.testBaselineSlaveUsage(NodeProvisionerTest.java:86)
  	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  	at java.lang.reflect.Method.invoke(Method.java:597)
  	at junit.framework.TestCase.runTest(TestCase.java:154)
  	at org.jvnet.hudson.test.HudsonTestCase.runTest(HudsonTestCase.java:151)
  	at junit.framework.TestCase.runBare(TestCase.java:127)
  	at junit.framework.TestResult$1.protect(TestResult.java:106)
  	at junit.framework.TestResult.runProtected(TestResult.java:124)
  	at junit.framework.TestResult.run(TestResult.java:109)
  	at junit.framework.TestCase.run(TestCase.java:118)
  	at junit.framework.TestSuite.runTest(TestSuite.java:208)
  	at junit.framework.TestSuite.run(TestSuite.java:203)
  	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  	at java.lang.reflect.Method.invoke(Method.java:597)
  	at org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213)
  	at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
  	at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
  	at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
  	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  	at java.lang.reflect.Method.invoke(Method.java:597)
  	at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
  	at org.apache.maven.surefire.booter.SurefireBooter.run(SurefireBooter.java:241)
  	at org.apache.maven.plugin.surefire.SurefirePlugin.execute(SurefirePlugin.java:537)
  	at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:447)
  	at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:539)
  	at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:480)
  	at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:459)
  	at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:311)
  	at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:278)
  	at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:143)
  	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:333)
  	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:126)
  	at org.apache.maven.cli.MavenCli.main(MavenCli.java:282)
  	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  	at java.lang.reflect.Method.invoke(Method.java:597)
  	at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
  	at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
  	at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
  	at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
  
  Found 1 deadlock.
................
  r13852 | kohsuke | 2008-12-24 14:32:29 -0800 (Wed, 24 Dec 2008) | 1 line
  
  bug fix in the test case.
................
  r13854 | kohsuke | 2008-12-24 15:20:22 -0800 (Wed, 24 Dec 2008) | 2 lines
  
  Using a new version of Rhino to get a proper exception chaining.
................
  r13855 | kohsuke | 2008-12-24 15:22:13 -0800 (Wed, 24 Dec 2008) | 1 line
  
  typo
................
  r13856 | kohsuke | 2008-12-24 15:37:56 -0800 (Wed, 24 Dec 2008) | 1 line
  
  CR shouldn't be in the repository
................
  r13859 | kohsuke | 2008-12-24 15:50:32 -0800 (Wed, 24 Dec 2008) | 3 lines
  
  Fixed svn:eol-style.
................
  r13866 | kohsuke | 2008-12-24 21:26:43 -0800 (Wed, 24 Dec 2008) | 3 lines
  
  Copying rev.13860 to retry a merge that now looks suspicious.
................
  r13869 | kohsuke | 2008-12-24 22:03:46 -0800 (Wed, 24 Dec 2008) | 2 lines
  
  The 2nd merge was successful, so adopting the successful merge as the multiple-computer-per-node branch.
................
  r13872 | kohsuke | 2008-12-25 07:28:37 -0800 (Thu, 25 Dec 2008) | 1 line
  
  fixed a test failure
................
  r13873 | kohsuke | 2008-12-25 08:16:49 -0800 (Thu, 25 Dec 2008) | 1 line
  
  expanded NodeProvisioner to work on per-label basis
................
  r13874 | kohsuke | 2008-12-25 08:27:32 -0800 (Thu, 25 Dec 2008) | 1 line
  
  bug fix
................
  r13875 | kohsuke | 2008-12-25 08:33:17 -0800 (Thu, 25 Dec 2008) | 1 line
  
  bug fix
................
  r13876 | kohsuke | 2008-12-25 08:45:03 -0800 (Thu, 25 Dec 2008) | 3 lines
  
  [HUDSON-2605] Strangely, I discovered that on some File, which is new File("./target/hudson-for-test"), file.exists()==false but file.getAbsoluteFile().exists()==true.
  
  It looks like this happens when $PWD of the process at the OS level is different from System.getProperty("user.dir")
................
  r13878 | kohsuke | 2008-12-25 15:52:45 -0800 (Thu, 25 Dec 2008) | 1 line
  
  added a marker file
................
  r13879 | kohsuke | 2008-12-25 15:53:13 -0800 (Thu, 25 Dec 2008) | 1 line
  
  use marker file to find the hudson main workspace.
................
  r13883 | kohsuke | 2008-12-26 07:50:44 -0800 (Fri, 26 Dec 2008) | 1 line
  
  avoid using a deprecated method.
................
  r13884 | kohsuke | 2008-12-26 07:50:59 -0800 (Fri, 26 Dec 2008) | 1 line
  
  adding more probes
................
  r13885 | kohsuke | 2008-12-26 08:15:42 -0800 (Fri, 26 Dec 2008) | 1 line
  
  for analyzing test failures, capturing the output is crucial.
................
  r13887 | kohsuke | 2008-12-26 11:25:12 -0800 (Fri, 26 Dec 2008) | 1 line
  
  allow sub-types to intercept mutation
................
  r13888 | kohsuke | 2008-12-26 11:26:01 -0800 (Fri, 26 Dec 2008) | 1 line
  
  clouds need to be taken into account before marking a label as pointless.
................
  r13889 | kohsuke | 2008-12-26 11:26:40 -0800 (Fri, 26 Dec 2008) | 3 lines
  
  fixing bugs in NodeProvisioner.
  
  Conservative estimate on idle executors have to be max, not min.
................
  r13890 | kohsuke | 2008-12-26 11:42:53 -0800 (Fri, 26 Dec 2008) | 1 line
  
  turns out the problem was that we were adding multiple slaves under the same name, which confused Hudson to no end.
................
  r13896 | kohsuke | 2008-12-27 07:44:20 -0800 (Sat, 27 Dec 2008) | 1 line
  
  formatting changes
................
  r13897 | kohsuke | 2008-12-27 07:45:00 -0800 (Sat, 27 Dec 2008) | 1 line
  
  reprot the test name to stdout so that one can easily distinguish different tests in target/surefire-reports/xyz-output.txt
................
  r13898 | kohsuke | 2008-12-27 07:54:53 -0800 (Sat, 27 Dec 2008) | 1 line
  
  doc improvement
................
  r13899 | kohsuke | 2008-12-27 09:59:07 -0800 (Sat, 27 Dec 2008) | 1 line
  
  split the functionality into two classes
................
  r13900 | kohsuke | 2008-12-27 10:00:29 -0800 (Sat, 27 Dec 2008) | 1 line
  
  doc improvement
................
  r13901 | kohsuke | 2008-12-27 10:06:24 -0800 (Sat, 27 Dec 2008) | 1 line
  
  added 'tick'
................
  r13902 | kohsuke | 2008-12-27 10:08:04 -0800 (Sat, 27 Dec 2008) | 1 line
  
  adding graph rendering of the load statistics
................
  r13903 | kohsuke | 2008-12-27 10:19:41 -0800 (Sat, 27 Dec 2008) | 1 line
  
  improved graph layout
................
  r13904 | kohsuke | 2008-12-27 10:21:05 -0800 (Sat, 27 Dec 2008) | 1 line
  
  Picker -> TimeScale to better reflect what it is.
................
  r13905 | kohsuke | 2008-12-27 10:40:27 -0800 (Sat, 27 Dec 2008) | 1 line
  
  duplicate
................
  r13906 | kohsuke | 2008-12-27 14:39:36 -0800 (Sat, 27 Dec 2008) | 1 line
  
  renamed to a shorter name
................
  r13907 | kohsuke | 2008-12-27 15:03:25 -0800 (Sat, 27 Dec 2008) | 1 line
  
  added icons
................
  r13908 | kohsuke | 2008-12-27 16:20:37 -0800 (Sat, 27 Dec 2008) | 1 line
  
  renamed to make 'loadStatistics' the URL binding.
................
  r13909 | kohsuke | 2008-12-27 16:21:01 -0800 (Sat, 27 Dec 2008) | 1 line
  
  exposing loadStatistics for Computer for better URL binding
................
  r13910 | kohsuke | 2008-12-27 16:21:16 -0800 (Sat, 27 Dec 2008) | 1 line
  
  adding UI support
................
  r13911 | kohsuke | 2008-12-27 19:31:43 -0800 (Sat, 27 Dec 2008) | 1 line
  
  added some basic visualization
................
  r13912 | kohsuke | 2008-12-27 19:35:10 -0800 (Sat, 27 Dec 2008) | 1 line
  
  if there's no description, don't even show it.
................
  r13913 | kohsuke | 2008-12-27 19:39:26 -0800 (Sat, 27 Dec 2008) | 1 line
  
  added load statistics page for the label as well.
................
  r13914 | kohsuke | 2008-12-27 19:48:55 -0800 (Sat, 27 Dec 2008) | 1 line
  
  added one more convenience method.
................
  r13915 | kohsuke | 2008-12-27 19:54:29 -0800 (Sat, 27 Dec 2008) | 1 line
  
  refactored so that a different Dataset can be fed.
................
  r13916 | kohsuke | 2008-12-27 19:59:20 -0800 (Sat, 27 Dec 2008) | 1 line
  
  added global load statistics lnk to the management screen.
................
  r13917 | kohsuke | 2008-12-27 20:31:01 -0800 (Sat, 27 Dec 2008) | 1 line
  
  <dt>s should use the bold font to distinguish them from <dd>s
................
  r13918 | kohsuke | 2008-12-27 20:35:10 -0800 (Sat, 27 Dec 2008) | 1 line
  
  added description of what the graph means.
................
  r13919 | kohsuke | 2008-12-27 20:35:39 -0800 (Sat, 27 Dec 2008) | 1 line
  
  added description of what the graph means.
................
  • Loading branch information
kohsuke committed Jan 7, 2009
1 parent 1d57c66 commit 4688aaf
Show file tree
Hide file tree
Showing 11 changed files with 440 additions and 45 deletions.
8 changes: 4 additions & 4 deletions pom.xml
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>org.jvnet.hudson.plugins</groupId>
<artifactId>plugin</artifactId>
<version>1.251</version>
<version>1.258</version>
<relativePath>../pom.xml</relativePath>
</parent>

Expand All @@ -24,19 +24,19 @@
<groupId>org.jvnet.hudson.main</groupId>
<artifactId>hudson-war</artifactId>
<type>war</type>
<version>1.252-SNAPSHOT</version>
<version>1.259-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jvnet.hudson.main</groupId>
<artifactId>hudson-core</artifactId>
<version>1.252-SNAPSHOT</version>
<version>1.259-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jvnet.hudson.main</groupId>
<artifactId>hudson-test-harness</artifactId>
<version>1.252-SNAPSHOT</version>
<version>1.259-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
Expand Down
122 changes: 110 additions & 12 deletions src/main/java/hudson/plugins/ec2/EC2Cloud.java
@@ -1,29 +1,37 @@
package hudson.plugins.ec2;

import com.xerox.amazonws.ec2.EC2Exception;
import com.xerox.amazonws.ec2.InstanceType;
import com.xerox.amazonws.ec2.Jec2;
import com.xerox.amazonws.ec2.KeyPairInfo;
import hudson.model.Descriptor;
import hudson.model.Hudson;
import hudson.model.Computer;
import hudson.model.Node;
import hudson.slaves.Cloud;
import hudson.slaves.NodeProvisioner.PlannedNode;
import hudson.util.FormFieldValidator;
import hudson.util.Secret;
import hudson.scheduler.CronTabList;
import hudson.util.StreamTaskListener;
import org.apache.commons.io.FileUtils;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.QueryParameter;

import javax.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.io.ObjectStreamException;
import java.io.InvalidObjectException;
import java.io.StringWriter;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.logging.Logger;
import java.util.Set;
import java.util.Collection;
import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.logging.Level;

import com.xerox.amazonws.ec2.Jec2;
import com.xerox.amazonws.ec2.EC2Exception;
import com.xerox.amazonws.ec2.InstanceType;
import antlr.ANTLRException;
import java.util.logging.Logger;

/**
* Hudson's view of EC2.
Expand All @@ -34,10 +42,11 @@ public class EC2Cloud extends Cloud {
private final String accessId;
private final Secret secretKey;
private final List<SlaveTemplate> templates;
private transient KeyPairInfo usableKeyPair;

@DataBoundConstructor
public EC2Cloud(String name, String accessId, String secretKey, List<SlaveTemplate> templates) {
super(name);
public EC2Cloud(String accessId, String secretKey, List<SlaveTemplate> templates) {
super("ec2");
this.accessId = accessId.trim();
this.secretKey = Secret.fromString(secretKey.trim());
this.templates = templates;
Expand All @@ -62,6 +71,95 @@ public List<SlaveTemplate> getTemplates() {
return Collections.unmodifiableList(templates);
}

public SlaveTemplate getTemplate(String ami) {
for (SlaveTemplate t : templates)
if(t.ami.equals(ami))
return t;
return null;
}

/**
* Gets or creates a new key such that Hudson knows both the private and
* the public key. The key can be then used to launch an instance and
* connect to it.
*/
public synchronized KeyPairInfo getUsableKeyPair() throws EC2Exception, IOException {
if(usableKeyPair!=null) return usableKeyPair;

// check the current key list and find one that we know the private key
Jec2 ec2 = connect();
Set<String> keyNames = new HashSet<String>();
for( KeyPairInfo kpi : ec2.describeKeyPairs(Collections.<String>emptyList())) {
keyNames.add(kpi.getKeyName());
File privateKey = getKeyFileName(kpi);
if(privateKey.exists()) {
usableKeyPair = new KeyPairInfo(kpi.getKeyName(),kpi.getKeyFingerprint(),
FileUtils.readFileToString(privateKey));
return usableKeyPair;
}
}

// none available, so create a new key
for( int i=0; ; i++ ) {
if(keyNames.contains("hudson-"+i)) continue;

KeyPairInfo r = ec2.createKeyPair("hudson-"+i);
FileUtils.writeStringToFile(getKeyFileName(r),r.getKeyMaterial());
usableKeyPair = r;

return usableKeyPair;
}
}

private File getKeyFileName(KeyPairInfo kpi) {
return new File(Hudson.getInstance().getRootDir(),"ec2-"+kpi.getKeyName()+".privateKey");
}

public void doProvision(StaplerRequest req, StaplerResponse rsp, @QueryParameter String ami) throws ServletException, IOException {
checkPermission(PROVISION);
if(ami==null) {
sendError("The 'ami' query parameter is missing",req,rsp);
return;
}
SlaveTemplate t = getTemplate(ami);
if(t==null) {
sendError("No such AMI: "+ami,req,rsp);
return;
}

StringWriter sw = new StringWriter();
StreamTaskListener listener = new StreamTaskListener(sw);
try {
EC2Slave node = t.provision(listener);
Hudson.getInstance().addNode(node);

rsp.sendRedirect2(req.getContextPath()+"/computer/"+node.getNodeName());
} catch (EC2Exception e) {
e.printStackTrace(listener.error(e.getMessage()));
sendError(sw.toString(),req,rsp);
}
}

@Override
public Collection<PlannedNode> provision(int i) {
// TODO: when we support labels, we can make more intelligent decisions about which AMI to start
// for a given provisioning request.
final SlaveTemplate t = templates.get(0);

List<PlannedNode> r = new ArrayList<PlannedNode>();
for( ; i>0; i-- ) {
r.add(new PlannedNode(t.getDisplayName(),
Computer.threadPoolForRemoting.submit(new Callable<Node>() {
public Node call() throws Exception {
// TODO: record the output somewhere
return t.provision(new StreamTaskListener());
}
})
,t.getNumExecutors()));
}
return r;
}

public DescriptorImpl getDescriptor() {
return DescriptorImpl.INSTANCE;
}
Expand Down
50 changes: 50 additions & 0 deletions src/main/java/hudson/plugins/ec2/EC2Computer.java
@@ -1,11 +1,22 @@
package hudson.plugins.ec2;

import com.xerox.amazonws.ec2.EC2Exception;
import com.xerox.amazonws.ec2.Jec2;
import com.xerox.amazonws.ec2.ReservationDescription;
import com.xerox.amazonws.ec2.ReservationDescription.Instance;
import hudson.slaves.SlaveComputer;

import java.util.Collections;

/**
* @author Kohsuke Kawaguchi
*/
public class EC2Computer extends SlaveComputer {
/**
* Cached description of this EC2 instance. Lazily fetched.
*/
private volatile Instance ec2InstanceDescription;

public EC2Computer(EC2Slave slave) {
super(slave);
}
Expand All @@ -14,4 +25,43 @@ public EC2Computer(EC2Slave slave) {
public EC2Slave getNode() {
return (EC2Slave)super.getNode();
}

public String getInstanceId() {
return getName();
}

/**
* Gets the EC2 console output.
*/
public String getConsoleOutput() throws EC2Exception {
Jec2 ec2 = EC2Cloud.get().connect();
return ec2.getConsoleOutput(getInstanceId()).getOutput();
}

/**
* Obtains the instance state description in EC2.
*
* <p>
* This method returns a cached state, so it's not suitable to check {@link Instance#getState()}
* and {@link Instance#getStateCode()} from the returned instance (but all the other fields are valid as it won't change.)
*/
public Instance describeInstance() throws EC2Exception {
if(ec2InstanceDescription==null)
ec2InstanceDescription = _describeInstance();
return ec2InstanceDescription;
}

/**
* Gets the current state of the instance.
*
* <p>
* Unlike {@link #describeInstance()}, this method always return the current status by calling EC2.
*/
public InstanceState getState() throws EC2Exception {
return InstanceState.find(_describeInstance().getState());
}

private ReservationDescription.Instance _describeInstance() throws EC2Exception {
return EC2Cloud.get().connect().describeInstances(Collections.<String>singletonList(getNode().getInstanceId())).get(0).getInstances().get(0);
}
}
67 changes: 67 additions & 0 deletions src/main/java/hudson/plugins/ec2/EC2ComputerLauncher.java
@@ -0,0 +1,67 @@
package hudson.plugins.ec2;

import com.xerox.amazonws.ec2.EC2Exception;
import com.xerox.amazonws.ec2.ReservationDescription.Instance;
import hudson.slaves.ComputerLauncher;
import hudson.slaves.SlaveComputer;
import hudson.util.StreamTaskListener;

import java.io.IOException;
import java.io.PrintStream;

/**
* {@link ComputerLauncher} for EC2 that waits for the instance to really come up before proceeding to
* the real user-specified {@link ComputerLauncher}.
*
* @author Kohsuke Kawaguchi
*/
public abstract class EC2ComputerLauncher extends ComputerLauncher {
public void launch(SlaveComputer _computer, StreamTaskListener listener) {
try {
EC2Computer computer = (EC2Computer)_computer;
PrintStream logger = listener.getLogger();

Instance inst = computer.describeInstance();

// wait until EC2 instance comes up and post console output
boolean reportedWaiting = false;
OUTER:
while(true) {
switch (computer.getState()) {
case PENDING:
case RUNNING:
String console = computer.getConsoleOutput();
if(console==null || console.length()==0) {
if(!reportedWaiting) {
reportedWaiting = true;
logger.println("Waiting for the EC2 instance to boot up");
}
Thread.sleep(5000); // check every 5 secs
continue OUTER;
}
break OUTER;
case SHUTTING_DOWN:
case TERMINATED:
// abort
logger.println("The instance "+computer.getInstanceId()+" appears to be shut down. Aborting launch.");
return;
}
}

launch(computer, logger, inst);
} catch (EC2Exception e) {
e.printStackTrace(listener.error(e.getMessage()));
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}

}

/**
* Stage 2 of the launch. Called after the EC2 instance comes up.
*/
protected abstract void launch(EC2Computer computer, PrintStream logger, Instance inst)
throws EC2Exception, IOException, InterruptedException;
}
30 changes: 16 additions & 14 deletions src/main/java/hudson/plugins/ec2/EC2Slave.java
@@ -1,39 +1,41 @@
package hudson.plugins.ec2;

import com.xerox.amazonws.ec2.EC2Exception;
import com.xerox.amazonws.ec2.InstanceType;
import com.xerox.amazonws.ec2.Jec2;
import com.xerox.amazonws.ec2.EC2Exception;
import hudson.model.Descriptor.FormException;
import hudson.model.Slave;
import hudson.model.Computer;
import hudson.model.Descriptor.FormException;
import hudson.model.Hudson;
import hudson.slaves.ComputerLauncher;
import hudson.model.Slave;
import hudson.plugins.ec2.ssh.EC2UnixLauncher;
import hudson.slaves.NodeDescriptor;
import hudson.slaves.RetentionStrategy;
import hudson.slaves.SlaveComputer;
import org.kohsuke.stapler.DataBoundConstructor;

import java.util.concurrent.atomic.AtomicInteger;
import java.io.IOException;
import java.util.Collections;
import java.util.logging.Logger;
import java.util.logging.Level;
import java.io.IOException;
import java.util.logging.Logger;

/**
* Slave running on EC2.
*
* @author Kohsuke Kawaguchi
*/
public final class EC2Slave extends Slave {
public EC2Slave(String instanceId, String description, String remoteFS, InstanceType type, String label, ComputerLauncher launcher) throws FormException {
/**
* Comes from {@link SlaveTemplate#initScript}.
*/
public final String initScript;

public EC2Slave(String instanceId, String description, String remoteFS, InstanceType type, String label, String initScript) throws FormException {
// TODO: retention policy for Amazon
super(instanceId, description, remoteFS, toNumExecutors(type), Mode.NORMAL, label, launcher, new EC2RetentionStrategy());
super(instanceId, description, remoteFS, toNumExecutors(type), Mode.NORMAL, label, new EC2UnixLauncher(), new EC2RetentionStrategy());
this.initScript = initScript;
}

/**
* See http://aws.amazon.com/ec2/instance-types/
*/
private static int toNumExecutors(InstanceType it) {
/*package*/ static int toNumExecutors(InstanceType it) {
switch (it) {
case DEFAULT: return 1;
case MEDIUM_HCPU: return 5;
Expand All @@ -57,7 +59,7 @@ public Computer createComputer() {
}

/**
* Terminates the instance in EC2.
* Terminates the instance in EC2.f
*/
public void terminate() {
Jec2 ec2 = EC2Cloud.get().connect();
Expand Down

0 comments on commit 4688aaf

Please sign in to comment.