package com.hubspot.baragon.migrations;
import java.util.Collection;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.utils.ZKPaths;
import com.google.common.base.Optional;
import com.google.common.base.Throwables;
import com.google.inject.Inject;
import com.hubspot.baragon.data.BaragonStateDatastore;
import com.hubspot.baragon.models.UpstreamInfo;
public class UpstreamsMigration extends ZkDataMigration {
private final BaragonStateDatastore baragonStateDatastore;
private final CuratorFramework curatorFramework;
@Inject
public UpstreamsMigration(BaragonStateDatastore baragonStateDatastore,
CuratorFramework curatorFramework) {
super(1);
this.baragonStateDatastore = baragonStateDatastore;
this.curatorFramework = curatorFramework;
}
@Override
public void applyMigration() {
try {
for (String service : baragonStateDatastore.getServices()) {
Collection<String> upstreams = curatorFramework.getChildren().forPath(ZKPaths.makePath(BaragonStateDatastore.SERVICES_FORMAT, service));
for (String upstream : upstreams) {
Optional<UpstreamInfo> maybeUpstream = baragonStateDatastore.getUpstreamInfo(service, upstream);
UpstreamInfo mergedInfo;
if (maybeUpstream.isPresent()) {
UpstreamInfo fromPath = UpstreamInfo.fromString(upstream);
mergedInfo = new UpstreamInfo(fromPath.getUpstream(), maybeUpstream.get().getRequestId().or(fromPath.getRequestId()), maybeUpstream.get().getRackId().or(fromPath.getRackId()));
} else {
mergedInfo = UpstreamInfo.fromString(upstream);
}
curatorFramework.inTransaction()
.delete().forPath(String.format(BaragonStateDatastore.UPSTREAM_FORMAT, service, upstream)).and()
.create().forPath(String.format(BaragonStateDatastore.UPSTREAM_FORMAT, service, mergedInfo.toPath())).and()
.commit();
}
}
} catch (Exception e) {
Throwables.propagate(e);
}
}
}