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 }