1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.jclouds.compute.predicates;
20  
21  import java.util.concurrent.TimeUnit;
22  
23  import javax.annotation.Resource;
24  import javax.inject.Inject;
25  import javax.inject.Named;
26  
27  import org.jclouds.compute.reference.ComputeServiceConstants;
28  import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts;
29  import org.jclouds.logging.Logger;
30  import org.jclouds.net.IPSocket;
31  import org.jclouds.predicates.RetryablePredicate;
32  import org.jclouds.predicates.SocketOpen;
33  
34  import com.google.common.base.Predicate;
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  public class RetryIfSocketNotYetOpen implements Predicate<IPSocket> {
45     @Resource
46     @Named(ComputeServiceConstants.COMPUTE_LOGGER)
47     private Logger logger = Logger.NULL;
48  
49     private final SocketOpen socketTester;
50     private long seconds;
51  
52     public RetryIfSocketNotYetOpen seconds(long seconds) {
53        this.seconds = seconds;
54        return this;
55     }
56  
57     @Inject
58     public RetryIfSocketNotYetOpen(SocketOpen socketTester, Timeouts timeouts) {
59        this.socketTester = socketTester;
60        this.seconds = timeouts.portOpen;
61     }
62  
63     public RetryIfSocketNotYetOpen(SocketOpen socketTester, Logger logger, long seconds) {
64        this.socketTester = socketTester;
65        this.logger = logger;
66        this.seconds = seconds;
67     }
68  
69     @Override
70     public String toString() {
71        return "retryIfSocketNotYetOpen(" + seconds + ")";
72     }
73  
74     @Override
75     public boolean apply(IPSocket socket) {
76        logger.debug(">> blocking on socket %s for %d seconds", socket, seconds);
77        RetryablePredicate<IPSocket> tester = new RetryablePredicate<IPSocket>(socketTester, seconds, 1, TimeUnit.SECONDS);
78        boolean passed = tester.apply(socket);
79        if (passed)
80           logger.debug("<< socket %s opened", socket);
81        else
82           logger.warn("<< socket %s didn't open after %d seconds", socket, seconds);
83        return passed;
84     }
85  }