1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.jclouds.vcloud.terremark.compute;
20
21 import java.util.Map;
22 import java.util.Set;
23 import java.util.concurrent.ConcurrentMap;
24 import java.util.concurrent.ExecutorService;
25
26 import javax.inject.Inject;
27 import javax.inject.Named;
28 import javax.inject.Provider;
29 import javax.inject.Singleton;
30
31 import org.jclouds.Constants;
32 import org.jclouds.collect.Memoized;
33 import org.jclouds.compute.ComputeServiceContext;
34 import org.jclouds.compute.callables.RunScriptOnNode;
35 import org.jclouds.compute.domain.Hardware;
36 import org.jclouds.compute.domain.Image;
37 import org.jclouds.compute.domain.NodeMetadata;
38 import org.jclouds.compute.domain.TemplateBuilder;
39 import org.jclouds.compute.internal.BaseComputeService;
40 import org.jclouds.compute.internal.PersistNodeCredentials;
41 import org.jclouds.compute.options.TemplateOptions;
42 import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts;
43 import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet;
44 import org.jclouds.compute.strategy.DestroyNodeStrategy;
45 import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
46 import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap;
47 import org.jclouds.compute.strategy.ListNodesStrategy;
48 import org.jclouds.compute.strategy.RebootNodeStrategy;
49 import org.jclouds.compute.strategy.ResumeNodeStrategy;
50 import org.jclouds.compute.strategy.SuspendNodeStrategy;
51 import org.jclouds.domain.Credentials;
52 import org.jclouds.domain.Location;
53 import org.jclouds.scriptbuilder.functions.InitAdminAccess;
54 import org.jclouds.vcloud.terremark.compute.domain.KeyPairCredentials;
55 import org.jclouds.vcloud.terremark.compute.domain.OrgAndName;
56 import org.jclouds.vcloud.terremark.compute.functions.NodeMetadataToOrgAndName;
57 import org.jclouds.vcloud.terremark.compute.options.TerremarkVCloudTemplateOptions;
58 import org.jclouds.vcloud.terremark.compute.strategy.CleanupOrphanKeys;
59
60 import com.google.common.base.Predicate;
61 import com.google.common.base.Supplier;
62
63
64
65
66 @Singleton
67 public class TerremarkVCloudComputeService extends BaseComputeService {
68 private final CleanupOrphanKeys cleanupOrphanKeys;
69
70 @Inject
71 protected TerremarkVCloudComputeService(ComputeServiceContext context, Map<String, Credentials> credentialStore,
72 @Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> sizes,
73 @Memoized Supplier<Set<? extends Location>> locations, ListNodesStrategy listNodesStrategy,
74 GetNodeMetadataStrategy getNodeMetadataStrategy, CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy,
75 RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy,
76 ResumeNodeStrategy resumeNodeStrategy, SuspendNodeStrategy suspendNodeStrategy,
77 Provider<TemplateBuilder> templateBuilderProvider, Provider<TemplateOptions> templateOptionsProvider,
78 @Named("NODE_RUNNING") Predicate<NodeMetadata> nodeRunning,
79 @Named("NODE_TERMINATED") Predicate<NodeMetadata> nodeTerminated,
80 @Named("NODE_SUSPENDED") Predicate<NodeMetadata> nodeSuspended,
81 InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory,
82 RunScriptOnNode.Factory runScriptOnNodeFactory, InitAdminAccess initAdminAccess,
83 PersistNodeCredentials persistNodeCredentials, Timeouts timeouts,
84 @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, CleanupOrphanKeys cleanupOrphanKeys,
85 ConcurrentMap<OrgAndName, KeyPairCredentials> credentialsMap, NodeMetadataToOrgAndName nodeToOrgAndName) {
86 super(context, credentialStore, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy,
87 runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, resumeNodeStrategy,
88 suspendNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, nodeTerminated,
89 nodeSuspended, initScriptRunnerFactory, initAdminAccess, runScriptOnNodeFactory, persistNodeCredentials,
90 timeouts, executor);
91 this.cleanupOrphanKeys = cleanupOrphanKeys;
92 }
93
94
95
96
97
98 @Override
99 public Set<? extends NodeMetadata> destroyNodesMatching(Predicate<NodeMetadata> filter) {
100 Set<? extends NodeMetadata> deadOnes = super.destroyNodesMatching(filter);
101 cleanupOrphanKeys.execute(deadOnes);
102 return deadOnes;
103 }
104
105
106
107
108
109 @Override
110 public TerremarkVCloudTemplateOptions templateOptions() {
111 return TerremarkVCloudTemplateOptions.class.cast(super.templateOptions());
112 }
113
114 }