in services/src/main/java/org/jclouds/karaf/services/internal/ComputeServiceFactory.java [89:201]
public synchronized void updated(String pid, Dictionary properties) throws ConfigurationException {
ServiceRegistration newRegistration = null;
try {
if (properties != null) {
Properties props = new Properties();
for (Enumeration e = properties.keys(); e.hasMoreElements(); ) {
Object key = e.nextElement();
Object val = properties.get(key);
props.put(key, val);
}
String provider = (String) properties.get(Constants.PROVIDER);
String api = (String) properties.get(Constants.API);
ProviderMetadata providerMetadata = null;
ApiMetadata apiMetadata = null;
if (!Strings.isNullOrEmpty(provider) && installedProviders.containsKey(provider)) {
providerMetadata = installedProviders.get(provider);
validate(providerMetadata, properties);
} else if (!Strings.isNullOrEmpty(api) && installedApis.containsKey(api)) {
apiMetadata = installedApis.get(api);
validate(apiMetadata, properties);
} else {
if (!Strings.isNullOrEmpty(provider)) {
providerPids.put(provider, pid);
}
if (!Strings.isNullOrEmpty(api)) {
apiPids.put(api, pid);
}
pendingPids.put(pid, properties);
LOGGER.warn("Provider {} or Api {} is not currently installed. Service will resume once the the provider is installed.", provider, api);
return;
}
//We are removing credentials as we don't want them to be visible in the service registration.
String id = (String) properties.get(Constants.NAME);
String identity = (String) properties.remove(Constants.IDENTITY);
String credential = (String) properties.remove(Constants.CREDENTIAL);
String endpoint = (String) properties.get(Constants.ENDPOINT);
String storeType = (String) properties.get(CREDENTIAL_STORE);
String eventSupport = (String) properties.get(NODE_EVENT_SUPPORT);
Boolean enableEventSupport = false;
if (Strings.isNullOrEmpty(credential) && providerMetadata != null && !providerMetadata.getApiMetadata().getDefaultCredential().isPresent()) {
LOGGER.warn("No credential specified and provider {}.", providerMetadata.getId());
return;
}
if (Strings.isNullOrEmpty(credential) && apiMetadata != null && !apiMetadata.getDefaultCredential().isPresent()) {
LOGGER.warn("No credential specified and api {}.", apiMetadata.getId());
return;
}
if (storeType == null || storeType.isEmpty()) {
storeType = DEFAULT_CREDENTIAL_STORE_TYPE;
}
if (eventSupport != null && !eventSupport.isEmpty()) {
enableEventSupport = Boolean.parseBoolean(eventSupport);
}
CredentialStore credentialStore = lookupStore(storeType);
ContextBuilder builder = null;
if (providerMetadata != null) {
builder = ContextBuilder.newBuilder(providerMetadata);
} else if (apiMetadata != null) {
builder = ContextBuilder.newBuilder(apiMetadata);
}
if (!Strings.isNullOrEmpty(endpoint)) {
builder = builder.endpoint(endpoint);
}
builder = builder.name(id).modules(ImmutableSet.<Module>of(new Log4JLoggingModule(), new JschSshClientModule()));
if (credentialStore != null) {
builder = builder.modules(ImmutableSet.<Module>of(credentialStore));
}
builder = builder.name(id).credentials(identity, credential).overrides(props);
ComputeServiceContext context = builder.build(ComputeServiceContext.class);
ComputeService service = null;
if (enableEventSupport) {
service = new ComputeServiceEventProxy(bundleContext, context.getComputeService());
} else {
service = context.getComputeService();
}
newRegistration = bundleContext.registerService(
ComputeService.class.getName(), service, properties);
//If all goes well remove the pending pid.
if (pendingPids.containsKey(pid)) {
activePids.put(pid, pendingPids.remove(pid));
}
}
} catch (InvalidConfigurationException ex) {
LOGGER.warn("Invalid configuration: {}", ex.getMessage());
} catch (Exception ex) {
LOGGER.error("Error creating compute service.", ex);
} finally {
ServiceRegistration oldRegistration = (newRegistration == null)
? registrations.remove(pid)
: registrations.put(pid, newRegistration);
if (oldRegistration != null) {
oldRegistration.unregister();
}
}
}