Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,7 @@ private void configureWith(Mapping entries) throws ConfiguratorException {
monitor.reset();
ConfigurationContext context = new ConfigurationContext(registry);
context.addListener(monitor::record);
context.getSecretSources().forEach(SecretSource::init);
try (ACLContext acl = ACL.as(ACL.SYSTEM)) {
invokeWith(entries, (configurator, config) -> configurator.configure(config, context));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@

public abstract class SecretSource implements ExtensionPoint {

public void init() {
// NOOP
}

public abstract Optional<String> reveal(String secret) throws IOException;

public static List<SecretSource> all() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ public class VaultSecretSource extends SecretSource {
private VaultAuthenticator vaultAuthenticator;
private String[] vaultPaths;


public VaultSecretSource() {
Optional<String> vaultFile = Optional.ofNullable(System.getenv(CASC_VAULT_FILE));
Properties prop = new Properties();
Expand All @@ -64,7 +63,7 @@ public VaultSecretSource() {
Optional<String> vaultNamespace = getVariable(CASC_VAULT_NAMESPACE, prop);
Optional<String[]> vaultPaths = getCommaSeparatedVariables(CASC_VAULT_PATHS, prop)
.map(Optional::of)
.orElse(getCommaSeparatedVariables(CASC_VAULT_PATH, prop)); // TODO: deprecate!
.orElseGet(() -> getCommaSeparatedVariables(CASC_VAULT_PATH, prop)); // TODO: deprecate!

// Check mandatory variables are set
if (!vaultUrl.isPresent() || !vaultPaths.isPresent()) return;
Expand Down Expand Up @@ -168,19 +167,6 @@ private void readPropertiesFromVaultFile(String vaultFile, Properties prop) {
@Override
public Optional<String> reveal(String secret) {
if (StringUtils.isBlank(secret)) return Optional.empty();

// TODO: move this to SecretSource.init() function which gets called only once when CasC.configure() is run
// Ensure secrets are up-to-date
if (vaultAuthenticator != null) {
try {
vaultAuthenticator.authenticate(vault, vaultConfig);
} catch (VaultException e) {
LOGGER.log(Level.WARNING, "Could not authenticate with vault client", e);
}

readSecretsFromVault();
}

return Optional.ofNullable(secrets.get(secret));
}

Expand All @@ -202,4 +188,17 @@ private Optional<String[]> getCommaSeparatedVariables(String key, Properties pro
"Please use CASC_VAULT_PATHS instead."); // TODO: deprecate!
return getVariable(key, prop).map(str -> str.split(","));
}

@Override
public void init() {
// Ensure secrets are up-to-date and Check vault authentication
if (vaultAuthenticator != null) {
try {
vaultAuthenticator.authenticate(vault, vaultConfig);
} catch (VaultException e) {
LOGGER.log(Level.WARNING, "Could not authenticate with vault client", e);
}
readSecretsFromVault();
}
}
}
16 changes: 16 additions & 0 deletions plugin/src/test/java/io/jenkins/plugins/casc/misc/Env.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.jenkins.plugins.casc.misc;

import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target(METHOD)
@Retention(RUNTIME)
@Repeatable( value = Envs.class )
public @interface Env {
String name();
String value();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package io.jenkins.plugins.casc.misc;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Properties;
import java.util.stream.Collectors;
import org.junit.contrib.java.lang.system.EnvironmentVariables;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

public class EnvVarsRule extends EnvironmentVariables {

@Override
public Statement apply(Statement base, Description description) {
EnvsFromFile configuredWithEnvsFromFile = description.getAnnotation(EnvsFromFile.class);
if (Objects.nonNull(configuredWithEnvsFromFile)) {

final String[] resource = configuredWithEnvsFromFile.value();

final List<String> envFiles = Arrays.stream(resource)
.map(s -> Paths.get(System.getProperty("java.io.tmpdir"), s).toString())
.collect(Collectors.toList());

Properties properties = new Properties();
for (String file : envFiles) {
try (FileInputStream inputStream = new FileInputStream(file)) {
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
properties.forEach((key, value) -> set(String.valueOf(key), String.valueOf(value)));
}
Envs configuredWithEnvs = description.getAnnotation(Envs.class);
if (Objects.nonNull(configuredWithEnvs)) {
List<Env> envs = Arrays.asList(configuredWithEnvs.value());
envs.forEach(env -> set(env.name(), env.value()));
}
return super.apply(base, description);
}
}
19 changes: 19 additions & 0 deletions plugin/src/test/java/io/jenkins/plugins/casc/misc/Envs.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.jenkins.plugins.casc.misc;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import org.junit.Test;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target(METHOD)
@Retention(RUNTIME)
public @interface Envs {

Env[] value() default {};

Class<? extends Throwable> expected() default Test.None.class;

String message() default "";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.jenkins.plugins.casc.misc;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import org.junit.Test;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target(METHOD)
@Retention(RUNTIME)
public @interface EnvsFromFile {

String[] value() default {};

Class<? extends Throwable> expected() default Test.None.class;

String message() default "";
}
Loading