Merge pull request #7905 from eddumelendez:ldap_actuator
* pr/7905: Polish contribution Add LDAP health actuatorpull/8001/head
commit
ad77b655aa
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2017 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.actuate.health;
|
||||||
|
|
||||||
|
import javax.naming.NamingException;
|
||||||
|
import javax.naming.directory.DirContext;
|
||||||
|
|
||||||
|
import org.springframework.ldap.core.ContextExecutor;
|
||||||
|
import org.springframework.ldap.core.LdapOperations;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link HealthIndicator} for configured LDAP server(s).
|
||||||
|
*
|
||||||
|
* @author Eddú Meléndez
|
||||||
|
* @author Stephane Nicoll
|
||||||
|
* @version 1.5.0
|
||||||
|
*/
|
||||||
|
public class LdapHealthIndicator extends AbstractHealthIndicator {
|
||||||
|
|
||||||
|
private static final ContextExecutor<String> versionContextExecutor = new VersionContextExecutor();
|
||||||
|
|
||||||
|
private final LdapOperations ldapOperations;
|
||||||
|
|
||||||
|
public LdapHealthIndicator(LdapOperations ldapOperations) {
|
||||||
|
Assert.notNull(ldapOperations, "LdapOperations must not be null");
|
||||||
|
this.ldapOperations = ldapOperations;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doHealthCheck(Health.Builder builder) throws Exception {
|
||||||
|
String version = this.ldapOperations.executeReadOnly(versionContextExecutor);
|
||||||
|
builder.up().withDetail("version", version);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class VersionContextExecutor implements ContextExecutor<String> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String executeWithContext(DirContext ctx) throws NamingException {
|
||||||
|
Object version = ctx.getEnvironment().get("java.naming.ldap.version");
|
||||||
|
if (version != null) {
|
||||||
|
return (String) version;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2017 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.springframework.boot.actuate.health;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration;
|
||||||
|
import org.springframework.boot.actuate.autoconfigure.HealthIndicatorAutoConfiguration;
|
||||||
|
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
|
||||||
|
import org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration;
|
||||||
|
import org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration;
|
||||||
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
import org.springframework.ldap.CommunicationException;
|
||||||
|
import org.springframework.ldap.core.ContextExecutor;
|
||||||
|
import org.springframework.ldap.core.LdapTemplate;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.mockito.BDDMockito.given;
|
||||||
|
import static org.mockito.Matchers.any;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for {@link LdapHealthIndicator}
|
||||||
|
*
|
||||||
|
* @author Eddú Meléndez
|
||||||
|
*/
|
||||||
|
public class LdapHealthIndicatorTests {
|
||||||
|
|
||||||
|
private AnnotationConfigApplicationContext context;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
this.context = new AnnotationConfigApplicationContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void close() {
|
||||||
|
if (this.context != null) {
|
||||||
|
this.context.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void indicatorExist() {
|
||||||
|
this.context.register(LdapAutoConfiguration.class,
|
||||||
|
LdapDataAutoConfiguration.class,
|
||||||
|
PropertyPlaceholderAutoConfiguration.class,
|
||||||
|
EndpointAutoConfiguration.class,
|
||||||
|
HealthIndicatorAutoConfiguration.class);
|
||||||
|
this.context.refresh();
|
||||||
|
LdapTemplate ldapTemplate = this.context.getBean(LdapTemplate.class);
|
||||||
|
assertThat(ldapTemplate).isNotNull();
|
||||||
|
LdapHealthIndicator healthIndicator = this.context.getBean(
|
||||||
|
LdapHealthIndicator.class);
|
||||||
|
assertThat(healthIndicator).isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void ldapIsUp() {
|
||||||
|
LdapTemplate ldapTemplate = mock(LdapTemplate.class);
|
||||||
|
given(ldapTemplate.executeReadOnly(any(ContextExecutor.class))).willReturn("3");
|
||||||
|
LdapHealthIndicator healthIndicator = new LdapHealthIndicator(ldapTemplate);
|
||||||
|
Health health = healthIndicator.health();
|
||||||
|
assertThat(health.getStatus()).isEqualTo(Status.UP);
|
||||||
|
assertThat(health.getDetails().get("version")).isEqualTo("3");
|
||||||
|
verify(ldapTemplate).executeReadOnly(any(ContextExecutor.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void ldapIsDown() {
|
||||||
|
LdapTemplate ldapTemplate = mock(LdapTemplate.class);
|
||||||
|
given(ldapTemplate.executeReadOnly(any(ContextExecutor.class)))
|
||||||
|
.willThrow(new CommunicationException(
|
||||||
|
new javax.naming.CommunicationException("Connection failed")));
|
||||||
|
LdapHealthIndicator healthIndicator = new LdapHealthIndicator(ldapTemplate);
|
||||||
|
Health health = healthIndicator.health();
|
||||||
|
assertThat(health.getStatus()).isEqualTo(Status.DOWN);
|
||||||
|
assertThat((String) health.getDetails().get("error"))
|
||||||
|
.contains("Connection failed");
|
||||||
|
verify(ldapTemplate).executeReadOnly(any(ContextExecutor.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue