blob: 425b348f3a2e99ef4a52c9bf7b3c095b1ae2cf32 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.brooklyn.test.framework;
import org.apache.brooklyn.api.entity.ImplementedBy;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.config.ConfigKeys;
/**
* Entity that checks if a TCP endpoint is reachable.
*
* For example:
* <pre>
* {@code
* services:
* - type: com.acme.MyEntityUnderTest
* id: entity-under-test
* - type: org.apache.brooklyn.test.framework.TestCase
* name: Tests
* brooklyn.children:
* - type: org.apache.brooklyn.test.framework.TestEndpointReachable
* name: Endpoint reachable
* brooklyn.config:
* targetId: entity-under-test
* timeout: 2m
* endpointSensor: datastore.url
* }
* </pre>
*
* The sensor's value can be in a number of different formats: a string in the form of {@code ip:port}
* or URI format; or a {@link com.google.common.net.HostAndPort}; or a {@link java.net.URI}; or a
* {@link java.net.URL} instance.
*
* Alternatively an explicit endpoint can be used (e.g. constructed from other sensors of
* the target entity):
* <pre>
* {@code
* ...
* - type: org.apache.brooklyn.test.framework.TestEndpointReachable
* name: Endpoint reachable
* brooklyn.config:
* targetId: entity-under-test
* timeout: 2m
* endpoint:
* $brooklyn:formatString:
* - %s:%s"
* - $brooklyn:entity("entity-under-test").attributeWhenReady("host.name")
* - $brooklyn:entity("entity-under-test").attributeWhenReady("https.port")
* }
* </pre>
*
* One can also assert that the given endpoint is not reachable. Here the timeout means that at
* some point within this timeout period, we expect the endpoint to become unreachable. As soon
* as it is unreachable, we return:
*
* <pre>
* {@code
* ...
* - type: org.apache.brooklyn.test.framework.TestEndpointReachable
* name: Endpoint reachable
* brooklyn.config:
* targetId: entity-under-test
* timeout: 2m
* endpointSensor: datastore.url
* assertions:
* reachable: false
* }
* </pre>
*/
@ImplementedBy(value = TestEndpointReachableImpl.class)
public interface TestEndpointReachable extends BaseTest {
ConfigKey<String> ENDPOINT = ConfigKeys.newStringConfigKey(
"endpoint",
"Endpoint (be it URL or host:port) to test, for tcp-reachability; mutually exclusive with 'endpointSensor'");
ConfigKey<Object> ENDPOINT_SENSOR = ConfigKeys.newConfigKey(
Object.class,
"endpointSensor",
"Sensor (or name of sensor) on target that advertises the endpoint (to test for tcp-reachability); mutually exclusive with 'endpoint'");
/**
* A key within the assertions map, to say whether we should assert that the endpoint is reachable or not reachable.
* The value in the map should be a boolean. If absent, defaults to true.
*/
public static final String REACHABLE_KEY = "reachable";
}