[KEYCLOAK-10066] Merge Preview Features Test: OpenshiftClientStorage

This commit is contained in:
Martin Bartos RH 2019-07-26 16:56:29 +02:00 committed by Marek Posolda
parent 215331e947
commit b18d88a37b
4 changed files with 124 additions and 21 deletions

View file

@ -835,27 +835,19 @@ public class TestingResourceProvider implements RealmResourceProvider {
@Path("/enable-feature/{feature}") @Path("/enable-feature/{feature}")
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
public Response enableFeature(@PathParam("feature") String feature) { public Response enableFeature(@PathParam("feature") String feature) {
Profile.Feature featureProfile;
Profile.Feature featureProfile = Profile.Feature.valueOf(feature); try {
featureProfile = Profile.Feature.valueOf(feature);
if (featureProfile == null) } catch (IllegalArgumentException e) {
System.err.printf("Feature '%s' doesn't exist!!\n", feature);
return Response.status(Response.Status.NOT_FOUND).build(); return Response.status(Response.Status.NOT_FOUND).build();
}
if (Profile.isFeatureEnabled(featureProfile)) if (Profile.isFeatureEnabled(featureProfile))
return Response.ok().build(); return Response.ok().build();
System.setProperty("keycloak.profile.feature." + feature.toLowerCase(), "enabled"); System.setProperty("keycloak.profile.feature." + featureProfile.toString().toLowerCase(), "enabled");
switch (featureProfile.getType()) {
case PREVIEW:
Profile.getPreviewFeatures().add(featureProfile);
break;
case EXPERIMENTAL:
Profile.getExperimentalFeatures().add(featureProfile);
break;
}
Profile.getDisabledFeatures().remove(featureProfile);
Profile.init(); Profile.init();
if (Profile.isFeatureEnabled(featureProfile)) if (Profile.isFeatureEnabled(featureProfile))
@ -868,17 +860,19 @@ public class TestingResourceProvider implements RealmResourceProvider {
@Path("/disable-feature/{feature}") @Path("/disable-feature/{feature}")
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
public Response disableFeature(@PathParam("feature") String feature) { public Response disableFeature(@PathParam("feature") String feature) {
Profile.Feature featureProfile;
Profile.Feature featureProfile = Profile.Feature.valueOf(feature); try {
featureProfile = Profile.Feature.valueOf(feature);
if (featureProfile == null) } catch (IllegalArgumentException e) {
System.err.printf("Feature '%s' doesn't exist!!\n", feature);
return Response.status(Response.Status.NOT_FOUND).build(); return Response.status(Response.Status.NOT_FOUND).build();
}
if (!Profile.isFeatureEnabled(featureProfile)) if (!Profile.isFeatureEnabled(featureProfile))
return Response.ok().build(); return Response.ok().build();
System.getProperties().remove("keycloak.profile.feature." + feature.toLowerCase()); System.getProperties().remove("keycloak.profile.feature." + featureProfile.toString().toLowerCase());
Profile.getDisabledFeatures().add(featureProfile);
Profile.init(); Profile.init();
if (!Profile.isFeatureEnabled(featureProfile)) if (!Profile.isFeatureEnabled(featureProfile))

View file

@ -16,6 +16,7 @@
*/ */
package org.keycloak.testsuite.arquillian.annotation; package org.keycloak.testsuite.arquillian.annotation;
import org.keycloak.common.Profile;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
@ -51,4 +52,9 @@ public @interface RestartContainer {
* @return Wait time in milliseconds after database initialization. * @return Wait time in milliseconds after database initialization.
*/ */
long intializeDatabaseWait() default 0; long intializeDatabaseWait() default 0;
/**
* @return Array of features, which should be enabled.
*/
Profile.Feature[] enableFeatures() default {};
} }

View file

@ -47,7 +47,10 @@ import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.exporter.ZipExporter;
import org.jboss.shrinkwrap.api.spec.WebArchive; import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.keycloak.common.Profile;
import org.keycloak.helpers.DropAllServlet; import org.keycloak.helpers.DropAllServlet;
import org.keycloak.testsuite.arquillian.AuthServerTestEnricher;
import org.keycloak.testsuite.arquillian.ContainerInfo;
import org.keycloak.testsuite.arquillian.annotation.RestartContainer; import org.keycloak.testsuite.arquillian.annotation.RestartContainer;
import org.wildfly.extras.creaper.commands.deployments.Deploy; import org.wildfly.extras.creaper.commands.deployments.Deploy;
import org.wildfly.extras.creaper.commands.deployments.Undeploy; import org.wildfly.extras.creaper.commands.deployments.Undeploy;
@ -58,7 +61,15 @@ import org.wildfly.extras.creaper.core.online.OnlineOptions;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.Properties;
/** /**
* Changes behaviour of original ContainerEventController to stop manual containers * Changes behaviour of original ContainerEventController to stop manual containers
@ -68,6 +79,7 @@ import java.util.List;
* *
* @author vramik * @author vramik
* @author pskopek * @author pskopek
* @author mabartos
*/ */
public class KeycloakContainerEventsController extends ContainerEventController { public class KeycloakContainerEventsController extends ContainerEventController {
@ -83,7 +95,7 @@ public class KeycloakContainerEventsController extends ContainerEventController
} }
@Override @Override
public void execute(@Observes(precedence = 3) AfterClass event) { public void execute(@Observes(precedence = 0) AfterClass event) {
try { try {
container.fire(new UnDeployManagedDeployments()); container.fire(new UnDeployManagedDeployments());
} finally { } finally {
@ -130,6 +142,14 @@ public class KeycloakContainerEventsController extends ContainerEventController
if (restartContainer.withoutKeycloakAddUserFile()) { if (restartContainer.withoutKeycloakAddUserFile()) {
copyKeycloakAddUserFile(); copyKeycloakAddUserFile();
} }
if (restartContainer.enableFeatures().length != 0) {
changeStateOfFeatures(restartContainer, false);
// Auth-server has to be restarted again. If not, the features will not to be disabled.
container.fire(new StopManualContainers());
container.fire(new StopSuiteContainers());
container.fire(new StartSuiteContainers());
}
} }
/** /**
@ -140,6 +160,10 @@ public class KeycloakContainerEventsController extends ContainerEventController
if (restartContainer.withoutKeycloakAddUserFile()) { if (restartContainer.withoutKeycloakAddUserFile()) {
removeKeycloakAddUserFile(); removeKeycloakAddUserFile();
} }
if (restartContainer.enableFeatures().length != 0) {
changeStateOfFeatures(restartContainer, true);
}
} }
/** /**
@ -242,6 +266,83 @@ public class KeycloakContainerEventsController extends ContainerEventController
} }
} }
/**
* Change state of features, which are contained in {@code enableFeatures} param.
* This method either enable or disable features.
* If auth-server is JBossBased, then the features are either enabled or disabled via {@code profile.properties}.
*
* @param restartContainer to pass more information from test annotation.
* @param enableFeatures if the features will be enabled or disabled.
*/
private void changeStateOfFeatures(RestartContainer restartContainer, boolean enableFeatures) {
Optional<Container> authServerOptional = containerRegistry.get().getContainers().stream()
.filter(f -> f.getName().startsWith("auth-server-")).findFirst();
if (authServerOptional.isPresent()) {
Container authServer = authServerOptional.get();
boolean isJbossBased = new ContainerInfo(authServer).isJBossBased();
if (isJbossBased) {
ContainerDef conf = authServer.getContainerConfiguration();
String jbossHome = conf.getContainerProperty("jbossHome");
Path fileProps = null;
if (jbossHome != null) {
try {
Path dir = Paths.get(jbossHome + "/standalone/configuration");
fileProps = dir.resolve("profile.properties");
if (enableFeatures) {
Path file = Files.createFile(fileProps);
Properties props = new Properties();
Arrays.stream(restartContainer.enableFeatures()).forEach(f -> props.setProperty("feature." + f.toString().toLowerCase(), "enabled"));
PrintWriter pw = new PrintWriter(file.toFile());
props.list(pw);
pw.close();
} else {
Files.deleteIfExists(fileProps);
}
} catch (FileAlreadyExistsException ex) {
changeFeaturesInExistingProps(restartContainer, fileProps, true);
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
if (enableFeatures) {
Arrays.stream(restartContainer.enableFeatures())
.forEach(f -> System.setProperty("keycloak.profile.feature." + f.toString().toLowerCase(), "enabled"));
} else {
Arrays.stream(restartContainer.enableFeatures())
.forEach(f -> System.getProperties().remove("keycloak.profile.feature." + f.toString().toLowerCase()));
}
}
Profile.init();
}
}
/**
* If exists {@code profile.properties} file, then another properties are only appended to the file.
*
* @param restartContainer to pass more information from test annotation
* @param file path to profile.properties
* @param enableFeatures if features will be enabled or disabled
*/
private void changeFeaturesInExistingProps(RestartContainer restartContainer, Path file, boolean enableFeatures) {
Profile.Feature[] features = restartContainer.enableFeatures();
String state = enableFeatures ? "enabled" : "disabled";
if (features.length != 0) {
Properties props = new Properties();
try {
props.load(Files.newBufferedReader(file));
Arrays.stream(features).forEach(f -> props.setProperty("feature." + f.toString().toLowerCase(), state));
props.store(Files.newBufferedWriter(file), "");
} catch (IOException e) {
e.printStackTrace();
}
}
}
/* /*
* Coppied from org.jboss.arquillian.container.impl.client.container.ContainerDeployController * Coppied from org.jboss.arquillian.container.impl.client.container.ContainerDeployController
* *

View file

@ -56,6 +56,7 @@ import org.keycloak.storage.openshift.OpenshiftClientStorageProviderFactory;
import org.keycloak.testsuite.AbstractTestRealmKeycloakTest; import org.keycloak.testsuite.AbstractTestRealmKeycloakTest;
import org.keycloak.testsuite.AssertEvents; import org.keycloak.testsuite.AssertEvents;
import org.keycloak.testsuite.admin.ApiUtil; import org.keycloak.testsuite.admin.ApiUtil;
import org.keycloak.testsuite.arquillian.annotation.RestartContainer;
import org.keycloak.testsuite.pages.AppPage; import org.keycloak.testsuite.pages.AppPage;
import org.keycloak.testsuite.pages.ConsentPage; import org.keycloak.testsuite.pages.ConsentPage;
import org.keycloak.testsuite.pages.ErrorPage; import org.keycloak.testsuite.pages.ErrorPage;
@ -68,6 +69,7 @@ import org.keycloak.testsuite.util.OAuthClient;
* *
* @author <a href="mailto:psilva@redhat.com">Pedro Igor</a> * @author <a href="mailto:psilva@redhat.com">Pedro Igor</a>
*/ */
@RestartContainer(enableFeatures = OPENSHIFT_INTEGRATION)
public final class OpenshiftClientStorageTest extends AbstractTestRealmKeycloakTest { public final class OpenshiftClientStorageTest extends AbstractTestRealmKeycloakTest {
private static Undertow OPENSHIFT_API_SERVER; private static Undertow OPENSHIFT_API_SERVER;