use of io.dekorate.Session in project dekorate by dekorateio.
the class KubernetesSessionListener method onClosed.
@Override
public void onClosed() {
Session session = getSession();
Project project = getProject();
Optional<KubernetesConfig> optionalAppConfig = session.getConfigurationRegistry().get(KubernetesConfig.class);
Optional<ImageConfiguration> optionalImageConfig = session.getConfigurationRegistry().getImageConfig(BuildServiceFactories.supplierMatches(project));
if (!optionalAppConfig.isPresent() || !optionalImageConfig.isPresent()) {
return;
}
KubernetesConfig kubernetesConfig = optionalAppConfig.get();
ResourceRegistry resources = session.getResourceRegistry();
KubernetesList generated = session.getGeneratedResources().getOrDefault(KUBERNETES, new KubernetesList());
BuildService buildService = null;
ImageConfiguration imageConfig = optionalImageConfig.get();
if (imageConfig.isAutoBuildEnabled() || imageConfig.isAutoPushEnabled() || kubernetesConfig.isAutoDeployEnabled()) {
try {
buildService = optionalImageConfig.map(BuildServiceFactories.create(getProject(), generated.getItems())).orElseThrow(() -> new IllegalStateException("No applicable BuildServiceFactory found."));
} catch (Exception e) {
BuildServiceFactories.log(project, session.getConfigurationRegistry().getAll(ImageConfiguration.class));
throw DekorateException.launderThrowable("Failed to lookup BuildService.", e);
}
}
List<ProjectHook> hooks = new ArrayList<>();
if (kubernetesConfig.isAutoDeployEnabled()) {
hooks.add(new ResourcesApplyHook(getProject(), KUBERNETES, "kubectl"));
hooks.add(new ScaleDeploymentHook(getProject(), kubernetesConfig.getName(), 0));
}
if (imageConfig.isAutoPushEnabled()) {
// When deploy is enabled, we scale the Deployment down before push
// then scale it back up once the image has been successfully pushed
// This ensure that the pod runs the proper image
hooks.add(new ImageBuildHook(getProject(), buildService));
hooks.add(new ImagePushHook(getProject(), buildService));
} else if (imageConfig.isAutoBuildEnabled() || kubernetesConfig.isAutoDeployEnabled()) {
hooks.add(new ImageBuildHook(getProject(), buildService));
}
if (kubernetesConfig.isAutoDeployEnabled()) {
hooks.add(new ScaleDeploymentHook(getProject(), kubernetesConfig.getName(), kubernetesConfig.getReplicas()));
}
if (!hooks.isEmpty()) {
OrderedHook hook = OrderedHook.create(hooks.toArray(new ProjectHook[hooks.size()]));
hook.register();
}
}
use of io.dekorate.Session in project dekorate by dekorateio.
the class KubernetesConfigGeneratorTest method shouldGenerateKubernetesWithoutWritingToFileSystem.
@Test
public void shouldGenerateKubernetesWithoutWritingToFileSystem() throws IOException {
Path tempDir = Files.createTempDirectory("dekorate");
WithProject withProject = new WithProject() {
};
withProject.setProject(FileProjectFactory.create(new File(".")).withDekorateOutputDir(tempDir.toAbsolutePath().toString()).withDekorateMetaDir(tempDir.toAbsolutePath().toString()));
SessionWriter writer = new SimpleFileWriter(withProject.getProject(), false);
Session session = Session.getSession();
session.setWriter(writer);
KubernetesConfigGenerator generator = new DefaultKubernetesConfigGenerator(session.getConfigurationRegistry());
Map<String, Object> map = new HashMap<String, Object>() {
{
put(KubernetesConfig.class.getName(), new HashMap<String, Object>() {
{
put("name", "generator-test");
put("partOf", "generator-test-group");
put("version", "latest");
put("replicas", 2);
put("ports", new Map[] { new HashMap<String, Object>() {
{
put("containerPort", 8080);
put("name", "HTTP");
}
} });
put("livenessProbe", new HashMap<String, Object>() {
{
put("httpActionPath", "/health");
}
});
}
});
}
};
generator.addPropertyConfiguration(map);
final Map<String, String> result = session.close();
KubernetesList list = session.getGeneratedResources().get("kubernetes");
assertThat(list).isNotNull();
assertThat(list.getItems()).filteredOn(i -> "Deployment".equals(i.getKind())).hasOnlyOneElementSatisfying(item -> {
assertThat(item).isInstanceOfSatisfying(Deployment.class, dep -> {
assertThat(dep.getSpec()).satisfies(spec -> {
assertThat(spec.getReplicas()).isEqualTo(2);
assertThat(spec.getTemplate().getSpec()).satisfies(podSpec -> {
assertThat(podSpec.getContainers()).hasOnlyOneElementSatisfying(container -> {
assertThat(container.getPorts()).hasOnlyOneElementSatisfying(port -> {
assertThat(port.getContainerPort()).isEqualTo(8080);
assertThat(port.getName()).isEqualTo("HTTP");
});
assertThat(container.getLivenessProbe().getHttpGet()).satisfies(httpGetAction -> {
assertThat(httpGetAction.getPath()).isEqualTo("/health");
assertThat(httpGetAction.getPort().getIntVal()).isEqualTo(8080);
});
});
});
});
});
});
assertThat(tempDir.resolve("kubernetes.json")).doesNotExist();
assertThat(tempDir.resolve("kubernetes.yml")).doesNotExist();
assertThat(result).hasSize(5);
}
use of io.dekorate.Session in project dekorate by dekorateio.
the class OpenshiftSessionListener method onClosed.
@Override
public void onClosed() {
Session session = getSession();
Project project = getProject();
// We ned to set the TTCL, becuase the KubenretesClient used in this part of
// code, needs TTCL so that java.util.ServiceLoader can work.
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
List<ProjectHook> hooks = new ArrayList<>();
try {
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
Optional<OpenshiftConfig> optionalAppConfig = session.getConfigurationRegistry().get(OpenshiftConfig.class);
Optional<ImageConfiguration> optionalImageConfig = session.getConfigurationRegistry().getImageConfig(BuildServiceFactories.supplierMatches(project));
if (!optionalAppConfig.isPresent() || !optionalImageConfig.isPresent()) {
return;
}
OpenshiftConfig openshiftConfig = optionalAppConfig.get();
ImageConfiguration imageConfig = optionalImageConfig.get();
String name = session.getConfigurationRegistry().get(OpenshiftConfig.class).map(c -> c.getName()).orElse(getProject().getBuildInfo().getName());
BuildService buildService = null;
boolean s2iEnabled = imageConfig instanceof S2iBuildConfig && ((S2iBuildConfig) imageConfig).isEnabled();
if (imageConfig.isAutoBuildEnabled() || imageConfig.isAutoPushEnabled() || openshiftConfig.isAutoDeployEnabled()) {
KubernetesList list = session.getGeneratedResources().get("openshift");
List<HasMetadata> generated = list != null ? list.getItems() : Collections.emptyList();
try {
buildService = optionalImageConfig.map(BuildServiceFactories.create(getProject(), generated)).orElseThrow(() -> new IllegalStateException("No applicable BuildServiceFactory found."));
} catch (Exception e) {
BuildServiceFactories.log(project, session.getConfigurationRegistry().getAll(ImageConfiguration.class));
throw DekorateException.launderThrowable("Failed to lookup BuildService.", e);
}
hooks.add(new ImageBuildHook(getProject(), buildService));
}
if (imageConfig.isAutoPushEnabled() && !s2iEnabled) {
hooks.add(new ImagePushHook(getProject(), buildService));
}
if (openshiftConfig.isAutoDeployEnabled()) {
hooks.add(new ResourcesApplyHook(getProject(), OPENSHIFT, "oc"));
}
} finally {
Thread.currentThread().setContextClassLoader(tccl);
if (!hooks.isEmpty()) {
OrderedHook hook = OrderedHook.create(hooks.toArray(new ProjectHook[hooks.size()]));
hook.register();
}
}
}
use of io.dekorate.Session in project dekorate by dekorateio.
the class OpenshiftManifestGeneratorTest method shouldNotAcceptKubernetesConfig.
@Test
public void shouldNotAcceptKubernetesConfig() {
Session session = Session.getSession();
OpenshiftManifestGenerator generator = new OpenshiftManifestGenerator(session.getResourceRegistry(), session.getConfigurationRegistry());
assertFalse(generator.accepts(BaseConfig.class));
}
use of io.dekorate.Session in project dekorate by dekorateio.
the class OpenshiftManifestGeneratorTest method shouldAcceptOpenshiftConfig.
@Test
public void shouldAcceptOpenshiftConfig() {
Session session = Session.getSession();
OpenshiftManifestGenerator generator = new OpenshiftManifestGenerator(session.getResourceRegistry(), session.getConfigurationRegistry());
assertTrue(generator.accepts(OpenshiftConfig.class));
}
Aggregations