static List<String> kubectlPodServiceCommand(KubernetesAccount account, String namespace, String service) { List<String> command = kubectlPrefix(account); if (StringUtils.isNotEmpty(namespace)) { command.add("-n=" + namespace); } command.add("get"); command.add("po"); command.add("-l=cluster=" + service); command.add("-o=jsonpath='{.items[0].metadata.name}'"); return command; }
static public boolean exists(KubernetesAccount account, String manifest) { Map<String, Object> parsedManifest = parseManifest(manifest); String kind = (String) parsedManifest.get("kind"); Map<String, Object> metadata = (Map<String, Object>) parsedManifest.getOrDefault("metadata", new HashMap<>()); String name = (String) metadata.get("name"); String namespace = (String) metadata.get("namespace"); return exists(account, namespace, kind, name); }
default String connectCommand(AccountDeploymentDetails<KubernetesAccount> details, SpinnakerRuntimeSettings runtimeSettings) { ServiceSettings settings = runtimeSettings.getServiceSettings(getService()); KubernetesAccount account = details.getAccount(); String namespace = settings.getLocation(); String name = getServiceName(); int port = settings.getPort(); String podNameCommand = String.join(" ", KubernetesV2Utils.kubectlPodServiceCommand(account, namespace, name)); return String.join(" ", KubernetesV2Utils.kubectlConnectPodCommand(account, namespace, "$(" + podNameCommand + ")", port)); } }
public void apply(String manifest) { manifest = KubernetesV2Utils.prettify(manifest); List<String> command = KubernetesV2Utils.kubectlPrefix(account); command.add("apply"); command.add("-f");
public boolean exists(String manifest) { Map<String, Object> parsedManifest = KubernetesV2Utils.parseManifest(manifest); String kind = (String) parsedManifest.get("kind"); Map<String, Object> metadata = (Map<String, Object>) parsedManifest.getOrDefault("metadata", new HashMap<>()); String name = (String) metadata.get("name"); String namespace = (String) metadata.get("namespace"); return exists(namespace, kind, name); }
String serviceDefinition = service.getServiceYaml(resolvedConfiguration); if (!KubernetesV2Utils.exists(account, namespaceDefinition)) { KubernetesV2Utils.apply(account, namespaceDefinition); if (!KubernetesV2Utils.exists(account, serviceDefinition)) { KubernetesV2Utils.apply(account, serviceDefinition); KubernetesV2Utils.apply(account, resourceDefinition); });
static public String createSecret(KubernetesAccount account, String namespace, String name, List<SecretMountPair> files) { Map<String, String> contentMap = new HashMap<>(); for (SecretMountPair pair: files) { String contents; try { contents = new String(Base64.getEncoder().encode(IOUtils.toByteArray(new FileInputStream(pair.getContents())))); } catch (IOException e) { throw new HalException(Problem.Severity.FATAL, "Failed to read required config file: " + pair.getContents().getAbsolutePath() + ": " + e.getMessage(), e); } contentMap.put(pair.getName(), contents); } name = name + "-" + Math.abs(contentMap.hashCode()); TemplatedResource secret = new JinjaJarResource("/kubernetes/manifests/secret.yml"); Map<String, Object> bindings = new HashMap<>(); bindings.put("files", contentMap); bindings.put("name", name); bindings.put("namespace", namespace); secret.extendBindings(bindings); apply(account, secret.toString()); return name; }
)); String name = KubernetesV2Utils.createSecret(account, namespace, secretNamePrefix, files); configSources.add(new ConfigSource() .setId(name) .collect(Collectors.toList()); String name = KubernetesV2Utils.createSecret(account, namespace, secretNamePrefix, files); configSources.add(new ConfigSource() .setId(name)
)); KubernetesV2Utils.SecretSpec spec = KubernetesV2Utils.createSecretSpec(namespace, getService().getCanonicalName(), secretNamePrefix, files); executor.apply(spec.resource.toString()); configSources.add(new ConfigSource() .collect(Collectors.toList()); KubernetesV2Utils.SecretSpec spec = KubernetesV2Utils.createSecretSpec(namespace, getService().getCanonicalName(), secretNamePrefix, files); executor.apply(spec.resource.toString()); configSources.add(new ConfigSource()
@Override public RemoteAction clean(AccountDeploymentDetails<KubernetesAccount> details, SpinnakerRuntimeSettings runtimeSettings) { DaemonTaskHandler.newStage("Invoking kubectl"); DaemonTaskHandler.message("Deleting all 'svc,deploy,secret' resources with label 'app=spin'..."); KubernetesSharedServiceSettings kubernetesSharedServiceSettings = new KubernetesSharedServiceSettings(details.getDeploymentConfiguration()); KubernetesV2Utils.deleteSpinnaker(details.getAccount(), kubernetesSharedServiceSettings.getDeployLocation()); return new RemoteAction(); }
default String connectCommand(AccountDeploymentDetails<KubernetesAccount> details, SpinnakerRuntimeSettings runtimeSettings) { ServiceSettings settings = runtimeSettings.getServiceSettings(getService()); KubernetesAccount account = details.getAccount(); String namespace = settings.getLocation(); String name = getServiceName(); int port = settings.getPort(); String podNameCommand = String.join(" ", KubernetesV2Utils.kubectlPodServiceCommand(account, namespace, name)); return String.join(" ", KubernetesV2Utils.kubectlConnectPodCommand(account, namespace, "$(" + podNameCommand + ")", port)); } }
static public void apply(KubernetesAccount account, String manifest) { manifest = prettify(manifest); List<String> command = kubectlPrefix(account); command.add("apply"); command.add("-f");
static List<String> kubectlConnectPodCommand(KubernetesAccount account, String namespace, String name, int port) { List<String> command = kubectlPrefix(account); if (StringUtils.isNotEmpty(namespace)) { command.add("-n=" + namespace); } command.add("port-forward"); command.add(name); command.add(port + ""); return command; }
static List<String> kubectlConnectPodCommand(KubernetesAccount account, String namespace, String name, int port) { List<String> command = kubectlPrefix(account); if (StringUtils.isNotEmpty(namespace)) { command.add("-n=" + namespace); } command.add("port-forward"); command.add(name); command.add(port + ""); return command; }
static List<String> kubectlPodServiceCommand(KubernetesAccount account, String namespace, String service) { List<String> command = kubectlPrefix(account); if (StringUtils.isNotEmpty(namespace)) { command.add("-n=" + namespace); } command.add("get"); command.add("po"); command.add("-l=cluster=" + service); command.add("-o=jsonpath='{.items[0].metadata.name}'"); return command; }
public boolean isReady(String namespace, String service) { log.info("Checking readiness for " + service); List<String> command = KubernetesV2Utils.kubectlPrefix(account);
private boolean exists(String namespace, String kind, String name) { log.info("Checking for " + kind + "/" + name); List<String> command = KubernetesV2Utils.kubectlPrefix(account);
public void deleteSpinnaker(String namespace) { List<String> command = KubernetesV2Utils.kubectlPrefix(account); if (StringUtils.isNotEmpty(namespace)) { command.add("-n=" + namespace); } command.add("delete"); command.add("deploy,svc,secret"); command.add("-l=app=spin"); JobRequest request = new JobRequest().setTokenizedCommand(command); String jobId = executor.startJob(request); JobStatus status; try { status = executor.backoffWait(jobId); } catch (InterruptedException e) { throw new DaemonTaskInterrupted(e); } if (status.getState() != JobStatus.State.COMPLETED) { throw new HalException(Problem.Severity.FATAL, String.join("\n", "Deleting spinnaker never completed in " + namespace, status.getStdErr(), status.getStdOut())); } if (status.getResult() != JobStatus.Result.SUCCESS) { throw new HalException(Problem.Severity.FATAL, String.join("\n", "Deleting spinnaker failed in " + namespace, status.getStdErr(), status.getStdOut())); } }
static private boolean exists(KubernetesAccount account, String namespace, String kind, String name) { log.info("Checking for " + kind + "/" + name); List<String> command = kubectlPrefix(account);
public void delete(String namespace, String service) { List<String> command = KubernetesV2Utils.kubectlPrefix(account); if (StringUtils.isNotEmpty(namespace)) { command.add("-n=" + namespace); } command.add("delete"); command.add("deploy,svc,secret"); command.add("-l=cluster=" + service); JobRequest request = new JobRequest().setTokenizedCommand(command); String jobId = executor.startJob(request); JobStatus status; try { status = executor.backoffWait(jobId); } catch (InterruptedException e) { throw new DaemonTaskInterrupted(e); } if (status.getState() != JobStatus.State.COMPLETED) { throw new HalException(Problem.Severity.FATAL, String.join("\n", "Deleting service " + service + " never completed", status.getStdErr(), status.getStdOut())); } if (status.getResult() != JobStatus.Result.SUCCESS) { throw new HalException(Problem.Severity.FATAL, String.join("\n", "Deleting service " + service + " failed", status.getStdErr(), status.getStdOut())); } }