use of io.fabric8.git.GitDataStore in project fabric8 by jboss-fuse.
the class GitDataStoreImplTestSupport method createGitDataStore.
protected GitDataStoreImpl createGitDataStore() throws Exception {
RuntimeProperties runtimeProperties = createMockRuntimeProperties();
CreateEnsembleOptions ensembleOptions = CreateEnsembleOptions.builder().zookeeperPassword("admin").build();
recursiveDelete(runtimeProperties.getDataPath().toFile());
BootstrapConfiguration.DataStoreOptions options = new BootstrapConfiguration.DataStoreOptions("root", new File("target/test-container"), zkURL, ensembleOptions);
runtimeProperties.putRuntimeAttribute(DataStoreTemplate.class, new DataStoreBootstrapTemplate(options));
FabricGitServiceImpl fabricGitService = new FabricGitServiceImpl();
fabricGitService.bindRuntimeProperties(runtimeProperties);
fabricGitService.activate();
ComponentConfigurer componentConfigurer = new ComponentConfigurer();
componentConfigurer.activate(null);
ZkDataStoreImpl zkDataStore = new ZkDataStoreImpl() {
@Override
public String getDefaultVersion() {
return "1.0";
}
};
zkDataStore.bindCurator(curator);
zkDataStore.bindRuntimeProperties(runtimeProperties);
zkDataStore.activateComponent();
final GitDataStoreImpl gitDataStore = new GitDataStoreImpl();
gitDataStore.bindConfigurer(componentConfigurer);
gitDataStore.bindGitService(fabricGitService);
gitDataStore.bindRuntimeProperties(runtimeProperties);
gitDataStore.bindGitProxyService(new GitProxyRegistrationHandler());
gitDataStore.bindCurator(curator);
gitDataStore.bindDataStore(zkDataStore);
gitDataStore.activate(new HashMap<String, Object>());
return gitDataStore;
}
use of io.fabric8.git.GitDataStore in project fabric8 by jboss-fuse.
the class ContainerBuilder method synchronizeGitRepositories.
/**
* ENTESB-6368: Ensures that local git repository is synchronized with fabric-wide git repository.
*/
protected void synchronizeGitRepositories() {
GitService gitService = ServiceLocator.awaitService(GitService.class);
GitDataStore gitDataStore = ServiceLocator.awaitService(GitDataStore.class);
for (int i = 0; i < 10; i++) {
try {
LOG.info("Synchronizing Git repositories");
Iterable<PushResult> results = gitDataStore.doPush(gitService.getGit(), new GitContext().requirePush());
if (results.iterator().hasNext()) {
return;
}
throw new Exception("No reference was pushed");
} catch (Exception e) {
LOG.warn("Synchronization of Git repositories failed: " + e.getMessage());
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw new RuntimeException(ie);
}
}
}
}
use of io.fabric8.git.GitDataStore in project fabric8 by jboss-fuse.
the class ContainerBuilder method synchronizeGitRepositories.
/**
* ENTESB-6368: Ensures that local git repository is synchronized with fabric-wide git repository.
*/
protected void synchronizeGitRepositories() {
GitService gitService = io.fabric8.api.gravia.ServiceLocator.awaitService(GitService.class);
GitDataStore gitDataStore = io.fabric8.api.gravia.ServiceLocator.awaitService(GitDataStore.class);
for (int i = 0; i < 10; i++) {
try {
LOG.info("Synchronizing Git repositories");
Iterable<PushResult> results = gitDataStore.doPush(gitService.getGit(), new GitContext().requirePush());
if (results.iterator().hasNext()) {
return;
}
throw new Exception("No reference was pushed");
} catch (Exception e) {
LOG.warn("Synchronization of Git repositories failed: " + e.getMessage());
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw new RuntimeException(ie);
}
}
}
}
use of io.fabric8.git.GitDataStore in project fabric8 by jboss-fuse.
the class DummyBatchingProgressMonitor method executeInternal.
private <T> T executeInternal(GitContext context, PersonIdent personIdent, GitOperation<T> operation) {
if (context.isRequirePull() || context.isRequireCommit()) {
assertWriteLock();
} else {
assertReadLock();
}
// [FABRIC-887] Must set the TCCL to the classloader that loaded GitDataStore as we need the classloader
// that could load this class, as jgit will load resources from classpath using the TCCL
// and that requires the TCCL to the classloader that could load GitDataStore as the resources
// jgit requires are in the same bundle as GitDataSource (eg embedded inside fabric-git)
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
try {
ClassLoader gitcl = GitDataStoreImpl.class.getClassLoader();
Thread.currentThread().setContextClassLoader(gitcl);
LOGGER.trace("Setting ThreadContextClassLoader to {} instead of {}", gitcl, tccl);
Git git = getGit();
Repository repository = git.getRepository();
if (personIdent == null) {
personIdent = new PersonIdent(repository);
}
if (context.isRequirePull()) {
doPullInternal(context, getCredentialsProvider(), false, gitTimeout);
}
T result = operation.call(git, context);
if (context.isRequireCommit()) {
doCommit(git, context);
Object cacheKey = context.getCacheKey();
if (cacheKey == null || cacheKey.equals(GitHelpers.MASTER_BRANCH)) {
versionCache.invalidateAll();
} else {
versionCache.invalidate(cacheKey);
}
notificationRequired = true;
}
if (context.isRequirePush()) {
PushPolicyResult pushResult = doPushInternal(context, getCredentialsProvider());
if (!pushResult.getRejectedUpdates().isEmpty()) {
Exception gitex = pushResult.getLastException();
throw new IllegalStateException("Push rejected: " + pushResult.getRejectedUpdates().values(), gitex);
}
}
return result;
} catch (Exception e) {
throw FabricException.launderThrowable(e);
} finally {
LOGGER.trace("Restoring ThreadContextClassLoader to {}", tccl);
Thread.currentThread().setContextClassLoader(tccl);
}
}
use of io.fabric8.git.GitDataStore in project fabric8 by jboss-fuse.
the class DummyBatchingProgressMonitor method activateInternal.
private void activateInternal() throws Exception {
LOGGER.info("Starting up GitDataStore " + this);
// Call the bootstrap {@link DataStoreTemplate}
DataStoreTemplate template = runtimeProperties.get().removeRuntimeAttribute(DataStoreTemplate.class);
if (template != null) {
// Do the initial commit and set the root tag
Ref rootTag = getGit().getRepository().getRef(GitHelpers.ROOT_TAG);
if (rootTag == null) {
getGit().commit().setMessage("First Commit").setCommitter("fabric", "user@fabric").call();
getGit().tag().setName(GitHelpers.ROOT_TAG).setMessage("Tag the root commit").call();
}
LOGGER.debug("Running datastore bootstrap template: " + template);
template.doWith(this, dataStore.get());
}
// Setup proxy service
GitProxyService proxyService = gitProxyService.get();
defaultProxySelector = ProxySelector.getDefault();
// authenticator disabled, until properly tested it does not affect others, as Authenticator is static in the JVM
// Authenticator.setDefault(new FabricGitLocalHostAuthenticator(proxyService));
ProxySelector fabricProxySelector = new FabricGitLocalHostProxySelector(defaultProxySelector, proxyService);
ProxySelector.setDefault(fabricProxySelector);
LOGGER.debug("Setting up FabricProxySelector: {}", fabricProxySelector);
if (gitRemoteUrl != null) {
gitListener.runRemoteUrlChanged(gitRemoteUrl);
remoteUrl = gitRemoteUrl;
} else {
gitService.get().addGitListener(gitListener);
remoteUrl = gitService.get().getRemoteUrl();
if (remoteUrl != null) {
gitListener.runRemoteUrlChanged(remoteUrl);
}
}
// Get initial versions
getInitialVersions();
// poll logic in case of remote git repo
if (gitRemoteUrl != null) {
// i need this old logic in case of remote repos
LOGGER.info("Starting to pull from remote git repository every {} millis", gitRemotePollInterval);
threadPool.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
LockHandle writeLock = aquireWriteLock();
try {
LOGGER.trace("Performing timed pull");
doPullInternal();
LOGGER.debug("Performed timed pull from external git repo");
} catch (Throwable e) {
LOGGER.debug("Error during performed timed pull/push due " + e.getMessage(), e);
LOGGER.warn("Error during performed timed pull/push due " + e.getMessage() + ". This exception is ignored.");
} finally {
writeLock.unlock();
}
}
@Override
public String toString() {
return "TimedPushTask";
}
}, 1000, gitRemotePollInterval, TimeUnit.MILLISECONDS);
}
LOGGER.info("Using ZooKeeper SharedCount to react when master git repo is changed, so we can do a git pull to the local git repo.");
counter = new SharedCount(curator.get(), ZkPath.GIT_TRIGGER.getPath(), 0);
counter.addListener(new SharedCountListener() {
@Override
public void countHasChanged(final SharedCountReader sharedCountReader, final int value) throws Exception {
Runnable task = new Runnable() {
@Override
public void run() {
doPullInternal();
}
};
if (gitRandomFetchDelay == 0) {
LOGGER.debug("Watch counter updated to " + value + ", scheduling immediate pull");
threadPool.submit(task);
} else {
int delay = RND.nextInt(gitRandomFetchDelay) + 1;
LOGGER.debug("Watch counter updated to " + value + ", scheduling pull with random delay=" + delay + "s");
threadPool.schedule(task, delay, TimeUnit.SECONDS);
}
}
@Override
public void stateChanged(CuratorFramework curatorFramework, ConnectionState connectionState) {
switch(connectionState) {
case SUSPENDED:
case READ_ONLY:
case LOST:
// do nothing
break;
case CONNECTED:
case RECONNECTED:
LOGGER.info("Shared Counter (Re)connected, doing a pull");
doPullInternal();
break;
}
}
});
try {
counter.start();
} catch (KeeperException.NotReadOnlyException ex) {
// In read only mode the counter is not going to start.
// If the connection is reestablished the component will reactivate.
// We need to catch this error so that the component gets activated.
}
if (gitGcOnLoad) {
LockHandle writeLock = aquireWriteLock();
try {
GitOperation<Void> gitop = new GitOperation<Void>() {
public Void call(Git git, GitContext context) throws Exception {
long before = System.currentTimeMillis();
try {
git.gc().call();
LOGGER.debug("git gc took " + ((System.currentTimeMillis() - before)) + " ms.");
} catch (GitAPIException e) {
LOGGER.debug("git gc threw an exception!", e);
}
return null;
}
};
executeInternal(new GitContext(), null, gitop);
} finally {
writeLock.unlock();
}
}
// failing to activate the component
if (readWriteLock.isWriteLockedByCurrentThread() || readWriteLock.getWriteHoldCount() == 0) {
try {
// let's delegate to other thread in order to free MCF thread
// ENTESB-7843: there's a problem when jetty is configured with TLS and keystore location using
// profile: URI. while Jetty continues to be configured if profile:jetty.xml isn't available
// (and it isn't initially), it fails trying to access keystore via profile: URI.
// we should optimistically assume we can pull, but there's nothing wrong if we can't
// - we'll be able to pull later
threadPoolInitial.execute(new Runnable() {
@Override
public void run() {
doPullInternal(5);
}
});
} catch (IllegalStateException e) {
LOGGER.info("Another thread acquired write lock and GitDataStore can't pull from remote repository.");
}
} else {
LOGGER.info("Another thread is keeping git write lock. GitDataStore will continue activation.");
}
}
Aggregations