public EcsHostListProvider withVdcs(Vdc... vdcs) { setVdcs(Arrays.asList(vdcs)); return this; } }
EcsHostListProvider hostListProvider = new EcsHostListProvider(client, loadBalancer, s3Config.getIdentity(), s3Config.getSecretKey()); smartConfig.setHostListProvider(hostListProvider); hostListProvider.setProtocol(s3Config.getPropAsString(S3Config.PROPERTY_POLL_PROTOCOL)); else hostListProvider.setProtocol(s3Config.getProtocol().toString()); hostListProvider.setPort(Integer.parseInt(s3Config.getPropAsString(S3Config.PROPERTY_POLL_PORT))); } catch (NumberFormatException e) { throw new RuntimeException(String.format("invalid poll port (%s=%s)", hostListProvider.setPort(s3Config.getPort()); hostListProvider.setVdcs(s3Config.getVdcs());
public List<Host> getHostList() { if (vdcs == null || vdcs.isEmpty()) return getDataNodes(loadBalancer.getTopHost(null)); List<Host> hostList = new ArrayList<Host>(); for (Vdc vdc : vdcs) { if (vdc.getHosts().isEmpty()) log.warn("VDC " + vdc.getName() + " has no hosts!"); boolean success = false; for (Host host : vdc) { if (!host.isHealthy()) { // the load balancer manages health checks log.warn("not retrieving node list from " + host.getName() + " because it's unhealthy"); continue; } try { updateVdcNodes(vdc, getDataNodes(host)); success = true; break; } catch (Throwable t) { log.warn("unable to retrieve node list from " + host.getName(), t); } } if (!success) log.warn("could not retrieve node list for VDC " + vdc.getName()); hostList.addAll(vdc.getHosts()); } return hostList; }
protected List<Host> getDataNodes(Host host) { String path = "/?endpoint"; URI uri = getRequestUri(host, path); // format date String rfcDate; synchronized (rfc822DateFormat) { rfcDate = rfc822DateFormat.format(new Date()); } // generate signature String canonicalString = "GET\n\n\n" + rfcDate + "\n" + path; String signature; try { signature = getSignature(canonicalString, secret); } catch (Exception e) { throw new RuntimeException("could not generate signature", e); } // construct request WebResource.Builder request = client.resource(uri).getRequestBuilder(); // add date and auth headers request.header("Date", rfcDate); request.header("Authorization", "AWS " + user + ":" + signature); // make REST call log.debug("retrieving VDC node list from {}", host.getName()); List<String> dataNodes = request.get(ListDataNode.class).getDataNodes(); List<Host> hosts = new ArrayList<Host>(); for (String node : dataNodes) { hosts.add(new Host(node)); } return hosts; }
@Override public void runHealthCheck(Host host) { // header is workaround for STORAGE-1833 PingResponse response = client.resource(getRequestUri(host, "/?ping")).header("x-emc-namespace", "x") .get(PingResponse.class); if (host instanceof VdcHost) { PingItem.Status status = PingItem.Status.OFF; if (response != null && response.getPingItemMap() != null) { PingItem pingItem = response.getPingItemMap().get(PingItem.MAINTENANCE_MODE); if (pingItem != null) status = pingItem.getStatus(); } if (status == PingItem.Status.ON) ((VdcHost) host).setMaintenanceMode(true); else ((VdcHost) host).setMaintenanceMode(false); } }