default void deleteVersion(AccountDeploymentDetails<KubernetesAccount> details, ServiceSettings settings, Integer version) { String name = getVersionedName(version); String namespace = getNamespace(settings); KubernetesV1ProviderUtils.deleteReplicaSet(details, namespace, name); } }
static String componentSecret(String name, Integer version) { return halSecret(name, version, "profiles"); }
static List<String> kubectlPortForwardCommand(AccountDeploymentDetails<KubernetesAccount> details, String namespace, String instance, int targetPort, int localPort) { List<String> command = kubectlAccountCommand(details); command.add("--namespace"); command.add(namespace); command.add("port-forward"); command.add(instance); command.add(localPort + ":" + targetPort); return command; }
KubernetesV1ProviderUtils.createNamespace(details, namespace); String secretName = KubernetesV1ProviderUtils.componentDependencies(name, version); String mountPoint = null; for (String file : requiredFiles) { }).collect(Collectors.toSet()); KubernetesV1ProviderUtils.upsertSecret(details, pairs, secretName, namespace); configSources.add(new ConfigSource().setId(secretName).setMountPath(mountPoint)); String secretName = KubernetesV1ProviderUtils.componentSecret(name + ind, version); ind += 1; }).collect(Collectors.toSet()); KubernetesV1ProviderUtils.upsertSecret(details, pairs, secretName, namespace); configSources.add(new ConfigSource() .setId(secretName)
static void upsertSecret(AccountDeploymentDetails<KubernetesAccount> details, Set<Pair<File, String>> files, String secretName, String namespace) { KubernetesClient client = getClient(details); if (client.secrets().inNamespace(namespace).withName(secretName).get() != null) { client.secrets().inNamespace(namespace).withName(secretName).delete(); } Map<String, String> secretContents = new HashMap<>(); files.forEach(pair -> { try { File file = pair.getLeft(); String name = pair.getRight(); String data = new String(Base64.getEncoder().encode(IOUtils.toByteArray(new FileInputStream(file)))); secretContents.putIfAbsent(name, data); } catch (IOException e) { throw new HalException(Severity.ERROR, "Unable to read contents of \"" + pair.getLeft() + "\": " + e); } }); SecretBuilder secretBuilder = new SecretBuilder(); secretBuilder = secretBuilder.withNewMetadata() .withName(secretName) .withNamespace(namespace) .endMetadata() .withData(secretContents); client.secrets().inNamespace(namespace).create(secretBuilder.build()); }
@Override default <S> S connectToService(AccountDeploymentDetails<KubernetesAccount> details, SpinnakerRuntimeSettings runtimeSettings, SpinnakerService<S> service) { ServiceSettings settings = runtimeSettings.getServiceSettings(service); KubernetesV1ProviderUtils.Proxy proxy = KubernetesV1ProviderUtils.openProxy(getJobExecutor(), details); String endpoint = KubernetesV1ProviderUtils.proxyServiceEndpoint(proxy, getNamespace(settings), getServiceName(), settings.getPort()).toString(); return getServiceInterfaceFactory().createService(endpoint, service); }
ServiceSettings monitoringSettings = runtimeSettings.getServiceSettings(monitoringService); KubernetesClient client = KubernetesV1ProviderUtils.getClient(details); KubernetesV1ProviderUtils.createNamespace(details, namespace);
default String connectCommand(AccountDeploymentDetails<KubernetesAccount> details, SpinnakerRuntimeSettings runtimeSettings, int localPort) { ServiceSettings settings = runtimeSettings.getServiceSettings(getService()); RunningServiceDetails runningServiceDetails = getRunningServiceDetails(details, runtimeSettings); Map<Integer, List<Instance>> instances = runningServiceDetails.getInstances(); Integer latest = runningServiceDetails.getLatestEnabledVersion(); String namespace = getNamespace(settings); List<Instance> latestInstances = instances.get(latest); if (latestInstances == null || latestInstances.isEmpty()) { throw new HalException(Problem.Severity.FATAL, "No instances running in latest server group for service " + getServiceName() + " in namespace " + namespace); } return Strings.join(KubernetesV1ProviderUtils.kubectlPortForwardCommand(details, namespace, latestInstances.get(0).getId(), settings.getPort(), localPort), " "); }
@Override public RemoteAction clean(AccountDeploymentDetails<KubernetesAccount> details, SpinnakerRuntimeSettings runtimeSettings) { KubernetesSharedServiceSettings kubernetesSharedServiceSettings = new KubernetesSharedServiceSettings(details.getDeploymentConfiguration()); KubernetesV1ProviderUtils.kubectlDeleteNamespaceCommand(DaemonTaskHandler.getJobExecutor(), details, kubernetesSharedServiceSettings.getDeployLocation()); return new RemoteAction(); } }
KubernetesV1ProviderUtils.createNamespace(details, namespace); String secretName = KubernetesV1ProviderUtils.componentDependencies(name, version); String mountPoint = null; for (String file : requiredFiles) { }).collect(Collectors.toSet()); KubernetesV1ProviderUtils.upsertSecret(details, pairs, secretName, namespace); configSources.add(new ConfigSource().setId(secretName).setMountPath(mountPoint)); String secretName = KubernetesV1ProviderUtils.componentSecret(name + ind, version); ind += 1; }).collect(Collectors.toSet()); KubernetesV1ProviderUtils.upsertSecret(details, pairs, secretName, namespace); configSources.add(new ConfigSource() .setId(secretName)
static void upsertSecret(AccountDeploymentDetails<KubernetesAccount> details, Set<Pair<File, String>> files, String secretName, String namespace) { KubernetesClient client = getClient(details); if (client.secrets().inNamespace(namespace).withName(secretName).get() != null) { client.secrets().inNamespace(namespace).withName(secretName).delete(); } Map<String, String> secretContents = new HashMap<>(); files.forEach(pair -> { try { File file = pair.getLeft(); String name = pair.getRight(); String data = new String(Base64.getEncoder().encode(IOUtils.toByteArray(new FileInputStream(file)))); secretContents.putIfAbsent(name, data); } catch (IOException e) { throw new HalException(Severity.ERROR, "Unable to read contents of \"" + pair.getLeft() + "\": " + e); } }); SecretBuilder secretBuilder = new SecretBuilder(); secretBuilder = secretBuilder.withNewMetadata() .withName(secretName) .withNamespace(namespace) .endMetadata() .withData(secretContents); client.secrets().inNamespace(namespace).create(secretBuilder.build()); }
@Override default <S> S connectToService(AccountDeploymentDetails<KubernetesAccount> details, SpinnakerRuntimeSettings runtimeSettings, SpinnakerService<S> service) { ServiceSettings settings = runtimeSettings.getServiceSettings(service); KubernetesV1ProviderUtils.Proxy proxy = KubernetesV1ProviderUtils.openProxy(getJobExecutor(), details); String endpoint = KubernetesV1ProviderUtils.proxyServiceEndpoint(proxy, getNamespace(settings), getServiceName(), settings.getPort()).toString(); return getServiceInterfaceFactory().createService(endpoint, service); }
ServiceSettings monitoringSettings = runtimeSettings.getServiceSettings(monitoringService); KubernetesClient client = KubernetesV1ProviderUtils.getClient(details); KubernetesV1ProviderUtils.createNamespace(details, namespace);
default String connectCommand(AccountDeploymentDetails<KubernetesAccount> details, SpinnakerRuntimeSettings runtimeSettings, int localPort) { ServiceSettings settings = runtimeSettings.getServiceSettings(getService()); RunningServiceDetails runningServiceDetails = getRunningServiceDetails(details, runtimeSettings); Map<Integer, List<Instance>> instances = runningServiceDetails.getInstances(); Integer latest = runningServiceDetails.getLatestEnabledVersion(); String namespace = getNamespace(settings); List<Instance> latestInstances = instances.get(latest); if (latestInstances == null || latestInstances.isEmpty()) { throw new HalException(Problem.Severity.FATAL, "No instances running in latest server group for service " + getServiceName() + " in namespace " + namespace); } return Strings.join(KubernetesV1ProviderUtils.kubectlPortForwardCommand(details, namespace, latestInstances.get(0).getId(), settings.getPort(), localPort), " "); }
@Override public RemoteAction clean(AccountDeploymentDetails<KubernetesAccount> details, SpinnakerRuntimeSettings runtimeSettings) { KubernetesSharedServiceSettings kubernetesSharedServiceSettings = new KubernetesSharedServiceSettings(details.getDeploymentConfiguration()); KubernetesV1ProviderUtils.kubectlDeleteNamespaceCommand(DaemonTaskHandler.getJobExecutor(), details, kubernetesSharedServiceSettings.getDeployLocation()); return new RemoteAction(); } }
static void resize(AccountDeploymentDetails<KubernetesAccount> details, String namespace, String replicaSetName, int targetSize) { KubernetesClient client = getClient(details); client.extensions().replicaSets().inNamespace(namespace).withName(replicaSetName).scale(targetSize); }
static List<String> kubectlPortForwardCommand(AccountDeploymentDetails<KubernetesAccount> details, String namespace, String instance, int targetPort, int localPort) { List<String> command = kubectlAccountCommand(details); command.add("--namespace"); command.add(namespace); command.add("port-forward"); command.add(instance); command.add(localPort + ":" + targetPort); return command; }
static String componentRegistry(String name, Integer version) { return halSecret(name, version, "registry"); }
@Override default <S> S connectToInstance(AccountDeploymentDetails<KubernetesAccount> details, SpinnakerRuntimeSettings runtimeSettings, SpinnakerService<S> sidecar, String instanceId) { ServiceSettings settings = runtimeSettings.getServiceSettings(sidecar); String namespace = getNamespace(settings); int localPort = SocketUtils.findAvailableTcpPort(); int targetPort = settings.getPort(); List<String> command = KubernetesV1ProviderUtils.kubectlPortForwardCommand(details, namespace, instanceId, targetPort, localPort); JobRequest request = new JobRequest().setTokenizedCommand(command); String jobId = getJobExecutor().startJob(request); // Wait for the proxy to spin up. DaemonTaskHandler.safeSleep(TimeUnit.SECONDS.toMillis(5)); JobStatus status = getJobExecutor().updateJob(jobId); // This should be a long-running job. if (status.getState() == JobStatus.State.COMPLETED) { throw new HalException(Problem.Severity.FATAL, "Unable to establish a proxy against " + getServiceName() + ":\n" + status.getStdOut() + "\n" + status.getStdErr()); } return getServiceInterfaceFactory().createService(settings.getScheme() + "://localhost:" + localPort, sidecar); }
default void deleteVersion(AccountDeploymentDetails<KubernetesAccount> details, ServiceSettings settings, Integer version) { String name = getVersionedName(version); String namespace = getNamespace(settings); KubernetesV1ProviderUtils.deleteReplicaSet(details, namespace, name); } }