use of com.netflix.spinnaker.halyard.core.error.v1.HalException in project halyard by spinnaker.
the class GoogleProviderUtils method defaultServiceAccount.
static String defaultServiceAccount(AccountDeploymentDetails<GoogleAccount> details) {
GoogleAccount account = details.getAccount();
String project = account.getProject();
Compute compute = getCompute(details);
try {
return compute.projects().get(project).execute().getDefaultServiceAccount();
} catch (IOException e) {
throw new HalException(FATAL, "Unable to get default compute service account");
}
}
use of com.netflix.spinnaker.halyard.core.error.v1.HalException in project halyard by spinnaker.
the class GoogleProviderUtils method getInstanceIp.
static String getInstanceIp(AccountDeploymentDetails<GoogleAccount> details, String instanceName) {
Compute compute = getCompute(details);
Instance instance = null;
try {
instance = compute.instances().get(details.getAccount().getProject(), "us-central1-f", instanceName).execute();
} catch (IOException e) {
throw new HalException(FATAL, "Unable to get instance " + instanceName);
}
return instance.getNetworkInterfaces().stream().map(i -> i.getAccessConfigs().stream().map(AccessConfig::getNatIP).filter(ip -> !StringUtils.isEmpty(ip)).findFirst()).filter(Optional::isPresent).map(Optional::get).findFirst().orElseThrow(() -> new HalException(FATAL, "No public IP associated with" + instanceName));
}
use of com.netflix.spinnaker.halyard.core.error.v1.HalException in project halyard by spinnaker.
the class GoogleProviderUtils method openSshTunnel.
private static Proxy openSshTunnel(String ip, int port, String keyFile) throws InterruptedException {
JobExecutor jobExecutor = DaemonTaskHandler.getJobExecutor();
List<String> command = new ArrayList<>();
// Make sure we don't have an entry for this host already (GCP recycles IPs).
command.add("ssh-keygen");
command.add("-R");
command.add(ip);
JobRequest request = new JobRequest().setTokenizedCommand(command);
JobStatus status = jobExecutor.backoffWait(jobExecutor.startJob(request));
if (status.getResult() != JobStatus.Result.SUCCESS) {
if (status.getStdErr().contains("No such file")) {
log.info("No ssh known_hosts file exists yet");
} else {
throw new HalException(FATAL, "Unable to remove old host entry " + status.getStdErr());
}
}
int localPort = SocketUtils.findAvailableTcpPort();
command.clear();
command.add("ssh");
command.add("ubuntu@" + ip);
command.add("-o");
command.add("StrictHostKeyChecking=no");
command.add("-i");
command.add(keyFile);
command.add("-N");
command.add("-L");
command.add(String.format("%d:localhost:%d", localPort, port));
request = new JobRequest().setTokenizedCommand(command);
String jobId = jobExecutor.startJob(request);
status = jobExecutor.updateJob(jobId);
while (status == null) {
DaemonTaskHandler.safeSleep(TimeUnit.SECONDS.toMillis(1));
status = jobExecutor.updateJob(jobId);
}
return new Proxy().setJobId(jobId).setPort(localPort);
}
use of com.netflix.spinnaker.halyard.core.error.v1.HalException in project halyard by spinnaker.
the class GoogleProviderUtils method ensureSshKeysExist.
private static void ensureSshKeysExist() {
File sshKeyFile = new File(getSshKeyFile());
if (!sshKeyFile.exists()) {
if (!sshKeyFile.getParentFile().exists()) {
sshKeyFile.getParentFile().mkdirs();
}
log.info("Generating a new ssh key file...");
JobExecutor jobExecutor = DaemonTaskHandler.getJobExecutor();
List<String> command = new ArrayList<>();
command.add("ssh-keygen");
// no password
command.add("-N");
command.add("");
// rsa key
command.add("-t");
command.add("rsa");
// path to keyfile
command.add("-f");
command.add(getSshKeyFile());
// username sshing into machine
command.add("-C");
command.add("ubuntu");
JobRequest request = new JobRequest().setTokenizedCommand(command);
JobStatus status;
try {
status = jobExecutor.backoffWait(jobExecutor.startJob(request));
} catch (InterruptedException e) {
throw new DaemonTaskInterrupted(e);
}
if (status.getResult() == JobStatus.Result.FAILURE) {
throw new HalException(FATAL, "ssh-keygen failed: " + status.getStdErr());
}
try {
File sshPublicKeyFile = new File(getSshPublicKeyFile());
String sshKeyContents = IOUtils.toString(new FileInputStream(sshPublicKeyFile));
if (!sshKeyContents.startsWith("ubuntu:")) {
sshKeyContents = "ubuntu:" + sshKeyContents;
FileUtils.writeByteArrayToFile(sshPublicKeyFile, sshKeyContents.getBytes());
}
} catch (IOException e) {
throw new HalException(FATAL, "Cannot reformat ssh key to match google key format expectation: " + e.getMessage(), e);
}
command = new ArrayList<>();
command.add("chmod");
command.add("400");
command.add(getSshKeyFile());
request = new JobRequest().setTokenizedCommand(command);
try {
status = jobExecutor.backoffWait(jobExecutor.startJob(request));
} catch (InterruptedException e) {
throw new DaemonTaskInterrupted(e);
}
if (status.getResult() == JobStatus.Result.FAILURE) {
throw new HalException(FATAL, "chmod failed: " + status.getStdErr() + status.getStdOut());
}
}
}
use of com.netflix.spinnaker.halyard.core.error.v1.HalException in project halyard by spinnaker.
the class KubectlServiceProvider method getService.
public <S> KubernetesV2Service getService(SpinnakerService.Type type, Class<S> clazz) {
Field serviceField = getField(type.getCanonicalName() + "service");
if (serviceField == null) {
return null;
}
serviceField.setAccessible(true);
try {
return (KubernetesV2Service) serviceField.get(this);
} catch (IllegalAccessException e) {
throw new HalException(Problem.Severity.FATAL, "Can't access service field for " + type + ": " + e.getMessage());
} finally {
serviceField.setAccessible(false);
}
}
Aggregations